Pronouns labels on Bluesky
1import {
2 DID,
3 PORT,
4 LABEL_LIMIT,
5 POSTS,
6 SIGNING_KEY,
7 DELETE,
8} from "./constants.js";
9import { Label } from "./types.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) {
16 console.error(error);
17 } else {
18 console.log(`Labeler server listening on ${address}`);
19 }
20});
21
22export const label = async (did: string, rkey: string) => {
23 const query = server.db
24 .prepare<unknown[], Label>(`SELECT * FROM labels WHERE uri = ?`)
25 .all(did);
26
27 const labels = query.reduce((set, label) => {
28 if (!label.neg) set.add(label.val);
29 else set.delete(label.val);
30 return set;
31 }, new Set<string>());
32
33 if (rkey.includes(DELETE)) {
34 process.stdout.write(`${new Date().toISOString()}: `);
35 await server
36 .createLabels({ uri: did }, { negate: [...labels] })
37 .catch((err) => {
38 console.log(err);
39 })
40 .then(() => console.log(`Deleted labels for ${did}`));
41 } else if (labels.size < LABEL_LIMIT && POSTS[rkey]) {
42 console.log(`${new Date().toISOString()}: `);
43 await server
44 .createLabel({ uri: did, val: POSTS[rkey] })
45 .catch((err) => {
46 console.log(err);
47 })
48 .then(() => console.log(`Labeled ${did} with ${POSTS[rkey]}`));
49 }
50};