Pronouns labels on Bluesky
1import { AppBskyActorDefs, ComAtprotoLabelDefs } from "@atproto/api";
2import { DID, PRONOUNS, SIGNING_KEY } from "./constants.js";
3import { LabelerServer } from "@skyware/labeler";
4
5const server = new LabelerServer({ did: DID, signingKey: SIGNING_KEY });
6
7server.start(4001, (error, address) => {
8 if (error) {
9 console.error(error);
10 } else {
11 console.log(`Labeler server listening on ${address}`);
12 }
13});
14
15export const label = async (
16 subject: string | AppBskyActorDefs.ProfileView,
17 uri: string,
18) => {
19 const did = AppBskyActorDefs.isProfileView(subject) ? subject.did : subject;
20
21 const query = server.db
22 .prepare<
23 unknown[],
24 ComAtprotoLabelDefs.Label
25 >(`SELECT * FROM labels WHERE uri = ?`)
26 .all(did);
27
28 const labels = query.reduce((set, label) => {
29 if (!label.neg) set.add(label.val);
30 else set.delete(label.val);
31 return set;
32 }, new Set<string>());
33
34 if (PRONOUNS[uri].includes("delete")) {
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 < 4 && PRONOUNS[uri]) {
42 await server
43 .createLabel({
44 src: server.did,
45 uri: did,
46 val: PRONOUNS[uri],
47 cts: new Date().toISOString(),
48 })
49 .catch((err) => {
50 console.log(err);
51 })
52 .then(() => console.log(`Labeled ${did} with ${PRONOUNS[uri]}`));
53 }
54};