Pronouns labels on Bluesky
1import { AppBskyActorDefs, ComAtprotoLabelDefs } from "@atproto/api"; 2import { DID, PRONOUNS, SIGNING_KEY, URIs } from "./constants.js"; 3import { LabelerServer } from "@skyware/labeler"; 4 5const server = new LabelerServer({ did: DID, signingKey: SIGNING_KEY }); 6 7server.start(4001, (error, address) => { 8 if (error) { 9 console.error(error); 10 } else { 11 console.log(`Labeler server listening on ${address}`); 12 } 13}); 14 15export const label = async ( 16 subject: string | AppBskyActorDefs.ProfileView, 17 uri: string, 18) => { 19 const did = AppBskyActorDefs.isProfileView(subject) ? subject.did : subject; 20 21 const query = server.db 22 .prepare< 23 unknown[], 24 ComAtprotoLabelDefs.Label 25 >(`SELECT * FROM labels WHERE uri = ?`) 26 .all(did); 27 28 const labels = query.reduce((set, label) => { 29 if (!label.neg) set.add(label.val); 30 else set.delete(label.val); 31 return set; 32 }, new Set<string>()); 33 34 const post = URIs[uri]; 35 36 if (post?.includes("Like this post to delete")) { 37 await server 38 .createLabels({ uri: did }, { negate: [...labels] }) 39 .catch((err) => { 40 console.log(err); 41 }) 42 .then(() => console.log(`Deleted labels for ${did}`)); 43 } else if (labels.size < 4 && PRONOUNS[post]) { 44 await server 45 .createLabel({ 46 src: server.did, 47 uri: did, 48 val: PRONOUNS[post], 49 cts: new Date().toISOString(), 50 }) 51 .catch((err) => { 52 console.log(err); 53 }) 54 .then(() => console.log(`Labeled ${did} with ${post}`)); 55 } 56};