{
"version": 3,
"sources": ["../../../../server/chat-plugins/suspect-tests.ts"],
"sourcesContent": ["import {FS} from '../../lib/fs';\n\nconst SUSPECTS_FILE = 'config/suspects.json';\nconst WHITELIST = [\"kris\"];\n\ninterface SuspectTest {\n\ttier: string;\n\tsuspect: string;\n\tdate: string;\n\turl: string;\n}\n\nexport const suspectTests: {[format: string]: SuspectTest} = JSON.parse(FS(SUSPECTS_FILE).readIfExistsSync() || \"{}\");\n\nfunction saveSuspectTests() {\n\tFS(SUSPECTS_FILE).writeUpdate(() => JSON.stringify(suspectTests));\n}\n\nfunction checkPermissions(context: Chat.CommandContext) {\n\tconst user = context.user;\n\tif (WHITELIST.includes(user.id)) return true;\n\tcontext.checkCan('gdeclare');\n}\n\nexport const commands: Chat.ChatCommands = {\n\tsuspect: 'suspects',\n\tsuspects: {\n\t\t''(target, room, user) {\n\t\t\tif (!Object.keys(suspectTests).length) {\n\t\t\t\treturn this.errorReply(\"There are no suspect tests running.\");\n\t\t\t}\n\t\t\tif (!this.runBroadcast()) return;\n\n\t\t\tlet buffer = 'Suspect tests currently running:';\n\t\t\tfor (const i of Object.keys(suspectTests)) {\n\t\t\t\tconst test = suspectTests[i];\n\t\t\t\tbuffer += '
';\n\t\t\t\tbuffer += `${test.tier}: ${test.suspect} (${test.date})`;\n\t\t\t}\n\t\t\treturn this.sendReplyBox(buffer);\n\t\t},\n\n\t\tedit: 'add',\n\t\tadd(target, room, user) {\n\t\t\tcheckPermissions(this);\n\n\t\t\tconst [tier, suspect, date, url] = target.split(',');\n\t\t\tif (!(tier && suspect && date && url)) {\n\t\t\t\treturn this.parse('/help suspects');\n\t\t\t}\n\n\t\t\tconst format = Dex.formats.get(tier);\n\t\t\tif (!format.exists) return this.errorReply(`\"${tier}\" is not a valid tier.`);\n\n\t\t\tconst suspectString = suspect.trim();\n\n\t\t\tconst [month, day] = date.trim().split(date.includes('-') ? '-' : '/');\n\t\t\tconst isValidDate = /[0-1]?[0-9]/.test(month) && /[0-3]?[0-9]/.test(day);\n\t\t\tif (!isValidDate) return this.errorReply(\"Dates must be in the format MM/DD.\");\n\t\t\tconst dateActual = `${month}/${day}`;\n\n\t\t\tconst urlActual = url.trim();\n\t\t\tif (!/^https:\\/\\/www\\.smogon\\.com\\/forums\\/(threads|posts)\\//.test(urlActual)) {\n\t\t\t\tthrow new Chat.ErrorMessage(\"Suspect test URLs must be Smogon threads or posts.\");\n\t\t\t}\n\n\t\t\tthis.privateGlobalModAction(`${user.name} ${suspectTests[format.id] ? \"edited the\" : \"added a\"} ${format.name} suspect test.`);\n\t\t\tthis.globalModlog('SUSPECTTEST', null, `${suspectTests[format.id] ? \"edited\" : \"added\"} ${format.name}`);\n\n\t\t\tsuspectTests[format.id] = {\n\t\t\t\ttier: format.name,\n\t\t\t\tsuspect: suspectString,\n\t\t\t\tdate: dateActual,\n\t\t\t\turl: urlActual,\n\t\t\t};\n\t\t\tsaveSuspectTests();\n\t\t},\n\n\t\tend: 'remove',\n\t\tdelete: 'remove',\n\t\tremove(target, room, user) {\n\t\t\tcheckPermissions(this);\n\n\t\t\tconst format = toID(target);\n\t\t\tconst test = suspectTests[format];\n\t\t\tif (!test) return this.errorReply(`There is no suspect test for '${target}'. Check spelling?`);\n\n\t\t\tthis.privateGlobalModAction(`${user.name} removed the ${test.tier} suspect test.`);\n\t\t\tthis.globalModlog('SUSPECTTEST', null, `removed ${test.tier}`);\n\n\t\t\tdelete suspectTests[format];\n\t\t\tsaveSuspectTests();\n\t\t},\n\n\t\thelp() {\n\t\t\treturn this.parse('/help suspects');\n\t\t},\n\t},\n\n\tsuspectshelp() {\n\t\tthis.sendReplyBox(\n\t\t\t`Commands to manage suspect tests:
` +\n\t\t\t`/suspects: displays currently running suspect tests.
` +\n\t\t\t`/suspects add [tier], [suspect], [date], [link]: adds a suspect test. Date in the format MM/DD. Requires: &
` +\n\t\t\t`/suspects remove [tier]: deletes a suspect test. Requires: &`\n\t\t);\n\t},\n};\n"],
"mappings": "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",
"names": []
}