hi im alinez not even tryingto hide it
1import { LabelerServer } from "@skyware/labeler";
2import { BskyAgent, AppBskyGraphDefs } from '@atproto/api'
3
4const LABELER_HANDLE = process.env.LABELER_HANDLE!;
5const LABELER_PASSWORD = process.env.LABELER_PASSWORD!;
6const LABELER_PDS = process.env.LABELER_PDS!;
7const LABELER_DID = process.env.LABELER_DID!;
8const SIGNING_KEY = process.env.SIGNING_KEY!;
9const LABELS_LISTS = [
10 ['is-alien', `at://${LABELER_DID}/app.bsky.graph.list/3m72hhjgqww2u`],
11 ['is-alienphobe', `at://${LABELER_DID}/app.bsky.graph.list/3m72h3vsecg2u`],
12 ['ebil-club-member', 'at://did:plc:b26ewgkrnx3yvsp2cdao3ntu/app.bsky.graph.list/3madar3xkeb2p']
13];
14
15const server = new LabelerServer({
16 did: LABELER_DID,
17 signingKey: SIGNING_KEY
18});
19
20const agent = new BskyAgent({
21 service: LABELER_PDS
22})
23await agent.login({
24 identifier: LABELER_DID,
25 password: LABELER_PASSWORD
26})
27
28const agentPublic = new BskyAgent({
29 service: "https://public.api.bsky.app"
30})
31
32server.app.get("/", (_, res) => res.redirect(`https://witchsky.app/profile/${LABELER_DID}`));
33server.start(14831, (error) => {
34 if (error) {
35 console.error("failed to start server:", error);
36 } else {
37 console.log("labeler server running on port 14831");
38 }
39});
40
41let isFetching = false;
42
43async function fetchAndLabel() {
44 if (isFetching) return;
45 isFetching = true;
46
47 try {
48 console.log("labeling...");
49
50 const query = await server.db.execute({
51 sql: "SELECT uri, val, neg FROM labels",
52 args: []
53 });
54 console.log(`fetched ${query.rows.length} existing labels`);
55
56 for (const [label, list] of LABELS_LISTS) {
57 let cursor: string | undefined
58 let members: AppBskyGraphDefs.ListItemView[] = []
59 do {
60 let res = await agentPublic.app.bsky.graph.getList({
61 list: list,
62 limit: 100,
63 cursor
64 })
65 cursor = res.data.cursor
66 members = members.concat(res.data.items)
67 } while (cursor)
68
69 for (const member of members) {
70 try {
71 if (query.rows.find((row: any) => row.uri === member.subject.did && row.val === label && row.neg === 0)) continue;
72
73 await server.createLabel({
74 uri: member.subject.did,
75 val: label
76 });
77 } catch (err) {
78 console.error(`failed to create label ${label} for ${member.subject.did}:`, err);
79 }
80 }
81 console.log(`labeled ${members.length} members with ${label}`);
82 }
83 console.log("labeling completed");
84 } catch (err) {
85 console.error("labeling failed:", err);
86 } finally {
87 isFetching = false;
88 }
89}
90
91await fetchAndLabel();
92setInterval(fetchAndLabel, 30 * 60 * 1000); // 30 minutes