Pronouns labels on Bluesky
1import { ComAtprotoLabelDefs } from "@atcute/client/lexicons";
2import {
3 DID,
4 PORT,
5 LABEL_LIMIT,
6 POSTS,
7 SIGNING_KEY,
8 DELETE,
9} from "./constants.js";
10import { LabelerServer } from "@skyware/labeler";
11
12const server = new LabelerServer({ did: DID, signingKey: SIGNING_KEY });
13
14server.start(PORT, (error, address) => {
15 if (error) console.error(error);
16 else console.log(`Labeler server listening on ${address}`);
17});
18
19export const label = (did: string, rkey: string) => {
20 const query = server.db
21 .prepare<string[]>(`SELECT * FROM labels WHERE uri = ?`)
22 .all(did) as ComAtprotoLabelDefs.Label[];
23
24 const labels = query.reduce((set, label) => {
25 if (!label.neg) set.add(label.val);
26 else set.delete(label.val);
27 return set;
28 }, new Set<string>());
29
30 try {
31 if (rkey.includes(DELETE)) {
32 server.createLabels({ uri: did }, { negate: [...labels] });
33 console.log(`${new Date().toISOString()} Deleted labels: ${did}`);
34 } else if (labels.size < LABEL_LIMIT && POSTS[rkey]) {
35 server.createLabel({ uri: did, val: POSTS[rkey] });
36 console.log(`${new Date().toISOString()} Labeled ${did}: ${POSTS[rkey]}`);
37 }
38 } catch (err) {
39 console.error(err);
40 }
41};