{ "version": 3, "sources": ["../../../../server/chat-commands/admin.ts"], "sourcesContent": ["/**\r\n * Administration commands\r\n * Pokemon Showdown - http://pokemonshowdown.com/\r\n *\r\n * These are administration commands, generally only useful for\r\n * programmers for managing the server.\r\n *\r\n * For the API, see chat-plugins/COMMANDS.md\r\n *\r\n * @license MIT\r\n */\r\n\r\nimport * as path from 'path';\r\nimport * as child_process from 'child_process';\r\nimport {FS, Utils, ProcessManager, SQL} from '../../lib';\r\n\r\ninterface ProcessData {\r\n\tcmd: string;\r\n\tcpu?: string;\r\n\ttime?: string;\r\n\tram?: string;\r\n}\r\n\r\nfunction hasDevAuth(user: User) {\r\n\tconst devRoom = Rooms.get('development');\r\n\treturn devRoom && Users.Auth.atLeast(devRoom.auth.getDirect(user.id), '%');\r\n}\r\n\r\nfunction bash(command: string, context: Chat.CommandContext, cwd?: string): Promise<[number, string, string]> {\r\n\tcontext.stafflog(`$ ${command}`);\r\n\tif (!cwd) cwd = FS.ROOT_PATH;\r\n\treturn new Promise(resolve => {\r\n\t\tchild_process.exec(command, {cwd}, (error, stdout, stderr) => {\r\n\t\t\tlet log = `[o] ${stdout}[e] ${stderr}`;\r\n\t\t\tif (error) log = `[c] ${error.code}\\n${log}`;\r\n\t\t\tcontext.stafflog(log);\r\n\t\t\tresolve([error?.code || 0, stdout, stderr]);\r\n\t\t});\r\n\t});\r\n}\r\n\r\nfunction keysIncludingNonEnumerable(obj: object) {\r\n\tconst methods = new Set();\r\n\tlet current = obj;\r\n\tdo {\r\n\t\tconst curProps = Object.getOwnPropertyNames(current);\r\n\t\tfor (const prop of curProps) {\r\n\t\t\tmethods.add(prop);\r\n\t\t}\r\n\t} while ((current = Object.getPrototypeOf(current)));\r\n\treturn [...methods];\r\n}\r\n\r\nfunction keysToCopy(obj: object) {\r\n\treturn keysIncludingNonEnumerable(obj).filter(\r\n\t\t// `__` matches sucrase init methods\r\n\t\t// prop is excluded because it can hit things like hasOwnProperty that are potentially annoying (?) with\r\n\t\t// the kind of prototype patching we want to do here - same for constructor and valueOf\r\n\t\tprop => !(prop.includes('__') || prop.toLowerCase().includes('prop') || ['valueOf', 'constructor'].includes(prop))\r\n\t);\r\n}\r\n\r\n/**\r\n * @returns {boolean} Whether or not the rebase failed\r\n */\r\nasync function updateserver(context: Chat.CommandContext, codePath: string) {\r\n\tconst exec = (command: string) => bash(command, context, codePath);\r\n\r\n\tcontext.sendReply(`Fetching newest version of code in the repository ${codePath}...`);\r\n\r\n\tlet [code, stdout, stderr] = await exec(`git fetch`);\r\n\tif (code) throw new Error(`updateserver: Crash while fetching - make sure this is a Git repository`);\r\n\tif (!stdout && !stderr) {\r\n\t\tcontext.sendReply(`There were no updates.`);\r\n\t\tMonitor.updateServerLock = false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\t[code, stdout, stderr] = await exec(`git rev-parse HEAD`);\r\n\tif (code || stderr) throw new Error(`updateserver: Crash while grabbing hash`);\r\n\tconst oldHash = String(stdout).trim();\r\n\r\n\t[code, stdout, stderr] = await exec(`git stash save \"PS /updateserver autostash\"`);\r\n\tlet stashedChanges = true;\r\n\tif (code) throw new Error(`updateserver: Crash while stashing`);\r\n\tif ((stdout + stderr).includes(\"No local changes\")) {\r\n\t\tstashedChanges = false;\r\n\t} else if (stderr) {\r\n\t\tthrow new Error(`updateserver: Crash while stashing`);\r\n\t} else {\r\n\t\tcontext.sendReply(`Saving changes...`);\r\n\t}\r\n\r\n\t// errors can occur while rebasing or popping the stash; make sure to recover\r\n\ttry {\r\n\t\tcontext.sendReply(`Rebasing...`);\r\n\t\t[code] = await exec(`git rebase --no-autostash FETCH_HEAD`);\r\n\t\tif (code) {\r\n\t\t\t// conflict while rebasing\r\n\t\t\tawait exec(`git rebase --abort`);\r\n\t\t\tthrow new Error(`restore`);\r\n\t\t}\r\n\r\n\t\tif (stashedChanges) {\r\n\t\t\tcontext.sendReply(`Restoring saved changes...`);\r\n\t\t\t[code] = await exec(`git stash pop`);\r\n\t\t\tif (code) {\r\n\t\t\t\t// conflict while popping stash\r\n\t\t\t\tawait exec(`git reset HEAD .`);\r\n\t\t\t\tawait exec(`git checkout .`);\r\n\t\t\t\tthrow new Error(`restore`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t} catch {\r\n\t\t// failed while rebasing or popping the stash\r\n\t\tawait exec(`git reset --hard ${oldHash}`);\r\n\t\tif (stashedChanges) await exec(`git stash pop`);\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\tpotd(target, room, user) {\r\n\t\tthis.canUseConsole();\r\n\t\tconst species = Dex.species.get(target);\r\n\t\tif (species.id === Config.potd) {\r\n\t\t\treturn this.errorReply(`The PotD is already set to ${species.name}`);\r\n\t\t}\r\n\t\tif (!species.exists) return this.errorReply(`Pokemon \"${target}\" not found.`);\r\n\t\tif (!Dex.species.getLearnset(species.id)) {\r\n\t\t\treturn this.errorReply(`That Pokemon has no learnset and cannot be used as the PotD.`);\r\n\t\t}\r\n\t\tConfig.potd = species.id;\r\n\t\tfor (const process of Rooms.PM.processes) {\r\n\t\t\tprocess.getProcess().send(`EVAL\\n\\nConfig.potd = '${species.id}'`);\r\n\t\t}\r\n\t\tthis.addGlobalModAction(`${user.name} set the PotD to ${species.name}.`);\r\n\t\tthis.globalModlog(`POTD`, null, species.name);\r\n\t},\r\n\tpotdhelp: [\r\n\t\t`/potd [pokemon] - Set the Pokemon of the Day to the given [pokemon]. Requires: &`,\r\n\t],\r\n\r\n\t/*********************************************************\r\n\t * Bot commands (chat-log manipulation)\r\n\t *********************************************************/\r\n\r\n\thtmlbox(target, room, user) {\r\n\t\tif (!target) return this.parse('/help htmlbox');\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkHTML(target);\r\n\t\ttarget = Chat.collapseLineBreaksHTML(target);\r\n\t\tthis.checkBroadcast(true, '!htmlbox');\r\n\t\tif (this.broadcastMessage) this.checkCan('declare', null, room);\r\n\r\n\t\tif (!this.runBroadcast(true, '!htmlbox')) return;\r\n\r\n\t\tif (this.broadcasting) {\r\n\t\t\treturn `/raw
${target}
`;\r\n\t\t} else {\r\n\t\t\tthis.sendReplyBox(target);\r\n\t\t}\r\n\t},\r\n\thtmlboxhelp: [\r\n\t\t`/htmlbox [message] - Displays a message, parsing HTML code contained.`,\r\n\t\t`!htmlbox [message] - Shows everyone a message, parsing HTML code contained. Requires: * # &`,\r\n\t],\r\n\taddhtmlbox(target, room, user, connection, cmd) {\r\n\t\tif (!target) return this.parse('/help ' + cmd);\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkChat();\r\n\t\tthis.checkHTML(target);\r\n\t\tthis.checkCan('addhtml', null, room);\r\n\t\ttarget = Chat.collapseLineBreaksHTML(target);\r\n\t\tif (user.tempGroup !== '*') {\r\n\t\t\ttarget += Utils.html`
[${user.name}]
`;\r\n\t\t}\r\n\r\n\t\treturn `/raw
${target}
`;\r\n\t},\r\n\taddhtmlboxhelp: [\r\n\t\t`/addhtmlbox [message] - Shows everyone a message, parsing HTML code contained. Requires: * # &`,\r\n\t],\r\n\taddrankhtmlbox(target, room, user, connection, cmd) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!target) return this.parse('/help ' + cmd);\r\n\t\tthis.checkChat();\r\n\t\tlet [rank, html] = this.splitOne(target);\r\n\t\tif (!(rank in Config.groups)) return this.errorReply(`Group '${rank}' does not exist.`);\r\n\t\thtml = this.checkHTML(html);\r\n\t\tthis.checkCan('addhtml', null, room);\r\n\t\thtml = Chat.collapseLineBreaksHTML(html);\r\n\t\tif (user.tempGroup !== '*') {\r\n\t\t\thtml += Utils.html`
[${user.name}]
`;\r\n\t\t}\r\n\r\n\t\troom.sendRankedUsers(`|html|
${html}
`, rank as GroupSymbol);\r\n\t},\r\n\taddrankhtmlboxhelp: [\r\n\t\t`/addrankhtmlbox [rank], [message] - Shows everyone with the specified rank or higher a message, parsing HTML code contained. Requires: * # &`,\r\n\t],\r\n\tchangeuhtml: 'adduhtml',\r\n\tadduhtml(target, room, user, connection, cmd) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!target) return this.parse('/help ' + cmd);\r\n\t\tthis.checkChat();\r\n\r\n\t\tlet [name, html] = this.splitOne(target);\r\n\t\tname = toID(name);\r\n\t\thtml = this.checkHTML(html);\r\n\t\tthis.checkCan('addhtml', null, room);\r\n\t\thtml = Chat.collapseLineBreaksHTML(html);\r\n\t\tif (user.tempGroup !== '*') {\r\n\t\t\thtml += Utils.html`
[${user.name}]
`;\r\n\t\t}\r\n\r\n\t\tif (cmd === 'changeuhtml') {\r\n\t\t\troom.attributedUhtmlchange(user, name, html);\r\n\t\t} else {\r\n\t\t\treturn `/uhtml ${name},${html}`;\r\n\t\t}\r\n\t},\r\n\tadduhtmlhelp: [\r\n\t\t`/adduhtml [name], [message] - Shows everyone a message that can change, parsing HTML code contained. Requires: * # &`,\r\n\t],\r\n\tchangeuhtmlhelp: [\r\n\t\t`/changeuhtml [name], [message] - Changes the message previously shown with /adduhtml [name]. Requires: * # &`,\r\n\t],\r\n\tchangerankuhtml: 'addrankuhtml',\r\n\taddrankuhtml(target, room, user, connection, cmd) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!target) return this.parse('/help ' + cmd);\r\n\t\tthis.checkChat();\r\n\r\n\t\tconst [rank, uhtml] = this.splitOne(target);\r\n\t\tif (!(rank in Config.groups)) return this.errorReply(`Group '${rank}' does not exist.`);\r\n\t\tlet [name, html] = this.splitOne(uhtml);\r\n\t\tname = toID(name);\r\n\t\thtml = this.checkHTML(html);\r\n\t\tthis.checkCan('addhtml', null, room);\r\n\t\thtml = Chat.collapseLineBreaksHTML(html);\r\n\t\tif (user.tempGroup !== '*') {\r\n\t\t\thtml += Utils.html`
[${user.name}]
`;\r\n\t\t}\r\n\r\n\t\thtml = `|uhtml${(cmd === 'changerankuhtml' ? 'change' : '')}|${name}|${html}`;\r\n\t\troom.sendRankedUsers(html, rank as GroupSymbol);\r\n\t},\r\n\taddrankuhtmlhelp: [\r\n\t\t`/addrankuhtml [rank], [name], [message] - Shows everyone with the specified rank or higher a message that can change, parsing HTML code contained. Requires: * # &`,\r\n\t],\r\n\tchangerankuhtmlhelp: [\r\n\t\t`/changerankuhtml [rank], [name], [message] - Changes the message previously shown with /addrankuhtml [rank], [name]. Requires: * # &`,\r\n\t],\r\n\r\n\tdeletenamecolor: 'setnamecolor',\r\n\tsnc: 'setnamecolor',\r\n\tdnc: 'setnamecolor',\r\n\tasync setnamecolor(target, room, user, connection, cmd) {\r\n\t\tthis.checkCan('rangeban');\r\n\t\tif (!toID(target)) {\r\n\t\t\treturn this.parse(`/help ${cmd}`);\r\n\t\t}\r\n\t\tlet [userid, source] = this.splitOne(target).map(toID);\r\n\t\tif (cmd.startsWith('d')) {\r\n\t\t\tsource = '';\r\n\t\t} else if (!source || source.length > 18) {\r\n\t\t\treturn this.errorReply(\r\n\t\t\t\t`Specify a source username to take the color from. Name must be <19 characters.`\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (!userid || userid.length > 18) {\r\n\t\t\treturn this.errorReply(`Specify a valid name to set a new color for. Names must be <19 characters.`);\r\n\t\t}\r\n\t\tconst [res, error] = await LoginServer.request('updatenamecolor', {\r\n\t\t\tuserid,\r\n\t\t\tsource,\r\n\t\t\tby: user.id,\r\n\t\t});\r\n\t\tif (error) {\r\n\t\t\treturn this.errorReply(error.message);\r\n\t\t}\r\n\t\tif (!res || res.actionerror) {\r\n\t\t\treturn this.errorReply(res?.actionerror || \"The loginserver is currently disabled.\");\r\n\t\t}\r\n\t\tif (source) {\r\n\t\t\treturn this.sendReply(\r\n\t\t\t\t`|html|${userid}'s namecolor was ` +\r\n\t\t\t\t`successfully updated to match '${source}'. ` +\r\n\t\t\t\t`Refresh your browser for it to take effect.`\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn this.sendReply(`${userid}'s namecolor was removed.`);\r\n\t\t}\r\n\t},\r\n\tsetnamecolorhelp: [\r\n\t\t`/setnamecolor OR /snc [username], [source name] - Set [username]'s name color to match the [source name]'s color.`,\r\n\t\t`Requires: &`,\r\n\t],\r\n\tdeletenamecolorhelp: [\r\n\t\t`/deletenamecolor OR /dnc [username] - Remove [username]'s namecolor.`,\r\n\t\t`Requires: &`,\r\n\t],\r\n\r\n\tpline(target, room, user) {\r\n\t\t// Secret console admin command\r\n\t\tthis.canUseConsole();\r\n\t\tconst message = target.length > 30 ? target.slice(0, 30) + '...' : target;\r\n\t\tthis.checkBroadcast(true, `!pline ${message}`);\r\n\t\tthis.runBroadcast(true);\r\n\t\tthis.sendReply(target);\r\n\t},\r\n\tplinehelp: [\r\n\t\t`/pline [protocol lines] - Adds the given [protocol lines] to the current room. Requires: & console access`,\r\n\t],\r\n\r\n\tpminfobox(target, room, user, connection) {\r\n\t\tthis.checkChat();\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkCan('addhtml', null, room);\r\n\t\tif (!target) return this.parse(\"/help pminfobox\");\r\n\r\n\t\tconst {targetUser, rest: html} = this.requireUser(target);\r\n\t\tthis.checkHTML(html);\r\n\t\tthis.checkPMHTML(targetUser);\r\n\r\n\t\tconst message = `|pm|${user.getIdentity()}|${targetUser.getIdentity()}|` +\r\n\t\t\t`/raw
${html}
`;\r\n\r\n\t\tuser.send(message);\r\n\t\tif (targetUser !== user) targetUser.send(message);\r\n\t\ttargetUser.lastPM = user.id;\r\n\t\tuser.lastPM = targetUser.id;\r\n\t},\r\n\tpminfoboxhelp: [`/pminfobox [user], [html]- PMs an [html] infobox to [user]. Requires * # &`],\r\n\r\n\tpmuhtmlchange: 'pmuhtml',\r\n\tpmuhtml(target, room, user, connection, cmd) {\r\n\t\tthis.checkChat();\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkCan('addhtml', null, room);\r\n\t\tif (!target) return this.parse(\"/help \" + cmd);\r\n\r\n\t\tconst {targetUser, rest: html} = this.requireUser(target);\r\n\t\tthis.checkHTML(html);\r\n\t\tthis.checkPMHTML(targetUser);\r\n\r\n\t\tconst message = `|pm|${user.getIdentity()}|${targetUser.getIdentity()}|` +\r\n\t\t\t`/uhtml${(cmd === 'pmuhtmlchange' ? 'change' : '')} ${html}`;\r\n\r\n\t\tuser.send(message);\r\n\t\tif (targetUser !== user) targetUser.send(message);\r\n\t\ttargetUser.lastPM = user.id;\r\n\t\tuser.lastPM = targetUser.id;\r\n\t},\r\n\tpmuhtmlhelp: [`/pmuhtml [user], [name], [html] - PMs [html] that can change to [user]. Requires * # &`],\r\n\tpmuhtmlchangehelp: [\r\n\t\t`/pmuhtmlchange [user], [name], [html] - Changes html that was previously PMed to [user] to [html]. Requires * # &`,\r\n\t],\r\n\r\n\tclosehtmlpage: 'sendhtmlpage',\r\n\tchangehtmlpageselector: 'sendhtmlpage',\r\n\tsendhtmlpage(target, room, user, connection, cmd) {\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkCan('addhtml', null, room);\r\n\r\n\t\tconst closeHtmlPage = cmd === 'closehtmlpage';\r\n\r\n\t\tconst {targetUser, rest} = this.requireUser(target);\r\n\t\tlet [pageid, content] = this.splitOne(rest);\r\n\t\tlet selector: string | undefined;\r\n\t\tif (cmd === 'changehtmlpageselector') {\r\n\t\t\t[selector, content] = this.splitOne(content);\r\n\t\t\tif (!selector) return this.parse(`/help ${cmd}`);\r\n\t\t}\r\n\t\tif (!pageid || (closeHtmlPage ? content : !content)) {\r\n\t\t\treturn this.parse(`/help ${cmd}`);\r\n\t\t}\r\n\r\n\t\tpageid = `${user.id}-${toID(pageid)}`;\r\n\r\n\t\tif (targetUser.locked && !this.user.can('lock')) {\r\n\t\t\tthis.errorReply(\"This user is currently locked, so you cannot send them HTML.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet targetConnections = [];\r\n\t\t// find if a connection has specifically requested this page\r\n\t\tfor (const c of targetUser.connections) {\r\n\t\t\tif (c.lastRequestedPage === pageid) {\r\n\t\t\t\ttargetConnections.push(c);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!targetConnections.length) {\r\n\t\t\t// no connection has requested it - verify that we share a room\r\n\t\t\tthis.checkPMHTML(targetUser);\r\n\t\t\ttargetConnections = targetUser.connections;\r\n\t\t}\r\n\r\n\t\tcontent = this.checkHTML(content);\r\n\r\n\t\tfor (const targetConnection of targetConnections) {\r\n\t\t\tconst context = new Chat.PageContext({\r\n\t\t\t\tuser: targetUser,\r\n\t\t\t\tconnection: targetConnection,\r\n\t\t\t\tpageid: `view-bot-${pageid}`,\r\n\t\t\t});\r\n\t\t\tif (closeHtmlPage) {\r\n\t\t\t\tcontext.send(`|deinit|`);\r\n\t\t\t} else if (selector) {\r\n\t\t\t\tcontext.send(`|selectorhtml|${selector}|${content}`);\r\n\t\t\t} else {\r\n\t\t\t\tcontext.title = `[${user.name}] ${pageid}`;\r\n\t\t\t\tcontext.setHTML(content);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (closeHtmlPage) {\r\n\t\t\tthis.sendReply(`Closed the bot page ${pageid} for ${targetUser.name}.`);\r\n\t\t} else {\r\n\t\t\tthis.sendReply(`Sent ${targetUser.name}${selector ? ` the selector ${selector} on` : ''} the bot page ${pageid}.`);\r\n\t\t}\r\n\t},\r\n\tsendhtmlpagehelp: [\r\n\t\t`/sendhtmlpage [userid], [pageid], [html] - Sends [userid] the bot page [pageid] with the content [html]. Requires: * # &`,\r\n\t],\r\n\tchangehtmlpageselectorhelp: [\r\n\t\t`/changehtmlpageselector [userid], [pageid], [selector], [html] - Sends [userid] the content [html] for the selector [selector] on the bot page [pageid]. Requires: * # &`,\r\n\t],\r\n\tclosehtmlpagehelp: [\r\n\t\t`/closehtmlpage [userid], [pageid], - Closes the bot page [pageid] for [userid]. Requires: * # &`,\r\n\t],\r\n\r\n\thighlighthtmlpage(target, room, user) {\r\n\t\tconst {targetUser, rest} = this.requireUser(target);\r\n\t\tlet [pageid, title, highlight] = Utils.splitFirst(rest, ',', 2);\r\n\r\n\t\tpageid = `${user.id}-${toID(pageid)}`;\r\n\t\tif (!pageid || !target) return this.parse(`/help highlighthtmlpage`);\r\n\t\tif (targetUser.locked && !this.user.can('lock')) {\r\n\t\t\tthrow new Chat.ErrorMessage(\"This user is currently locked, so you cannot send them highlights.\");\r\n\t\t}\r\n\r\n\t\tconst buf = `|tempnotify|bot-${pageid}|${title} [from ${user.name}]|${highlight ? highlight : ''}`;\r\n\t\tlet targetConnections = [];\r\n\t\tthis.checkPMHTML(targetUser);\r\n\t\t// try to locate connections that have requested the page recently\r\n\t\tfor (const c of targetUser.connections) {\r\n\t\t\tif (c.lastRequestedPage === pageid) {\r\n\t\t\t\ttargetConnections.push(c);\r\n\t\t\t}\r\n\t\t}\r\n\t\t// there are none, default to the first connection\r\n\t\tif (!targetConnections.length) {\r\n\t\t\ttargetConnections = [targetUser.connections[0]];\r\n\t\t}\r\n\t\tfor (const conn of targetConnections) {\r\n\t\t\tconn.send(`>view-bot-${pageid}\\n${buf}`);\r\n\t\t}\r\n\r\n\t\tthis.sendReply(`Sent a highlight to ${targetUser.name} on the bot page ${pageid}.`);\r\n\t},\r\n\thighlighthtmlpagehelp: [\r\n\t\t`/highlighthtmlpage [userid], [pageid], [title], [optional highlight] - Sends a highlight to [userid] if they're viewing the bot page [pageid].`,\r\n\t\t`If a [highlight] is specified, only highlights them if they have that term on their highlight list.`,\r\n\t],\r\n\r\n\tchangeprivateuhtml: 'sendprivatehtmlbox',\r\n\tsendprivateuhtml: 'sendprivatehtmlbox',\r\n\tsendprivatehtmlbox(target, room, user, connection, cmd) {\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkCan('addhtml', null, room);\r\n\r\n\t\tconst {targetUser, rest} = this.requireUser(target);\r\n\r\n\t\tif (targetUser.locked && !this.user.can('lock')) {\r\n\t\t\tthrow new Chat.ErrorMessage(\"This user is currently locked, so you cannot send them private HTML.\");\r\n\t\t}\r\n\r\n\t\tif (!(targetUser.id in room.users)) {\r\n\t\t\tthrow new Chat.ErrorMessage(\"You cannot send private HTML to users who are not in this room.\");\r\n\t\t}\r\n\r\n\t\tlet html: string;\r\n\t\tlet messageType: string;\r\n\t\tlet name: string | undefined;\r\n\t\tconst plainHtml = cmd === 'sendprivatehtmlbox';\r\n\t\tif (plainHtml) {\r\n\t\t\thtml = rest;\r\n\t\t\tmessageType = 'html';\r\n\t\t} else {\r\n\t\t\t[name, html] = this.splitOne(rest);\r\n\t\t\tif (!name) return this.parse('/help sendprivatehtmlbox');\r\n\r\n\t\t\tmessageType = `uhtml${(cmd === 'changeprivateuhtml' ? 'change' : '')}|${name}`;\r\n\t\t}\r\n\r\n\t\thtml = this.checkHTML(html);\r\n\t\tif (!html) return this.parse('/help sendprivatehtmlbox');\r\n\r\n\t\thtml = `${Utils.html`
[Private from ${user.name}]
`}${Chat.collapseLineBreaksHTML(html)}`;\r\n\t\tif (plainHtml) html = `
${html}
`;\r\n\r\n\t\ttargetUser.sendTo(room, `|${messageType}|${html}`);\r\n\r\n\t\tthis.sendReply(`Sent private HTML to ${targetUser.name}.`);\r\n\t},\r\n\tsendprivatehtmlboxhelp: [\r\n\t\t`/sendprivatehtmlbox [userid], [html] - Sends [userid] the private [html]. Requires: * # &`,\r\n\t\t`/sendprivateuhtml [userid], [name], [html] - Sends [userid] the private [html] that can change. Requires: * # &`,\r\n\t\t`/changeprivateuhtml [userid], [name], [html] - Changes the message previously sent with /sendprivateuhtml [userid], [name], [html]. Requires: * # &`,\r\n\t],\r\n\r\n\tbotmsg(target, room, user, connection) {\r\n\t\tif (!target || !target.includes(',')) {\r\n\t\t\treturn this.parse('/help botmsg');\r\n\t\t}\r\n\t\tthis.checkRecursion();\r\n\r\n\t\tlet {targetUser, rest: message} = this.requireUser(target);\r\n\r\n\t\tconst auth = this.room ? this.room.auth : Users.globalAuth;\r\n\t\tif (!['*', '#'].includes(auth.get(targetUser))) {\r\n\t\t\treturn this.popupReply(`The user \"${targetUser.name}\" is not a bot in this room.`);\r\n\t\t}\r\n\t\tthis.room = null; // shouldn't be in a room\r\n\t\tthis.pmTarget = targetUser;\r\n\r\n\t\tmessage = this.checkChat(message);\r\n\t\tif (!message) return;\r\n\t\tChat.sendPM(`/botmsg ${message}`, user, targetUser, targetUser);\r\n\t},\r\n\tbotmsghelp: [`/botmsg [username], [message] - Send a private message to a bot without feedback. For room bots, must use in the room the bot is auth in.`],\r\n\r\n\tnick() {\r\n\t\tthis.sendReply(`||New to the Pok\u00E9mon Showdown protocol? Your client needs to get a signed assertion from the login server and send /trn`);\r\n\t\tthis.sendReply(`||https://github.com/smogon/pokemon-showdown/blob/master/PROTOCOL.md#global-messages`);\r\n\t\tthis.sendReply(`||Follow the instructions for handling |challstr| in this documentation`);\r\n\t},\r\n\r\n\t/*********************************************************\r\n\t * Server management commands\r\n\t *********************************************************/\r\n\r\n\tmemusage: 'memoryusage',\r\n\tmemoryusage(target, room, user) {\r\n\t\tif (!hasDevAuth(user)) this.checkCan('lockdown');\r\n\t\tconst memUsage = process.memoryUsage();\r\n\t\tconst resultNums = [memUsage.rss, memUsage.heapUsed, memUsage.heapTotal];\r\n\t\tconst units = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\"];\r\n\t\tconst results = resultNums.map(num => {\r\n\t\t\tconst unitIndex = Math.floor(Math.log2(num) / 10); // 2^10 base log\r\n\t\t\treturn `${(num / Math.pow(2, 10 * unitIndex)).toFixed(2)} ${units[unitIndex]}`;\r\n\t\t});\r\n\t\tthis.sendReply(`||[Main process] RSS: ${results[0]}, Heap: ${results[1]} / ${results[2]}`);\r\n\t},\r\n\tmemoryusagehelp: [\r\n\t\t`/memoryusage OR /memusage - Get the current memory usage of the server. Requires: &`,\r\n\t],\r\n\r\n\tforcehotpatch: 'hotpatch',\r\n\tasync hotpatch(target, room, user, connection, cmd) {\r\n\t\tif (!target) return this.parse('/help hotpatch');\r\n\t\tthis.canUseConsole();\r\n\r\n\t\tif (Monitor.updateServerLock) {\r\n\t\t\treturn this.errorReply(\"Wait for /updateserver to finish before hotpatching.\");\r\n\t\t}\r\n\r\n\t\tawait this.parse(`/rebuild`);\r\n\t\tconst lock = Monitor.hotpatchLock;\r\n\t\tconst hotpatches = [\r\n\t\t\t'chat', 'formats', 'loginserver', 'punishments', 'dnsbl', 'modlog',\r\n\t\t\t'processmanager', 'roomsp', 'usersp',\r\n\t\t];\r\n\r\n\t\ttarget = toID(target);\r\n\t\ttry {\r\n\t\t\tUtils.clearRequireCache({exclude: ['/lib/process-manager']});\r\n\t\t\tif (target === 'all') {\r\n\t\t\t\tif (lock['all']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching all has been disabled by ${lock['all'].by} (${lock['all'].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tif (Config.disablehotpatchall) {\r\n\t\t\t\t\treturn this.errorReply(\"This server does not allow for the use of /hotpatch all\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor (const hotpatch of hotpatches) {\r\n\t\t\t\t\tawait this.parse(`/hotpatch ${hotpatch}`);\r\n\t\t\t\t}\r\n\t\t\t} else if (target === 'chat' || target === 'commands') {\r\n\t\t\t\tif (lock['tournaments']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching tournaments has been disabled by ${lock['tournaments'].by} (${lock['tournaments'].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tif (lock['chat']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching chat has been disabled by ${lock['chat'].by} (${lock['chat'].reason})`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.sendReply(\"Hotpatching chat commands...\");\r\n\r\n\t\t\t\tconst disabledCommands = Chat.allCommands().filter(c => c.disabled).map(c => `/${c.fullCmd}`);\r\n\t\t\t\tif (cmd !== 'forcehotpatch' && disabledCommands.length) {\r\n\t\t\t\t\tthis.errorReply(`${Chat.count(disabledCommands.length, \"commands\")} are disabled right now.`);\r\n\t\t\t\t\tthis.errorReply(`Hotpatching will enable them. Use /forcehotpatch chat if you're sure.`);\r\n\t\t\t\t\treturn this.errorReply(`Currently disabled: ${disabledCommands.join(', ')}`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst oldPlugins = Chat.plugins;\r\n\t\t\t\tChat.destroy();\r\n\r\n\t\t\t\tconst processManagers = ProcessManager.processManagers;\r\n\t\t\t\tfor (const manager of processManagers.slice()) {\r\n\t\t\t\t\tif (manager.filename.startsWith(FS(__dirname + '/../chat-plugins/').path)) {\r\n\t\t\t\t\t\tvoid manager.destroy();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tvoid Chat.PM.destroy();\r\n\r\n\t\t\t\tglobal.Chat = require('../chat').Chat;\r\n\t\t\t\tglobal.Tournaments = require('../tournaments').Tournaments;\r\n\r\n\t\t\t\tthis.sendReply(\"Reloading chat plugins...\");\r\n\t\t\t\tChat.loadPlugins(oldPlugins);\r\n\t\t\t\tthis.sendReply(\"DONE\");\r\n\t\t\t} else if (target === 'processmanager') {\r\n\t\t\t\tif (lock['processmanager']) {\r\n\t\t\t\t\treturn this.errorReply(\r\n\t\t\t\t\t\t`Hot-patching formats has been disabled by ${lock['processmanager'].by} ` +\r\n\t\t\t\t\t\t`(${lock['processmanager'].reason})`\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tthis.sendReply('Hotpatching processmanager prototypes...');\r\n\r\n\t\t\t\t// keep references\r\n\t\t\t\tconst cache = {...require.cache};\r\n\t\t\t\tUtils.clearRequireCache();\r\n\t\t\t\tconst newPM = require('../../lib/process-manager');\r\n\t\t\t\trequire.cache = cache;\r\n\r\n\t\t\t\tconst protos = [\r\n\t\t\t\t\t[ProcessManager.QueryProcessManager, newPM.QueryProcessManager],\r\n\t\t\t\t\t[ProcessManager.StreamProcessManager, newPM.StreamProcessManager],\r\n\t\t\t\t\t[ProcessManager.ProcessManager, newPM.ProcessManager],\r\n\t\t\t\t\t[ProcessManager.RawProcessManager, newPM.RawProcessManager],\r\n\t\t\t\t\t[ProcessManager.QueryProcessWrapper, newPM.QueryProcessWrapper],\r\n\t\t\t\t\t[ProcessManager.StreamProcessWrapper, newPM.StreamProcessWrapper],\r\n\t\t\t\t\t[ProcessManager.RawProcessManager, newPM.RawProcessWrapper],\r\n\t\t\t\t].map(part => part.map(constructor => constructor.prototype));\r\n\r\n\t\t\t\tfor (const [oldProto, newProto] of protos) {\r\n\t\t\t\t\tconst newKeys = keysToCopy(newProto);\r\n\t\t\t\t\tconst oldKeys = keysToCopy(oldProto);\r\n\t\t\t\t\tfor (const key of oldKeys) {\r\n\t\t\t\t\t\tif (!newProto[key]) {\r\n\t\t\t\t\t\t\tdelete oldProto[key];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (const key of newKeys) {\r\n\t\t\t\t\t\toldProto[key] = newProto[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.sendReply('DONE');\r\n\t\t\t} else if (target === 'usersp' || target === 'roomsp') {\r\n\t\t\t\tif (lock[target]) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching ${target} has been disabled by ${lock[target].by} (${lock[target].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tlet newProto: any, oldProto: any, message: string;\r\n\t\t\t\tswitch (target) {\r\n\t\t\t\tcase 'usersp':\r\n\t\t\t\t\tnewProto = require('../users').User.prototype;\r\n\t\t\t\t\toldProto = Users.User.prototype;\r\n\t\t\t\t\tmessage = 'user prototypes';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'roomsp':\r\n\t\t\t\t\tnewProto = require('../rooms').BasicRoom.prototype;\r\n\t\t\t\t\toldProto = Rooms.BasicRoom.prototype;\r\n\t\t\t\t\tmessage = 'rooms prototypes';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.sendReply(`Hotpatching ${message}...`);\r\n\t\t\t\tconst newKeys = keysToCopy(newProto);\r\n\t\t\t\tconst oldKeys = keysToCopy(oldProto);\r\n\r\n\t\t\t\tconst counts = {\r\n\t\t\t\t\tadded: 0,\r\n\t\t\t\t\tupdated: 0,\r\n\t\t\t\t\tdeleted: 0,\r\n\t\t\t\t};\r\n\r\n\t\t\t\tfor (const key of oldKeys) {\r\n\t\t\t\t\tif (!newProto[key]) {\r\n\t\t\t\t\t\tcounts.deleted++;\r\n\t\t\t\t\t\tdelete oldProto[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfor (const key of newKeys) {\r\n\t\t\t\t\tif (!oldProto[key]) {\r\n\t\t\t\t\t\tcounts.added++;\r\n\t\t\t\t\t} else if (\r\n\t\t\t\t\t\t// compare source code\r\n\t\t\t\t\t\ttypeof oldProto[key] !== 'function' || oldProto[key].toString() !== newProto[key].toString()\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tcounts.updated++;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\toldProto[key] = newProto[key];\r\n\t\t\t\t}\r\n\t\t\t\tthis.sendReply(`DONE`);\r\n\t\t\t\tthis.sendReply(\r\n\t\t\t\t\t`Updated ${Chat.count(counts.updated, 'methods')}` +\r\n\t\t\t\t\t(counts.added ? `, added ${Chat.count(counts.added, 'new methods')} to ${message}` : '') +\r\n\t\t\t\t\t(counts.deleted ? `, and removed ${Chat.count(counts.deleted, 'methods')}.` : '.')\r\n\t\t\t\t);\r\n\t\t\t} else if (target === 'tournaments') {\r\n\t\t\t\tif (lock['tournaments']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching tournaments has been disabled by ${lock['tournaments'].by} (${lock['tournaments'].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tthis.sendReply(\"Hotpatching tournaments...\");\r\n\r\n\t\t\t\tglobal.Tournaments = require('../tournaments').Tournaments;\r\n\t\t\t\tChat.loadPlugin(Tournaments, 'tournaments');\r\n\t\t\t\tthis.sendReply(\"DONE\");\r\n\t\t\t} else if (target === 'formats' || target === 'battles') {\r\n\t\t\t\tif (lock['formats']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching formats has been disabled by ${lock['formats'].by} (${lock['formats'].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tif (lock['battles']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching battles has been disabled by ${lock['battles'].by} (${lock['battles'].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tif (lock['validator']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching the validator has been disabled by ${lock['validator'].by} (${lock['validator'].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tthis.sendReply(\"Hotpatching formats...\");\r\n\r\n\t\t\t\t// reload .sim-dist/dex.js\r\n\t\t\t\tglobal.Dex = require('../../sim/dex').Dex;\r\n\t\t\t\t// rebuild the formats list\r\n\t\t\t\tRooms.global.formatList = '';\r\n\t\t\t\t// respawn validator processes\r\n\t\t\t\tvoid TeamValidatorAsync.PM.respawn();\r\n\t\t\t\t// respawn simulator processes\r\n\t\t\t\tvoid Rooms.PM.respawn();\r\n\t\t\t\t// respawn datasearch processes (crashes otherwise, since the Dex data in the PM can be out of date)\r\n\t\t\t\tvoid Chat.plugins.datasearch?.PM?.respawn();\r\n\t\t\t\t// broadcast the new formats list to clients\r\n\t\t\t\tRooms.global.sendAll(Rooms.global.formatListText);\r\n\t\t\t\tthis.sendReply(\"DONE\");\r\n\t\t\t} else if (target === 'loginserver') {\r\n\t\t\t\tthis.sendReply(\"Hotpatching loginserver...\");\r\n\t\t\t\tFS('config/custom.css').unwatch();\r\n\t\t\t\tglobal.LoginServer = require('../loginserver').LoginServer;\r\n\t\t\t\tthis.sendReply(\"DONE. New login server requests will use the new code.\");\r\n\t\t\t} else if (target === 'learnsets' || target === 'validator') {\r\n\t\t\t\tif (lock['validator']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching the validator has been disabled by ${lock['validator'].by} (${lock['validator'].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tif (lock['formats']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching formats has been disabled by ${lock['formats'].by} (${lock['formats'].reason})`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.sendReply(\"Hotpatching validator...\");\r\n\t\t\t\tvoid TeamValidatorAsync.PM.respawn();\r\n\t\t\t\tthis.sendReply(\"DONE. Any battles started after now will have teams be validated according to the new code.\");\r\n\t\t\t} else if (target === 'punishments') {\r\n\t\t\t\tif (lock['punishments']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching punishments has been disabled by ${lock['punishments'].by} (${lock['punishments'].reason})`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.sendReply(\"Hotpatching punishments...\");\r\n\t\t\t\tglobal.Punishments = require('../punishments').Punishments;\r\n\t\t\t\tthis.sendReply(\"DONE\");\r\n\t\t\t} else if (target === 'dnsbl' || target === 'datacenters' || target === 'iptools') {\r\n\t\t\t\tthis.sendReply(\"Hotpatching ip-tools...\");\r\n\r\n\t\t\t\tglobal.IPTools = require('../ip-tools').IPTools;\r\n\t\t\t\tvoid IPTools.loadHostsAndRanges();\r\n\t\t\t\tthis.sendReply(\"DONE\");\r\n\t\t\t} else if (target === 'modlog') {\r\n\t\t\t\tif (lock['modlog']) {\r\n\t\t\t\t\treturn this.errorReply(`Hot-patching modlogs has been disabled by ${lock['modlog'].by} (${lock['modlog'].reason})`);\r\n\t\t\t\t}\r\n\t\t\t\tthis.sendReply(\"Hotpatching modlog...\");\r\n\r\n\t\t\t\tvoid Rooms.Modlog.database.destroy();\r\n\t\t\t\tconst {mainModlog} = require('../modlog');\r\n\t\t\t\tif (mainModlog.readyPromise) {\r\n\t\t\t\t\tthis.sendReply(\"Waiting for the new SQLite database to be ready...\");\r\n\t\t\t\t\tawait mainModlog.readyPromise;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.sendReply(\"The new SQLite database is ready!\");\r\n\t\t\t\t}\r\n\t\t\t\tRooms.Modlog.destroyAllSQLite();\r\n\r\n\t\t\t\tRooms.Modlog = mainModlog;\r\n\t\t\t\tthis.sendReply(\"DONE\");\r\n\t\t\t} else if (target.startsWith('disable')) {\r\n\t\t\t\tthis.sendReply(\"Disabling hot-patch has been moved to its own command:\");\r\n\t\t\t\treturn this.parse('/help nohotpatch');\r\n\t\t\t} else {\r\n\t\t\t\treturn this.errorReply(\"Your hot-patch command was unrecognized.\");\r\n\t\t\t}\r\n\t\t} catch (e: any) {\r\n\t\t\tRooms.global.notifyRooms(\r\n\t\t\t\t['development', 'staff'] as RoomID[],\r\n\t\t\t\t`|c|${user.getIdentity()}|/log ${user.name} used /hotpatch ${target} - but something failed while trying to hot-patch.`\r\n\t\t\t);\r\n\t\t\treturn this.errorReply(`Something failed while trying to hot-patch ${target}: \\n${e.stack}`);\r\n\t\t}\r\n\t\tRooms.global.notifyRooms(\r\n\t\t\t['development', 'staff'] as RoomID[],\r\n\t\t\t`|c|${user.getIdentity()}|/log ${user.name} used /hotpatch ${target}`\r\n\t\t);\r\n\t},\r\n\thotpatchhelp: [\r\n\t\t`Hot-patching the game engine allows you to update parts of Showdown without interrupting currently-running battles. Requires: console access`,\r\n\t\t`Hot-patching has greater memory requirements than restarting`,\r\n\t\t`You can disable various hot-patches with /nohotpatch. For more information on this, see /help nohotpatch`,\r\n\t\t`/hotpatch chat - reloads the chat-commands and chat-plugins directories`,\r\n\t\t`/hotpatch validator - spawn new team validator processes`,\r\n\t\t`/hotpatch formats - reload the sim/dex.ts tree, reload the formats list, and spawn new simulator and team validator processes`,\r\n\t\t`/hotpatch dnsbl - reloads IPTools datacenters`,\r\n\t\t`/hotpatch punishments - reloads new punishments code`,\r\n\t\t`/hotpatch loginserver - reloads new loginserver code`,\r\n\t\t`/hotpatch tournaments - reloads new tournaments code`,\r\n\t\t`/hotpatch modlog - reloads new modlog code`,\r\n\t\t`/hotpatch all - hot-patches chat, tournaments, formats, login server, punishments, modlog, and dnsbl`,\r\n\t\t`/forcehotpatch [target] - as above, but performs the update regardless of whether the history has changed in git`,\r\n\t],\r\n\r\n\thotpatchlock: 'nohotpatch',\r\n\tyeshotpatch: 'nohotpatch',\r\n\tallowhotpatch: 'nohotpatch',\r\n\tnohotpatch(target, room, user, connection, cmd) {\r\n\t\tthis.checkCan('gdeclare');\r\n\t\tif (!target) return this.parse('/help nohotpatch');\r\n\r\n\t\tconst separator = ' ';\r\n\r\n\t\tconst hotpatch = toID(target.substr(0, target.indexOf(separator)));\r\n\t\tconst reason = target.substr(target.indexOf(separator), target.length).trim();\r\n\t\tif (!reason || !target.includes(separator)) return this.parse('/help nohotpatch');\r\n\r\n\t\tconst lock = Monitor.hotpatchLock;\r\n\t\tconst validDisable = [\r\n\t\t\t'roomsp', 'usersp', 'chat', 'battles', 'formats', 'validator',\r\n\t\t\t'tournaments', 'punishments', 'modlog', 'all', 'processmanager',\r\n\t\t];\r\n\r\n\t\tif (!validDisable.includes(hotpatch)) {\r\n\t\t\treturn this.errorReply(`Disabling hotpatching \"${hotpatch}\" is not supported.`);\r\n\t\t}\r\n\t\tconst enable = ['allowhotpatch', 'yeshotpatch'].includes(cmd);\r\n\r\n\t\tif (enable) {\r\n\t\t\tif (!lock[hotpatch]) return this.errorReply(`Hot-patching ${hotpatch} is not disabled.`);\r\n\r\n\t\t\tdelete lock[hotpatch];\r\n\t\t\tthis.sendReply(`You have enabled hot-patching ${hotpatch}.`);\r\n\t\t} else {\r\n\t\t\tif (lock[hotpatch]) {\r\n\t\t\t\treturn this.errorReply(`Hot-patching ${hotpatch} has already been disabled by ${lock[hotpatch].by} (${lock[hotpatch].reason})`);\r\n\t\t\t}\r\n\t\t\tlock[hotpatch] = {\r\n\t\t\t\tby: user.name,\r\n\t\t\t\treason,\r\n\t\t\t};\r\n\t\t\tthis.sendReply(`You have disabled hot-patching ${hotpatch}.`);\r\n\t\t}\r\n\t\tRooms.global.notifyRooms(\r\n\t\t\t['development', 'staff', 'upperstaff'] as RoomID[],\r\n\t\t\t`|c|${user.getIdentity()}|/log ${user.name} has ${enable ? 'enabled' : 'disabled'} hot-patching ${hotpatch}. Reason: ${reason}`\r\n\t\t);\r\n\t},\r\n\tnohotpatchhelp: [\r\n\t\t`/nohotpatch [chat|formats|battles|validator|tournaments|punishments|modlog|all] [reason] - Disables hotpatching the specified part of the simulator. Requires: &`,\r\n\t\t`/allowhotpatch [chat|formats|battles|validator|tournaments|punishments|modlog|all] [reason] - Enables hotpatching the specified part of the simulator. Requires: &`,\r\n\t],\r\n\r\n\tasync processes(target, room, user) {\r\n\t\tif (!hasDevAuth(user)) this.checkCan('lockdown');\r\n\r\n\t\tconst processes = new Map();\r\n\t\tconst ramUnits = [\"KiB\", \"MiB\", \"GiB\", \"TiB\"];\r\n\r\n\t\tconst cwd = FS.ROOT_PATH;\r\n\t\tawait new Promise(resolve => {\r\n\t\t\tconst child = child_process.exec('ps -o pid,%cpu,time,rss,command', {cwd}, (err, stdout) => {\r\n\t\t\t\tif (err) throw err;\r\n\t\t\t\tconst rows = stdout.split('\\n').slice(1); // first line is the table header\r\n\t\t\t\tfor (const row of rows) {\r\n\t\t\t\t\tif (!row.trim()) continue;\r\n\t\t\t\t\tconst [pid, cpu, time, ram, ...rest] = row.split(' ').filter(Boolean);\r\n\t\t\t\t\tif (pid === `${child.pid}`) continue; // ignore this process\r\n\t\t\t\t\tconst entry: ProcessData = {cmd: rest.join(' ')};\r\n\t\t\t\t\t// at the point of 0:00.[num], it's in so few seconds we don't care, so\r\n\t\t\t\t\t// we don't need to clutter the display\r\n\t\t\t\t\tif (time && !time.startsWith('0:00')) {\r\n\t\t\t\t\t\tentry.time = time;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (cpu && cpu !== '0.0') entry.cpu = `${cpu}%`;\r\n\t\t\t\t\tconst ramNum = parseInt(ram);\r\n\t\t\t\t\tif (!isNaN(ramNum)) {\r\n\t\t\t\t\t\tconst unitIndex = Math.floor(Math.log2(ramNum) / 10); // 2^10 base log\r\n\t\t\t\t\t\tentry.ram = `${(ramNum / Math.pow(2, 10 * unitIndex)).toFixed(2)} ${ramUnits[unitIndex]}`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tprocesses.set(pid, entry);\r\n\t\t\t\t}\r\n\t\t\t\tresolve();\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tlet buf = `${process.pid} - Main `;\r\n\t\tconst mainDisplay = [];\r\n\t\tconst mainProcess = processes.get(`${process.pid}`)!;\r\n\t\tif (mainProcess.cpu) mainDisplay.push(`CPU ${mainProcess.cpu}`);\r\n\t\tif (mainProcess.time) mainDisplay.push(`time: ${mainProcess.time})`);\r\n\t\tif (mainProcess.ram) {\r\n\t\t\tmainDisplay.push(`RAM: ${mainProcess.ram}`);\r\n\t\t}\r\n\t\tif (mainDisplay.length) buf += ` (${mainDisplay.join(', ')})`;\r\n\t\tbuf += `

Process managers:
`;\r\n\t\tprocesses.delete(`${process.pid}`);\r\n\r\n\t\tfor (const manager of ProcessManager.processManagers) {\r\n\t\t\tfor (const [i, process] of manager.processes.entries()) {\r\n\t\t\t\tconst pid = process.getProcess().pid;\r\n\t\t\t\tlet managerName = manager.basename;\r\n\t\t\t\tif (managerName.startsWith('index.')) { // doesn't actually tell us anything abt the process\r\n\t\t\t\t\tmanagerName = manager.filename.split(path.sep).slice(-2).join(path.sep);\r\n\t\t\t\t}\r\n\t\t\t\tbuf += `${pid} - ${managerName} ${i} (load ${process.getLoad()}`;\r\n\t\t\t\tconst info = processes.get(`${pid}`)!;\r\n\t\t\t\tconst display = [];\r\n\t\t\t\tif (info.cpu) display.push(`CPU: ${info.cpu}`);\r\n\t\t\t\tif (info.time) display.push(`time: ${info.time}`);\r\n\t\t\t\tif (info.ram) display.push(`RAM: ${info.ram}`);\r\n\t\t\t\tif (display.length) buf += `, ${display.join(', ')})`;\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t\tprocesses.delete(`${pid}`);\r\n\t\t\t}\r\n\t\t\tfor (const [i, process] of manager.releasingProcesses.entries()) {\r\n\t\t\t\tconst pid = process.getProcess().pid;\r\n\t\t\t\tbuf += `${pid} - PENDING RELEASE ${manager.basename} ${i} (load ${process.getLoad()}`;\r\n\t\t\t\tconst info = processes.get(`${pid}`);\r\n\t\t\t\tif (info) {\r\n\t\t\t\t\tconst display = [];\r\n\t\t\t\t\tif (info.cpu) display.push(`CPU: ${info.cpu}`);\r\n\t\t\t\t\tif (info.time) display.push(`time: ${info.time}`);\r\n\t\t\t\t\tif (info.ram) display.push(`RAM: ${info.ram}`);\r\n\t\t\t\t\tif (display.length) buf += `, ${display.join(', ')})`;\r\n\t\t\t\t}\r\n\t\t\t\tbuf += `
`;\r\n\t\t\t\tprocesses.delete(`${pid}`);\r\n\t\t\t}\r\n\t\t}\r\n\t\tbuf += `
`;\r\n\t\tbuf += `
Other processes:`;\r\n\r\n\t\tfor (const [pid, info] of processes) {\r\n\t\t\tbuf += `${pid} - ${info.cmd}`;\r\n\t\t\tconst display = [];\r\n\t\t\tif (info.cpu) display.push(`CPU: ${info.cpu}`);\r\n\t\t\tif (info.time) display.push(`time: ${info.time}`);\r\n\t\t\tif (info.ram) display.push(`RAM: ${info.ram}`);\r\n\t\t\tif (display.length) buf += `(${display.join(', ')})`;\r\n\t\t\tbuf += `
`;\r\n\t\t}\r\n\t\tbuf += `
`;\r\n\t\tthis.sendReplyBox(buf);\r\n\t},\r\n\tprocesseshelp: [\r\n\t\t`/processes - Get information about the running processes on the server. Requires: &.`,\r\n\t],\r\n\r\n\tasync savelearnsets(target, room, user, connection) {\r\n\t\tthis.canUseConsole();\r\n\t\tthis.sendReply(\"saving...\");\r\n\t\tawait FS('data/learnsets.js').write(`'use strict';\\n\\nexports.Learnsets = {\\n` +\r\n\t\t\tObject.entries(Dex.data.Learnsets).map(([id, entry]) => (\r\n\t\t\t\t`\\t${id}: {learnset: {\\n` +\r\n\t\t\t\tUtils.sortBy(\r\n\t\t\t\t\tObject.entries(Dex.species.getLearnsetData(id as ID)),\r\n\t\t\t\t\t([moveid]) => moveid\r\n\t\t\t\t).map(([moveid, sources]) => (\r\n\t\t\t\t\t`\\t\\t${moveid}: [\"` + sources.join(`\", \"`) + `\"],\\n`\r\n\t\t\t\t)).join('') +\r\n\t\t\t\t`\\t}},\\n`\r\n\t\t\t)).join('') +\r\n\t\t`};\\n`);\r\n\t\tthis.sendReply(\"learnsets.js saved.\");\r\n\t},\r\n\tsavelearnsetshelp: [\r\n\t\t`/savelearnsets - Saves the learnset list currently active on the server. Requires: &`,\r\n\t],\r\n\r\n\ttoggleripgrep(target, room, user) {\r\n\t\tthis.checkCan('rangeban');\r\n\t\tConfig.disableripgrep = !Config.disableripgrep;\r\n\t\tthis.addGlobalModAction(`${user.name} ${Config.disableripgrep ? 'disabled' : 'enabled'} Ripgrep-related functionality.`);\r\n\t},\r\n\ttoggleripgrephelp: [`/toggleripgrep - Disable/enable all functionality depending on Ripgrep. Requires: &`],\r\n\r\n\tdisablecommand(target, room, user) {\r\n\t\tthis.checkCan('makeroom');\r\n\t\tif (!toID(target)) {\r\n\t\t\treturn this.parse(`/help disablecommand`);\r\n\t\t}\r\n\t\tif (['!', '/'].some(c => target.startsWith(c))) target = target.slice(1);\r\n\t\tconst parsed = Chat.parseCommand(`/${target}`);\r\n\t\tif (!parsed) {\r\n\t\t\treturn this.errorReply(`Command \"/${target}\" is in an invalid format.`);\r\n\t\t}\r\n\t\tconst {handler, fullCmd} = parsed;\r\n\t\tif (!handler) {\r\n\t\t\treturn this.errorReply(`Command \"/${target}\" not found.`);\r\n\t\t}\r\n\t\tif (handler.disabled) {\r\n\t\t\treturn this.errorReply(`Command \"/${target}\" is already disabled`);\r\n\t\t}\r\n\t\thandler.disabled = true;\r\n\t\tthis.addGlobalModAction(`${user.name} disabled the command /${fullCmd}.`);\r\n\t\tthis.globalModlog(`DISABLECOMMAND`, null, target);\r\n\t},\r\n\tdisablecommandhelp: [`/disablecommand [command] - Disables the given [command]. Requires: &`],\r\n\r\n\twidendatacenters: 'adddatacenters',\r\n\tadddatacenters() {\r\n\t\tthis.errorReply(\"This command has been replaced by /datacenter add\");\r\n\t\treturn this.parse('/help datacenters');\r\n\t},\r\n\r\n\tdisableladder(target, room, user) {\r\n\t\tthis.checkCan('disableladder');\r\n\t\tif (Ladders.disabled) {\r\n\t\t\treturn this.errorReply(`/disableladder - Ladder is already disabled.`);\r\n\t\t}\r\n\r\n\t\tLadders.disabled = true;\r\n\r\n\t\tthis.modlog(`DISABLELADDER`);\r\n\t\tMonitor.log(`The ladder was disabled by ${user.name}.`);\r\n\r\n\t\tconst innerHTML = (\r\n\t\t\t`Due to technical difficulties, the ladder has been temporarily disabled.
` +\r\n\t\t\t`Rated games will no longer update the ladder. It will be back momentarily.`\r\n\t\t);\r\n\r\n\t\tfor (const curRoom of Rooms.rooms.values()) {\r\n\t\t\tif (curRoom.type === 'battle') curRoom.rated = 0;\r\n\t\t\tcurRoom.addRaw(`
${innerHTML}
`).update();\r\n\t\t}\r\n\t\tfor (const u of Users.users.values()) {\r\n\t\t\tif (u.connected) u.send(`|pm|&|${u.tempGroup}${u.name}|/raw
${innerHTML}
`);\r\n\t\t}\r\n\t},\r\n\tdisableladderhelp: [`/disableladder - Stops all rated battles from updating the ladder. Requires: &`],\r\n\r\n\tenableladder(target, room, user) {\r\n\t\tthis.checkCan('disableladder');\r\n\t\tif (!Ladders.disabled) {\r\n\t\t\treturn this.errorReply(`/enable - Ladder is already enabled.`);\r\n\t\t}\r\n\t\tLadders.disabled = false;\r\n\r\n\t\tthis.modlog('ENABLELADDER');\r\n\t\tMonitor.log(`The ladder was enabled by ${user.name}.`);\r\n\r\n\t\tconst innerHTML = (\r\n\t\t\t`The ladder is now back.
` +\r\n\t\t\t`Rated games will update the ladder now..`\r\n\t\t);\r\n\r\n\t\tfor (const curRoom of Rooms.rooms.values()) {\r\n\t\t\tcurRoom.addRaw(`
${innerHTML}
`).update();\r\n\t\t}\r\n\t\tfor (const u of Users.users.values()) {\r\n\t\t\tif (u.connected) u.send(`|pm|&|${u.tempGroup}${u.name}|/raw
${innerHTML}
`);\r\n\t\t}\r\n\t},\r\n\tenableladderhelp: [`/enable - Allows all rated games to update the ladder. Requires: &`],\r\n\r\n\tlockdown(target, room, user) {\r\n\t\tthis.checkCan('lockdown');\r\n\r\n\t\tconst disabledCommands = Chat.allCommands().filter(c => c.disabled).map(c => `/${c.fullCmd}`);\r\n\t\tif (disabledCommands.length) {\r\n\t\t\tthis.sendReply(`${Chat.count(disabledCommands.length, \"commands\")} are disabled right now.`);\r\n\t\t\tthis.sendReply(`Be aware that restarting will re-enable them.`);\r\n\t\t\tthis.sendReply(`Currently disabled: ${disabledCommands.join(', ')}`);\r\n\t\t}\r\n\t\tRooms.global.startLockdown();\r\n\r\n\t\tthis.stafflog(`${user.name} used /lockdown`);\r\n\t},\r\n\tlockdownhelp: [\r\n\t\t`/lockdown - locks down the server, which prevents new battles from starting so that the server can eventually be restarted. Requires: &`,\r\n\t],\r\n\r\n\tautolockdown: 'autolockdownkill',\r\n\tautolockdownkill(target, room, user) {\r\n\t\tthis.checkCan('lockdown');\r\n\t\tif (Config.autolockdown === undefined) Config.autolockdown = true;\r\n\t\tif (this.meansYes(target)) {\r\n\t\t\tif (Config.autolockdown) {\r\n\t\t\t\treturn this.errorReply(\"The server is already set to automatically kill itself upon the final battle finishing.\");\r\n\t\t\t}\r\n\t\t\tConfig.autolockdown = true;\r\n\t\t\tthis.privateGlobalModAction(`${user.name} used /autolockdownkill on (autokill on final battle finishing)`);\r\n\t\t} else if (this.meansNo(target)) {\r\n\t\t\tif (!Config.autolockdown) {\r\n\t\t\t\treturn this.errorReply(\"The server is already set to not automatically kill itself upon the final battle finishing.\");\r\n\t\t\t}\r\n\t\t\tConfig.autolockdown = false;\r\n\t\t\tthis.privateGlobalModAction(`${user.name} used /autolockdownkill off (no autokill on final battle finishing)`);\r\n\t\t} else {\r\n\t\t\treturn this.parse('/help autolockdownkill');\r\n\t\t}\r\n\t},\r\n\tautolockdownkillhelp: [\r\n\t\t`/autolockdownkill on - Turns on the setting to enable the server to automatically kill itself upon the final battle finishing. Requires &`,\r\n\t\t`/autolockdownkill off - Turns off the setting to enable the server to automatically kill itself upon the final battle finishing. Requires &`,\r\n\t],\r\n\r\n\tprelockdown(target, room, user) {\r\n\t\tthis.checkCan('lockdown');\r\n\t\tRooms.global.lockdown = 'pre';\r\n\r\n\t\tthis.privateGlobalModAction(`${user.name} used /prelockdown (disabled tournaments in preparation for server restart)`);\r\n\t},\r\n\tprelockdownhelp: [`/prelockdown - Prevents new tournaments from starting so that the server can be restarted. Requires: &`],\r\n\r\n\tslowlockdown(target, room, user) {\r\n\t\tthis.checkCan('lockdown');\r\n\r\n\t\tRooms.global.startLockdown(undefined, true);\r\n\r\n\t\tthis.privateGlobalModAction(`${user.name} used /slowlockdown (lockdown without auto-restart)`);\r\n\t},\r\n\tslowlockdownhelp: [\r\n\t\t`/slowlockdown - Locks down the server, but disables the automatic restart after all battles end.`,\r\n\t\t`Requires: &`,\r\n\t],\r\n\r\n\tcrashfixed: 'endlockdown',\r\n\tendlockdown(target, room, user, connection, cmd) {\r\n\t\tthis.checkCan('lockdown');\r\n\r\n\t\tif (!Rooms.global.lockdown) {\r\n\t\t\treturn this.errorReply(\"We're not under lockdown right now.\");\r\n\t\t}\r\n\t\tif (Rooms.global.lockdown !== true && cmd === 'crashfixed') {\r\n\t\t\treturn this.errorReply('/crashfixed - There is no active crash.');\r\n\t\t}\r\n\r\n\t\tconst message = cmd === 'crashfixed' ?\r\n\t\t\t`
We fixed the crash without restarting the server!
` :\r\n\t\t\t`
The server restart was canceled.
`;\r\n\t\tif (Rooms.global.lockdown === true) {\r\n\t\t\tfor (const curRoom of Rooms.rooms.values()) {\r\n\t\t\t\tcurRoom.addRaw(message).update();\r\n\t\t\t}\r\n\t\t\tfor (const curUser of Users.users.values()) {\r\n\t\t\t\tcurUser.send(`|pm|&|${curUser.tempGroup}${curUser.name}|/raw ${message}`);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.sendReply(\"Preparation for the server shutdown was canceled.\");\r\n\t\t}\r\n\t\tRooms.global.lockdown = false;\r\n\r\n\t\tthis.stafflog(`${user.name} used /endlockdown`);\r\n\t},\r\n\tendlockdownhelp: [\r\n\t\t`/endlockdown - Cancels the server restart and takes the server out of lockdown state. Requires: &`,\r\n\t\t`/crashfixed - Ends the active lockdown caused by a crash without the need of a restart. Requires: &`,\r\n\t],\r\n\r\n\temergency(target, room, user) {\r\n\t\tthis.checkCan('lockdown');\r\n\r\n\t\tif (Config.emergency) {\r\n\t\t\treturn this.errorReply(\"We're already in emergency mode.\");\r\n\t\t}\r\n\t\tConfig.emergency = true;\r\n\t\tfor (const curRoom of Rooms.rooms.values()) {\r\n\t\t\tcurRoom.addRaw(`
The server has entered emergency mode. Some features might be disabled or limited.
`).update();\r\n\t\t}\r\n\r\n\t\tthis.stafflog(`${user.name} used /emergency.`);\r\n\t},\r\n\temergencyhelp: [\r\n\t\t`/emergency - Turns on emergency mode and enables extra logging. Requires: &`,\r\n\t],\r\n\r\n\tendemergency(target, room, user) {\r\n\t\tthis.checkCan('lockdown');\r\n\r\n\t\tif (!Config.emergency) {\r\n\t\t\treturn this.errorReply(\"We're not in emergency mode.\");\r\n\t\t}\r\n\t\tConfig.emergency = false;\r\n\t\tfor (const curRoom of Rooms.rooms.values()) {\r\n\t\t\tcurRoom.addRaw(`
The server is no longer in emergency mode.
`).update();\r\n\t\t}\r\n\r\n\t\tthis.stafflog(`${user.name} used /endemergency.`);\r\n\t},\r\n\tendemergencyhelp: [\r\n\t\t`/endemergency - Turns off emergency mode. Requires: &`,\r\n\t],\r\n\r\n\tasync savebattles(target, room, user) {\r\n\t\tthis.checkCan('rangeban'); // admins can restart, so they should be able to do this if needed\r\n\t\tthis.sendReply(`Saving battles...`);\r\n\t\tconst count = await Rooms.global.saveBattles();\r\n\t\tthis.sendReply(`DONE.`);\r\n\t\tthis.sendReply(`${count} battles saved.`);\r\n\t\tthis.addModAction(`${user.name} used /savebattles`);\r\n\t},\r\n\r\n\tasync kill(target, room, user) {\r\n\t\tthis.checkCan('lockdown');\r\n\t\tlet noSave = toID(target) === 'nosave';\r\n\t\tif (!Config.usepostgres) noSave = true;\r\n\r\n\t\tif (Rooms.global.lockdown !== true && noSave) {\r\n\t\t\treturn this.errorReply(\"For safety reasons, using /kill without saving battles can only be done during lockdown.\");\r\n\t\t}\r\n\r\n\t\tif (Monitor.updateServerLock) {\r\n\t\t\treturn this.errorReply(\"Wait for /updateserver to finish before using /kill.\");\r\n\t\t}\r\n\r\n\t\tif (!noSave) {\r\n\t\t\tthis.sendReply('Saving battles...');\r\n\t\t\tRooms.global.lockdown = true; // we don't want more battles starting while we save\r\n\t\t\tfor (const u of Users.users.values()) {\r\n\t\t\t\tu.send(\r\n\t\t\t\t\t`|pm|&|${u.getIdentity()}|/raw
The server is restarting soon.
` +\r\n\t\t\t\t\t`While battles are being saved, no more can be started. If you're in a battle, it will be paused during saving.
` +\r\n\t\t\t\t\t`After the restart, you will be able to resume your battles from where you left off.`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tconst count = await Rooms.global.saveBattles();\r\n\t\t\tthis.sendReply(`DONE.`);\r\n\t\t\tthis.sendReply(`${count} battles saved.`);\r\n\t\t}\r\n\r\n\t\tconst logRoom = Rooms.get('staff') || Rooms.lobby || room;\r\n\r\n\t\tif (!logRoom?.log.roomlogStream) return process.exit();\r\n\r\n\t\tlogRoom.roomlog(`${user.name} used /kill`);\r\n\r\n\t\tvoid logRoom.log.roomlogStream.writeEnd().then(() => {\r\n\t\t\tprocess.exit();\r\n\t\t});\r\n\r\n\t\t// In the case the above never terminates\r\n\t\tsetTimeout(() => {\r\n\t\t\tprocess.exit();\r\n\t\t}, 10000);\r\n\t},\r\n\tkillhelp: [\r\n\t\t`/kill - kills the server. Use the argument \\`nosave\\` to prevent the saving of battles.`,\r\n\t\t` If this argument is used, the server must be in lockdown. Requires: &`,\r\n\t],\r\n\r\n\tloadbanlist(target, room, user, connection) {\r\n\t\tthis.checkCan('lockdown');\r\n\r\n\t\tconnection.sendTo(room, \"Loading ipbans.txt...\");\r\n\t\tPunishments.loadBanlist().then(\r\n\t\t\t() => connection.sendTo(room, \"ipbans.txt has been reloaded.\"),\r\n\t\t\terror => connection.sendTo(room, `Something went wrong while loading ipbans.txt: ${error}`)\r\n\t\t);\r\n\t},\r\n\tloadbanlisthelp: [\r\n\t\t`/loadbanlist - Loads the bans located at ipbans.txt. The command is executed automatically at startup. Requires: &`,\r\n\t],\r\n\r\n\trefreshpage(target, room, user) {\r\n\t\tthis.checkCan('lockdown');\r\n\t\tRooms.global.sendAll('|refresh|');\r\n\t\tthis.stafflog(`${user.name} used /refreshpage`);\r\n\t},\r\n\trefreshpagehelp: [\r\n\t\t`/refreshpage - refreshes the page for every user online. Requires: &`,\r\n\t],\r\n\r\n\tasync updateserver(target, room, user, connection) {\r\n\t\tthis.canUseConsole();\r\n\t\tif (Monitor.updateServerLock) {\r\n\t\t\treturn this.errorReply(`/updateserver - Another update is already in progress (or a previous update crashed).`);\r\n\t\t}\r\n\r\n\t\tconst validPrivateCodePath = Config.privatecodepath && path.isAbsolute(Config.privatecodepath);\r\n\t\ttarget = toID(target);\r\n\t\tMonitor.updateServerLock = true;\r\n\r\n\r\n\t\tlet success = true;\r\n\t\tif (target === 'private') {\r\n\t\t\tif (!validPrivateCodePath) {\r\n\t\t\t\tMonitor.updateServerLock = false;\r\n\t\t\t\tthrow new Chat.ErrorMessage(\"`Config.privatecodepath` must be set to an absolute path before using /updateserver private.\");\r\n\t\t\t}\r\n\t\t\tsuccess = await updateserver(this, Config.privatecodepath);\r\n\t\t\tthis.addGlobalModAction(`${user.name} used /updateserver private`);\r\n\t\t} else {\r\n\t\t\tif (target !== 'public' && validPrivateCodePath) {\r\n\t\t\t\tsuccess = await updateserver(this, Config.privatecodepath);\r\n\t\t\t}\r\n\t\t\tsuccess = success && await updateserver(this, FS.ROOT_PATH);\r\n\t\t\tthis.addGlobalModAction(`${user.name} used /updateserver${target === 'public' ? ' public' : ''}`);\r\n\t\t}\r\n\r\n\t\tthis.sendReply(success ? `DONE` : `FAILED, old changes restored.`);\r\n\r\n\t\tMonitor.updateServerLock = false;\r\n\t},\r\n\tupdateserverhelp: [\r\n\t\t`/updateserver - Updates the server's code from its Git repository, including private code if present. Requires: console access`,\r\n\t\t`/updateserver private - Updates only the server's private code. Requires: console access`,\r\n\t],\r\n\r\n\tasync updateloginserver(target, room, user) {\r\n\t\tthis.canUseConsole();\r\n\t\tthis.sendReply('Restarting...');\r\n\t\tconst [result, err] = await LoginServer.request('restart');\r\n\t\tif (err) {\r\n\t\t\tRooms.global.notifyRooms(\r\n\t\t\t\t['staff', 'development'],\r\n\t\t\t\t`|c|&|/log ${user.name} used /updateloginserver - but something failed while updating.`\r\n\t\t\t);\r\n\t\t\treturn this.errorReply(err.message + '\\n' + err.stack);\r\n\t\t}\r\n\t\tif (!result) return this.errorReply('No result received.');\r\n\t\tthis.stafflog(`[o] ${result.success || \"\"} [e] ${result.actionerror || \"\"}`);\r\n\t\tif (result.actionerror) {\r\n\t\t\treturn this.errorReply(result.actionerror);\r\n\t\t}\r\n\t\tlet message = `${user.name} used /updateloginserver`;\r\n\t\tif (result.updated) {\r\n\t\t\tthis.sendReply(`DONE. Server updated and restarted.`);\r\n\t\t} else {\r\n\t\t\tmessage += ` - but something failed while updating.`;\r\n\t\t\tthis.errorReply(`FAILED. Conflicts were found while updating - the restart was aborted.`);\r\n\t\t}\r\n\t\tRooms.global.notifyRooms(\r\n\t\t\t['staff', 'development'], `|c|&|/log ${message}`\r\n\t\t);\r\n\t},\r\n\tupdateloginserverhelp: [\r\n\t\t`/updateloginserver - Updates and restarts the loginserver. Requires: console access`,\r\n\t],\r\n\r\n\tasync rebuild() {\r\n\t\tthis.canUseConsole();\r\n\t\tconst [, , stderr] = await bash('node ./build', this);\r\n\t\tif (stderr) {\r\n\t\t\tthrow new Chat.ErrorMessage(`Crash while rebuilding: ${stderr}`);\r\n\t\t}\r\n\t\tthis.sendReply('Rebuilt.');\r\n\t},\r\n\r\n\t/*********************************************************\r\n\t * Low-level administration commands\r\n\t *********************************************************/\r\n\r\n\tasync bash(target, room, user, connection) {\r\n\t\tthis.canUseConsole();\r\n\t\tif (!target) return this.parse('/help bash');\r\n\t\tthis.sendReply(`$ ${target}`);\r\n\t\tconst [, stdout, stderr] = await bash(target, this);\r\n\t\tthis.runBroadcast();\r\n\t\tthis.sendReply(`${stdout}${stderr}`);\r\n\t},\r\n\tbashhelp: [`/bash [command] - Executes a bash command on the server. Requires: & console access`],\r\n\r\n\tasync eval(target, room, user, connection) {\r\n\t\tthis.canUseConsole();\r\n\t\tif (!this.runBroadcast(true)) return;\r\n\t\tconst logRoom = Rooms.get('upperstaff') || Rooms.get('staff');\r\n\r\n\t\tif (this.message.startsWith('>>') && room) {\r\n\t\t\tthis.broadcasting = true;\r\n\t\t\tthis.broadcastToRoom = true;\r\n\t\t}\r\n\t\tconst generateHTML = (direction: string, contents: string) => (\r\n\t\t\t`
` +\r\n\t\t\t\tUtils.escapeHTML(direction).repeat(2) +\r\n\t\t\t\t` ${Chat.getReadmoreCodeBlock(contents)}
`\r\n\t\t);\r\n\t\tthis.sendReply(`|html|${generateHTML('>', target)}`);\r\n\t\tlogRoom?.roomlog(`>> ${target}`);\r\n\t\tlet uhtmlId = null;\r\n\t\ttry {\r\n\t\t\t/* eslint-disable no-eval, @typescript-eslint/no-unused-vars */\r\n\t\t\tconst battle = room?.battle;\r\n\t\t\tconst me = user;\r\n\t\t\tlet result = eval(target);\r\n\t\t\t/* eslint-enable no-eval, @typescript-eslint/no-unused-vars */\r\n\r\n\t\t\tif (result?.then) {\r\n\t\t\t\tuhtmlId = `eval-${Date.now().toString().slice(-6)}-${Math.random().toFixed(6).slice(-6)}`;\r\n\t\t\t\tthis.sendReply(`|uhtml|${uhtmlId}|${generateHTML('<', 'Promise pending')}`);\r\n\t\t\t\tthis.update();\r\n\t\t\t\tresult = `Promise -> ${Utils.visualize(await result)}`;\r\n\t\t\t\tthis.sendReply(`|uhtmlchange|${uhtmlId}|${generateHTML('<', result)}`);\r\n\t\t\t} else {\r\n\t\t\t\tresult = Utils.visualize(result);\r\n\t\t\t\tthis.sendReply(`|html|${generateHTML('<', result)}`);\r\n\t\t\t}\r\n\t\t\tlogRoom?.roomlog(`<< ${result}`);\r\n\t\t} catch (e: any) {\r\n\t\t\tconst message = ('' + e.stack).replace(/\\n *at CommandContext\\.eval [\\s\\S]*/m, '');\r\n\t\t\tconst command = uhtmlId ? `|uhtmlchange|${uhtmlId}|` : '|html|';\r\n\t\t\tthis.sendReply(`${command}${generateHTML('<', message)}`);\r\n\t\t\tlogRoom?.roomlog(`<< ${message}`);\r\n\t\t}\r\n\t},\r\n\tevalhelp: [\r\n\t\t`/eval [code] - Evaluates the code given and shows results. Requires: & console access.`,\r\n\t],\r\n\r\n\tasync evalsql(target, room) {\r\n\t\tthis.canUseConsole();\r\n\t\tthis.runBroadcast(true);\r\n\t\tif (!Config.usesqlite) return this.errorReply(`SQLite is disabled.`);\r\n\t\tconst logRoom = Rooms.get('upperstaff') || Rooms.get('staff');\r\n\t\tif (!target) return this.errorReply(`Specify a database to access and a query.`);\r\n\t\tconst [db, query] = Utils.splitFirst(target, ',').map(item => item.trim());\r\n\t\tif (!FS('./databases').readdirSync().includes(`${db}.db`)) {\r\n\t\t\treturn this.errorReply(`The database file ${db}.db was not found.`);\r\n\t\t}\r\n\t\tif (room && this.message.startsWith('>>sql')) {\r\n\t\t\tthis.broadcasting = true;\r\n\t\t\tthis.broadcastToRoom = true;\r\n\t\t}\r\n\t\tthis.sendReply(\r\n\t\t\t`|html|
` +\r\n\t\t\t`
SQLite> [${db}.db]  ${Chat.getReadmoreCodeBlock(query)}
`\r\n\t\t);\r\n\t\tlogRoom?.roomlog(`SQLite> ${target}`);\r\n\t\tconst database = SQL(module, {\r\n\t\t\tfile: `./databases/${db}.db`,\r\n\t\t\tonError(err) {\r\n\t\t\t\treturn {err: err.message, stack: err.stack};\r\n\t\t\t},\r\n\t\t});\r\n\t\tfunction formatResult(result: any[] | string) {\r\n\t\t\tif (!Array.isArray(result)) {\r\n\t\t\t\treturn (\r\n\t\t\t\t\t`
` +\r\n\t\t\t\t\t`SQLite< ${Chat.getReadmoreCodeBlock(result)}
`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tlet buffer = '
`;\r\n\t\t\t\treturn buffer;\r\n\t\t\t}\r\n\t\t\tbuffer += Object.keys(result[0]).join('`;\r\n\t\t\tbuffer += result.map(item => (\r\n\t\t\t\t``\r\n\t\t\t)).join('');\r\n\t\t\tbuffer += `
';\r\n\t\t\t// header\r\n\t\t\tif (!result.length) {\r\n\t\t\t\tbuffer += `No data in table.
');\r\n\t\t\tbuffer += `
${Object.values(item).map(val => Utils.escapeHTML(val as string)).join('')}
`;\r\n\t\t\treturn buffer;\r\n\t\t}\r\n\r\n\t\tfunction parseError(res: any): never {\r\n\t\t\tconst err = new Error(res.err);\r\n\t\t\terr.stack = res.stack;\r\n\t\t\tthrow err;\r\n\t\t}\r\n\r\n\t\tlet result;\r\n\t\ttry {\r\n\t\t\t// presume it's attempting to get data first\r\n\t\t\tresult = await database.all(query, []);\r\n\t\t\tif ((result as any).err) parseError(result as any);\r\n\t\t} catch (err: any) {\r\n\t\t\t// it's not getting data, but it might still be a valid statement - try to run instead\r\n\t\t\tif (err.stack?.includes(`Use run() instead`)) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tresult = await database.run(query, []);\r\n\t\t\t\t\tif ((result as any).err) parseError(result as any);\r\n\t\t\t\t\tresult = Utils.visualize(result);\r\n\t\t\t\t} catch (e: any) {\r\n\t\t\t\t\tresult = ('' + e.stack).replace(/\\n *at CommandContext\\.evalsql [\\s\\S]*/m, '');\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tresult = ('' + err.stack).replace(/\\n *at CommandContext\\.evalsql [\\s\\S]*/m, '');\r\n\t\t\t}\r\n\t\t}\r\n\t\tawait database.destroy();\r\n\t\tconst formattedResult = `|html|${formatResult(result)}`;\r\n\t\tlogRoom?.roomlog(formattedResult);\r\n\t\tthis.sendReply(formattedResult);\r\n\t},\r\n\tevalsqlhelp: [\r\n\t\t`/evalsql [database], [query] - Evaluates the given SQL [query] in the given [database].`,\r\n\t\t`Requires: & console access`,\r\n\t],\r\n\r\n\tevalbattle(target, room, user, connection) {\r\n\t\troom = this.requireRoom();\r\n\t\tthis.canUseConsole();\r\n\t\tif (!this.runBroadcast(true)) return;\r\n\t\tif (!room.battle) {\r\n\t\t\treturn this.errorReply(\"/evalbattle - This isn't a battle room.\");\r\n\t\t}\r\n\r\n\t\tvoid room.battle.stream.write(`>eval ${target.replace(/\\n/g, '\\f')}`);\r\n\t},\r\n\tevalbattlehelp: [\r\n\t\t`/evalbattle [code] - Evaluates the code in the battle stream of the current room. Requires: & console access.`,\r\n\t],\r\n\r\n\tebat: 'editbattle',\r\n\teditbattle(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkCan('forcewin');\r\n\t\tif (!target) return this.parse('/help editbattle');\r\n\t\tif (!room.battle) {\r\n\t\t\tthis.errorReply(\"/editbattle - This is not a battle room.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst battle = room.battle;\r\n\t\tlet cmd;\r\n\t\t[cmd, target] = Utils.splitFirst(target, ' ');\r\n\t\tif (cmd.endsWith(',')) cmd = cmd.slice(0, -1);\r\n\t\tconst targets = target.split(',');\r\n\t\tif (targets.length === 1 && targets[0] === '') targets.pop();\r\n\t\tlet player, pokemon, move, stat, value;\r\n\t\tswitch (cmd) {\r\n\t\tcase 'hp':\r\n\t\tcase 'h':\r\n\t\t\tif (targets.length !== 3) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[player, pokemon, value] = targets.map(f => f.trim());\r\n\t\t\t[player, pokemon] = [player, pokemon].map(toID);\r\n\t\t\tvoid battle.stream.write(\r\n\t\t\t\t`>eval let p=pokemon('${player}', '${pokemon}');p.sethp(${parseInt(value)});` +\r\n\t\t\t\t`if (p.isActive)battle.add('-damage',p,p.getHealth);`\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase 'status':\r\n\t\tcase 's':\r\n\t\t\tif (targets.length !== 3) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[player, pokemon, value] = targets.map(toID);\r\n\t\t\tvoid battle.stream.write(\r\n\t\t\t\t`>eval let pl=player('${player}');let p=pokemon(pl,'${pokemon}');p.setStatus('${value}');if (!p.isActive){battle.add('','please ignore the above');battle.add('-status',pl.active[0],pl.active[0].status,'[silent]');}`\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase 'pp':\r\n\t\t\tif (targets.length !== 4) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[player, pokemon, move, value] = targets.map(f => f.trim());\r\n\t\t\t[player, pokemon, move] = [player, pokemon, move].map(toID);\r\n\t\t\tvoid battle.stream.write(\r\n\t\t\t\t`>eval pokemon('${player}','${pokemon}').getMoveData('${move}').pp = ${parseInt(value)};`\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase 'boost':\r\n\t\tcase 'b':\r\n\t\t\tif (targets.length !== 4) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[player, pokemon, stat, value] = targets.map(f => f.trim());\r\n\t\t\t[player, pokemon, stat] = [player, pokemon, stat].map(toID);\r\n\t\t\tvoid battle.stream.write(\r\n\t\t\t\t`>eval let p=pokemon('${player}','${pokemon}');battle.boost({${stat}:${parseInt(value)}},p)`\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase 'volatile':\r\n\t\tcase 'v':\r\n\t\t\tif (targets.length !== 3) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[player, pokemon, value] = targets.map(toID);\r\n\t\t\tvoid battle.stream.write(\r\n\t\t\t\t`>eval pokemon('${player}','${pokemon}').addVolatile('${value}')`\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase 'sidecondition':\r\n\t\tcase 'sc':\r\n\t\t\tif (targets.length !== 2) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[player, value] = targets.map(toID);\r\n\t\t\tvoid battle.stream.write(`>eval player('${player}').addSideCondition('${value}', 'debug')`);\r\n\t\t\tbreak;\r\n\t\tcase 'fieldcondition': case 'pseudoweather':\r\n\t\tcase 'fc':\r\n\t\t\tif (targets.length !== 1) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[value] = targets.map(toID);\r\n\t\t\tvoid battle.stream.write(`>eval battle.field.addPseudoWeather('${value}', 'debug')`);\r\n\t\t\tbreak;\r\n\t\tcase 'weather':\r\n\t\tcase 'w':\r\n\t\t\tif (targets.length !== 1) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[value] = targets.map(toID);\r\n\t\t\tvoid battle.stream.write(`>eval battle.field.setWeather('${value}', 'debug')`);\r\n\t\t\tbreak;\r\n\t\tcase 'terrain':\r\n\t\tcase 't':\r\n\t\t\tif (targets.length !== 1) {\r\n\t\t\t\tthis.errorReply(\"Incorrect command use\");\r\n\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t}\r\n\t\t\t[value] = targets.map(toID);\r\n\t\t\tvoid battle.stream.write(`>eval battle.field.setTerrain('${value}', 'debug')`);\r\n\t\t\tbreak;\r\n\t\tcase 'reseed':\r\n\t\t\tif (targets.length !== 0) {\r\n\t\t\t\tif (targets.length !== 4) {\r\n\t\t\t\t\tthis.errorReply(\"Seed must have 4 parts\");\r\n\t\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t\t}\r\n\t\t\t\t// this just tests for a 5-digit number, close enough to uint16\r\n\t\t\t\tif (!targets.every(val => /^[0-9]{1,5}$/.test(val))) {\r\n\t\t\t\t\tthis.errorReply(\"Seed parts much be unsigned 16-bit integers\");\r\n\t\t\t\t\treturn this.parse('/help editbattle');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvoid battle.stream.write(`>reseed ${targets.join(',')}`);\r\n\t\t\tif (targets.length) this.sendReply(`Reseeded to ${targets.join(',')}`);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tthis.errorReply(`Unknown editbattle command: ${cmd}`);\r\n\t\t\treturn this.parse('/help editbattle');\r\n\t\t}\r\n\t},\r\n\teditbattlehelp: [\r\n\t\t`/editbattle hp [player], [pokemon], [hp]`,\r\n\t\t`/editbattle status [player], [pokemon], [status]`,\r\n\t\t`/editbattle pp [player], [pokemon], [move], [pp]`,\r\n\t\t`/editbattle boost [player], [pokemon], [stat], [amount]`,\r\n\t\t`/editbattle volatile [player], [pokemon], [volatile]`,\r\n\t\t`/editbattle sidecondition [player], [sidecondition]`,\r\n\t\t`/editbattle fieldcondition [fieldcondition]`,\r\n\t\t`/editbattle weather [weather]`,\r\n\t\t`/editbattle terrain [terrain]`,\r\n\t\t`/editbattle reseed [optional seed]`,\r\n\t\t`Short forms: /ebat h OR s OR pp OR b OR v OR sc OR fc OR w OR t`,\r\n\t\t`[player] must be a username or number, [pokemon] must be species name or party slot number (not nickname), [move] must be move name.`,\r\n\t],\r\n};\r\n\r\nexport const pages: Chat.PageTable = {\r\n\tbot(args, user, connection) {\r\n\t\tconst [botid, ...pageArgs] = args;\r\n\t\tconst pageid = pageArgs.join('-');\r\n\t\tif (pageid.length > 300) {\r\n\t\t\treturn this.errorReply(`The page ID specified is too long.`);\r\n\t\t}\r\n\t\tconst bot = Users.get(botid);\r\n\t\tif (!bot) {\r\n\t\t\treturn `

The bot \"${bot}\" is not available.

`;\r\n\t\t}\r\n\t\tlet canSend = Users.globalAuth.get(bot) === '*';\r\n\t\tlet room;\r\n\t\tfor (const curRoom of Rooms.global.chatRooms) {\r\n\t\t\tif (['*', '#'].includes(curRoom.auth.getDirect(bot.id))) {\r\n\t\t\t\tcanSend = true;\r\n\t\t\t\troom = curRoom;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!canSend) {\r\n\t\t\treturn `

\"${bot}\" is not a bot.

`;\r\n\t\t}\r\n\t\tconnection.lastRequestedPage = `${bot.id}-${pageid}`;\r\n\t\tbot.sendTo(\r\n\t\t\troom ? room.roomid : 'lobby',\r\n\t\t\t`|pm|${user.getIdentity()}|${bot.getIdentity()}||requestpage|${user.name}|${pageid}`\r\n\t\t);\r\n\t},\r\n};\r\n"], "mappings": "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", "names": ["user", "target", "room", "process", "connection", "logRoom", "result", "battle"] }