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