Pronouns labels on Bluesky
1import { AppBskyActorDefs, ComAtprotoLabelDefs } from "@atproto/api";
2import { DID, POSTS, 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 (POSTS[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 && POSTS[uri]) {
42 await server
43 .createLabel({ uri: did, val: POSTS[uri] })
44 .catch((err) => {
45 console.log(err);
46 })
47 .then(() => console.log(`Labeled ${did} with ${POSTS[uri]}`));
48 }
49};