"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var remote_exports = {}; __export(remote_exports, { ATTRIBUTES: () => ATTRIBUTES, Limiter: () => Limiter, PM: () => PM, RemoteClassifier: () => RemoteClassifier, limiter: () => limiter }); module.exports = __toCommonJS(remote_exports); var import_lib = require("../../lib"); var import_config_loader = require("../config-loader"); var import_dex_data = require("../../sim/dex-data"); const PM_TIMEOUT = 20 * 60 * 1e3; const ATTRIBUTES = { "SEVERE_TOXICITY": {}, "TOXICITY": {}, "IDENTITY_ATTACK": {}, "INSULT": {}, "PROFANITY": {}, "THREAT": {}, "SEXUALLY_EXPLICIT": {}, "FLIRTATION": {} }; function time() { return Math.floor(Math.floor(Date.now() / 1e3) / 60); } class Limiter { constructor(max) { this.lastTick = time(); this.count = 0; this.max = max; } shouldRequest() { const now = time(); if (this.lastTick !== now) { this.count = 0; this.lastTick = now; } this.count++; return this.count < this.max; } } function isCommon(message) { message = message.toLowerCase().replace(/\?!\., ;:/g, ""); return ["gg", "wp", "ggwp", "gl", "hf", "glhf", "hello"].includes(message); } let throttleTime = null; const limiter = new Limiter(800); const PM = new import_lib.ProcessManager.QueryProcessManager(module, async (text) => { if (isCommon(text) || !limiter.shouldRequest()) return null; if (throttleTime && Date.now() - throttleTime < 1e4) { return null; } if (throttleTime) throttleTime = null; const requestData = { // todo - support 'es', 'it', 'pt', 'fr' - use user.language? room.settings.language...? languages: ["en"], requestedAttributes: ATTRIBUTES, comment: { text } }; try { const raw = await (0, import_lib.Net)(`https://commentanalyzer.googleapis.com/v1alpha1/comments:analyze`).post({ query: { key: import_config_loader.Config.perspectiveKey }, body: JSON.stringify(requestData), headers: { "Content-Type": "application/json" }, timeout: 10 * 1e3 // 10s }); if (!raw) return null; const data = JSON.parse(raw); if (data.error) throw new Error(data.message); const result = {}; for (const k in data.attributeScores) { const score = data.attributeScores[k]; result[k] = score.summaryScore.value; } return result; } catch (e) { throttleTime = Date.now(); if (e.message.startsWith("Request timeout") || e.statusCode === 429) { return null; } Monitor.crashlog(e, "A Perspective API request", { request: JSON.stringify(requestData) }); return null; } }, PM_TIMEOUT); if (require.main === module) { global.Config = import_config_loader.Config; global.Monitor = { crashlog(error, source = "A remote Artemis child process", details = null) { const repr = JSON.stringify([error.name, error.message, source, details]); process.send(`THROW @!!@${repr} ${error.stack}`); }, slow(text) { process.send(`CALLBACK SLOW ${text}`); } }; global.toID = import_dex_data.toID; process.on("uncaughtException", (err) => { if (import_config_loader.Config.crashguard) { Monitor.crashlog(err, "A remote Artemis child process"); } }); import_lib.Repl.start(`abusemonitor-remote-${process.pid}`, (cmd) => eval(cmd)); } else if (!process.send) { PM.spawn(import_config_loader.Config.remoteartemisprocesses || 1); } class RemoteClassifier { classify(text) { if (!import_config_loader.Config.perspectiveKey) return Promise.resolve(null); return PM.query(text); } async suggestScore(text, data) { if (!import_config_loader.Config.perspectiveKey) return Promise.resolve(null); const body = { comment: { text }, attributeScores: {} }; for (const k in data) { body.attributeScores[k] = { summaryScore: { value: data[k] } }; } try { const raw = await (0, import_lib.Net)(`https://commentanalyzer.googleapis.com/v1alpha1/comments:suggestscore`).post({ query: { key: import_config_loader.Config.perspectiveKey }, body: JSON.stringify(body), headers: { "Content-Type": "application/json" }, timeout: 10 * 1e3 // 10s }); return JSON.parse(raw); } catch (e) { return { error: e.message }; } } destroy() { return PM.destroy(); } respawn() { return PM.respawn(); } spawn(number) { PM.spawn(number); } getActiveProcesses() { return PM.processes.length; } } RemoteClassifier.PM = PM; RemoteClassifier.ATTRIBUTES = ATTRIBUTES; //# sourceMappingURL=remote.js.map