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 17 const post = URIs[uri]; 18 19 if (labels && 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 if (labels) { 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) return; 51 } 52 53 if (PRONOUNS[post]) { 54 await agent 55 .withProxy("atproto_labeler", DID) 56 .tools.ozone.moderation.emitEvent({ 57 event: { 58 $type: "tools.ozone.moderation.defs#modEventLabel", 59 createLabelVals: [PRONOUNS[post]], 60 negateLabelVals: [], 61 }, 62 subject: { 63 $type: "com.atproto.admin.defs#repoRef", 64 did: did, 65 }, 66 createdBy: agent.did!, 67 createdAt: new Date().toISOString(), 68 subjectBlobCids: [], 69 }) 70 .catch((err) => { 71 console.log(err); 72 }) 73 .then(() => console.log(`Labeled ${did} with ${post}`)); 74 } 75};