Pronouns labels on Bluesky

switch from queryLabels to db queries

+10
package-lock.json
···
"dotenv": "^16.4.5"
},
"devDependencies": {
"@types/node": "^20.14.10",
"typescript": "^5.5.3"
}
···
"version": "13.2.2",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.2.2.tgz",
"integrity": "sha512-RWI+nyf0q64vyOxL8LbKtjJMki0sogRL/8axvklNtiTM0iFCVtHwME9w6+0P1/v4dQvsIg8A45oT3ka1t/M/+A=="
},
"node_modules/@types/node": {
"version": "20.16.2",
···
"dotenv": "^16.4.5"
},
"devDependencies": {
+
"@types/better-sqlite3": "^7.6.11",
"@types/node": "^20.14.10",
"typescript": "^5.5.3"
}
···
"version": "13.2.2",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.2.2.tgz",
"integrity": "sha512-RWI+nyf0q64vyOxL8LbKtjJMki0sogRL/8axvklNtiTM0iFCVtHwME9w6+0P1/v4dQvsIg8A45oT3ka1t/M/+A=="
+
},
+
"node_modules/@types/better-sqlite3": {
+
"version": "7.6.11",
+
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.11.tgz",
+
"integrity": "sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==",
+
"dev": true,
+
"dependencies": {
+
"@types/node": "*"
+
}
},
"node_modules/@types/node": {
"version": "20.16.2",
+1
package.json
···
"dev": "npx tsx --watch src/main.ts"
},
"devDependencies": {
"@types/node": "^20.14.10",
"typescript": "^5.5.3"
},
···
"dev": "npx tsx --watch src/main.ts"
},
"devDependencies": {
+
"@types/better-sqlite3": "^7.6.11",
"@types/node": "^20.14.10",
"typescript": "^5.5.3"
},
-19
src/agent.ts
···
-
import { AtpAgent } from "@atproto/api";
-
import "dotenv/config";
-
-
export const getAgent = async () => {
-
const agent = new AtpAgent({
-
service: process.env.BSKY_SERVICE ?? "https://bsky.social",
-
});
-
-
await agent.login({
-
identifier: process.env.BSKY_IDENTIFIER!,
-
password: process.env.BSKY_PASSWORD!,
-
});
-
-
return agent;
-
};
-
-
AtpAgent.configure({
-
appLabelers: [process.env.DID ?? ""],
-
});
···
+20 -14
src/label.ts
···
-
import { AppBskyActorDefs } from "@atproto/api";
import { DID, PRONOUNS, SIGNING_KEY, URIs } from "./constants.js";
import { LabelerServer } from "@skyware/labeler";
-
import { getAgent } from "./agent.js";
const server = new LabelerServer({ did: DID, signingKey: SIGNING_KEY });
-
const agent = await getAgent();
server.start(4001, (error, address) => {
if (error) {
···
uri: string,
) => {
const did = AppBskyActorDefs.isProfileView(subject) ? subject.did : subject;
-
const labels = await agent.com.atproto.label
-
.queryLabels({ sources: [server.did], uriPatterns: [did] })
-
.catch((err) => {
-
console.log(err);
-
});
-
if (!labels) return;
const post = URIs[uri];
if (post?.includes("Like this post to delete")) {
await server
-
.createLabels(
-
{ uri: did },
-
{ negate: labels.data.labels.map((label) => label.val) },
-
)
.catch((err) => {
console.log(err);
})
.then(() => console.log(`Deleted labels for ${did}`));
-
} else if (labels.data.labels.length < 4 && PRONOUNS[post]) {
await server
.createLabel({
src: server.did,
···
+
import { AppBskyActorDefs, ComAtprotoLabelDefs } from "@atproto/api";
import { DID, PRONOUNS, SIGNING_KEY, URIs } from "./constants.js";
import { LabelerServer } from "@skyware/labeler";
+
import Database from "better-sqlite3";
const server = new LabelerServer({ did: DID, signingKey: SIGNING_KEY });
+
+
const db = new Database("labels.db");
+
db.pragma("journal_mode = WAL");
server.start(4001, (error, address) => {
if (error) {
···
uri: string,
) => {
const did = AppBskyActorDefs.isProfileView(subject) ? subject.did : subject;
+
+
const query = db
+
.prepare<
+
unknown[],
+
ComAtprotoLabelDefs.Label
+
>(`SELECT * FROM labels WHERE uri = ?`)
+
.all(did);
+
+
const labels = query.reduce((set, label) => {
+
if (!label.neg) set.add(label.val);
+
else set.delete(label.val);
+
return set;
+
}, new Set<string>());
const post = URIs[uri];
if (post?.includes("Like this post to delete")) {
await server
+
.createLabels({ uri: did }, { negate: [...labels] })
.catch((err) => {
console.log(err);
})
.then(() => console.log(`Deleted labels for ${did}`));
+
} else if (labels.size < 4 && PRONOUNS[post]) {
await server
.createLabel({
src: server.did,