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