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