Pronouns labels on Bluesky
1import { AppBskyActorDefs } from "@atproto/api";
2import { DID, PRONOUNS, SIGNING_KEY, URIs } from "./constants.js";
3import { LabelerServer } from "@skyware/labeler";
4import { getAgent } from "./agent.js";
5
6const server = new LabelerServer({ did: DID, signingKey: SIGNING_KEY });
7const agent = await getAgent();
8
9server.start(4001, (error, address) => {
10 if (error) {
11 console.error(error);
12 } else {
13 console.log(`Labeler server listening on ${address}`);
14 }
15});
16
17export const label = async (
18 subject: string | AppBskyActorDefs.ProfileView,
19 uri: string,
20) => {
21 const did = AppBskyActorDefs.isProfileView(subject) ? subject.did : subject;
22 const labels = await agent.com.atproto.label
23 .queryLabels({ sources: [server.did], uriPatterns: [did] })
24 .catch((err) => {
25 console.log(err);
26 });
27 if (!labels) return;
28
29 const post = URIs[uri];
30
31 if (post?.includes("Like this post to delete")) {
32 await server
33 .createLabels(
34 { uri: did },
35 { negate: labels.data.labels.map((label) => label.val) },
36 )
37 .catch((err) => {
38 console.log(err);
39 })
40 .then(() => console.log(`Deleted labels for ${did}`));
41 } else if (labels.data.labels.length < 4 && PRONOUNS[post]) {
42 await server
43 .createLabel({
44 src: server.did,
45 uri: did,
46 val: PRONOUNS[post],
47 cts: new Date().toISOString(),
48 })
49 .catch((err) => {
50 console.log(err);
51 })
52 .then(() => console.log(`Labeled ${did} with ${post}`));
53 }
54};