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};