Spaces:
Sleeping
Sleeping
{ | |
"version": 3, | |
"sources": ["../../../server/artemis/remote.ts"], | |
"sourcesContent": ["/**\n * Code for using Google's Perspective API for filters.\n * @author mia-pi-git\n */\nimport { ProcessManager, Net, Repl } from '../../lib';\nimport { Config } from '../config-loader';\nimport { toID } from '../../sim/dex-data';\n\n// 20m. this is mostly here so we can use Monitor.slow()\nconst PM_TIMEOUT = 20 * 60 * 1000;\nexport const ATTRIBUTES = {\n\t\"SEVERE_TOXICITY\": {},\n\t\"TOXICITY\": {},\n\t\"IDENTITY_ATTACK\": {},\n\t\"INSULT\": {},\n\t\"PROFANITY\": {},\n\t\"THREAT\": {},\n\t\"SEXUALLY_EXPLICIT\": {},\n\t\"FLIRTATION\": {},\n};\n\nexport interface PerspectiveRequest {\n\tlanguages: string[];\n\trequestedAttributes: AnyObject;\n\tcomment: { text: string };\n}\n\nfunction time() {\n\treturn Math.floor(Math.floor(Date.now() / 1000) / 60);\n}\n\nexport class Limiter {\n\treadonly max: number;\n\tlastTick = time();\n\tcount = 0;\n\tconstructor(max: number) {\n\t\tthis.max = max;\n\t}\n\tshouldRequest() {\n\t\tconst now = time();\n\t\tif (this.lastTick !== now) {\n\t\t\tthis.count = 0;\n\t\t\tthis.lastTick = now;\n\t\t}\n\t\tthis.count++;\n\t\treturn this.count < this.max;\n\t}\n}\n\nfunction isCommon(message: string) {\n\tmessage = message.toLowerCase().replace(/\\?!\\., ;:/g, '');\n\treturn ['gg', 'wp', 'ggwp', 'gl', 'hf', 'glhf', 'hello'].includes(message);\n}\n\nlet throttleTime: number | null = null;\nexport const limiter = new Limiter(800);\nexport const PM = new ProcessManager.QueryProcessManager<string, Record<string, number> | null>(module, async text => {\n\tif (isCommon(text) || !limiter.shouldRequest()) return null;\n\tif (throttleTime && ((Date.now() - throttleTime) < 10000)) {\n\t\treturn null;\n\t}\n\tif (throttleTime) throttleTime = null;\n\n\tconst requestData: PerspectiveRequest = {\n\t\t// todo - support 'es', 'it', 'pt', 'fr' - use user.language? room.settings.language...?\n\t\tlanguages: ['en'],\n\t\trequestedAttributes: ATTRIBUTES,\n\t\tcomment: { text },\n\t};\n\ttry {\n\t\tconst raw = await Net(`https://commentanalyzer.googleapis.com/v1alpha1/comments:analyze`).post({\n\t\t\tquery: {\n\t\t\t\tkey: Config.perspectiveKey,\n\t\t\t},\n\t\t\tbody: JSON.stringify(requestData),\n\t\t\theaders: {\n\t\t\t\t'Content-Type': \"application/json\",\n\t\t\t},\n\t\t\ttimeout: 10 * 1000, // 10s\n\t\t});\n\t\tif (!raw) return null;\n\t\tconst data = JSON.parse(raw);\n\t\tif (data.error) throw new Error(data.message);\n\t\tconst result: { [k: string]: number } = {};\n\t\tfor (const k in data.attributeScores) {\n\t\t\tconst score = data.attributeScores[k];\n\t\t\tresult[k] = score.summaryScore.value;\n\t\t}\n\t\treturn result;\n\t} catch (e: any) {\n\t\t// eslint-disable-next-line require-atomic-updates\n\t\tthrottleTime = Date.now();\n\t\tif (e.message.startsWith('Request timeout') || e.statusCode === 429) {\n\t\t\t// request timeout: just ignore this. error on their end not ours.\n\t\t\t// 429: too many requests, we already freeze for 10s above so. not much more we can do\n\t\t\treturn null;\n\t\t}\n\t\tMonitor.crashlog(e, 'A Perspective API request', { request: JSON.stringify(requestData) });\n\t\treturn null;\n\t}\n}, PM_TIMEOUT);\n\n// main module check necessary since this gets required in other non-parent processes sometimes\n// when that happens we do not want to take over or set up or anything\nif (require.main === module) {\n\t// This is a child process!\n\tglobal.Config = Config;\n\tglobal.Monitor = {\n\t\tcrashlog(error: Error, source = 'A remote Artemis child process', details: AnyObject | null = null) {\n\t\t\tconst repr = JSON.stringify([error.name, error.message, source, details]);\n\t\t\tprocess.send!(`THROW\\n@!!@${repr}\\n${error.stack}`);\n\t\t},\n\t\tslow(text: string) {\n\t\t\tprocess.send!(`CALLBACK\\nSLOW\\n${text}`);\n\t\t},\n\t} as any;\n\tglobal.toID = toID;\n\tprocess.on('uncaughtException', err => {\n\t\tif (Config.crashguard) {\n\t\t\tMonitor.crashlog(err, 'A remote Artemis child process');\n\t\t}\n\t});\n\t// eslint-disable-next-line no-eval\n\tRepl.start(`abusemonitor-remote-${process.pid}`, cmd => eval(cmd));\n} else if (!process.send) {\n\tPM.spawn(Config.remoteartemisprocesses || 1);\n}\n\nexport class RemoteClassifier {\n\tstatic readonly PM = PM;\n\tstatic readonly ATTRIBUTES = ATTRIBUTES;\n\tclassify(text: string) {\n\t\tif (!Config.perspectiveKey) return Promise.resolve(null);\n\t\treturn PM.query(text);\n\t}\n\tasync suggestScore(text: string, data: Record<string, number>) {\n\t\tif (!Config.perspectiveKey) return Promise.resolve(null);\n\t\tconst body: AnyObject = {\n\t\t\tcomment: { text },\n\t\t\tattributeScores: {},\n\t\t};\n\t\tfor (const k in data) {\n\t\t\tbody.attributeScores[k] = { summaryScore: { value: data[k] } };\n\t\t}\n\t\ttry {\n\t\t\tconst raw = await Net(`https://commentanalyzer.googleapis.com/v1alpha1/comments:suggestscore`).post({\n\t\t\t\tquery: {\n\t\t\t\t\tkey: Config.perspectiveKey,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': \"application/json\",\n\t\t\t\t},\n\t\t\t\ttimeout: 10 * 1000, // 10s\n\t\t\t});\n\t\t\treturn JSON.parse(raw);\n\t\t} catch (e: any) {\n\t\t\treturn { error: e.message };\n\t\t}\n\t}\n\tdestroy() {\n\t\treturn PM.destroy();\n\t}\n\trespawn() {\n\t\treturn PM.respawn();\n\t}\n\tspawn(number: number) {\n\t\tPM.spawn(number);\n\t}\n\tgetActiveProcesses() {\n\t\treturn PM.processes.length;\n\t}\n}\n"], | |
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,iBAA0C;AAC1C,2BAAuB;AACvB,sBAAqB;AAGrB,MAAM,aAAa,KAAK,KAAK;AACtB,MAAM,aAAa;AAAA,EACzB,mBAAmB,CAAC;AAAA,EACpB,YAAY,CAAC;AAAA,EACb,mBAAmB,CAAC;AAAA,EACpB,UAAU,CAAC;AAAA,EACX,aAAa,CAAC;AAAA,EACd,UAAU,CAAC;AAAA,EACX,qBAAqB,CAAC;AAAA,EACtB,cAAc,CAAC;AAChB;AAQA,SAAS,OAAO;AACf,SAAO,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI,EAAE;AACrD;AAEO,MAAM,QAAQ;AAAA,EAIpB,YAAY,KAAa;AAFzB,oBAAW,KAAK;AAChB,iBAAQ;AAEP,SAAK,MAAM;AAAA,EACZ;AAAA,EACA,gBAAgB;AACf,UAAM,MAAM,KAAK;AACjB,QAAI,KAAK,aAAa,KAAK;AAC1B,WAAK,QAAQ;AACb,WAAK,WAAW;AAAA,IACjB;AACA,SAAK;AACL,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC1B;AACD;AAEA,SAAS,SAAS,SAAiB;AAClC,YAAU,QAAQ,YAAY,EAAE,QAAQ,cAAc,EAAE;AACxD,SAAO,CAAC,MAAM,MAAM,QAAQ,MAAM,MAAM,QAAQ,OAAO,EAAE,SAAS,OAAO;AAC1E;AAEA,IAAI,eAA8B;AAC3B,MAAM,UAAU,IAAI,QAAQ,GAAG;AAC/B,MAAM,KAAK,IAAI,0BAAe,oBAA2D,QAAQ,OAAM,SAAQ;AACrH,MAAI,SAAS,IAAI,KAAK,CAAC,QAAQ,cAAc;AAAG,WAAO;AACvD,MAAI,gBAAkB,KAAK,IAAI,IAAI,eAAgB,KAAQ;AAC1D,WAAO;AAAA,EACR;AACA,MAAI;AAAc,mBAAe;AAEjC,QAAM,cAAkC;AAAA;AAAA,IAEvC,WAAW,CAAC,IAAI;AAAA,IAChB,qBAAqB;AAAA,IACrB,SAAS,EAAE,KAAK;AAAA,EACjB;AACA,MAAI;AACH,UAAM,MAAM,UAAM,gBAAI,kEAAkE,EAAE,KAAK;AAAA,MAC9F,OAAO;AAAA,QACN,KAAK,4BAAO;AAAA,MACb;AAAA,MACA,MAAM,KAAK,UAAU,WAAW;AAAA,MAChC,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,MACA,SAAS,KAAK;AAAA;AAAA,IACf,CAAC;AACD,QAAI,CAAC;AAAK,aAAO;AACjB,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,KAAK;AAAO,YAAM,IAAI,MAAM,KAAK,OAAO;AAC5C,UAAM,SAAkC,CAAC;AACzC,eAAW,KAAK,KAAK,iBAAiB;AACrC,YAAM,QAAQ,KAAK,gBAAgB,CAAC;AACpC,aAAO,CAAC,IAAI,MAAM,aAAa;AAAA,IAChC;AACA,WAAO;AAAA,EACR,SAAS,GAAP;AAED,mBAAe,KAAK,IAAI;AACxB,QAAI,EAAE,QAAQ,WAAW,iBAAiB,KAAK,EAAE,eAAe,KAAK;AAGpE,aAAO;AAAA,IACR;AACA,YAAQ,SAAS,GAAG,6BAA6B,EAAE,SAAS,KAAK,UAAU,WAAW,EAAE,CAAC;AACzF,WAAO;AAAA,EACR;AACD,GAAG,UAAU;AAIb,IAAI,QAAQ,SAAS,QAAQ;AAE5B,SAAO,SAAS;AAChB,SAAO,UAAU;AAAA,IAChB,SAAS,OAAc,SAAS,kCAAkC,UAA4B,MAAM;AACnG,YAAM,OAAO,KAAK,UAAU,CAAC,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,CAAC;AACxE,cAAQ,KAAM;AAAA,MAAc;AAAA,EAAS,MAAM,OAAO;AAAA,IACnD;AAAA,IACA,KAAK,MAAc;AAClB,cAAQ,KAAM;AAAA;AAAA,EAAmB,MAAM;AAAA,IACxC;AAAA,EACD;AACA,SAAO,OAAO;AACd,UAAQ,GAAG,qBAAqB,SAAO;AACtC,QAAI,4BAAO,YAAY;AACtB,cAAQ,SAAS,KAAK,gCAAgC;AAAA,IACvD;AAAA,EACD,CAAC;AAED,kBAAK,MAAM,uBAAuB,QAAQ,OAAO,SAAO,KAAK,GAAG,CAAC;AAClE,WAAW,CAAC,QAAQ,MAAM;AACzB,KAAG,MAAM,4BAAO,0BAA0B,CAAC;AAC5C;AAEO,MAAM,iBAAiB;AAAA,EAG7B,SAAS,MAAc;AACtB,QAAI,CAAC,4BAAO;AAAgB,aAAO,QAAQ,QAAQ,IAAI;AACvD,WAAO,GAAG,MAAM,IAAI;AAAA,EACrB;AAAA,EACA,MAAM,aAAa,MAAc,MAA8B;AAC9D,QAAI,CAAC,4BAAO;AAAgB,aAAO,QAAQ,QAAQ,IAAI;AACvD,UAAM,OAAkB;AAAA,MACvB,SAAS,EAAE,KAAK;AAAA,MAChB,iBAAiB,CAAC;AAAA,IACnB;AACA,eAAW,KAAK,MAAM;AACrB,WAAK,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,KAAK,CAAC,EAAE,EAAE;AAAA,IAC9D;AACA,QAAI;AACH,YAAM,MAAM,UAAM,gBAAI,uEAAuE,EAAE,KAAK;AAAA,QACnG,OAAO;AAAA,UACN,KAAK,4BAAO;AAAA,QACb;AAAA,QACA,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,SAAS;AAAA,UACR,gBAAgB;AAAA,QACjB;AAAA,QACA,SAAS,KAAK;AAAA;AAAA,MACf,CAAC;AACD,aAAO,KAAK,MAAM,GAAG;AAAA,IACtB,SAAS,GAAP;AACD,aAAO,EAAE,OAAO,EAAE,QAAQ;AAAA,IAC3B;AAAA,EACD;AAAA,EACA,UAAU;AACT,WAAO,GAAG,QAAQ;AAAA,EACnB;AAAA,EACA,UAAU;AACT,WAAO,GAAG,QAAQ;AAAA,EACnB;AAAA,EACA,MAAM,QAAgB;AACrB,OAAG,MAAM,MAAM;AAAA,EAChB;AAAA,EACA,qBAAqB;AACpB,WAAO,GAAG,UAAU;AAAA,EACrB;AACD;AA5Ca,iBACI,KAAK;AADT,iBAEI,aAAa;", | |
"names": [] | |
} | |