auron
Version:
Interact with your ATProto labeler from your terminal
242 lines (241 loc) • 8.21 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRecords = exports.getProfiles = exports.getRepos = exports.getEvents = exports.getQueueItems = exports.getAgent = void 0;
const api_1 = require("@atproto/api");
const common_1 = require("@atproto/common");
const readline = __importStar(require("readline"));
const loader_1 = require("../utils/loader");
let agent;
const prompt2FA = () => {
return new Promise((resolve) => {
const spinner = (0, loader_1.getGlobalSpinner)();
// Stop the spinner to allow clean input
if (spinner) {
spinner.stop();
}
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question("Enter your 2FA code: ", (answer) => {
rl.close();
// Restart the spinner
if (spinner) {
spinner.start();
}
resolve(answer.trim());
});
});
};
const getAgent = async () => {
if (agent)
return agent;
if (!process.env.SERVICE_URL) {
throw new Error("SERVICE_URL env var is required");
}
if (!process.env.SERVICE_DID) {
throw new Error("SERVICE_DID env var is required");
}
agent = new api_1.AtpAgent({ service: process.env.SERVICE_URL });
// @ts-ignore
agent.configureProxy(process.env.SERVICE_DID);
try {
await agent.login({
identifier: process.env.USERNAME,
password: process.env.PASSWORD,
});
}
catch (error) {
if (error instanceof api_1.ComAtprotoServerCreateSession.AuthFactorTokenRequiredError) {
const authFactorToken = await prompt2FA();
await agent.login({
identifier: process.env.USERNAME,
password: process.env.PASSWORD,
authFactorToken,
});
}
else {
throw error;
}
}
return agent;
};
exports.getAgent = getAgent;
const getQueueItems = async ({ reviewState, maxCount = 500, takendown, cursor, }, emitter) => {
const agent = await (0, exports.getAgent)();
let nextCursor = cursor;
let counter = 0;
const result = {
cursor,
subjectStatuses: [],
};
do {
try {
const params = {
cursor: nextCursor,
limit: Math.min(100, maxCount),
reviewState: reviewState || api_1.ToolsOzoneModerationDefs.REVIEWOPEN,
};
if (takendown !== undefined) {
params.takendown = takendown;
}
const { data } = await agent.tools.ozone.moderation.queryStatuses(params);
nextCursor = data.cursor;
result.subjectStatuses.push(...data.subjectStatuses);
emitter.emit("update", {
maxCount,
nextCursor,
subjectCount: result.subjectStatuses.length,
});
}
catch (err) {
console.error(err);
break;
}
// Every 5th request, wait for 500ms to avoid potential rate limiting
if (counter % 5) {
await new Promise((resolve) => setTimeout(resolve, 500));
}
counter++;
} while (nextCursor &&
(!maxCount || result.subjectStatuses.length < maxCount));
return { ...result, cursor: nextCursor };
};
exports.getQueueItems = getQueueItems;
const getEvents = async ({ types, createdAfter, createdBefore, cursor, }, emitter) => {
const agent = await (0, exports.getAgent)();
let nextCursor = cursor;
let counter = 0;
const result = {
cursor,
events: [],
};
do {
try {
const { data } = await agent.tools.ozone.moderation.queryEvents({
types,
limit: 100,
createdAfter,
createdBefore,
cursor: nextCursor,
});
nextCursor = data.cursor;
result.events.push(...data.events);
emitter.emit("update", {
nextCursor,
eventCount: result.events.length,
});
}
catch (err) {
console.error(err);
break;
}
// Every 5th request, wait for 500ms to avoid potential rate limiting
if (counter % 5) {
await new Promise((resolve) => setTimeout(resolve, 500));
}
counter++;
} while (nextCursor);
return { ...result, cursor: nextCursor };
};
exports.getEvents = getEvents;
const getRepos = async ({ dids }, emitter) => {
const agent = await (0, exports.getAgent)();
const repos = [];
for (const chunk of (0, common_1.chunkArray)(dids, 100)) {
try {
const { data } = await agent.tools.ozone.moderation.getRepos({
dids: chunk,
});
repos.push(...data.repos.filter((r) => api_1.ToolsOzoneModerationDefs.isRepoViewDetail(r)));
emitter.emit("update", {
total: dids.length,
repoCount: repos.length,
});
}
catch (err) {
console.log(`Error fetching repos for ${chunk}`);
}
}
return repos;
};
exports.getRepos = getRepos;
const getProfiles = async ({ dids }, emitter) => {
const agent = await (0, exports.getAgent)();
const profiles = [];
let i = 0;
for (const chunk of (0, common_1.chunkArray)(dids, 25)) {
if (i % 10 === 0) {
await new Promise((res) => setTimeout(res, 1000));
}
try {
const { data } = await agent.app.bsky.actor.getProfiles({
actors: chunk,
});
profiles.push(...data.profiles);
emitter.emit("update", {
total: dids.length,
profileCount: profiles.length,
});
}
catch (err) {
console.log(`Error fetching profiles for ${chunk}`);
}
}
return profiles;
};
exports.getProfiles = getProfiles;
const getRecords = async ({ uris }, emitter) => {
const agent = await (0, exports.getAgent)();
const records = [];
for (const chunk of (0, common_1.chunkArray)(uris, 100)) {
try {
const { data } = await agent.tools.ozone.moderation.getRecords({
uris: chunk,
});
records.push(...data.records.filter((r) => api_1.ToolsOzoneModerationDefs.isRecordViewDetail(r)));
emitter.emit("update", {
total: uris.length,
recordCount: records.length,
});
}
catch (err) {
console.log(`Error fetching records for ${chunk}`);
}
}
return records;
};
exports.getRecords = getRecords;