Pronouns labels on Bluesky
1import { AppBskyActorDefs, Agent } from "@atproto/api";
2import { DID, PRONOUNS, URIs } from "./constants.js";
3
4export const label = async (
5 agent: Agent,
6 subject: string | AppBskyActorDefs.ProfileView,
7 uri: string,
8) => {
9 const did = AppBskyActorDefs.isProfileView(subject) ? subject.did : subject;
10 const labels = await agent
11 .withProxy("atproto_labeler", DID)
12 .com.atproto.label.queryLabels({ sources: [DID], uriPatterns: [did] })
13 .catch((err) => {
14 console.log(err);
15 });
16 if (!labels) return;
17
18 const post = URIs[uri];
19
20 if (post?.includes("Like this post to delete")) {
21 await agent
22 .withProxy("atproto_labeler", DID)
23 .tools.ozone.moderation.emitEvent({
24 event: {
25 $type: "tools.ozone.moderation.defs#modEventLabel",
26 createLabelVals: [],
27 negateLabelVals: labels.data.labels.map((label) => label.val),
28 },
29 subject: {
30 $type: "com.atproto.admin.defs#repoRef",
31 did: did,
32 },
33 createdBy: agent.did!,
34 createdAt: new Date().toISOString(),
35 subjectBlobCids: [],
36 })
37 .catch((err) => {
38 console.log(err);
39 })
40 .then(() => console.log(`Deleted labels for ${did}`));
41 return;
42 }
43
44 const labelCount = labels.data.labels.reduce((set, label) => {
45 if (!label.neg) set.add(label.val);
46 else set.delete(label.val);
47 return set;
48 }, new Set()).size;
49
50 if (labelCount < 4 && PRONOUNS[post]) {
51 await agent
52 .withProxy("atproto_labeler", DID)
53 .tools.ozone.moderation.emitEvent({
54 event: {
55 $type: "tools.ozone.moderation.defs#modEventLabel",
56 createLabelVals: [PRONOUNS[post]],
57 negateLabelVals: [],
58 },
59 subject: {
60 $type: "com.atproto.admin.defs#repoRef",
61 did: did,
62 },
63 createdBy: agent.did!,
64 createdAt: new Date().toISOString(),
65 subjectBlobCids: [],
66 })
67 .catch((err) => {
68 console.log(err);
69 })
70 .then(() => console.log(`Labeled ${did} with ${post}`));
71 }
72};