{
"version": 3,
"sources": ["../../../../server/chat-plugins/username-prefixes.ts"],
"sourcesContent": ["/**\r\n * Code to manage username prefixes that force battles to be public or disable modchat.\r\n * @author Annika\r\n */\r\n\r\nimport {FS} from '../../lib';\r\n\r\nconst PREFIXES_FILE = 'config/chat-plugins/username-prefixes.json';\r\nconst PREFIX_DURATION = 10 * 24 * 60 * 60 * 1000;\r\n\r\nexport class PrefixManager {\r\n\tconstructor() {\r\n\t\t// after a restart/newly using the plugin, load prefixes from config.js\r\n\t\tif (!Chat.oldPlugins['username-prefixes']) this.refreshConfig(true);\r\n\t}\r\n\r\n\tsave() {\r\n\t\tFS(PREFIXES_FILE).writeUpdate(() => JSON.stringify(Config.forcedprefixes || []));\r\n\t}\r\n\r\n\trefreshConfig(configJustLoaded = false) {\r\n\t\tif (!Config.forcedprefixes) Config.forcedprefixes = [];\r\n\t\t// ensure everything is in the right format\r\n\t\tif (!Array.isArray(Config.forcedprefixes)) {\r\n\t\t\tconst convertedPrefixes = [];\r\n\t\t\tfor (const type in Config.forcedprefixes) {\r\n\t\t\t\tfor (const prefix of Config.forcedprefixes[type].map(toID)) {\r\n\t\t\t\t\tconvertedPrefixes.push({type, prefix, expireAt: Date.now() + PREFIX_DURATION});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tConfig.forcedprefixes = convertedPrefixes;\r\n\t\t}\r\n\t\tif (configJustLoaded) {\r\n\t\t\tfor (const entry of Config.forcedprefixes) {\r\n\t\t\t\tentry.prefix = toID(entry.prefix);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet data: AnyObject[];\r\n\t\ttry {\r\n\t\t\tdata = JSON.parse(FS(PREFIXES_FILE).readSync());\r\n\t\t} catch (e: any) {\r\n\t\t\tif (e.code !== 'ENOENT') throw e;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (data.length) {\r\n\t\t\tfor (const entry of data) {\r\n\t\t\t\tif (Config.forcedprefixes.includes(entry)) continue;\r\n\t\t\t\tConfig.forcedprefixes.push(entry);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\taddPrefix(prefix: ID, type: 'privacy' | 'modchat') {\r\n\t\tif (!Config.forcedprefixes) Config.forcedprefixes = [];\r\n\t\tconst entry = Config.forcedprefixes.find((x: AnyObject) => x.prefix === prefix && x.type === type);\r\n\t\tif (entry) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Username prefix '${prefix}' is already configured to force ${type}.`);\r\n\t\t}\r\n\r\n\t\tConfig.forcedprefixes.push({type, prefix, expireAt: Date.now() + PREFIX_DURATION});\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tremovePrefix(prefix: ID, type: 'privacy' | 'modchat') {\r\n\t\tconst entry = Config.forcedprefixes.findIndex((x: AnyObject) => x.prefix === prefix && x.type === type);\r\n\t\tif (entry < 0) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Username prefix '${prefix}' is not configured to force ${type}!`);\r\n\t\t}\r\n\r\n\t\tConfig.forcedprefixes.splice(entry, 1);\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tvalidateType(type: string) {\r\n\t\tif (type !== 'privacy' && type !== 'modchat') {\r\n\t\t\tthrow new Chat.ErrorMessage(`'${type}' is not a valid type of forced prefix. Valid types are 'privacy' and 'modchat'.`);\r\n\t\t}\r\n\t\treturn type;\r\n\t}\r\n}\r\n\r\nexport const prefixManager = new PrefixManager();\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\tforceprefix: 'usernameprefix',\r\n\tforcedprefix: 'usernameprefix',\r\n\tforcedprefixes: 'usernameprefix',\r\n\tusernameprefixes: 'usernameprefix',\r\n\tusernameprefix: {\r\n\t\thelp: '',\r\n\t\t''() {\r\n\t\t\tthis.parse(`/help forcedprefix`);\r\n\t\t},\r\n\r\n\t\tdelete: 'add',\r\n\t\tremove: 'add',\r\n\t\tadd(target, room, user, connection, cmd) {\r\n\t\t\tthis.checkCan('addhtml');\r\n\r\n\t\t\tconst isAdding = cmd.includes('add');\r\n\r\n\t\t\tconst [prefix, type] = target.split(',').map(toID);\r\n\t\t\tif (!prefix || !type) return this.parse(`/help usernameprefix`);\r\n\t\t\tif (prefix.length > 18) {\r\n\t\t\t\tthrow new Chat.ErrorMessage(`Specified prefix '${prefix}' is longer than the maximum user ID length.`);\r\n\t\t\t}\r\n\r\n\t\t\tif (isAdding) {\r\n\t\t\t\tprefixManager.addPrefix(prefix, prefixManager.validateType(type));\r\n\t\t\t} else {\r\n\t\t\t\tprefixManager.removePrefix(prefix, prefixManager.validateType(type));\r\n\t\t\t}\r\n\r\n\t\t\tthis.globalModlog(`FORCEDPREFIX ${isAdding ? 'ADD' : 'REMOVE'}`, null, `'${prefix}' ${isAdding ? 'to' : 'from'} ${type}`);\r\n\t\t\tthis.addGlobalModAction(`${user.name} set the username prefix ${prefix} to${isAdding ? '' : ' no longer'} disable ${type}.`);\r\n\t\t},\r\n\r\n\t\tview(target) {\r\n\t\t\tthis.checkCan('addhtml');\r\n\r\n\t\t\tconst types = target ? [prefixManager.validateType(toID(target))] : ['privacy', 'modchat'];\r\n\r\n\t\t\tconst entries = Config.forcedprefixes.filter((x: any) => types.includes(x.type));\r\n\r\n\t\t\treturn this.sendReplyBox(types.map(type => {\r\n\t\t\t\tconst prefixes = entries.filter((x: any) => x.type === type).map((x: any) => x.prefix);\r\n\t\t\t\tconst info = prefixes.length ?\r\n\t\t\t\t\t`${prefixes.join(', ')}` : `none`;\r\n\t\t\t\treturn `Username prefixes that disable ${type}: ${info}.`;\r\n\t\t\t}).join(`
`));\r\n\t\t},\r\n\t},\r\n\tusernameprefixhelp() {\r\n\t\treturn this.sendReplyBox(\r\n\t\t\t`/usernameprefix add [prefix], [type]: Sets the username prefix [prefix] to disable privacy or modchat on battles where at least one player has the prefix.
` +\r\n\t\t\t`/usernameprefix remove [prefix], [type]: Removes a prefix configuration.
` +\r\n\t\t\t`/usernameprefix view [optional type]: Displays the currently configured username prefixes.
` +\r\n\t\t\t`Valid types are privacy (which forces battles to take place in public rooms) and modchat (which prevents players from setting moderated chat).
` +\r\n\t\t\t`Requires: * &`\r\n\t\t);\r\n\t},\r\n};\r\n"],
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,iBAAiB;AAEjB,MAAM,gBAAgB;AACtB,MAAM,kBAAkB,KAAK,KAAK,KAAK,KAAK;AAErC,MAAM,cAAc;AAAA,EAC1B,cAAc;AAEb,QAAI,CAAC,KAAK,WAAW,mBAAmB;AAAG,WAAK,cAAc,IAAI;AAAA,EACnE;AAAA,EAEA,OAAO;AACN,uBAAG,aAAa,EAAE,YAAY,MAAM,KAAK,UAAU,OAAO,kBAAkB,CAAC,CAAC,CAAC;AAAA,EAChF;AAAA,EAEA,cAAc,mBAAmB,OAAO;AACvC,QAAI,CAAC,OAAO;AAAgB,aAAO,iBAAiB,CAAC;AAErD,QAAI,CAAC,MAAM,QAAQ,OAAO,cAAc,GAAG;AAC1C,YAAM,oBAAoB,CAAC;AAC3B,iBAAW,QAAQ,OAAO,gBAAgB;AACzC,mBAAW,UAAU,OAAO,eAAe,IAAI,EAAE,IAAI,IAAI,GAAG;AAC3D,4BAAkB,KAAK,EAAC,MAAM,QAAQ,UAAU,KAAK,IAAI,IAAI,gBAAe,CAAC;AAAA,QAC9E;AAAA,MACD;AACA,aAAO,iBAAiB;AAAA,IACzB;AACA,QAAI,kBAAkB;AACrB,iBAAW,SAAS,OAAO,gBAAgB;AAC1C,cAAM,SAAS,KAAK,MAAM,MAAM;AAAA,MACjC;AAAA,IACD;AAEA,QAAI;AACJ,QAAI;AACH,aAAO,KAAK,UAAM,eAAG,aAAa,EAAE,SAAS,CAAC;AAAA,IAC/C,SAAS,GAAP;AACD,UAAI,EAAE,SAAS;AAAU,cAAM;AAC/B;AAAA,IACD;AACA,QAAI,KAAK,QAAQ;AAChB,iBAAW,SAAS,MAAM;AACzB,YAAI,OAAO,eAAe,SAAS,KAAK;AAAG;AAC3C,eAAO,eAAe,KAAK,KAAK;AAAA,MACjC;AAAA,IACD;AAAA,EACD;AAAA,EAEA,UAAU,QAAY,MAA6B;AAClD,QAAI,CAAC,OAAO;AAAgB,aAAO,iBAAiB,CAAC;AACrD,UAAM,QAAQ,OAAO,eAAe,KAAK,CAAC,MAAiB,EAAE,WAAW,UAAU,EAAE,SAAS,IAAI;AACjG,QAAI,OAAO;AACV,YAAM,IAAI,KAAK,aAAa,oBAAoB,0CAA0C,OAAO;AAAA,IAClG;AAEA,WAAO,eAAe,KAAK,EAAC,MAAM,QAAQ,UAAU,KAAK,IAAI,IAAI,gBAAe,CAAC;AACjF,SAAK,KAAK;AAAA,EACX;AAAA,EAEA,aAAa,QAAY,MAA6B;AACrD,UAAM,QAAQ,OAAO,eAAe,UAAU,CAAC,MAAiB,EAAE,WAAW,UAAU,EAAE,SAAS,IAAI;AACtG,QAAI,QAAQ,GAAG;AACd,YAAM,IAAI,KAAK,aAAa,oBAAoB,sCAAsC,OAAO;AAAA,IAC9F;AAEA,WAAO,eAAe,OAAO,OAAO,CAAC;AACrC,SAAK,KAAK;AAAA,EACX;AAAA,EAEA,aAAa,MAAc;AAC1B,QAAI,SAAS,aAAa,SAAS,WAAW;AAC7C,YAAM,IAAI,KAAK,aAAa,IAAI,sFAAsF;AAAA,IACvH;AACA,WAAO;AAAA,EACR;AACD;AAEO,MAAM,gBAAgB,IAAI,cAAc;AAExC,MAAM,WAA8B;AAAA,EAC1C,aAAa;AAAA,EACb,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,IACf,MAAM;AAAA,IACN,KAAK;AACJ,WAAK,MAAM,oBAAoB;AAAA,IAChC;AAAA,IAEA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,IAAI,QAAQ,MAAM,MAAM,YAAY,KAAK;AACxC,WAAK,SAAS,SAAS;AAEvB,YAAM,WAAW,IAAI,SAAS,KAAK;AAEnC,YAAM,CAAC,QAAQ,IAAI,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI,IAAI;AACjD,UAAI,CAAC,UAAU,CAAC;AAAM,eAAO,KAAK,MAAM,sBAAsB;AAC9D,UAAI,OAAO,SAAS,IAAI;AACvB,cAAM,IAAI,KAAK,aAAa,qBAAqB,oDAAoD;AAAA,MACtG;AAEA,UAAI,UAAU;AACb,sBAAc,UAAU,QAAQ,cAAc,aAAa,IAAI,CAAC;AAAA,MACjE,OAAO;AACN,sBAAc,aAAa,QAAQ,cAAc,aAAa,IAAI,CAAC;AAAA,MACpE;AAEA,WAAK,aAAa,gBAAgB,WAAW,QAAQ,YAAY,MAAM,IAAI,WAAW,WAAW,OAAO,UAAU,MAAM;AACxH,WAAK,mBAAmB,GAAG,KAAK,gCAAgC,YAAY,WAAW,KAAK,wBAAwB,OAAO;AAAA,IAC5H;AAAA,IAEA,KAAK,QAAQ;AACZ,WAAK,SAAS,SAAS;AAEvB,YAAM,QAAQ,SAAS,CAAC,cAAc,aAAa,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,SAAS;AAEzF,YAAM,UAAU,OAAO,eAAe,OAAO,CAAC,MAAW,MAAM,SAAS,EAAE,IAAI,CAAC;AAE/E,aAAO,KAAK,aAAa,MAAM,IAAI,UAAQ;AAC1C,cAAM,WAAW,QAAQ,OAAO,CAAC,MAAW,EAAE,SAAS,IAAI,EAAE,IAAI,CAAC,MAAW,EAAE,MAAM;AACrF,cAAM,OAAO,SAAS,SACrB,SAAS,SAAS,KAAK,iBAAiB,aAAa;AACtD,eAAO,0CAA0C,kBAAkB;AAAA,MACpE,CAAC,EAAE,KAAK,QAAQ,CAAC;AAAA,IAClB;AAAA,EACD;AAAA,EACA,qBAAqB;AACpB,WAAO,KAAK;AAAA,MACX;AAAA,IAKD;AAAA,EACD;AACD;",
"names": []
}