UNPKG

auron

Version:

Interact with your ATProto labeler from your terminal

242 lines (241 loc) 8.21 kB
"use strict"; 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;