Spaces:
Running
Running
{ | |
"version": 3, | |
"sources": ["../../../server/chat-plugins/chat-monitor.ts"], | |
"sourcesContent": ["import { FS, Utils } from '../../lib';\nimport type { FilterWord } from '../chat';\n\nconst LEGACY_MONITOR_FILE = 'config/chat-plugins/chat-monitor.tsv';\nconst MONITOR_FILE = 'config/chat-plugins/chat-filter.json';\nconst WRITE_THROTTLE_TIME = 5 * 60 * 1000;\n\n// Substitution dictionary adapted from https://github.com/ThreeLetters/NoSwearingPlease/blob/master/index.js\n// Licensed under MIT.\nconst EVASION_DETECTION_SUBSTITUTIONS: { [k: string]: string[] } = {\n\ta: [\"a\", \"4\", \"@\", \"\u00E1\", \"\u00E2\", \"\u00E3\", \"\u00E0\", \"\u15E9\", \"A\", \"\u24D0\", \"\u24B6\", \"\u03B1\", \"\u034F\", \"\u20B3\", \"\u00E4\", \"\u00C4\", \"\u13D7\", \"\u03BB\", \"\u0394\", \"\u1E00\", \"\u13AA\", \"\u01DF\", \"\u033E\", \"\uFF41\", \"\uFF21\", \"\u1D00\", \"\u0250\", \"\uD83C\uDD50\", \"\uD835\uDC1A\", \"\uD835\uDC00\", \"\uD835\uDE22\", \"\uD835\uDE08\", \"\uD835\uDE56\", \"\uD835\uDE3C\", \"\uD835\uDCB6\", \"\uD835\uDCEA\", \"\uD835\uDCD0\", \"\uD835\uDD52\", \"\uD835\uDD38\", \"\uD835\uDD1E\", \"\uD835\uDD04\", \"\uD835\uDD86\", \"\uD835\uDD6C\", \"\uD83C\uDD30\", \"\uD83C\uDD70\", \"\uD835\uDC9C\", \"\uD835\uDE8A\", \"\uD835\uDE70\", \"\uA34F\", \"\u0430\", \"\uD835\uDCEA\"],\n\tb: [\"b\", \"8\", \"\u15F7\", \"B\", \"\u24D1\", \"\u24B7\", \"\u0432\", \"\u0E3F\", \"\u1E05\", \"\u1E04\", \"\u13F0\", \"\u03D0\", \"\u0181\", \"\u1E03\", \"\u1E02\", \"\u026E\", \"\uFF42\", \"\uFF22\", \"\u0299\", \"\uD83C\uDD51\", \"\uD835\uDC1B\", \"\uD835\uDC01\", \"\uD835\uDE23\", \"\uD835\uDE09\", \"\uD835\uDE57\", \"\uD835\uDE3D\", \"\uD835\uDCB7\", \"\uD835\uDCEB\", \"\uD835\uDCD1\", \"\uD835\uDD53\", \"\uD835\uDD39\", \"\uD835\uDD1F\", \"\uD835\uDD05\", \"\uD835\uDD87\", \"\uD835\uDD6D\", \"\uD83C\uDD31\", \"\uD83C\uDD71\", \"\uD835\uDC35\", \"\u10A6\", \"\uD835\uDE8B\", \"\uD835\uDE71\", \"\u266D\", \"b\"],\n\tc: [\"c\", \"\u00E7\", \"\u1455\", \"C\", \"\u24D2\", \"\u24B8\", \"\u00A2\", \"\u034F\", \"\u20B5\", \"\u010B\", \"\u010A\", \"\u1348\", \"\u03C2\", \"\u1E09\", \"\u1E08\", \"\u13DF\", \"\u0188\", \"\u033E\", \"\uFF43\", \"\uFF23\", \"\u1D04\", \"\u0254\", \"\uD83C\uDD52\", \"\uD835\uDC1C\", \"\uD835\uDC02\", \"\uD835\uDE24\", \"\uD835\uDE0A\", \"\uD835\uDE58\", \"\uD835\uDE3E\", \"\uD835\uDCB8\", \"\uD835\uDCEC\", \"\uD835\uDCD2\", \"\uD835\uDD54\", \"\u2102\", \"\uD835\uDD20\", \"\u212D\", \"\uD835\uDD88\", \"\uD835\uDD6E\", \"\uD83C\uDD32\", \"\uD83C\uDD72\", \"\uD835\uDC9E\", \"\uD835\uDE8C\", \"\uD835\uDE72\", \"\u263E\", \"\u0441\"],\n\td: [\"d\", \"\u15EA\", \"D\", \"\u24D3\", \"\u24B9\", \"\u2202\", \"\u0110\", \"\u010F\", \"\u010E\", \"\u13B4\", \"\u1E0A\", \"\u13A0\", \"\u0256\", \"\uFF44\", \"\uFF24\", \"\u1D05\", \"\uD83C\uDD53\", \"\uD835\uDC1D\", \"\uD835\uDC03\", \"\uD835\uDE25\", \"\uD835\uDE0B\", \"\uD835\uDE59\", \"\uD835\uDE3F\", \"\uD835\uDCB9\", \"\uD835\uDCED\", \"\uD835\uDCD3\", \"\uD835\uDD55\", \"\u200B\", \"\uD835\uDD21\", \"\uD835\uDD89\", \"\uD835\uDD6F\", \"\uD83C\uDD33\", \"\uD83C\uDD73\", \"\uD835\uDC9F\", \"\u0503\", \"\uD835\uDE8D\", \"\uD835\uDE73\", \"\u25D7\", \"\u217E\"],\n\te: [\"e\", \"3\", \"\u00E9\", \"\u00EA\", \"E\", \"\u24D4\", \"\u24BA\", \"\u0454\", \"\u034F\", \"\u0246\", \"\u1EC7\", \"\u1EC6\", \"\u13CB\", \"\u03B5\", \"\u03A3\", \"\u1E15\", \"\u1E14\", \"\u13AC\", \"\u025B\", \"\u033E\", \"\uFF45\", \"\uFF25\", \"\u1D07\", \"\u01DD\", \"\uD83C\uDD54\", \"\uD835\uDC1E\", \"\uD835\uDC04\", \"\uD835\uDE26\", \"\uD835\uDE0C\", \"\uD835\uDE5A\", \"\uD835\uDE40\", \"\u212F\", \"\uD835\uDCEE\", \"\uD835\uDCD4\", \"\uD835\uDD56\", \"\uD835\uDD3B\", \"\uD835\uDD22\", \"\uD835\uDD07\", \"\uD835\uDD8A\", \"\uD835\uDD70\", \"\uD83C\uDD34\", \"\uD83C\uDD74\", \"\uD835\uDC52\", \"\uD835\uDC38\", \"\u04BD\", \"\uD835\uDE8E\", \"\uD835\uDE74\", \"\u20AC\", \"\u0435\", \"\u0451\", \"\uD835\uDCEE\"],\n\tf: [\"f\", \"\u15B4\", \"F\", \"\u24D5\", \"\u24BB\", \"\u20A3\", \"\u1E1F\", \"\u1E1E\", \"\u13A6\", \"\u0493\", \"\u0284\", \"\uFF46\", \"\uFF26\", \"\u025F\", \"\uD83C\uDD55\", \"\uD835\uDC1F\", \"\uD835\uDC05\", \"\uD835\uDE27\", \"\uD835\uDE0D\", \"\uD835\uDE5B\", \"\uD835\uDE41\", \"\uD835\uDCBB\", \"\uD835\uDCEF\", \"\uD835\uDCD5\", \"\uD835\uDD57\", \"\uD835\uDD3C\", \"\uD835\uDD23\", \"\uD835\uDD08\", \"\uD835\uDD8B\", \"\uD835\uDD71\", \"\uD83C\uDD35\", \"\uD83C\uDD75\", \"\uD835\uDC39\", \"\u03DD\", \"\uD835\uDE8F\", \"\uD835\uDE75\", \"\u03DC\", \"f\", \"\u0191\"],\n\tg: [\"g\", \"q\", \"6\", \"9\", \"G\", \"\u24D6\", \"\u24BC\", \"\u034F\", \"\u20B2\", \"\u0121\", \"\u0120\", \"\u13B6\", \"\u03D1\", \"\u1E20\", \"\u0262\", \"\u033E\", \"\uFF47\", \"\uFF27\", \"\u0183\", \"\uD83C\uDD56\", \"\uD835\uDC20\", \"\uD835\uDC06\", \"\uD835\uDE28\", \"\uD835\uDE0E\", \"\uD835\uDE5C\", \"\uD835\uDE42\", \"\u210A\", \"\uD835\uDCF0\", \"\uD835\uDCD6\", \"\uD835\uDD58\", \"\uD835\uDD3D\", \"\uD835\uDD24\", \"\uD835\uDD09\", \"\uD835\uDD8C\", \"\uD835\uDD72\", \"\uD83C\uDD36\", \"\uD83C\uDD76\", \"\uD835\uDC54\", \"\uD835\uDCA2\", \"\u0260\", \"\uD835\uDE90\", \"\uD835\uDE76\", \"\u2761\", \"\u0581\", \"\uD835\uDE76\", \"\uD835\uDCF0\", \"\u050C\"],\n\th: [\n\t\t\"h\", \"\u157C\", \"H\", \"\u24D7\", \"\u24BD\", \"\u043D\", \"\u2C67\", \"\u1E27\", \"\u1E26\", \"\u13C2\", \"\u0266\", \"\uFF48\", \"\uFF28\", \"\u029C\", \"\u0265\", \"\uD83C\uDD57\", \"\uD835\uDC21\", \"\uD835\uDC07\", \"\uD835\uDE29\", \"\uD835\uDE0F\", \"\uD835\uDE5D\", \"\uD835\uDE43\", \"\uD835\uDCBD\", \"\uD835\uDCF1\", \"\uD835\uDCD7\", \"\uD835\uDD59\", \"\uD835\uDD3E\", \"\uD835\uDD25\", \"\uD835\uDD0A\", \"\uD835\uDD8D\", \"\uD835\uDD73\", \"\uD83C\uDD37\", \"\uD83C\uDD77\", \"\uD835\uDC3B\", \"\u050B\", \"\uD835\uDE91\", \"\uD835\uDE77\", \"\u2644\", \"h\",\n\t],\n\ti: [\"i\", \"!\", \"l\", \"1\", \"\u00ED\", \"I\", \"\u24D8\", \"\u24BE\", \"\u03B9\", \"\u034F\", \"\u0142\", \"\u00EF\", \"\u00CF\", \"\u13A5\", \"\u1E2D\", \"\u1E2C\", \"\u0268\", \"\u033E\", \"\uFF49\", \"\uFF29\", \"\u026A\", \"\u0131\", \"\uD83C\uDD58\", \"\uD835\uDC22\", \"\uD835\uDC08\", \"\uD835\uDE2A\", \"\uD835\uDE10\", \"\uD835\uDE5E\", \"\uD835\uDE44\", \"\uD835\uDCBE\", \"\uD835\uDCF2\", \"\uD835\uDCD8\", \"\uD835\uDD5A\", \"\u210D\", \"\uD835\uDD26\", \"\u210C\", \"\uD835\uDD8E\", \"\uD835\uDD74\", \"\uD83C\uDD38\", \"\uD83C\uDD78\", \"\uD835\uDC3C\", \"\uD835\uDE92\", \"\uD835\uDE78\", \"\u2657\", \"\u0456\", \"\u00A1\", \"|\", \"\uD835\uDCF2\"],\n\tj: [\"j\", \"\u148D\", \"J\", \"\u24D9\", \"\u24BF\", \"\u05E0\", \"\u13E0\", \"\u03F3\", \"\u029D\", \"\uFF4A\", \"\uFF2A\", \"\u1D0A\", \"\u027E\", \"\uD83C\uDD59\", \"\uD835\uDC23\", \"\uD835\uDC09\", \"\uD835\uDE2B\", \"\uD835\uDE11\", \"\uD835\uDE5F\", \"\uD835\uDE45\", \"\uD835\uDCBF\", \"\uD835\uDCF3\", \"\uD835\uDCD9\", \"\uD835\uDD5B\", \"\u200B\", \"\uD835\uDD27\", \"\uD835\uDD8F\", \"\uD835\uDD75\", \"\uD83C\uDD39\", \"\uD83C\uDD79\", \"\uD835\uDCA5\", \"\uD835\uDE93\", \"\uD835\uDE79\", \"\u266A\", \"\u0458\"],\n\tk: [\"k\", \"K\", \"\u24DA\", \"\u24C0\", \"\u043A\", \"\u034F\", \"\u20AD\", \"\u1E33\", \"\u1E32\", \"\u13E6\", \"\u03BA\", \"\u0198\", \"\u04C4\", \"\u033E\", \"\uFF4B\", \"\uFF2B\", \"\u1D0B\", \"\u029E\", \"\uD83C\uDD5A\", \"\uD835\uDC24\", \"\uD835\uDC0A\", \"\uD835\uDE2C\", \"\uD835\uDE12\", \"\uD835\uDE60\", \"\uD835\uDE46\", \"\uD835\uDCC0\", \"\uD835\uDCF4\", \"\uD835\uDCDA\", \"\uD835\uDD5C\", \"\uD835\uDD40\", \"\uD835\uDD28\", \"\u2111\", \"\uD835\uDD90\", \"\uD835\uDD76\", \"\uD83C\uDD3A\", \"\uD83C\uDD7A\", \"\uD835\uDCA6\", \"\u0199\", \"\uD835\uDE94\", \"\uD835\uDE7A\", \"\u03F0\", \"k\", \"\uD835\uDCF4\"],\n\tl: [\"l\", \"i\", \"1\", \"/\", \"|\", \"\u14AA\", \"L\", \"\u24DB\", \"\u24C1\", \"\u2113\", \"\u2C60\", \"\u0140\", \"\u013F\", \"\u13DD\", \"\u1E36\", \"\u13DE\", \"\u029F\", \"\uFF4C\", \"\uFF2C\", \"\uD83C\uDD5B\", \"\uD835\uDC25\", \"\uD835\uDC0B\", \"\uD835\uDE2D\", \"\uD835\uDE13\", \"\uD835\uDE61\", \"\uD835\uDE47\", \"\uD835\uDCC1\", \"\uD835\uDCF5\", \"\uD835\uDCDB\", \"\uD835\uDD5D\", \"\uD835\uDD41\", \"\uD835\uDD29\", \"\u200B\", \"\uD835\uDD91\", \"\uD835\uDD77\", \"\uD83C\uDD3B\", \"\uD83C\uDD7B\", \"\uD835\uDC3F\", \"\u0285\", \"\uD835\uDE95\", \"\uD835\uDE7B\", \"\u21B3\", \"\u217C\"],\n\tm: [\n\t\t\"m\", \"\u15F0\", \"M\", \"\u24DC\", \"\u24C2\", \"\u043C\", \"\u034F\", \"\u20A5\", \"\u1E43\", \"\u1E42\", \"\u13B7\", \"\u03FB\", \"\u039C\", \"\u1E41\", \"\u1E40\", \"\u028D\", \"\u033E\", \"\uFF4D\", \"\uFF2D\", \"\u1D0D\", \"\u026F\", \"\uD83C\uDD5C\", \"\uD835\uDC26\", \"\uD835\uDC0C\", \"\uD835\uDE2E\", \"\uD835\uDE14\", \"\uD835\uDE62\", \"\uD835\uDE48\", \"\uD835\uDCC2\", \"\uD835\uDCF6\", \"\uD835\uDCDC\", \"\uD835\uDD5E\", \"\uD835\uDD42\", \"\uD835\uDD2A\", \"\uD835\uDD0D\", \"\uD835\uDD92\", \"\uD835\uDD78\", \"\uD83C\uDD3C\", \"\uD83C\uDD7C\", \"\uD835\uDC40\", \"\u0271\", \"\uD835\uDE96\", \"\uD835\uDE7C\", \"\u2654\", \"\u217F\",\n\t],\n\tn: [\"n\", \"\u00F1\", \"\u144E\", \"N\", \"\u24DD\", \"\u24C3\", \"\u0438\", \"\u20A6\", \"\u0144\", \"\u0143\", \"\u13C1\", \"\u03C0\", \"\u220F\", \"\u1E46\", \"\u057C\", \"\uFF4E\", \"\uFF2E\", \"\u0274\", \"\uD83C\uDD5D\", \"\uD835\uDC27\", \"\uD835\uDC0D\", \"\uD835\uDE2F\", \"\uD835\uDE15\", \"\uD835\uDE63\", \"\uD835\uDE49\", \"\uD835\uDCC3\", \"\uD835\uDCF7\", \"\uD835\uDCDD\", \"\uD835\uDD5F\", \"\uD835\uDD43\", \"\uD835\uDD2B\", \"\uD835\uDD0E\", \"\uD835\uDD93\", \"\uD835\uDD79\", \"\uD83C\uDD3D\", \"\uD83C\uDD7D\", \"\uD835\uDCA9\", \"\u0273\", \"\uD835\uDE97\", \"\uD835\uDE7D\", \"\u266B\", \"\u0578\", \"\u03B7\", \"\uD835\uDE7D\", \"\u019E\", \"\uD835\uDCF7\", \"\u039D\"],\n\to: [\"o\", \"0\", \"\u00F3\", \"\u00F4\", \"\u00F5\", \"\u00FA\", \"O\", \"\u24DE\", \"\u24C4\", \"\u03C3\", \"\u034F\", \"\u00D8\", \"\u00F6\", \"\u00D6\", \"\u13A7\", \"\u0398\", \"\u1E4F\", \"\u1E4E\", \"\u13BE\", \"\u0585\", \"\u033E\", \"\uFF4F\", \"\uFF2F\", \"\u1D0F\", \"\uD83C\uDD5E\", \"\uD835\uDC28\", \"\uD835\uDC0E\", \"\uD835\uDE30\", \"\uD835\uDE16\", \"\uD835\uDE64\", \"\uD835\uDE4A\", \"\u2134\", \"\uD835\uDCF8\", \"\uD835\uDCDE\", \"\uD835\uDD60\", \"\uD835\uDD44\", \"\uD835\uDD2C\", \"\uD835\uDD0F\", \"\uD835\uDD94\", \"\uD835\uDD7A\", \"\uD83C\uDD3E\", \"\uD83C\uDD7E\", \"\uD835\uDC5C\", \"\uD835\uDCAA\", \"\uD835\uDE98\", \"\uD835\uDE7E\", \"\u2299\", \"\u03BF\"],\n\tp: [\"p\", \"\u146D\", \"P\", \"\u24DF\", \"\u24C5\", \"\u03C1\", \"\u20B1\", \"\u1E57\", \"\u1E56\", \"\u13AE\", \"\u01A4\", \"\u13E2\", \"\u0584\", \"\uFF50\", \"\uFF30\", \"\u1D18\", \"\uD83C\uDD5F\", \"\uD835\uDC29\", \"\uD835\uDC0F\", \"\uD835\uDE31\", \"\uD835\uDE17\", \"\uD835\uDE65\", \"\uD835\uDE4B\", \"\uD835\uDCC5\", \"\uD835\uDCF9\", \"\uD835\uDCDF\", \"\uD835\uDD61\", \"\u2115\", \"\uD835\uDD2D\", \"\uD835\uDD10\", \"\uD835\uDD95\", \"\uD835\uDD7B\", \"\uD83C\uDD3F\", \"\uD83C\uDD7F\", \"\uD835\uDCAB\", \"\uD835\uDE99\", \"\uD835\uDE7F\", \"\u0440\"],\n\tq: [\n\t\t\"q\", \"\u146B\", \"Q\", \"\u24E0\", \"\u24C6\", \"\u034F\", \"\u13A4\", \"\u03C6\", \"\u10B3\", \"\u0566\", \"\u033E\", \"\uFF51\", \"\uFF31\", \"\u03D9\", \"\u01EB\", \"\uD83C\uDD60\", \"\uD835\uDC2A\", \"\uD835\uDC10\", \"\uD835\uDE32\", \"\uD835\uDE18\", \"\uD835\uDE66\", \"\uD835\uDE4C\", \"\uD835\uDCC6\", \"\uD835\uDCFA\", \"\uD835\uDCE0\", \"\uD835\uDD62\", \"\u200B\", \"\uD835\uDD2E\", \"\uD835\uDD11\", \"\uD835\uDD96\", \"\uD835\uDD7C\", \"\uD83C\uDD40\", \"\uD83C\uDD80\", \"\uD835\uDCAC\", \"\uD835\uDE9A\", \"\uD835\uDE80\", \"\u262D\", \"\u051B\",\n\t],\n\tr: [\"r\", \"\u1587\", \"R\", \"\u24E1\", \"\u24C7\", \"\u044F\", \"\u2C64\", \"\u0155\", \"\u0154\", \"\u13D2\", \"\u0433\", \"\u0393\", \"\u1E59\", \"\u1E58\", \"\u0280\", \"\uFF52\", \"\uFF32\", \"\u0279\", \"\uD83C\uDD61\", \"\uD835\uDC2B\", \"\uD835\uDC11\", \"\uD835\uDE33\", \"\uD835\uDE19\", \"\uD835\uDE67\", \"\uD835\uDE4D\", \"\uD835\uDCC7\", \"\uD835\uDCFB\", \"\uD835\uDCE1\", \"\uD835\uDD63\", \"\uD835\uDD46\", \"\uD835\uDD2F\", \"\uD835\uDD12\", \"\uD835\uDD97\", \"\uD835\uDD7D\", \"\uD83C\uDD41\", \"\uD83C\uDD81\", \"\uD835\uDC45\", \"\u027E\", \"\uD835\uDE9B\", \"\uD835\uDE81\", \"\u2608\", \"r\", \"\uD835\uDE81\", \"\uD835\uDCFB\"],\n\ts: [\"s\", \"5\", \"\u1515\", \"S\", \"\u24E2\", \"\u24C8\", \"\u0455\", \"\u034F\", \"\u20B4\", \"\u1E69\", \"\u1E68\", \"\u13D5\", \"\u0405\", \"\u1E60\", \"\u0586\", \"\u033E\", \"\uFF53\", \"\uFF33\", \"\uA731\", \"\uD83C\uDD62\", \"\uD835\uDC2C\", \"\uD835\uDC12\", \"\uD835\uDE34\", \"\uD835\uDE1A\", \"\uD835\uDE68\", \"\uD835\uDE4E\", \"\uD835\uDCC8\", \"\uD835\uDCFC\", \"\uD835\uDCE2\", \"\uD835\uDD64\", \"\u2119\", \"\uD835\uDD30\", \"\uD835\uDD13\", \"\uD835\uDD98\", \"\uD835\uDD7E\", \"\uD83C\uDD42\", \"\uD83C\uDD82\", \"\uD835\uDCAE\", \"\u0282\", \"\uD835\uDE9C\", \"\uD835\uDE82\", \"\u0455\", \"\uD835\uDCFC\"],\n\tt: [\"t\", \"+\", \"T\", \"\u24E3\", \"\u24C9\", \"\u0442\", \"\u20AE\", \"\u1E97\", \"\u1E6E\", \"\u13D6\", \"\u03C4\", \"\u01AC\", \"\u13C6\", \"\u0236\", \"\uFF54\", \"\uFF34\", \"\u1D1B\", \"\u0287\", \"\uD83C\uDD63\", \"\uD835\uDC2D\", \"\uD835\uDC13\", \"\uD835\uDE35\", \"\uD835\uDE1B\", \"\uD835\uDE69\", \"\uD835\uDE4F\", \"\uD835\uDCC9\", \"\uD835\uDCFD\", \"\uD835\uDCE3\", \"\uD835\uDD65\", \"\u200B\", \"\uD835\uDD31\", \"\uD835\uDD14\", \"\uD835\uDD99\", \"\uD835\uDD7F\", \"\uD83C\uDD43\", \"\uD83C\uDD83\", \"\uD835\uDCAF\", \"\u019A\", \"\uD835\uDE9D\", \"\uD835\uDE83\", \"\u2602\", \"t\", \"\uD835\uDCFD\"],\n\tu: [\"u\", \"\u00FA\", \"\u00FC\", \"\u144C\", \"U\", \"\u24E4\", \"\u24CA\", \"\u03C5\", \"\u034F\", \"\u0244\", \"\u00DC\", \"\u13EC\", \"\u01B1\", \"\u1E73\", \"\u1E72\", \"\u028A\", \"\u033E\", \"\uFF55\", \"\uFF35\", \"\u1D1C\", \"\uD83C\uDD64\", \"\uD835\uDC2E\", \"\uD835\uDC14\", \"\uD835\uDE36\", \"\uD835\uDE1C\", \"\uD835\uDE6A\", \"\uD835\uDE50\", \"\uD835\uDCCA\", \"\uD835\uDCFE\", \"\uD835\uDCE4\", \"\uD835\uDD66\", \"\u211A\", \"\uD835\uDD32\", \"\u211C\", \"\uD835\uDD9A\", \"\uD835\uDD80\", \"\uD83C\uDD44\", \"\uD83C\uDD84\", \"\uD835\uDCB0\", \"\uD835\uDE9E\", \"\uD835\uDE84\", \"\u260B\", \"\u057D\"],\n\tv: [\"v\", \"\u142F\", \"V\", \"\u24E5\", \"\u24CB\", \"\u03BD\", \"\u1E7F\", \"\u1E7E\", \"\u13C9\", \"\u01B2\", \"\u1E7C\", \"\u028B\", \"\uFF56\", \"\uFF36\", \"\u1D20\", \"\u028C\", \"\uD83C\uDD65\", \"\uD835\uDC2F\", \"\uD835\uDC15\", \"\uD835\uDE37\", \"\uD835\uDE1D\", \"\uD835\uDE6B\", \"\uD835\uDE51\", \"\uD835\uDCCB\", \"\uD835\uDCFF\", \"\uD835\uDCE5\", \"\uD835\uDD67\", \"\u200B\", \"\uD835\uDD33\", \"\uD835\uDD9B\", \"\uD835\uDD81\", \"\uD83C\uDD45\", \"\uD83C\uDD85\", \"\uD835\uDCB1\", \"\uD835\uDE9F\", \"\uD835\uDE85\", \"\u2713\", \"\u2174\"],\n\tw: [\"w\", \"\u15EF\", \"W\", \"\u24E6\", \"\u24CC\", \"\u03C9\", \"\u034F\", \"\u20A9\", \"\u1E85\", \"\u1E84\", \"\u13C7\", \"\u0448\", \"\u0428\", \"\u1E87\", \"\u1E86\", \"\u13B3\", \"\u0561\", \"\u033E\", \"\uFF57\", \"\uFF37\", \"\u1D21\", \"\u028D\", \"\uD83C\uDD66\", \"\uD835\uDC30\", \"\uD835\uDC16\", \"\uD835\uDE38\", \"\uD835\uDE1E\", \"\uD835\uDE6C\", \"\uD835\uDE52\", \"\uD835\uDCCC\", \"\uD835\uDD00\", \"\uD835\uDCE6\", \"\uD835\uDD68\", \"\u211D\", \"\uD835\uDD34\", \"\uD835\uDD16\", \"\uD835\uDD9C\", \"\uD835\uDD82\", \"\uD83C\uDD46\", \"\uD83C\uDD86\", \"\uD835\uDCB2\", \"\u026F\", \"\uD835\uDEA0\", \"\uD835\uDE86\", \"\u051D\"],\n\tx: [\"x\", \"\u166D\", \"X\", \"\u24E7\", \"\u24CD\", \"\u03C7\", \"\u04FE\", \"\u1E8D\", \"\u1E8C\", \"\u1300\", \"\u03F0\", \"\u0416\", \"\u0445\", \"\u04FC\", \"\uFF58\", \"\uFF38\", \"\uD83C\uDD67\", \"\uD835\uDC31\", \"\uD835\uDC17\", \"\uD835\uDE39\", \"\uD835\uDE1F\", \"\uD835\uDE6D\", \"\uD835\uDE53\", \"\uD835\uDCCD\", \"\uD835\uDD01\", \"\uD835\uDCE7\", \"\uD835\uDD69\", \"\u200B\", \"\uD835\uDD35\", \"\uD835\uDD17\", \"\uD835\uDD9D\", \"\uD835\uDD83\", \"\uD83C\uDD47\", \"\uD83C\uDD87\", \"\uD835\uDCB3\", \"\uD835\uDEA1\", \"\uD835\uDE87\", \"\u2318\", \"\u0445\"],\n\ty: [\n\t\t\"y\", \"Y\", \"\u24E8\", \"\u24CE\", \"\u0443\", \"\u034F\", \"\u024E\", \"\u00FF\", \"\u0178\", \"\u13A9\", \"\u03C8\", \"\u03A8\", \"\u1E8F\", \"\u1E8E\", \"\u13BD\", \"\u0447\", \"\u028F\", \"\u033E\", \"\uFF59\", \"\uFF39\", \"\u028E\", \"\uD83C\uDD68\", \"\uD835\uDC32\", \"\uD835\uDC18\", \"\uD835\uDE3A\", \"\uD835\uDE20\", \"\uD835\uDE6E\", \"\uD835\uDE54\", \"\uD835\uDCCE\", \"\uD835\uDD02\", \"\uD835\uDCE8\", \"\uD835\uDD6A\", \"\uD835\uDD4A\", \"\uD835\uDD36\", \"\uD835\uDD18\", \"\uD835\uDD9E\", \"\uD835\uDD84\", \"\uD83C\uDD48\", \"\uD83C\uDD88\", \"\uD835\uDCB4\", \"\u10E7\", \"\uD835\uDEA2\", \"\uD835\uDE88\", \"\u263F\", \"\u0443\",\n\t],\n\tz: [\"z\", \"\u1614\", \"Z\", \"\u24E9\", \"\u24CF\", \"\u2C6B\", \"\u1E93\", \"\u1E92\", \"\u135A\", \"\u13C3\", \"\u0290\", \"\uFF5A\", \"\uFF3A\", \"\u1D22\", \"\uD83C\uDD69\", \"\uD835\uDC33\", \"\uD835\uDC19\", \"\uD835\uDE3B\", \"\uD835\uDE21\", \"\uD835\uDE6F\", \"\uD835\uDE55\", \"\uD835\uDCCF\", \"\uD835\uDD03\", \"\uD835\uDCE9\", \"\uD835\uDD6B\", \"\uD835\uDD4B\", \"\uD835\uDD37\", \"\uD835\uDD19\", \"\uD835\uDD9F\", \"\uD835\uDD85\", \"\uD83C\uDD49\", \"\uD83C\uDD89\", \"\uD835\uDCB5\", \"\u0225\", \"\uD835\uDEA3\", \"\uD835\uDE89\", \"\u2621\", \"z\", \"\uD835\uDD03\"],\n};\n\nconst filterWords: { [k: string]: Chat.FilterWord[] } = Chat.filterWords;\n\nexport const Filters = new class {\n\treadonly EVASION_DETECTION_SUBSTITUTIONS = EVASION_DETECTION_SUBSTITUTIONS;\n\treadonly EVASION_DETECTION_SUB_STRINGS: { [k: string]: string } = {};\n\tconstructor() {\n\t\tfor (const letter in EVASION_DETECTION_SUBSTITUTIONS) {\n\t\t\tthis.EVASION_DETECTION_SUB_STRINGS[letter] = `[${EVASION_DETECTION_SUBSTITUTIONS[letter].join('')}]`;\n\t\t}\n\t\tthis.load();\n\t}\n\tconstructEvasionRegex(str: string) {\n\t\tconst buf = \"\\\\b\" +\n\t\t\t[...str].map(letter => (this.EVASION_DETECTION_SUB_STRINGS[letter] || letter) + '+').join('\\\\.?') +\n\t\t\t\"\\\\b\";\n\t\treturn new RegExp(buf, 'iu');\n\t}\n\n\tgenerateRegex(word: string, isEvasion = false, isShortener = false, isReplacement = false) {\n\t\ttry {\n\t\t\tif (isEvasion) {\n\t\t\t\treturn this.constructEvasionRegex(word);\n\t\t\t} else {\n\t\t\t\treturn new RegExp((isShortener ? `\\\\b${word}` : word), (isReplacement ? 'igu' : 'iu'));\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\tthrow new Chat.ErrorMessage(\n\t\t\t\te.message.startsWith('Invalid regular expression: ') ? e.message : `Invalid regular expression: /${word}/: ${e.message}`\n\t\t\t);\n\t\t}\n\t}\n\n\tstripWordBoundaries(regex: RegExp) {\n\t\treturn new RegExp(regex.toString().replace('/\\\\b', '').replace('\\\\b/iu', ''), 'iu');\n\t}\n\n\tsave(force = false) {\n\t\tFS(MONITOR_FILE).writeUpdate(() => {\n\t\t\tconst buf: { [k: string]: FilterWord[] } = {};\n\t\t\tfor (const key in Chat.monitors) {\n\t\t\t\tbuf[key] = [];\n\t\t\t\tfor (const filterWord of filterWords[key]) {\n\t\t\t\t\tconst word = { ...filterWord };\n\t\t\t\t\tdelete (word as any).regex; // no reason to save this. does not stringify.\n\t\t\t\t\tbuf[key].push(word);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn JSON.stringify(buf);\n\t\t}, { throttle: force ? 0 : WRITE_THROTTLE_TIME });\n\t}\n\n\tadd(filterWord: Partial<Chat.FilterWord> & { list: string, word: string }) {\n\t\tif (!filterWord.hits) filterWord.hits = 0;\n\t\tconst punishment = Chat.monitors[filterWord.list].punishment;\n\t\tif (!filterWord.regex) {\n\t\t\tfilterWord.regex = this.generateRegex(\n\t\t\t\tfilterWord.word,\n\t\t\t\tpunishment === 'EVASION',\n\t\t\t\tpunishment === 'SHORTENER',\n\t\t\t\t!!filterWord.replacement,\n\t\t\t);\n\t\t}\n\n\t\tif (filterWords[filterWord.list].some(val => String(val.regex) === String(filterWord.regex))) {\n\t\t\tthrow new Chat.ErrorMessage(`${filterWord.word} is already added to the ${filterWord.list} list.`);\n\t\t}\n\n\t\tfilterWords[filterWord.list].push(filterWord as Chat.FilterWord);\n\t\tthis.save(true);\n\t}\n\n\tload() {\n\t\tconst legacy = FS(LEGACY_MONITOR_FILE);\n\t\tif (legacy.existsSync()) {\n\t\t\treturn process.nextTick(() => {\n\t\t\t\tthis.loadLegacy();\n\t\t\t\tlegacy.renameSync(LEGACY_MONITOR_FILE + '.backup');\n\t\t\t\tMonitor.notice(`Legacy chatfilter data loaded and renamed to a .backup file.`);\n\t\t\t});\n\t\t}\n\n\t\tconst data = JSON.parse(FS(MONITOR_FILE).readIfExistsSync() || \"{}\");\n\t\tfor (const k in data) {\n\t\t\tfilterWords[k] = [];\n\t\t\t// previously, this checked to be sure the monitor existed in Chat.monitors and that there was\n\t\t\t// a proper `[LOCATION, PUNISHMENT]` pair. Now, we do not do that, as a frequent issue with the TSV was that\n\t\t\t// plugins with monitors would not be loaded into Chat before the filter words started loading.\n\t\t\t// as such, they would crash, and usually it would lead to the words being overwritten and lost altogether\n\t\t\t// Therefore, instead of throwing if it isn't found, we just add it to the list anyway.\n\t\t\t// either a) the monitor will be loaded later, and all will be well\n\t\t\t// or b) the monitor doesn't exist anymore,\n\t\t\t// in which case it can either be deleted manually or the data will be fine if the monitor is re-added later\n\t\t\tfor (const entry of data[k]) {\n\t\t\t\tif (k === 'evasion') {\n\t\t\t\t\tentry.regex = this.constructEvasionRegex(entry.word);\n\t\t\t\t} else {\n\t\t\t\t\tentry.regex = new RegExp(\n\t\t\t\t\t\tk === 'shorteners' ? `\\\\b${entry.word}` : entry.word,\n\t\t\t\t\t\tentry.replacement ? 'igu' : 'iu'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tfilterWords[k].push(entry);\n\t\t\t}\n\t\t}\n\t}\n\n\tloadLegacy() {\n\t\tlet data;\n\t\ttry {\n\t\t\tdata = FS(LEGACY_MONITOR_FILE).readSync();\n\t\t} catch (e: any) {\n\t\t\tif (e.code !== 'ENOENT') throw e;\n\t\t}\n\t\tif (!data) return;\n\t\tconst lines = data.split('\\n');\n\t\tloop: for (const line of lines) {\n\t\t\tif (!line || line === '\\r') continue;\n\t\t\tconst [location, word, punishment, reason, times, ...rest] = line.split('\\t').map(param => param.trim());\n\t\t\tif (location === 'Location') continue;\n\t\t\tif (!(location && word && punishment)) continue;\n\t\t\tfor (const key in Chat.monitors) {\n\t\t\t\tif (Chat.monitors[key].location === location && Chat.monitors[key].punishment === punishment) {\n\t\t\t\t\tconst replacement = rest[0];\n\t\t\t\t\tconst publicReason = rest[1];\n\t\t\t\t\tlet regex: RegExp;\n\t\t\t\t\tif (punishment === 'EVASION') {\n\t\t\t\t\t\tregex = Filters.constructEvasionRegex(word);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tregex = new RegExp(punishment === 'SHORTENER' ? `\\\\b${word}` : word, replacement ? 'igu' : 'iu');\n\t\t\t\t\t}\n\n\t\t\t\t\tconst filterWord: FilterWord = { regex, word, hits: parseInt(times) || 0 };\n\n\t\t\t\t\t// \"undefined\" is the result of an issue with filter storage.\n\t\t\t\t\t// As far as I'm aware, nothing is actually filtered with \"undefined\" as the reason.\n\t\t\t\t\tif (reason && reason !== \"undefined\") filterWord.reason = reason;\n\t\t\t\t\tif (publicReason) filterWord.publicReason = publicReason;\n\t\t\t\t\tif (replacement) filterWord.replacement = replacement;\n\t\t\t\t\tfilterWords[key].push(filterWord);\n\t\t\t\t\tcontinue loop;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// this is not thrown because we DO NOT WANT SECRET FILTERS TO BE LEAKED, but we want this to be known\n\t\t\t// (this sends the filter line info only in the email, but still reports the crash to Dev)\n\t\t\tMonitor.crashlog(new Error(\"Couldn't find [location, punishment] pair for a filter word\"), \"The main process\", {\n\t\t\t\tlocation, word, punishment, reason, times, rest,\n\t\t\t});\n\t\t}\n\t}\n};\n\n// Register the chat monitors used\nChat.registerMonitor('autolock', {\n\tlocation: 'EVERYWHERE',\n\tpunishment: 'AUTOLOCK',\n\tlabel: 'Autolock',\n\tmonitor(line, room, user, message, lcMessage, isStaff) {\n\t\tconst { regex, word, reason, publicReason } = line;\n\t\tconst match = regex.exec(lcMessage);\n\t\tif (match) {\n\t\t\tif (isStaff) return `${message} __[would be locked: ${word}${reason ? ` (${reason})` : ''}]__`;\n\t\t\tmessage = message.replace(/(https?):\\/\\//g, '$1__:__//');\n\t\t\tmessage = message.replace(/\\./g, '__.__');\n\t\t\tif (room) {\n\t\t\t\tvoid Punishments.autolock(\n\t\t\t\t\tuser, room, 'ChatMonitor', `Filtered phrase: ${word}`,\n\t\t\t\t\t`<<${room.roomid}>> ${user.name}: ||\\`\\`${message}\\`\\`${reason ? ` __(${reason})__` : ''}||`, true\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.errorReply(`Please do not say '${match[0]}'${publicReason ? ` ${publicReason}` : ``}.`);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t},\n});\n\nChat.registerMonitor('publicwarn', {\n\tlocation: 'PUBLIC',\n\tpunishment: 'WARN',\n\tlabel: 'Filtered in public',\n\tmonitor(line, room, user, message, lcMessage, isStaff) {\n\t\tconst { regex, word, reason, publicReason } = line;\n\t\tconst match = regex.exec(lcMessage);\n\t\tif (match) {\n\t\t\tif (isStaff) return `${message} __[would be filtered in public: ${word}${reason ? ` (${reason})` : ''}]__`;\n\t\t\tthis.errorReply(`Please do not say '${match[0]}'${publicReason ? ` ${publicReason}` : ``}.`);\n\t\t\treturn false;\n\t\t}\n\t},\n});\n\nChat.registerMonitor('warn', {\n\tlocation: 'EVERYWHERE',\n\tpunishment: 'WARN',\n\tlabel: 'Filtered',\n\tmonitor(line, room, user, message, lcMessage, isStaff) {\n\t\tconst { regex, word, reason, publicReason } = line;\n\t\tconst match = regex.exec(lcMessage);\n\t\tif (match) {\n\t\t\tif (isStaff) return `${message} __[would be filtered: ${word}${reason ? ` (${reason})` : ''}]__`;\n\t\t\tthis.errorReply(`Please do not say '${match[0]}'${publicReason ? ` ${publicReason}` : ``}.`);\n\t\t\treturn false;\n\t\t}\n\t},\n});\n\nChat.registerMonitor('evasion', {\n\tlocation: 'EVERYWHERE',\n\tpunishment: 'EVASION',\n\tlabel: 'Filter Evasion Detection',\n\tmonitor(line, room, user, message, lcMessage, isStaff) {\n\t\tconst { regex, word, reason, publicReason } = line;\n\n\t\t// Many codepoints used in filter evasion detection can be decomposed\n\t\t// into multiple codepoints that are canonically equivalent to the\n\t\t// original. Perform a canonical composition on the message to detect\n\t\t// when people attempt to evade by abusing this behaviour of Unicode.\n\t\tlet normalizedMessage = lcMessage.normalize('NFKC');\n\n\t\t// Normalize spaces and other common evasion characters to a period\n\t\tnormalizedMessage = normalizedMessage.replace(/[\\s-_,.]+/g, '.');\n\n\t\tconst match = regex.exec(normalizedMessage);\n\t\tif (match) {\n\t\t\t// Don't lock someone iff the word itself is used, and whitespace wasn't used to evade the filter,\n\t\t\t// in which case message (which doesn't have whitespace stripped) should also match the regex.\n\t\t\tif (match[0] === word && regex.test(message)) {\n\t\t\t\tif (isStaff) return `${message} __[would be filtered: ${word}${reason ? ` (${reason})` : ''}]__`;\n\t\t\t\tthis.errorReply(`Do not say '${word}'.`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (isStaff) return `${message} __[would be locked for filter evading: ${match[0]} (${word})]__`;\n\t\t\tmessage = message.replace(/(https?):\\/\\//g, '$1__:__//');\n\t\t\tif (room) {\n\t\t\t\tvoid Punishments.autolock(\n\t\t\t\t\tuser, room, 'FilterEvasionMonitor', `Evading filter: ${message} (${match[0]} => ${word})`,\n\t\t\t\t\t`<<${room.roomid}>> ${user.name}: ||\\`\\`${message}\\`\\` __(${match[0]} => ${word})__||`, true\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.errorReply(`Please do not say '${word}'${publicReason ? ` ${publicReason}` : ``}.`);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t},\n});\n\nChat.registerMonitor('wordfilter', {\n\tlocation: 'EVERYWHERE',\n\tpunishment: 'FILTERTO',\n\tlabel: 'Filtered to a different phrase',\n\tcondition: 'notStaff',\n\tmonitor(line, room, user, message, lcMessage, isStaff) {\n\t\tconst { regex, replacement } = line;\n\t\tlet match = regex.exec(message);\n\t\twhile (match) {\n\t\t\tlet filtered = replacement || '';\n\t\t\tif (match[0] === match[0].toUpperCase()) filtered = filtered.toUpperCase();\n\t\t\tif (match[0].startsWith(match[0].charAt(0).toUpperCase())) {\n\t\t\t\tfiltered = `${filtered ? filtered.charAt(0).toUpperCase() : ''}${filtered.slice(1)}`;\n\t\t\t}\n\t\t\tmessage = message.replace(match[0], filtered);\n\t\t\tmatch = regex.exec(message);\n\t\t}\n\t\treturn message;\n\t},\n});\n\nChat.registerMonitor('namefilter', {\n\tlocation: 'NAMES',\n\tpunishment: 'WARN',\n\tlabel: 'Filtered in names',\n});\n\nChat.registerMonitor('battlefilter', {\n\tlocation: 'BATTLES',\n\tpunishment: 'MUTE',\n\tlabel: 'Filtered in battles',\n\tmonitor(line, room, user, message, lcMessage, isStaff) {\n\t\tconst { regex, word, reason, publicReason } = line;\n\t\tconst match = regex.exec(lcMessage);\n\t\tif (match) {\n\t\t\tif (isStaff) return `${message} __[would be filtered: ${word}${reason ? ` (${reason})` : ''}]__`;\n\t\t\tmessage = message.replace(/(https?):\\/\\//g, '$1__:__//');\n\t\t\tmessage = message.replace(/\\./g, '__.__');\n\t\t\tif (room) {\n\t\t\t\troom.mute(user);\n\t\t\t\tthis.errorReply(\n\t\t\t\t\t`You have been muted for using a banned phrase. Please do not say '${match[0]}'${publicReason ? ` ${publicReason}` : ``}.`\n\t\t\t\t);\n\t\t\t\tconst text = `[BattleMonitor] <<${room.roomid}>> MUTED: ${user.name}: ${message}${reason ? ` __(${reason})__` : ''}`;\n\t\t\t\tconst adminlog = Rooms.get('adminlog');\n\t\t\t\tif (adminlog) {\n\t\t\t\t\tadminlog.add(`|c|~|${text}`).update();\n\t\t\t\t} else {\n\t\t\t\t\tMonitor.log(text);\n\t\t\t\t}\n\t\t\t\tvoid (room as GameRoom).uploadReplay(user, this.connection, 'forpunishment');\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t},\n});\n\nChat.registerMonitor('shorteners', {\n\tlocation: 'EVERYWHERE',\n\tpunishment: 'SHORTENER',\n\tlabel: 'URL Shorteners',\n\tcondition: 'notTrusted',\n\tmonitor(line, room, user, message, lcMessage, isStaff) {\n\t\tconst { regex, word, publicReason } = line;\n\t\tif (regex.test(lcMessage)) {\n\t\t\tif (isStaff) return `${message} __[shortener: ${word}]__`;\n\t\t\tthis.errorReply(`Please do not use URL shorteners such as '${word}'${publicReason ? ` ${publicReason}` : ``}.`);\n\t\t\treturn false;\n\t\t}\n\t},\n});\n\n/*\n * Columns Location and Punishment use keywords. Possible values:\n *\n * Location: EVERYWHERE, PUBLIC, NAMES, BATTLES\n * Punishment: AUTOLOCK, WARN, FILTERTO, SHORTENER, MUTE, EVASION\n */\n\n/* The sucrase transformation of optional chaining is too expensive to be used in a hot function like this. */\n/* eslint-disable @typescript-eslint/prefer-optional-chain */\nexport const chatfilter: Chat.ChatFilter = function (message, user, room) {\n\tlet lcMessage = message\n\t\t.replace(/\\u039d/g, 'N').toLowerCase()\n\t\t// eslint-disable-next-line no-misleading-character-class\n\t\t.replace(/[\\u200b\\u007F\\u00AD\\uDB40\\uDC00\\uDC21]/g, '')\n\t\t.replace(/\\u03bf/g, 'o')\n\t\t.replace(/\\u043e/g, 'o')\n\t\t.replace(/\\u0430/g, 'a')\n\t\t.replace(/\\u0435/g, 'e')\n\t\t.replace(/\\u039d/g, 'e');\n\tlcMessage = lcMessage.replace(/__|\\*\\*|``|\\[\\[|\\]\\]/g, '');\n\n\tconst isStaffRoom = room && (\n\t\t(room.persist && room.roomid.endsWith('staff')\n\t\t) || room.roomid.startsWith('help-'));\n\tconst isStaff = isStaffRoom || user.isStaff || !!(this.pmTarget && this.pmTarget.isStaff);\n\n\tfor (const list in Chat.monitors) {\n\t\tconst { location, condition, monitor } = Chat.monitors[list];\n\t\tif (!monitor) continue;\n\t\t// Ignore challenge games, which are unrated and not part of roomtours.\n\t\tif (location === 'BATTLES' && !(room && room.battle && room.battle.challengeType !== 'challenge')) continue;\n\t\tif (location === 'PUBLIC' && room && room.settings.isPrivate === true) continue;\n\n\t\tswitch (condition) {\n\t\tcase 'notTrusted':\n\t\t\tif (user.trusted && !isStaffRoom) continue;\n\t\t\tbreak;\n\t\tcase 'notStaff':\n\t\t\tif (isStaffRoom) continue;\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (const line of Chat.filterWords[list]) {\n\t\t\tconst ret = monitor.call(this, line, room, user, message, lcMessage, isStaff);\n\t\t\tif (ret !== undefined && ret !== message) {\n\t\t\t\tline.hits++;\n\t\t\t\tFilters.save();\n\t\t\t}\n\t\t\tif (typeof ret === 'string') {\n\t\t\t\tmessage = ret;\n\t\t\t} else if (ret === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn message;\n};\n/* eslint-enable @typescript-eslint/prefer-optional-chain */\n\nexport const namefilter: Chat.NameFilter = (name, user) => {\n\tconst id = toID(name);\n\tif (Punishments.namefilterwhitelist.has(id)) return name;\n\tif (Monitor.forceRenames.has(id)) {\n\t\tif (typeof Monitor.forceRenames.get(id) === 'number') {\n\t\t\t// we check this for hotpatching reasons, since on the initial chat patch this will still be a Utils.Multiset\n\t\t\t// we're gonna assume no one has seen it since that covers people who _haven't_ actually, and those who have\n\t\t\t// likely will not be attempting to log into it\n\t\t\tMonitor.forceRenames.set(id, false);\n\t\t}\n\t\t// false means the user has not seen it yet\n\t\tif (!Monitor.forceRenames.get(id)) {\n\t\t\tuser.trackRename = id;\n\t\t\tMonitor.forceRenames.set(id, true);\n\t\t}\n\t\t// Don't allow reuse of forcerenamed names\n\t\treturn '';\n\t}\n\tif (id === toID(user.trackRename)) return '';\n\tlet lcName = name\n\t\t.replace(/\\u039d/g, 'N').toLowerCase()\n\t\t.replace(/[\\u200b\\u007F\\u00AD]/g, '')\n\t\t.replace(/\\u03bf/g, 'o')\n\t\t.replace(/\\u043e/g, 'o')\n\t\t.replace(/\\u0430/g, 'a')\n\t\t.replace(/\\u0435/g, 'e')\n\t\t.replace(/\\u039d/g, 'e');\n\t// Remove false positives.\n\tlcName = lcName.replace('herapist', '').replace('grape', '').replace('scrape', '');\n\n\tfor (const list in filterWords) {\n\t\tif (!Chat.monitors[list] || Chat.monitors[list].location === 'BATTLES') continue;\n\t\tconst punishment = Chat.monitors[list].punishment;\n\t\tfor (const line of filterWords[list]) {\n\t\t\tconst regex = (punishment === 'EVASION' ? Filters.stripWordBoundaries(line.regex) : line.regex);\n\t\t\tif (regex.test(lcName)) {\n\t\t\t\tif (Chat.monitors[list].punishment === 'AUTOLOCK') {\n\t\t\t\t\tvoid Punishments.autolock(\n\t\t\t\t\t\tuser, 'staff', `NameMonitor`, `inappropriate name: ${name}`,\n\t\t\t\t\t\t`using an inappropriate name: ||${name} (from ${user.name})||`, false, name\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tline.hits++;\n\t\t\t\tFilters.save();\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t}\n\treturn name;\n};\nexport const loginfilter: Chat.LoginFilter = user => {\n\tif (user.namelocked) return;\n\tif (user.trackRename) {\n\t\tconst manualForceRename = Monitor.forceRenames.has(toID(user.trackRename));\n\t\tRooms.global.notifyRooms(\n\t\t\t['staff'],\n\t\t\tUtils.html`|html|[NameMonitor] Username used: <span class=\"username\">${user.name}</span> ${user.getAccountStatusString()} (${!manualForceRename ? 'automatically ' : ''}forcerenamed from <span class=\"username\">${user.trackRename}</span>)`\n\t\t);\n\t\tuser.trackRename = '';\n\t}\n\tconst offlineWarn = Punishments.offlineWarns.get(user.id);\n\tif (typeof offlineWarn !== 'undefined') {\n\t\tuser.send(`|c|~|/warn You were warned while offline${offlineWarn.length ? `: ${offlineWarn}` : '.'}`);\n\t\tPunishments.offlineWarns.delete(user.id);\n\t}\n};\nexport const nicknamefilter: Chat.NicknameFilter = (name, user) => {\n\tlet lcName = name\n\t\t.replace(/\\u039d/g, 'N').toLowerCase()\n\t\t.replace(/[\\u200b\\u007F\\u00AD]/g, '')\n\t\t.replace(/\\u03bf/g, 'o')\n\t\t.replace(/\\u043e/g, 'o')\n\t\t.replace(/\\u0430/g, 'a')\n\t\t.replace(/\\u0435/g, 'e')\n\t\t.replace(/\\u039d/g, 'e');\n\t// Remove false positives.\n\tlcName = lcName.replace('herapist', '').replace('grape', '').replace('scrape', '');\n\n\tfor (const list in filterWords) {\n\t\tif (!Chat.monitors[list]) continue;\n\t\tif (Chat.monitors[list].location === 'BATTLES') continue;\n\t\tfor (const line of filterWords[list]) {\n\t\t\tlet { regex, word } = line;\n\t\t\tif (Chat.monitors[list].punishment === 'EVASION') {\n\t\t\t\t// Evasion banwords by default require whitespace on either side.\n\t\t\t\t// If we didn't remove it here, it would be quite easy to evade the filter\n\t\t\t\t// and use slurs in Pok\u00E9mon nicknames.\n\t\t\t\tregex = Filters.stripWordBoundaries(regex);\n\t\t\t}\n\n\t\t\tconst match = regex.exec(lcName);\n\t\t\tif (match) {\n\t\t\t\tif (Chat.monitors[list].punishment === 'AUTOLOCK') {\n\t\t\t\t\tvoid Punishments.autolock(\n\t\t\t\t\t\tuser, 'staff', `NameMonitor`, `inappropriate Pok\u00E9mon nickname: ${name}`,\n\t\t\t\t\t\t`${user.name} - using an inappropriate Pok\u00E9mon nickname: ||${name}||`, true\n\t\t\t\t\t);\n\t\t\t\t} else if (Chat.monitors[list].punishment === 'EVASION' && match[0] !== lcName) {\n\t\t\t\t\t// Don't autolock unless it's an evasion regex and they're evading\n\t\t\t\t\tvoid Punishments.autolock(\n\t\t\t\t\t\tuser, 'staff', 'FilterEvasionMonitor', `Evading filter in Pok\u00E9mon nickname (${name} => ${word})`,\n\t\t\t\t\t\t`${user.name}: Pok\u00E9mon nicknamed ||\\`\\`${name} => ${word}\\`\\`||`, true\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tline.hits++;\n\t\t\t\tFilters.save();\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t}\n\n\treturn name;\n};\nexport const statusfilter: Chat.StatusFilter = (status, user) => {\n\tlet lcStatus = status\n\t\t.replace(/\\u039d/g, 'N').toLowerCase()\n\t\t.replace(/[\\u200b\\u007F\\u00AD]/g, '')\n\t\t.replace(/\\u03bf/g, 'o')\n\t\t.replace(/\\u043e/g, 'o')\n\t\t.replace(/\\u0430/g, 'a')\n\t\t.replace(/\\u0435/g, 'e')\n\t\t.replace(/\\u039d/g, 'e');\n\t// Remove false positives.\n\tlcStatus = lcStatus.replace('herapist', '').replace('grape', '').replace('scrape', '');\n\t// Check for blatant staff impersonation attempts. Ideally this could be completely generated from Config.grouplist\n\t// for better support for side servers, but not all ranks are staff ranks or should necessarily be filted.\n\tconst impersonationRegex = /\\b(?:global|room|upper|senior)?\\s*(?:staff|admin|administrator|leader|owner|founder|mod|moderator|driver|voice|operator|sysop|creator)\\b/gi;\n\tif (!user.can('lock') && impersonationRegex.test(lcStatus)) return '';\n\n\tfor (const list in filterWords) {\n\t\tif (!Chat.monitors[list]) continue;\n\t\tconst punishment = Chat.monitors[list].punishment;\n\t\tfor (const line of filterWords[list]) {\n\t\t\tconst regex = (punishment === 'EVASION' ? Filters.stripWordBoundaries(line.regex) : line.regex);\n\t\t\tif (regex.test(lcStatus)) {\n\t\t\t\tif (punishment === 'AUTOLOCK') {\n\t\t\t\t\t// I'm only locking for true autolock phrases, not evasion of slurs\n\t\t\t\t\t// because someone might understandably expect a popular slur to be\n\t\t\t\t\t// already registered and therefore try to make the name different from the original slur.\n\t\t\t\t\tvoid Punishments.autolock(\n\t\t\t\t\t\tuser, 'staff', `NameMonitor`, `inappropriate status message: ${status}`,\n\t\t\t\t\t\t`${user.name} - using an inappropriate status: ||${status}||`, true\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tline.hits++;\n\t\t\t\tFilters.save();\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t}\n\n\treturn status;\n};\n\nexport const pages: Chat.PageTable = {\n\tfilters(query, user, connection) {\n\t\tif (!user.named) return Rooms.RETRY_AFTER_LOGIN;\n\t\tthis.title = 'Filters';\n\t\tlet buf = `<div class=\"pad ladder\"><h2>Filters</h2>`;\n\t\tif (!user.can('addhtml')) this.checkCan('lock');\n\t\tlet content = ``;\n\t\tfor (const key in Chat.monitors) {\n\t\t\tcontent += `<tr><th colspan=\"2\"><h3>${Chat.monitors[key].label} <span style=\"font-size:8pt;\">[${key}]</span></h3></tr></th>`;\n\t\t\tif (filterWords[key].length) {\n\t\t\t\tcontent += filterWords[key].map(({ regex, word, reason, publicReason, replacement, hits }) => {\n\t\t\t\t\tlet entry = Utils.html`<abbr title=\"${reason}\"><code>${word}</code></abbr>`;\n\t\t\t\t\tif (publicReason) entry += Utils.html` <small>(public reason: ${publicReason})</small>`;\n\t\t\t\t\tif (replacement) entry += Utils.html` ⇒ ${replacement}`;\n\t\t\t\t\treturn `<tr><td>${entry}</td><td>${hits}</td></tr>`;\n\t\t\t\t}).join('');\n\t\t\t}\n\t\t}\n\n\t\tif (Punishments.namefilterwhitelist.size) {\n\t\t\tcontent += `<tr><th colspan=\"2\"><h3>Whitelisted names</h3></tr></th>`;\n\t\t\tfor (const [val] of Punishments.namefilterwhitelist) {\n\t\t\t\tcontent += `<tr><td>${val}</td></tr>`;\n\t\t\t}\n\t\t}\n\t\tif (!content) {\n\t\t\tbuf += `<p>There are no filtered words.</p>`;\n\t\t} else {\n\t\t\tbuf += `<table>${content}</table>`;\n\t\t}\n\t\tbuf += `</div>`;\n\t\treturn buf;\n\t},\n};\n\nexport const commands: Chat.ChatCommands = {\n\tfilters: 'filter',\n\tfilter: {\n\t\tadd(target, room, user) {\n\t\t\tthis.checkCan('rangeban');\n\n\t\t\tlet separator = ',';\n\t\t\tif (target.includes('\\n')) {\n\t\t\t\tseparator = '\\n';\n\t\t\t} else if (target.includes('/')) {\n\t\t\t\tseparator = '/';\n\t\t\t}\n\n\t\t\tlet [list, ...rest] = target.split(separator);\n\t\t\tlist = toID(list);\n\n\t\t\tif (!list || !rest.length) {\n\t\t\t\treturn this.errorReply(`Syntax: /filter add list ${separator} word ${separator} reason [${separator} optional public reason]`);\n\t\t\t}\n\n\t\t\tif (!(list in filterWords)) {\n\t\t\t\treturn this.errorReply(`Invalid list: ${list}. Possible options: ${Object.keys(filterWords).join(', ')}`);\n\t\t\t}\n\n\t\t\tconst filterWord = { list, word: '' } as Partial<FilterWord> & { list: string, word: string };\n\n\t\t\trest = rest.map(part => part.trim());\n\t\t\tif (Chat.monitors[list].punishment === 'FILTERTO') {\n\t\t\t\t[filterWord.word, filterWord.replacement, filterWord.reason, filterWord.publicReason] = rest;\n\t\t\t\tif (!filterWord.replacement) {\n\t\t\t\t\treturn this.errorReply(\n\t\t\t\t\t\t`Syntax for word filters: /filter add ${list} ${separator} regex ${separator} reason [${separator} optional public reason]`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t[filterWord.word, filterWord.reason, filterWord.publicReason] = rest;\n\t\t\t}\n\n\t\t\tfilterWord.word = filterWord.word.trim();\n\t\t\tif (!filterWord.word) {\n\t\t\t\treturn this.errorReply(`Invalid word: '${filterWord.word}'.`);\n\t\t\t}\n\t\t\tFilters.add(filterWord);\n\t\t\tconst reason = filterWord.reason ? ` (${filterWord.reason})` : '';\n\t\t\tif (Chat.monitors[list].punishment === 'FILTERTO') {\n\t\t\t\tthis.globalModlog(`ADDFILTER`, null, `'${String(filterWord.regex)} => ${filterWord.replacement}' to ${list} list${reason}`);\n\t\t\t} else {\n\t\t\t\tthis.globalModlog(`ADDFILTER`, null, `'${filterWord.word}' to ${list} list${reason}`);\n\t\t\t}\n\t\t\tconst output = `'${filterWord.word}' was added to the ${list} list.`;\n\t\t\tRooms.get('upperstaff')?.add(output).update();\n\t\t\tif (room?.roomid !== 'upperstaff') this.sendReply(output);\n\t\t},\n\t\tremove(target, room, user) {\n\t\t\tthis.checkCan('rangeban');\n\n\t\t\tlet [list, ...words] = target.split(target.includes('\\n') ? '\\n' : ',').map(param => param.trim());\n\t\t\tlist = toID(list);\n\n\t\t\tif (!list || !words.length) return this.errorReply(\"Syntax: /filter remove list, words\");\n\n\t\t\tif (!(list in filterWords)) {\n\t\t\t\treturn this.errorReply(`Invalid list: ${list}. Possible options: ${Object.keys(filterWords).join(', ')}`);\n\t\t\t}\n\n\t\t\tconst notFound = words.filter(val => !filterWords[list].filter(entry => entry.word === val).length);\n\t\t\tif (notFound.length) {\n\t\t\t\treturn this.errorReply(`${notFound.join(', ')} ${Chat.plural(notFound, \"are\", \"is\")} not on the ${list} list.`);\n\t\t\t}\n\t\t\tfilterWords[list] = filterWords[list].filter(entry => !words.includes(entry.word));\n\n\t\t\tthis.globalModlog(`REMOVEFILTER`, null, `'${words.join(', ')}' from ${list} list`);\n\t\t\tFilters.save(true);\n\t\t\tconst output = `'${words.join(', ')}' ${Chat.plural(words, \"were\", \"was\")} removed from the ${list} list.`;\n\t\t\tRooms.get('upperstaff')?.add(output).update();\n\t\t\tif (room?.roomid !== 'upperstaff') this.sendReply(output);\n\t\t},\n\t\t'': 'view',\n\t\tlist: 'view',\n\t\tview(target, room, user) {\n\t\t\tthis.parse(`/join view-filters`);\n\t\t},\n\t\thelp(target, room, user) {\n\t\t\tthis.parse(`/help filter`);\n\t\t},\n\t\ttest(target, room, user) {\n\t\t\tthis.checkCan('lock');\n\t\t\tif (room && ['staff', 'upperstaff'].includes(room.roomid)) {\n\t\t\t\tthis.runBroadcast(true, `!filter test ${target}`);\n\t\t\t}\n\n\t\t\tconst lcMessage = Chat.stripFormatting(target\n\t\t\t\t.replace(/\\u039d/g, 'N')\n\t\t\t\t.toLowerCase()\n\t\t\t\t// eslint-disable-next-line no-misleading-character-class\n\t\t\t\t.replace(/[\\u200b\\u007F\\u00AD\\uDB40\\uDC00\\uDC21]/g, '')\n\t\t\t\t.replace(/\\u03bf/g, 'o')\n\t\t\t\t.replace(/\\u043e/g, 'o')\n\t\t\t\t.replace(/\\u0430/g, 'a')\n\t\t\t\t.replace(/\\u0435/g, 'e')\n\t\t\t\t.replace(/\\u039d/g, 'e'));\n\t\t\tconst buf = [];\n\t\t\tfor (const monitorName in Chat.monitors) {\n\t\t\t\tconst monitor = Chat.monitors[monitorName];\n\t\t\t\tfor (const line of Chat.filterWords[monitorName]) {\n\t\t\t\t\tlet ret;\n\t\t\t\t\tif (monitor.monitor) {\n\t\t\t\t\t\tret = monitor.monitor.call(this, line, room, user, target, lcMessage, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = line.regex.exec(target)?.[0];\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof ret === 'string') {\n\t\t\t\t\t\tbuf.push(`${monitorName}: ${ret}`);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (ret === false) {\n\t\t\t\t\t\tbuf.push(`${monitorName}: \"${target}\" would be blocked from being sent.`);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (buf.length) {\n\t\t\t\treturn this.sendReplyBox(Chat.formatText(buf.join('\\n'), false, true));\n\t\t\t} else {\n\t\t\t\tthrow new Chat.ErrorMessage(\n\t\t\t\t\t`\"${target}\" doesn't trigger any filters. Check spelling?`\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\ttesthelp: [\n\t\t\t`/filter test [test string] - Tests whether or not the provided test string would trigger any of the chat monitors.`,\n\t\t\t`Requires: % @ ~`,\n\t\t],\n\t},\n\tfilterhelp: [\n\t\t`/filter add list, word, reason[, optional public reason] - Adds a word to the given filter list. Requires: ~`,\n\t\t`/filter remove list, words - Removes words from the given filter list. Requires: ~`,\n\t\t`/filter view - Opens the list of filtered words. Requires: % @ ~`,\n\t\t`/filter test [test string] - Tests whether or not the provided test string would trigger any of the chat monitors. Requires: % @ ~`,\n\t\t`You may use / instead of , in /filter add if you want to specify a reason that includes commas.`,\n\t],\n\tallowname(target, room, user) {\n\t\tthis.checkCan('forcerename');\n\t\ttarget = toID(target);\n\t\tif (!target) return this.errorReply(`Syntax: /allowname username`);\n\t\tif (Punishments.namefilterwhitelist.has(target)) {\n\t\t\treturn this.errorReply(`${target} is already allowed as a username.`);\n\t\t}\n\n\t\tconst msg = `${target} was allowed as a username by ${user.name}.`;\n\t\tconst toNotify: RoomID[] = ['staff', 'upperstaff'];\n\t\tRooms.global.notifyRooms(toNotify, `|c|${user.getIdentity()}|/log ${msg}`);\n\t\tif (!room || !toNotify.includes(room.roomid)) {\n\t\t\tthis.sendReply(msg);\n\t\t}\n\t\tthis.globalModlog(`ALLOWNAME`, target);\n\t\tMonitor.forceRenames.delete(target as ID);\n\t},\n};\n\nprocess.nextTick(() => {\n\tChat.multiLinePattern.register('/filter (add|remove) ');\n});\n"], | |
"mappings": "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", | |
"names": [] | |
} | |