Pronouns labels on Bluesky
1import { label } from "./label.js"; 2import { DID } from "./constants.js"; 3import fs from "node:fs"; 4import { Jetstream } from "@skyware/jetstream"; 5import { AppBskyFeedLike } from "@atcute/client/lexicons"; 6 7let intervalID: NodeJS.Timeout; 8const cursorFile = fs.readFileSync("cursor.txt", "utf8"); 9if (cursorFile) console.log(`Initiate firehose at cursor ${cursorFile}`); 10 11const jetstream = new Jetstream({ 12 wantedCollections: ["app.bsky.feed.like"], 13 cursor: cursorFile ?? 0, 14}); 15 16jetstream.on("open", () => { 17 intervalID = setInterval(() => { 18 if (jetstream.cursor) { 19 console.log(`${new Date().toISOString()}: ${jetstream.cursor}`); 20 fs.writeFile("cursor.txt", jetstream.cursor.toString(), (err) => { 21 if (err) console.log(err); 22 }); 23 } 24 }, 60000); 25}); 26 27jetstream.on("error", (err) => console.error(err)); 28 29jetstream.on("close", () => clearInterval(intervalID)); 30 31jetstream.onCreate("app.bsky.feed.like", (event) => { 32 const record = event.commit.record as AppBskyFeedLike.Record; 33 if (record.subject?.uri?.includes(`${DID}/app.bsky.feed.post`)) 34 label(event.did, record.subject.uri.split("/").pop()!); 35}); 36 37jetstream.start();