Pronouns labels on Bluesky
1import { AppBskyActorDefs, ComAtprotoLabelDefs } from "@atproto/api"; 2import { DID, POSTS, SIGNING_KEY } 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 if (POSTS[uri].includes("delete")) { 35 await server 36 .createLabels({ uri: did }, { negate: [...labels] }) 37 .catch((err) => { 38 console.log(err); 39 }) 40 .then(() => console.log(`Deleted labels for ${did}`)); 41 } else if (labels.size < 4 && POSTS[uri]) { 42 await server 43 .createLabel({ uri: did, val: POSTS[uri] }) 44 .catch((err) => { 45 console.log(err); 46 }) 47 .then(() => console.log(`Labeled ${did} with ${POSTS[uri]}`)); 48 } 49};