{ "version": 3, "sources": ["../../../../server/artemis/remote.ts"], "sourcesContent": ["/**\r\n * Code for using Google's Perspective API for filters.\r\n * @author mia-pi-git\r\n */\r\nimport {ProcessManager, Net, Repl} from '../../lib';\r\nimport {Config} from '../config-loader';\r\nimport {toID} from '../../sim/dex-data';\r\n\r\n// 20m. this is mostly here so we can use Monitor.slow()\r\nconst PM_TIMEOUT = 20 * 60 * 1000;\r\nexport const ATTRIBUTES = {\r\n\t\"SEVERE_TOXICITY\": {},\r\n\t\"TOXICITY\": {},\r\n\t\"IDENTITY_ATTACK\": {},\r\n\t\"INSULT\": {},\r\n\t\"PROFANITY\": {},\r\n\t\"THREAT\": {},\r\n\t\"SEXUALLY_EXPLICIT\": {},\r\n\t\"FLIRTATION\": {},\r\n};\r\n\r\n\r\nexport interface PerspectiveRequest {\r\n\tlanguages: string[];\r\n\trequestedAttributes: AnyObject;\r\n\tcomment: {text: string};\r\n}\r\n\r\nfunction time() {\r\n\treturn Math.floor(Math.floor(Date.now() / 1000) / 60);\r\n}\r\n\r\nexport class Limiter {\r\n\treadonly max: number;\r\n\tlastTick = time();\r\n\tcount = 0;\r\n\tconstructor(max: number) {\r\n\t\tthis.max = max;\r\n\t}\r\n\tshouldRequest() {\r\n\t\tconst now = time();\r\n\t\tif (this.lastTick !== now) {\r\n\t\t\tthis.count = 0;\r\n\t\t\tthis.lastTick = now;\r\n\t\t}\r\n\t\tthis.count++;\r\n\t\treturn this.count < this.max;\r\n\t}\r\n}\r\n\r\nfunction isCommon(message: string) {\r\n\tmessage = message.toLowerCase().replace(/\\?!\\., ;:/g, '');\r\n\treturn ['gg', 'wp', 'ggwp', 'gl', 'hf', 'glhf', 'hello'].includes(message);\r\n}\r\n\r\nlet throttleTime: number | null = null;\r\nexport const limiter = new Limiter(800);\r\nexport const PM = new ProcessManager.QueryProcessManager | null>(module, async text => {\r\n\tif (isCommon(text) || !limiter.shouldRequest()) return null;\r\n\tif (throttleTime && (Date.now() - throttleTime < 10000)) {\r\n\t\treturn null;\r\n\t}\r\n\tif (throttleTime) throttleTime = null;\r\n\r\n\tconst requestData: PerspectiveRequest = {\r\n\t\t// todo - support 'es', 'it', 'pt', 'fr' - use user.language? room.settings.language...?\r\n\t\tlanguages: ['en'],\r\n\t\trequestedAttributes: ATTRIBUTES,\r\n\t\tcomment: {text},\r\n\t};\r\n\ttry {\r\n\t\tconst raw = await Net(`https://commentanalyzer.googleapis.com/v1alpha1/comments:analyze`).post({\r\n\t\t\tquery: {\r\n\t\t\t\tkey: Config.perspectiveKey,\r\n\t\t\t},\r\n\t\t\tbody: JSON.stringify(requestData),\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': \"application/json\",\r\n\t\t\t},\r\n\t\t\ttimeout: 10 * 1000, // 10s\r\n\t\t});\r\n\t\tif (!raw) return null;\r\n\t\tconst data = JSON.parse(raw);\r\n\t\tif (data.error) throw new Error(data.message);\r\n\t\tconst result: {[k: string]: number} = {};\r\n\t\tfor (const k in data.attributeScores) {\r\n\t\t\tconst score = data.attributeScores[k];\r\n\t\t\tresult[k] = score.summaryScore.value;\r\n\t\t}\r\n\t\treturn result;\r\n\t} catch (e: any) {\r\n\t\tthrottleTime = Date.now();\r\n\t\tif (e.message.startsWith('Request timeout')) {\r\n\t\t\t// just ignore this. error on their end not ours.\r\n\t\t\t// todo maybe stop sending requests for a bit?\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tMonitor.crashlog(e, 'A Perspective API request', {request: JSON.stringify(requestData)});\r\n\t\treturn null;\r\n\t}\r\n}, PM_TIMEOUT);\r\n\r\n\r\n// main module check necessary since this gets required in other non-parent processes sometimes\r\n// when that happens we do not want to take over or set up or anything\r\nif (require.main === module) {\r\n\t// This is a child process!\r\n\tglobal.Config = Config;\r\n\tglobal.Monitor = {\r\n\t\tcrashlog(error: Error, source = 'A remote Artemis child process', details: AnyObject | null = null) {\r\n\t\t\tconst repr = JSON.stringify([error.name, error.message, source, details]);\r\n\t\t\tprocess.send!(`THROW\\n@!!@${repr}\\n${error.stack}`);\r\n\t\t},\r\n\t\tslow(text: string) {\r\n\t\t\tprocess.send!(`CALLBACK\\nSLOW\\n${text}`);\r\n\t\t},\r\n\t};\r\n\tglobal.toID = toID;\r\n\tprocess.on('uncaughtException', err => {\r\n\t\tif (Config.crashguard) {\r\n\t\t\tMonitor.crashlog(err, 'A remote Artemis child process');\r\n\t\t}\r\n\t});\r\n\t// eslint-disable-next-line no-eval\r\n\tRepl.start(`abusemonitor-remote-${process.pid}`, cmd => eval(cmd));\r\n} else if (!process.send) {\r\n\tPM.spawn(Config.remoteartemisprocesses || 1);\r\n}\r\n\r\nexport class RemoteClassifier {\r\n\tstatic readonly PM = PM;\r\n\tstatic readonly ATTRIBUTES = ATTRIBUTES;\r\n\tclassify(text: string) {\r\n\t\tif (!Config.perspectiveKey) return Promise.resolve(null);\r\n\t\treturn PM.query(text);\r\n\t}\r\n\tasync suggestScore(text: string, data: Record) {\r\n\t\tif (!Config.perspectiveKey) return Promise.resolve(null);\r\n\t\tconst body: AnyObject = {\r\n\t\t\tcomment: {text},\r\n\t\t\tattributeScores: {},\r\n\t\t};\r\n\t\tfor (const k in data) {\r\n\t\t\tbody.attributeScores[k] = {summaryScore: {value: data[k]}};\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tconst raw = await Net(`https://commentanalyzer.googleapis.com/v1alpha1/comments:suggestscore`).post({\r\n\t\t\t\tquery: {\r\n\t\t\t\t\tkey: Config.perspectiveKey,\r\n\t\t\t\t},\r\n\t\t\t\tbody: JSON.stringify(body),\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t'Content-Type': \"application/json\",\r\n\t\t\t\t},\r\n\t\t\t\ttimeout: 10 * 1000, // 10s\r\n\t\t\t});\r\n\t\t\treturn JSON.parse(raw);\r\n\t\t} catch (e: any) {\r\n\t\t\treturn {error: e.message};\r\n\t\t}\r\n\t}\r\n\tdestroy() {\r\n\t\treturn PM.destroy();\r\n\t}\r\n\trespawn() {\r\n\t\treturn PM.respawn();\r\n\t}\r\n\tspawn(number: number) {\r\n\t\tPM.spawn(number);\r\n\t}\r\n\tgetActiveProcesses() {\r\n\t\treturn PM.processes.length;\r\n\t}\r\n}\r\n\r\n"], "mappings": "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", "names": [] }