Pronouns labels on Bluesky
1import { AppBskyActorDefs, ComAtprotoLabelDefs } from "@atproto/api";
2import { DID, PRONOUNS, SIGNING_KEY, URIs } 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 const post = URIs[uri];
35
36 if (post?.includes("Like this post to delete")) {
37 await server
38 .createLabels({ uri: did }, { negate: [...labels] })
39 .catch((err) => {
40 console.log(err);
41 })
42 .then(() => console.log(`Deleted labels for ${did}`));
43 } else if (labels.size < 4 && PRONOUNS[post]) {
44 await server
45 .createLabel({
46 src: server.did,
47 uri: did,
48 val: PRONOUNS[post],
49 cts: new Date().toISOString(),
50 })
51 .catch((err) => {
52 console.log(err);
53 })
54 .then(() => console.log(`Labeled ${did} with ${post}`));
55 }
56};