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();