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