{ "version": 3, "sources": ["../../../../server/chat-commands/core.ts"], "sourcesContent": ["/**\r\n * Core commands\r\n * Pokemon Showdown - http://pokemonshowdown.com/\r\n *\r\n * These are core commands - basic commands required for Pokemon Showdown\r\n * to run. A lot of these are sent by the client.\r\n *\r\n * System commands should not be modified, added, or removed. If you'd\r\n * like to modify or add commands, add or edit files in chat-plugins/\r\n *\r\n * For the API, see chat-plugins/COMMANDS.md\r\n *\r\n * @license MIT\r\n */\r\n\r\n/* eslint no-else-return: \"error\" */\r\nimport {Utils} from '../../lib';\r\nimport type {UserSettings} from '../users';\r\nimport type {GlobalPermission} from '../user-groups';\r\n\r\nexport const crqHandlers: {[k: string]: Chat.CRQHandler} = {\r\n\tuserdetails(target, user, trustable) {\r\n\t\tif (target.length > 18) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst targetUser = Users.get(target);\r\n\t\tif (!trustable || !targetUser) {\r\n\t\t\treturn {\r\n\t\t\t\tid: target,\r\n\t\t\t\tuserid: toID(target),\r\n\t\t\t\tname: target,\r\n\t\t\t\trooms: false,\r\n\t\t\t};\r\n\t\t}\r\n\t\tinterface RoomData {p1?: string; p2?: string; isPrivate?: boolean | 'hidden' | 'voice'}\r\n\t\tlet roomList: {[roomid: string]: RoomData} | false = {};\r\n\t\tfor (const roomid of targetUser.inRooms) {\r\n\t\t\tconst targetRoom = Rooms.get(roomid);\r\n\t\t\tif (!targetRoom) continue; // shouldn't happen\r\n\t\t\tconst roomData: RoomData = {};\r\n\t\t\tif (targetRoom.settings.isPrivate) {\r\n\t\t\t\tif (!user.inRooms.has(roomid) && !user.games.has(roomid)) continue;\r\n\t\t\t\troomData.isPrivate = true;\r\n\t\t\t}\r\n\t\t\tif (targetRoom.battle) {\r\n\t\t\t\tif (targetUser.settings.hideBattlesFromTrainerCard && user.id !== targetUser.id && !user.can('lock')) continue;\r\n\t\t\t\tconst battle = targetRoom.battle;\r\n\t\t\t\troomData.p1 = battle.p1 ? ' ' + battle.p1.name : '';\r\n\t\t\t\troomData.p2 = battle.p2 ? ' ' + battle.p2.name : '';\r\n\t\t\t}\r\n\t\t\tlet roomidWithAuth: string = roomid;\r\n\t\t\tif (targetRoom.auth.has(targetUser.id)) {\r\n\t\t\t\troomidWithAuth = targetRoom.auth.getDirect(targetUser.id) + roomid;\r\n\t\t\t}\r\n\t\t\troomList[roomidWithAuth] = roomData;\r\n\t\t}\r\n\t\tif (!targetUser.connected) roomList = false;\r\n\t\tlet group = targetUser.tempGroup;\r\n\t\tif (targetUser.locked) group = Config.punishgroups?.locked?.symbol ?? '\\u203d';\r\n\t\tif (targetUser.namelocked) group = Config.punishgroups?.namelocked?.symbol ?? '\u2716';\r\n\t\tconst sectionleader = Users.globalAuth.sectionLeaders.has(targetUser.id);\r\n\t\treturn {\r\n\t\t\tid: target,\r\n\t\t\tuserid: targetUser.id,\r\n\t\t\tname: targetUser.name,\r\n\t\t\tavatar: targetUser.avatar,\r\n\t\t\tgroup: group,\r\n\t\t\tcustomgroup: sectionleader ? \"Section Leader\" : undefined,\r\n\t\t\tautoconfirmed: targetUser.autoconfirmed ? true : undefined,\r\n\t\t\tstatus: targetUser.getStatus() || undefined,\r\n\t\t\trooms: roomList,\r\n\t\t\tfriended: user.friends?.has(targetUser.id) || undefined,\r\n\t\t};\r\n\t},\r\n\troomlist(target, user, trustable) {\r\n\t\tif (!trustable) return false;\r\n\t\treturn {rooms: Rooms.global.getBattles(target)};\r\n\t},\r\n\trooms(target, user, trustable) {\r\n\t\tif (!trustable) return false;\r\n\t\treturn Rooms.global.getRooms(user);\r\n\t},\r\n\tladdertop(target, user, trustable) {\r\n\t\tif (!trustable) return false;\r\n\t\tconst [format, prefix] = target.split(',').map(x => x.trim());\r\n\t\treturn Ladders(toID(format)).getTop(prefix);\r\n\t},\r\n\troominfo(target, user, trustable) {\r\n\t\tif (!trustable) return false;\r\n\r\n\t\tif (target.length > 225) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst targetRoom = Rooms.get(target);\r\n\t\tif (!targetRoom || (\r\n\t\t\ttargetRoom.settings.isPrivate && !user.inRooms.has(targetRoom.roomid) && !user.games.has(targetRoom.roomid)\r\n\t\t)) {\r\n\t\t\tconst roominfo = {id: target, error: 'not found or access denied'};\r\n\t\t\treturn roominfo;\r\n\t\t}\r\n\t\tlet visibility;\r\n\t\tif (targetRoom.settings.isPrivate) {\r\n\t\t\tvisibility = (targetRoom.settings.isPrivate === 'hidden') ? 'hidden' : 'secret';\r\n\t\t} else {\r\n\t\t\tvisibility = 'public';\r\n\t\t}\r\n\r\n\t\tconst roominfo: AnyObject = {\r\n\t\t\tid: target,\r\n\t\t\troomid: targetRoom.roomid,\r\n\t\t\ttitle: targetRoom.title,\r\n\t\t\ttype: targetRoom.type,\r\n\t\t\tvisibility: visibility,\r\n\t\t\tmodchat: targetRoom.settings.modchat,\r\n\t\t\tmodjoin: targetRoom.settings.modjoin,\r\n\t\t\tauth: {},\r\n\t\t\tusers: [],\r\n\t\t};\r\n\r\n\t\tfor (const [id, rank] of targetRoom.auth) {\r\n\t\t\tif (!roominfo.auth[rank]) roominfo.auth[rank] = [];\r\n\t\t\troominfo.auth[rank].push(id);\r\n\t\t}\r\n\r\n\t\tfor (const userid in targetRoom.users) {\r\n\t\t\tconst curUser = targetRoom.users[userid];\r\n\t\t\tif (!curUser.named) continue;\r\n\t\t\tconst userinfo = curUser.getIdentity(targetRoom);\r\n\t\t\troominfo.users.push(userinfo);\r\n\t\t}\r\n\t\treturn roominfo;\r\n\t},\r\n};\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\tversion(target, room, user) {\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\tconst version = Chat.packageData.version;\r\n\t\tthis.sendReplyBox(this.tr`Server version: ${version}`);\r\n\t},\r\n\tversionhelp: [\r\n\t\t`/version - Get the current server version.`,\r\n\t],\r\n\r\n\tuserlist(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tconst userList = [];\r\n\r\n\t\tfor (const id in room.users) {\r\n\t\t\tconst curUser = Users.get(room.users[id]);\r\n\t\t\tif (!curUser?.named) continue;\r\n\t\t\tuserList.push(Utils.escapeHTML(curUser.getIdentity(room)));\r\n\t\t}\r\n\r\n\t\tlet output = `There ${Chat.plural(userList, \"are\", \"is\")} ${Chat.count(userList, \" users\")} in this room:
`;\r\n\t\toutput += userList.join(`, `);\r\n\r\n\t\tthis.sendReplyBox(output);\r\n\t},\r\n\tuserlisthelp: [`/userlist - Displays a list of users who are currently in the room.`],\r\n\r\n\tmee: 'me',\r\n\tme(target, room, user) {\r\n\t\tif (this.cmd === 'mee' && /[A-Z-a-z0-9/]/.test(target.charAt(0))) {\r\n\t\t\treturn this.errorReply(this.tr`/mee - must not start with a letter or number`);\r\n\t\t}\r\n\t\ttarget = this.checkChat(`/${this.cmd} ${target || ''}`);\r\n\r\n\t\tif (this.message.startsWith(`/ME`)) {\r\n\t\t\tconst uppercaseIdentity = user.getIdentity(room).toUpperCase();\r\n\t\t\tif (this.pmTarget) {\r\n\t\t\t\tconst msg = `|pm|${uppercaseIdentity}|${this.pmTarget.getIdentity()}|${target}`;\r\n\t\t\t\tuser.send(msg);\r\n\t\t\t\tif (this.pmTarget !== user) this.pmTarget.send(msg);\r\n\t\t\t} else {\r\n\t\t\t\tthis.add(`|c|${uppercaseIdentity}|${target}`);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treturn target;\r\n\t},\r\n\tmehelp: [`/me [action] - Adds the given [action] into chat, attributed to the user.`],\r\n\r\n\tshrug(target) {\r\n\t\ttarget = target ? ' ' + target + ' ' : '';\r\n\t\tif (target.startsWith(' /me')) target = target.slice(1);\r\n\t\treturn this.checkChat(target + '\u00AF\\\\_(\u30C4)_/\u00AF');\r\n\t},\r\n\tshrughelp: ['/shrug [message] - Sends the given message, if any, appended with \u00AF\\\\_(\u30C4)_/\u00AF'],\r\n\r\n\ttableflip(target) {\r\n\t\ttarget = target ? ' ' + target + ' ' : '';\r\n\t\tif (target.startsWith(' /me')) target = target.slice(1);\r\n\t\treturn this.checkChat(target + '(\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35 \u253B\u2501\u253B');\r\n\t},\r\n\ttablefliphelp: ['/tableflip [message] - Sends the given message, if any, appended with (\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35 \u253B\u2501\u253B'],\r\n\r\n\ttableunflip(target) {\r\n\t\ttarget = target ? ' ' + target + ' ' : '';\r\n\t\tif (target.startsWith(' /me')) target = target.slice(1);\r\n\t\treturn this.checkChat(target + '\u252C\u2500\u2500\u252C\u25E1\uFF89(\u00B0 -\u00B0\uFF89)');\r\n\t},\r\n\ttableunfliphelp: ['/tableunflip [message] - Sends the given message, if any, appended with \u252C\u2500\u2500\u252C\u25E1\uFF89(\u00B0 -\u00B0\uFF89)'],\r\n\r\n\t'battle!': 'battle',\r\n\tbattle(target, room, user, connection, cmd) {\r\n\t\tif (cmd === 'battle') {\r\n\t\t\treturn this.sendReply(this.tr`What?! How are you not more excited to battle?! Try /battle! to show me you're ready.`);\r\n\t\t}\r\n\t\tif (!target) target = \"randombattle\";\r\n\t\treturn this.parse(`/search ${target}`);\r\n\t},\r\n\tbattlehelp: [\r\n\t\t`/battle! [format] - Starts a battle in the given [format].`,\r\n\t\t`If none is given, defaults to current generation random battle.`,\r\n\t],\r\n\r\n\tsignout: 'logout',\r\n\tlogout(target, room, user) {\r\n\t\tuser.resetName();\r\n\t},\r\n\tlogouthelp: [`/logout - Logs you out and ends your session.`],\r\n\r\n\tnoreply(target, room, user) {\r\n\t\tif (!target.startsWith('/')) return this.parse('/help noreply');\r\n\t\treturn this.parse(target, {isQuiet: true});\r\n\t},\r\n\tnoreplyhelp: [`/noreply [command] - Runs the command without displaying the response.`],\r\n\r\n\tasync msgroom(target, room, user, connection) {\r\n\t\tconst [targetId, message] = Utils.splitFirst(target, ',').map(i => i.trim());\r\n\t\tif (!targetId || !message) {\r\n\t\t\treturn this.parse(`/help msgroom`);\r\n\t\t}\r\n\t\tthis.checkRecursion();\r\n\r\n\t\tconst targetRoom = Rooms.search(targetId.trim());\r\n\t\tif (!targetRoom) return this.errorReply(`Room not found.`);\r\n\t\tif (message.trim().startsWith('/msgroom ')) {\r\n\t\t\treturn this.errorReply(`Please do not nest /msgroom inside itself.`);\r\n\t\t}\r\n\t\tconst subcontext = new Chat.CommandContext({room: targetRoom, message, user, connection});\r\n\t\tawait subcontext.parse();\r\n\t},\r\n\tmsgroomhelp: [`/msgroom [room], [command] - Runs the [command] in the given [room].`],\r\n\r\n\tr: 'reply',\r\n\treply(target, room, user) {\r\n\t\tif (!target) return this.parse('/help reply');\r\n\t\tif (!user.lastPM) {\r\n\t\t\treturn this.errorReply(this.tr`No one has PMed you yet.`);\r\n\t\t}\r\n\t\treturn this.parse(`/msg ${user.lastPM || ''}, ${target}`);\r\n\t},\r\n\treplyhelp: [`/reply OR /r [message] - Send a message to the last user you got a message from, or sent a message to.`],\r\n\r\n\tpm: 'msg',\r\n\twhisper: 'msg',\r\n\tw: 'msg',\r\n\tmsg(target, room, user, connection) {\r\n\t\tif (!target) return this.parse('/help msg');\r\n\t\tif (!target.includes(',')) {\r\n\t\t\tthis.errorReply(this.tr`You forgot the comma.`);\r\n\t\t\treturn this.parse('/help msg');\r\n\t\t}\r\n\t\tthis.checkRecursion();\r\n\r\n\t\tconst {targetUser, targetUsername, rest: message} = this.splitUser(target);\r\n\t\tif (targetUsername === '~') {\r\n\t\t\tthis.pmTarget = null;\r\n\t\t\tthis.room = null;\r\n\t\t} else if (!targetUser) {\r\n\t\t\tlet error = this.tr`User ${targetUsername} not found. Did you misspell their name?`;\r\n\t\t\terror = `|pm|${this.user.getIdentity()}| ${targetUsername}|/error ${error}`;\r\n\t\t\tconnection.send(error);\r\n\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tthis.pmTarget = targetUser;\r\n\t\t\tthis.room = null;\r\n\t\t}\r\n\r\n\t\tif (targetUser && !targetUser.connected) {\r\n\t\t\treturn this.errorReply(this.tr`User ${targetUsername} is offline.`);\r\n\t\t}\r\n\r\n\t\treturn this.parse(message);\r\n\t},\r\n\tmsghelp: [`/msg OR /whisper OR /w [username], [message] - Send a private message.`],\r\n\r\n\tinv: 'invite',\r\n\tinvite(target, room, user) {\r\n\t\tif (!target) return this.parse('/help invite');\r\n\r\n\t\tconst pmTarget = this.pmTarget; // not room means it's a PM\r\n\t\tif (!pmTarget) {\r\n\t\t\tconst {targetUser, rest: targetRoomid} = this.requireUser(target);\r\n\t\t\tconst targetRoom = targetRoomid ? Rooms.search(targetRoomid) : room;\r\n\t\t\tif (!targetRoom) return this.errorReply(this.tr`The room \"${targetRoomid}\" was not found.`);\r\n\t\t\treturn this.parse(`/pm ${targetUser.name}, /invite ${targetRoom.roomid}`);\r\n\t\t}\r\n\r\n\t\tconst targetRoom = Rooms.search(target);\r\n\t\tif (!targetRoom) return this.errorReply(this.tr`The room \"${target}\" was not found.`);\r\n\r\n\t\tconst invitesBlocked = pmTarget.settings.blockInvites;\r\n\t\tif (invitesBlocked) {\r\n\t\t\tif (invitesBlocked === true ? !user.can('lock') : !Users.globalAuth.atLeast(user, invitesBlocked as GroupSymbol)) {\r\n\t\t\t\tChat.maybeNotifyBlocked('invite', pmTarget, user);\r\n\t\t\t\treturn this.errorReply(`This user is currently blocking room invites.`);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!targetRoom.checkModjoin(pmTarget)) {\r\n\t\t\tthis.room = targetRoom;\r\n\t\t\tthis.parse(`/roomvoice ${pmTarget.name}`);\r\n\t\t\tif (!targetRoom.checkModjoin(pmTarget)) {\r\n\t\t\t\treturn this.errorReply(this.tr`You do not have permission to invite people into this room.`);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (pmTarget.id in targetRoom.users) {\r\n\t\t\treturn this.errorReply(this.tr`This user is already in \"${targetRoom.title}\".`);\r\n\t\t}\r\n\t\treturn this.checkChat(`/invite ${targetRoom.roomid}`);\r\n\t},\r\n\tinvitehelp: [\r\n\t\t`/invite [username] - Invites the player [username] to join the room you sent the command to.`,\r\n\t\t`/invite [username], [roomname] - Invites the player [username] to join the room [roomname].`,\r\n\t\t`(in a PM) /invite [roomname] - Invites the player you're PMing to join the room [roomname].`,\r\n\t],\r\n\r\n\tblockpm: 'blockpms',\r\n\tignorepms: 'blockpms',\r\n\tignorepm: 'blockpms',\r\n\tblockpms(target, room, user) {\r\n\t\ttarget = target.toLowerCase().trim();\r\n\t\tif (target === 'ac') target = 'autoconfirmed';\r\n\r\n\t\tif (user.settings.blockPMs === (target || true)) {\r\n\t\t\treturn this.errorReply(this.tr`You are already blocking private messages! To unblock, use /unblockpms`);\r\n\t\t}\r\n\t\tif (Users.Auth.isAuthLevel(target)) {\r\n\t\t\tuser.settings.blockPMs = target;\r\n\t\t\tthis.sendReply(this.tr`You are now blocking private messages, except from staff and ${target}.`);\r\n\t\t} else if (target === 'autoconfirmed' || target === 'trusted' || target === 'unlocked') {\r\n\t\t\tuser.settings.blockPMs = target;\r\n\t\t\ttarget = this.tr(target);\r\n\t\t\tthis.sendReply(this.tr `You are now blocking private messages, except from staff and ${target} users.`);\r\n\t\t} else if (target === 'friends') {\r\n\t\t\tuser.settings.blockPMs = target;\r\n\t\t\tthis.sendReply(this.tr`You are now blocking private messages, except from staff and friends.`);\r\n\t\t} else {\r\n\t\t\tuser.settings.blockPMs = true;\r\n\t\t\tthis.sendReply(this.tr`You are now blocking private messages, except from staff.`);\r\n\t\t}\r\n\t\tuser.update();\r\n\t\treturn true;\r\n\t},\r\n\tblockpmshelp: [\r\n\t\t`/blockpms - Blocks private messages except from staff. Unblock them with /unblockpms.`,\r\n\t\t`/blockpms [unlocked/ac/trusted/+/friends] - Blocks private messages except from staff and the specified group.`,\r\n\t],\r\n\r\n\tunblockpm: 'unblockpms',\r\n\tunignorepms: 'unblockpms',\r\n\tunignorepm: 'unblockpms',\r\n\tunblockpms(target, room, user) {\r\n\t\tif (!user.settings.blockPMs) {\r\n\t\t\treturn this.errorReply(this.tr`You are not blocking private messages! To block, use /blockpms`);\r\n\t\t}\r\n\t\tuser.settings.blockPMs = false;\r\n\t\tuser.update();\r\n\t\treturn this.sendReply(this.tr`You are no longer blocking private messages.`);\r\n\t},\r\n\tunblockpmshelp: [`/unblockpms - Unblocks private messages. Block them with /blockpms.`],\r\n\r\n\tunblockinvites: 'blockinvites',\r\n\tblockinvites(target, room, user, connection, cmd) {\r\n\t\tconst unblock = cmd.includes('unblock');\r\n\t\tif (unblock) {\r\n\t\t\tif (!user.settings.blockInvites) {\r\n\t\t\t\treturn this.errorReply(`You are not blocking room invites! To block, use /blockinvites.`);\r\n\t\t\t}\r\n\t\t\tuser.settings.blockInvites = false;\r\n\t\t\tthis.sendReply(`You are no longer blocking room invites.`);\r\n\t\t} else {\r\n\t\t\tif (toID(target) === 'ac') target = 'autoconfirmed';\r\n\t\t\tif (user.settings.blockInvites === (target || true)) {\r\n\t\t\t\treturn this.errorReply(\"You are already blocking room invites - to unblock, use /unblockinvites\");\r\n\t\t\t}\r\n\t\t\tif (target in Config.groups) {\r\n\t\t\t\tuser.settings.blockInvites = target as GroupSymbol;\r\n\t\t\t\tthis.sendReply(this.tr`You are now blocking room invites, except from staff and ${target}.`);\r\n\t\t\t} else if (target === 'autoconfirmed' || target === 'trusted' || target === 'unlocked') {\r\n\t\t\t\tuser.settings.blockInvites = target;\r\n\t\t\t\tthis.sendReply(this.tr`You are now blocking room invites, except from staff and ${target} users.`);\r\n\t\t\t} else {\r\n\t\t\t\tuser.settings.blockInvites = true;\r\n\t\t\t\tthis.sendReply(this.tr`You are now blocking room invites, except from staff.`);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn user.update();\r\n\t},\r\n\tblockinviteshelp: [\r\n\t\t`/blockinvites [rank] - Allows only users with the given [rank] to invite you to rooms.`,\r\n\t\t`Valid settings: autoconfirmed, trusted, unlocked, +, %, @, &.`,\r\n\t\t`/unblockinvites - Allows anyone to invite you to rooms.`,\r\n\t],\r\n\r\n\tstatus(target, room, user, connection, cmd) {\r\n\t\tif (user.locked || user.semilocked) {\r\n\t\t\treturn this.errorReply(this.tr`Your status cannot be updated while you are locked or semilocked.`);\r\n\t\t}\r\n\t\tif (!target) return this.parse('/help status');\r\n\r\n\t\tconst maxLength = 52;\r\n\t\tif (target.length > maxLength) {\r\n\t\t\treturn this.errorReply(this.tr`Your status is too long; it must be under ${maxLength} characters.`);\r\n\t\t}\r\n\t\ttarget = this.statusfilter(target);\r\n\t\tif (!target) return this.errorReply(this.tr`Your status contains a banned word.`);\r\n\r\n\t\tuser.setUserMessage(target);\r\n\t\tthis.sendReply(this.tr`Your status has been set to: ${target}.`);\r\n\t},\r\n\tstatushelp: [\r\n\t\t`/status [note] - Sets a short note as your status, visible when users click your username.`,\r\n\t\t `Use /clearstatus to clear your status message.`,\r\n\t],\r\n\r\n\tdonotdisturb: 'busy',\r\n\tdnd: 'busy',\r\n\tbusy(target, room, user, connection, cmd) {\r\n\t\tif (target) {\r\n\t\t\tthis.errorReply(this.tr`Setting status messages in /busy is no longer supported. Set a status using /status.`);\r\n\t\t}\r\n\t\tuser.setStatusType('busy');\r\n\t\tconst isDND = ['dnd', 'donotdisturb'].includes(cmd);\r\n\t\tif (isDND) {\r\n\t\t\tthis.parse('/blockpms +');\r\n\t\t\tthis.parse('/blockchallenges');\r\n\t\t\tuser.settings.doNotDisturb = true;\r\n\t\t}\r\n\t\tthis.sendReply(this.tr`You are now marked as busy.`);\r\n\t},\r\n\tbusyhelp: [\r\n\t\t`/busy OR /donotdisturb - Marks you as busy.`,\r\n\t\t`Use /donotdisturb to also block private messages and challenges.`,\r\n\t\t`Use /back to mark yourself as back.`,\r\n\t],\r\n\r\n\tidle: 'away',\r\n\tafk: 'away',\r\n\tbrb: 'away',\r\n\taway(target, room, user, connection, cmd) {\r\n\t\tif (target) {\r\n\t\t\tthis.errorReply(this.tr`Setting status messages in /away is no longer supported. Set a status using /status.`);\r\n\t\t}\r\n\t\tuser.setStatusType('idle');\r\n\t\tthis.sendReply(this.tr`You are now marked as away. Send a message or use /back to indicate you are back.`);\r\n\t},\r\n\tawayhelp: [`/away - Marks you as away. Send a message or use /back to indicate you are back.`],\r\n\r\n\tcs: 'clearstatus',\r\n\tclearstatus(target, room, user) {\r\n\t\tif (target) return this.parse(`/forceclearstatus ${target}`);\r\n\r\n\t\tif (!user.userMessage) return this.sendReply(this.tr`You don't have a status message set.`);\r\n\t\tuser.setUserMessage('');\r\n\r\n\t\treturn this.sendReply(this.tr`You have cleared your status message.`);\r\n\t},\r\n\tclearstatushelp: [\r\n\t\t`/clearstatus - Clears your status message.`,\r\n\t\t`/clearstatus user, reason - Clears another person's status message. Requires: % @ &`,\r\n\t],\r\n\r\n\tunaway: 'back',\r\n\tunafk: 'back',\r\n\tback(target, room, user) {\r\n\t\tif (user.statusType === 'online') return this.errorReply(this.tr`You are already marked as back.`);\r\n\t\tconst statusType = user.statusType;\r\n\t\tuser.setStatusType('online');\r\n\r\n\t\tif (user.settings.doNotDisturb) {\r\n\t\t\tthis.parse('/unblockpms');\r\n\t\t\tthis.parse('/unblockchallenges');\r\n\t\t\tuser.settings.doNotDisturb = false;\r\n\t\t}\r\n\r\n\t\tif (statusType) {\r\n\t\t\treturn this.sendReply(this.tr`You are no longer marked as busy.`);\r\n\t\t}\r\n\r\n\t\treturn this.sendReply(this.tr`You have cleared your status message.`);\r\n\t},\r\n\tbackhelp: [`/back - Marks you as back if you are away.`],\r\n\r\n\tasync rank(target, room, user) {\r\n\t\tif (!target) target = user.name;\r\n\r\n\t\tconst values = await Ladders.visualizeAll(target);\r\n\t\tlet buffer = `
`;\r\n\t\tbuffer += Utils.html``;\r\n\r\n\t\tconst ratings = values.join(``);\r\n\t\tif (!ratings) {\r\n\t\t\tbuffer += ``;\r\n\t\t} else {\r\n\t\t\tbuffer += ``;\r\n\t\t\tbuffer += ratings;\r\n\t\t}\r\n\t\tbuffer += `
User: ${target}
${this.tr`This user has not played any ladder games yet.`}
${this.tr`Format`}Elo${this.tr`W`}${this.tr`L`}${this.tr`Total`}
`;\r\n\r\n\t\tthis.sendReply(`|raw|${buffer}`);\r\n\t},\r\n\trankhelp: [\r\n\t\t`/rank [user] - Shows all ladder ranks for the given [user].`,\r\n\t\t`If no user is given, it defaults to the user of the command.`,\r\n\t],\r\n\r\n\tshowrank: 'hiderank',\r\n\thiderank(target, room, user, connection, cmd) {\r\n\t\tconst userGroup = Users.Auth.getGroup(Users.globalAuth.get(user.id));\r\n\t\tif (!userGroup['hiderank'] || !user.registered) {\r\n\t\t\treturn this.errorReply(`/hiderank - Access denied.`);\r\n\t\t}\r\n\r\n\t\tconst isShow = cmd === 'showrank';\r\n\t\tconst group = (isShow ? Users.globalAuth.get(user.id) : (target.trim() || Users.Auth.defaultSymbol()) as GroupSymbol);\r\n\t\tif (user.tempGroup === group) {\r\n\t\t\treturn this.errorReply(this.tr`You already have the temporary symbol '${group}'.`);\r\n\t\t}\r\n\t\tif (!Users.Auth.isValidSymbol(group) || !(group in Config.groups) ||\r\n\t\t\t(group === Users.SECTIONLEADER_SYMBOL && !(Users.globalAuth.sectionLeaders.has(user.id) || user.can('bypassall')))) {\r\n\t\t\treturn this.errorReply(this.tr`You must specify a valid group symbol.`);\r\n\t\t}\r\n\t\tif (!isShow && Config.groups[group].rank > Config.groups[user.tempGroup].rank) {\r\n\t\t\treturn this.errorReply(this.tr`You may only set a temporary symbol below your current rank.`);\r\n\t\t}\r\n\t\tuser.tempGroup = group;\r\n\t\tuser.updateIdentity();\r\n\t\tthis.sendReply(`|c|~|${this.tr`Your temporary group symbol is now`} \\`\\`${user.tempGroup}\\`\\`.`);\r\n\t},\r\n\tshowrankhelp: 'hiderankhelp',\r\n\thiderankhelp: [\r\n\t\t`/hiderank [rank] - Displays your global rank as the given [rank].`,\r\n\t\t`/showrank - Displays your true global rank instead of the rank you're hidden as.`,\r\n\t],\r\n\r\n\tlanguage(target, room, user) {\r\n\t\tif (!target) {\r\n\t\t\tconst language = Chat.languages.get(user.language || 'english' as ID);\r\n\t\t\treturn this.sendReply(this.tr`Currently, you're viewing Pok\u00E9mon Showdown in ${language}.`);\r\n\t\t}\r\n\t\tconst languageID = toID(target);\r\n\t\tif (!Chat.languages.has(languageID)) {\r\n\t\t\tconst languages = [...Chat.languages.values()].join(', ');\r\n\t\t\treturn this.errorReply(this.tr`Valid languages are: ${languages}`);\r\n\t\t}\r\n\t\tuser.language = languageID;\r\n\t\tuser.update();\r\n\t\tconst languageName = Chat.languages.get(languageID);\r\n\t\tconst langRoom = Rooms.search(languageName || \"\");\r\n\t\tlet language = languageName;\r\n\t\tif (langRoom) {\r\n\t\t\tlanguage = `${languageName}`;\r\n\t\t}\r\n\t\treturn this.sendReply(\r\n\t\t\t`|html|` + this.tr`Pok\u00E9mon Showdown will now be displayed in ${language} (except in language rooms).`\r\n\t\t);\r\n\t},\r\n\tlanguagehelp: [\r\n\t\t`/language - View your current language setting.`,\r\n\t\t`/language [language] - Changes the language Pok\u00E9mon Showdown will be displayed to you in.`,\r\n\t\t`Note that rooms can set their own language, which will override this setting.`,\r\n\t],\r\n\r\n\tupdatesettings(target, room, user) {\r\n\t\tconst settings: Partial = {};\r\n\t\ttry {\r\n\t\t\tconst raw = JSON.parse(target);\r\n\t\t\tif (typeof raw !== 'object' || Array.isArray(raw) || !raw) {\r\n\t\t\t\tthis.errorReply(this.tr`/updatesettings expects JSON encoded object.`);\r\n\t\t\t}\r\n\t\t\tif (typeof raw.language === 'string') this.parse(`/noreply /language ${raw.language}`);\r\n\t\t\tfor (const setting in user.settings) {\r\n\t\t\t\tif (setting in raw) {\r\n\t\t\t\t\tif (setting === 'blockPMs' &&\r\n\t\t\t\t\t\tUsers.Auth.isAuthLevel(raw[setting])) {\r\n\t\t\t\t\t\tsettings[setting] = raw[setting];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsettings[setting as keyof UserSettings] = !!raw[setting];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tObject.assign(user.settings, settings);\r\n\t\t\tuser.update();\r\n\t\t} catch {\r\n\t\t\tthis.errorReply(this.tr`Unable to parse settings in /updatesettings!`);\r\n\t\t}\r\n\t},\r\n\tupdatesettingshelp: [\r\n\t\t`/updatesettings [settings] - Update your settings to match the given JSON settings blob.`,\r\n\t],\r\n\r\n\t/*********************************************************\r\n\t * Battle management commands\r\n\t *********************************************************/\r\n\r\n\tallowexportinputlog(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tconst battle = room.battle;\r\n\t\tif (!battle) {\r\n\t\t\treturn this.errorReply(this.tr`Must be in a battle.`);\r\n\t\t}\r\n\t\tconst targetUser = Users.getExact(target);\r\n\t\tif (!targetUser) {\r\n\t\t\treturn this.errorReply(this.tr`User ${target} not found.`);\r\n\t\t}\r\n\t\tif (!battle.playerTable[user.id]) {\r\n\t\t\treturn this.errorReply(this.tr`Must be a player in this battle.`);\r\n\t\t}\r\n\t\tif (!battle.allowExtraction[targetUser.id]) {\r\n\t\t\treturn this.errorReply(this.tr`${targetUser.name} has not requested extraction.`);\r\n\t\t}\r\n\t\tif (battle.allowExtraction[targetUser.id].has(user.id)) {\r\n\t\t\treturn this.errorReply(this.tr`You have already consented to extraction with ${targetUser.name}.`);\r\n\t\t}\r\n\t\tbattle.allowExtraction[targetUser.id].add(user.id);\r\n\t\tthis.addModAction(room.tr`${user.name} consents to sharing battle team and choices with ${targetUser.name}.`);\r\n\t\tif (!battle.inputLog) return this.errorReply(this.tr`No input log found.`);\r\n\t\tif (Object.keys(battle.playerTable).length === battle.allowExtraction[targetUser.id].size) {\r\n\t\t\tthis.addModAction(room.tr`${targetUser.name} has extracted the battle input log.`);\r\n\t\t\tconst inputLog = battle.inputLog.map(Utils.escapeHTML).join(`
`);\r\n\t\t\ttargetUser.sendTo(\r\n\t\t\t\troom,\r\n\t\t\t\t`|html|
${inputLog}
`,\r\n\t\t\t);\r\n\t\t}\r\n\t},\r\n\tallowexportinputloghelp: [\r\n\t\t`/allowexportinputlog [user] - Consents to sharing teams and choices from the current battle with the specified user.`,\r\n\t],\r\n\r\n\trequestinputlog: 'exportinputlog',\r\n\texportinputlog(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tconst battle = room.battle;\r\n\t\tif (!battle) {\r\n\t\t\treturn this.errorReply(this.tr`This command only works in battle rooms.`);\r\n\t\t}\r\n\t\tif (!battle.inputLog) {\r\n\t\t\tthis.errorReply(this.tr`This command only works when the battle has ended - if the battle has stalled, use /offertie.`);\r\n\t\t\tif (user.can('forcewin')) this.errorReply(this.tr`Alternatively, you can end the battle with /forcetie.`);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.checkCan('exportinputlog', null, room);\r\n\t\tif (user.can('forcewin') || Dex.formats.get(battle.format).team) {\r\n\t\t\tif (!battle.inputLog) return this.errorReply(this.tr`No input log found.`);\r\n\t\t\tthis.addModAction(room.tr`${user.name} has extracted the battle input log.`);\r\n\t\t\tconst inputLog = battle.inputLog.map(Utils.escapeHTML).join(`
`);\r\n\t\t\tuser.sendTo(\r\n\t\t\t\troom,\r\n\t\t\t\t`|html|
${inputLog}
`,\r\n\t\t\t);\r\n\t\t} else if (!battle.allowExtraction[user.id]) {\r\n\t\t\tbattle.allowExtraction[user.id] = new Set();\r\n\t\t\tfor (const id in battle.playerTable) {\r\n\t\t\t\tconst playerUser = Users.get(id);\r\n\t\t\t\tif (!playerUser) continue;\r\n\t\t\t\tif (playerUser.id === user.id) {\r\n\t\t\t\t\tbattle.allowExtraction[user.id].add(user.id);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplayerUser.sendTo(\r\n\t\t\t\t\t\troom,\r\n\t\t\t\t\t\tUtils.html`|html|${user.name} wants to extract the battle input log. `\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.addModAction(room.tr`${user.name} wants to extract the battle input log.`);\r\n\t\t} else {\r\n\t\t\t// Re-request to make the buttons appear again for users who have not allowed extraction\r\n\t\t\tlet logExported = true;\r\n\t\t\tfor (const id in battle.playerTable) {\r\n\t\t\t\tconst playerUser = Users.get(id);\r\n\t\t\t\tif (!playerUser || battle.allowExtraction[user.id].has(playerUser.id)) continue;\r\n\t\t\t\tlogExported = false;\r\n\t\t\t\tplayerUser.sendTo(\r\n\t\t\t\t\troom,\r\n\t\t\t\t\tUtils.html`|html|${user.name} wants to extract the battle input log. `\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tif (logExported) return this.errorReply(this.tr`You already extracted the battle input log.`);\r\n\t\t\tthis.sendReply(this.tr`Battle input log re-requested.`);\r\n\t\t}\r\n\t},\r\n\texportinputloghelp: [`/exportinputlog - Asks players in a battle for permission to export an inputlog. Requires: &`],\r\n\r\n\timportinputlog(target, room, user, connection) {\r\n\t\tthis.checkCan('importinputlog');\r\n\t\tconst formatIndex = target.indexOf(`\"formatid\":\"`);\r\n\t\tconst nextQuoteIndex = target.indexOf(`\"`, formatIndex + 12);\r\n\t\tif (formatIndex < 0 || nextQuoteIndex < 0) return this.errorReply(this.tr`Invalid input log.`);\r\n\t\ttarget = target.replace(/\\r/g, '');\r\n\t\tif ((`\\n` + target).includes(`\\n>eval `) && !user.hasConsoleAccess(connection)) {\r\n\t\t\treturn this.errorReply(this.tr`Your input log contains untrusted code - you must have console access to use it.`);\r\n\t\t}\r\n\r\n\t\tconst formatid = target.slice(formatIndex + 12, nextQuoteIndex);\r\n\t\tconst battleRoom = Rooms.createBattle({format: formatid, inputLog: target});\r\n\t\tif (!battleRoom) return; // createBattle will inform the user if creating the battle failed\r\n\r\n\t\tconst nameIndex1 = target.indexOf(`\"name\":\"`);\r\n\t\tconst nameNextQuoteIndex1 = target.indexOf(`\"`, nameIndex1 + 8);\r\n\t\tconst nameIndex2 = target.indexOf(`\"name\":\"`, nameNextQuoteIndex1 + 1);\r\n\t\tconst nameNextQuoteIndex2 = target.indexOf(`\"`, nameIndex2 + 8);\r\n\t\tif (nameIndex1 >= 0 && nameNextQuoteIndex1 >= 0 && nameIndex2 >= 0 && nameNextQuoteIndex2 >= 0) {\r\n\t\t\tconst battle = battleRoom.battle!;\r\n\t\t\tbattle.p1.name = target.slice(nameIndex1 + 8, nameNextQuoteIndex1);\r\n\t\t\tbattle.p2.name = target.slice(nameIndex2 + 8, nameNextQuoteIndex2);\r\n\t\t}\r\n\t\tbattleRoom.auth.set(user.id, Users.HOST_SYMBOL);\r\n\t\tfor (const player of battleRoom.battle!.players) {\r\n\t\t\tplayer.hasTeam = true;\r\n\t\t}\r\n\t\tthis.parse(`/join ${battleRoom.roomid}`);\r\n\t\tsetTimeout(() => {\r\n\t\t\t// timer to make sure this goes under the battle\r\n\t\t\tbattleRoom.add(`|uhtmlchange|invites|
This is an imported replay
Players will need to be manually added with /invitebattle or /restoreplayers
`);\r\n\t\t\tbattleRoom.add(`|uhtml|invites|`).update();\r\n\t\t\tbattleRoom.battle!.sendInviteForm(user);\r\n\t\t}, 500);\r\n\t},\r\n\timportinputloghelp: [`/importinputlog [inputlog] - Starts a battle with a given inputlog. Requires: + % @ &`],\r\n\r\n\tshowteam: 'showset',\r\n\tasync showset(target, room, user, connection, cmd) {\r\n\t\tthis.checkChat();\r\n\t\tconst showAll = cmd === 'showteam';\r\n\t\tconst hideStats = toID(target) === 'hidestats';\r\n\t\troom = this.requireRoom();\r\n\t\tconst battle = room.battle;\r\n\t\tif (!showAll && !target) return this.parse(`/help showset`);\r\n\t\tif (!battle) return this.errorReply(this.tr`This command can only be used in a battle.`);\r\n\t\tlet team = await battle.getTeam(user);\r\n\t\tif (!team) return this.errorReply(this.tr`You are not a player and don't have a team.`);\r\n\r\n\t\tif (!showAll) {\r\n\t\t\tconst parsed = parseInt(target);\r\n\t\t\tif (isNaN(parsed)) {\r\n\t\t\t\tconst matchedSet = team.filter(set => {\r\n\t\t\t\t\tconst id = toID(target);\r\n\t\t\t\t\treturn toID(set.name) === id || toID(set.species) === id;\r\n\t\t\t\t})[0];\r\n\t\t\t\tif (!matchedSet) return this.errorReply(this.tr`You don't have a Pok\u00E9mon matching \"${target}\" in your team.`);\r\n\t\t\t\tteam = [matchedSet];\r\n\t\t\t} else {\r\n\t\t\t\tconst setIndex = parsed - 1;\r\n\t\t\t\tconst indexedSet = team[setIndex];\r\n\t\t\t\tif (!indexedSet) {\r\n\t\t\t\t\treturn this.errorReply(this.tr`You don't have a Pok\u00E9mon #${parsed} on your team - your team only has ${team.length} Pok\u00E9mon.`);\r\n\t\t\t\t}\r\n\t\t\t\tteam = [indexedSet];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet resultString = Utils.escapeHTML(Teams.export(team, {hideStats}));\r\n\t\tif (showAll) {\r\n\t\t\tresultString = `
${this.tr`View team`}${resultString}
`;\r\n\t\t}\r\n\t\tthis.runBroadcast(true);\r\n\t\treturn this.sendReplyBox(resultString);\r\n\t},\r\n\tshowsethelp: [\r\n\t\t`!showteam - show the team you're using in the current battle (must be used in a battle you're a player in).`,\r\n\t\t`!showteam hidestats - show the team you're using in the current battle, without displaying any stat-related information.`,\r\n\t\t`!showset [number] - shows the set of the pokemon corresponding to that number (in original Team Preview order, not necessarily current order)`,\r\n\t],\r\n\r\n\tasync acceptopenteamsheets(target, room, user, connection, cmd) {\r\n\t\troom = this.requireRoom();\r\n\t\tconst battle = room.battle;\r\n\t\tif (!battle) return this.errorReply(this.tr`Must be in a battle room.`);\r\n\t\tconst player = battle.playerTable[user.id];\r\n\t\tif (!player) {\r\n\t\t\treturn this.errorReply(this.tr`Must be a player to agree to open team sheets.`);\r\n\t\t}\r\n\t\tconst format = Dex.formats.get(battle.options.format);\r\n\t\tif (!Dex.formats.getRuleTable(format).has('openteamsheets')) {\r\n\t\t\treturn this.errorReply(this.tr`This format does not allow requesting open team sheets. You can both manually agree to it by using !showteam hidestats.`);\r\n\t\t}\r\n\t\tif (battle.turn > 0) {\r\n\t\t\treturn this.errorReply(this.tr`You cannot agree to open team sheets after Team Preview. Each player can still show their own sheet by using this command: !showteam hidestats`);\r\n\t\t}\r\n\t\tif (battle.players.some(curPlayer => curPlayer.wantsOpenTeamSheets === false)) {\r\n\t\t\treturn this.errorReply(this.tr`An opponent has already rejected open team sheets.`);\r\n\t\t}\r\n\t\tif (player.wantsOpenTeamSheets !== null) {\r\n\t\t\treturn this.errorReply(this.tr`You have already made your decision about agreeing to open team sheets.`);\r\n\t\t}\r\n\t\tplayer.wantsOpenTeamSheets = true;\r\n\t\tplayer.sendRoom(Utils.html`|uhtmlchange|otsrequest|`);\r\n\r\n\t\tthis.add(this.tr`${user.name} has agreed to open team sheets.`);\r\n\t\tif (battle.players.every(curPlayer => curPlayer.wantsOpenTeamSheets)) {\r\n\t\t\tlet buf = '|uhtml|ots|';\r\n\t\t\tfor (const curPlayer of battle.players) {\r\n\t\t\t\tconst team = await battle.getTeam(curPlayer.id);\r\n\t\t\t\tif (!team) continue;\r\n\t\t\t\tbuf += Utils.html`
Open Team Sheet for ${curPlayer.name}${Teams.export(team, {hideStats: true})}
`;\r\n\t\t\t}\r\n\t\t\tfor (const curPlayer of battle.players) {\r\n\t\t\t\tcurPlayer.sendRoom(buf);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tacceptopenteamsheetshelp: [`/acceptopenteamsheets - Agrees to an open team sheet opportunity during Team Preview, where all information on a team except stats is shared with the opponent. Requires: \\u2606`],\r\n\r\n\trejectopenteamsheets(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tconst battle = room.battle;\r\n\t\tif (!battle) return this.errorReply(this.tr`Must be in a battle room.`);\r\n\t\tconst player = battle.playerTable[user.id];\r\n\t\tif (!player) {\r\n\t\t\treturn this.errorReply(this.tr`Must be a player to reject open team sheets.`);\r\n\t\t}\r\n\t\tconst format = Dex.formats.get(battle.options.format);\r\n\t\tif (!Dex.formats.getRuleTable(format).has('openteamsheets')) {\r\n\t\t\treturn this.errorReply(this.tr`This format does not allow requesting open team sheets.`);\r\n\t\t}\r\n\t\tif (battle.turn > 0) {\r\n\t\t\treturn this.errorReply(this.tr`You cannot reject open team sheets after Team Preview.`);\r\n\t\t}\r\n\t\tif (player.wantsOpenTeamSheets !== null) {\r\n\t\t\treturn this.errorReply(this.tr`You have already made your decision about agreeing to open team sheets.`);\r\n\t\t}\r\n\t\tplayer.wantsOpenTeamSheets = false;\r\n\t\tfor (const otherPlayer of battle.players) {\r\n\t\t\totherPlayer.sendRoom(Utils.html`|uhtmlchange|otsrequest|`);\r\n\t\t}\r\n\t\treturn this.add(this.tr`${user.name} rejected open team sheets.`);\r\n\t},\r\n\trejectopenteamsheetshelp: [`/rejectopenteamsheetshelp - Rejects an open team sheet opportunity during Team Preview, where all information on a team except stats is shared with the opponent. Requires: \\u2606`],\r\n\r\n\tacceptdraw: 'offertie',\r\n\taccepttie: 'offertie',\r\n\tofferdraw: 'offertie',\r\n\trequesttie: 'offertie',\r\n\toffertie(target, room, user, connection, cmd) {\r\n\t\troom = this.requireRoom();\r\n\t\tconst battle = room.battle;\r\n\t\tif (!battle) return this.errorReply(this.tr`Must be in a battle room.`);\r\n\t\tif (!Config.allowrequestingties) {\r\n\t\t\treturn this.errorReply(this.tr`This server does not allow offering ties.`);\r\n\t\t}\r\n\t\tif (room.tour) {\r\n\t\t\treturn this.errorReply(this.tr`You can't offer ties in tournaments.`);\r\n\t\t}\r\n\t\tif (battle.turn < 100) {\r\n\t\t\treturn this.errorReply(this.tr`It's too early to tie, please play until turn 100.`);\r\n\t\t}\r\n\t\tthis.checkCan('roomvoice', null, room);\r\n\t\tif (cmd === 'accepttie' && !battle.players.some(player => player.wantsTie)) {\r\n\t\t\treturn this.errorReply(this.tr`No other player is requesting a tie right now. It was probably canceled.`);\r\n\t\t}\r\n\t\tconst player = battle.playerTable[user.id];\r\n\t\tif (!battle.players.some(curPlayer => curPlayer.wantsTie)) {\r\n\t\t\tthis.add(this.tr`${user.name} is offering a tie.`);\r\n\t\t\troom.update();\r\n\t\t\tfor (const otherPlayer of battle.players) {\r\n\t\t\t\tif (otherPlayer !== player) {\r\n\t\t\t\t\totherPlayer.sendRoom(\r\n\t\t\t\t\t\tUtils.html`|uhtml|offertie| `\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplayer.wantsTie = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (!player) {\r\n\t\t\t\treturn this.errorReply(this.tr`Must be a player to accept ties.`);\r\n\t\t\t}\r\n\t\t\tif (!player.wantsTie) {\r\n\t\t\t\tplayer.wantsTie = true;\r\n\t\t\t} else {\r\n\t\t\t\treturn this.errorReply(this.tr`You have already agreed to a tie.`);\r\n\t\t\t}\r\n\t\t\tplayer.sendRoom(Utils.html`|uhtmlchange|offertie|`);\r\n\t\t\tthis.add(this.tr`${user.name} accepted the tie.`);\r\n\t\t\tif (battle.players.every(curPlayer => curPlayer.wantsTie)) {\r\n\t\t\t\tif (battle.players.length > 2) {\r\n\t\t\t\t\tthis.add(this.tr`All players have accepted the tie.`);\r\n\t\t\t\t}\r\n\t\t\t\tbattle.tie();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\toffertiehelp: [`/offertie - Offers a tie to all players in a battle; if all accept, it ties. Can only be used after 100+ turns have passed. Requires: \\u2606 @ # &`],\r\n\r\n\trejectdraw: 'rejecttie',\r\n\trejecttie(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tconst battle = room.battle;\r\n\t\tif (!battle) return this.errorReply(this.tr`Must be in a battle room.`);\r\n\t\tconst player = battle.playerTable[user.id];\r\n\t\tif (!player) {\r\n\t\t\treturn this.errorReply(this.tr`Must be a player to reject ties.`);\r\n\t\t}\r\n\t\tif (!battle.players.some(curPlayer => curPlayer.wantsTie)) {\r\n\t\t\treturn this.errorReply(this.tr`No other player is requesting a tie right now. It was probably canceled.`);\r\n\t\t}\r\n\t\tif (player.wantsTie) player.wantsTie = false;\r\n\t\tfor (const otherPlayer of battle.players) {\r\n\t\t\totherPlayer.sendRoom(Utils.html`|uhtmlchange|offertie|`);\r\n\t\t}\r\n\t\treturn this.add(this.tr`${user.name} rejected the tie.`);\r\n\t},\r\n\trejecttiehelp: [`/rejecttie - Rejects a tie offered by another player in a battle.`],\r\n\r\n\tinputlog() {\r\n\t\tthis.parse(`/help exportinputlog`);\r\n\t\tthis.parse(`/help importinputlog`);\r\n\t},\r\n\r\n\t/*********************************************************\r\n\t * Battle commands\r\n\t *********************************************************/\r\n\r\n\tforfeit(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.game) return this.errorReply(this.tr`This room doesn't have an active game.`);\r\n\t\tif (!room.game.forfeit) {\r\n\t\t\treturn this.errorReply(this.tr`This kind of game can't be forfeited.`);\r\n\t\t}\r\n\t\troom.game.forfeit(user);\r\n\t},\r\n\tforfeithelp: [\r\n\t\t`/forfeit - Forfeits your currently active game, if it supports that.`,\r\n\t],\r\n\r\n\tguess: 'choose',\r\n\tchoose(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.game) return this.errorReply(this.tr`This room doesn't have an active game.`);\r\n\t\tif (!room.game.choose) return this.errorReply(this.tr`This game doesn't support /choose`);\r\n\t\tif (room.game.checkChat) this.checkChat();\r\n\t\troom.game.choose(user, target);\r\n\t},\r\n\tchoosehelp: [\r\n\t\t`/choose [text] - Make a choice for the currently active game.`,\r\n\t],\r\n\r\n\tmv: 'move',\r\n\tattack: 'move',\r\n\tmove(target, room, user) {\r\n\t\tthis.parse(`/choose move ${target}`);\r\n\t},\r\n\tmovehelp: [\r\n\t\t`/move [move] - Make a move for the current game.`,\r\n\t],\r\n\r\n\tsw: 'switch',\r\n\tswitch(target, room, user) {\r\n\t\tthis.parse(`/choose switch ${target}`);\r\n\t},\r\n\tswitchhelp: [\r\n\t\t`/switch [pokemon] - Make a switch for the current game.`,\r\n\t],\r\n\r\n\tteam(target, room, user) {\r\n\t\tthis.parse(`/choose team ${target}`);\r\n\t},\r\n\tteamhelp: [\r\n\t\t`/team [pokemon] - Change your team for the current game.`,\r\n\t],\r\n\r\n\tundo(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.game) return this.errorReply(this.tr`This room doesn't have an active game.`);\r\n\t\tif (!room.game.undo) return this.errorReply(this.tr`This game doesn't support /undo`);\r\n\r\n\t\troom.game.undo(user, target);\r\n\t},\r\n\tundohelp: [\r\n\t\t`/undo - Reverts the last move of the player in the current game, if it supports it.`,\r\n\t],\r\n\r\n\tuploadreplay: 'savereplay',\r\n\tasync savereplay(target, room, user, connection) {\r\n\t\tif (!room?.battle) {\r\n\t\t\treturn this.errorReply(this.tr`You can only save replays for battles.`);\r\n\t\t}\r\n\r\n\t\tconst options = (target === 'forpunishment' || target === 'silent') ? target : undefined;\r\n\t\tawait room.uploadReplay(user, connection, options);\r\n\t},\r\n\tsavereplayhelp: [`/savereplay - Saves the replay for the current battle.`],\r\n\r\n\thidereplay(target, room, user, connection) {\r\n\t\tif (!room?.battle) return this.errorReply(`Must be used in a battle.`);\r\n\t\tthis.checkCan('joinbattle', null, room);\r\n\t\tif (room.tour?.forcePublic) {\r\n\t\t\treturn this.errorReply(this.tr`This battle can't have hidden replays, because the tournament is set to be forced public.`);\r\n\t\t}\r\n\t\tif (room.hideReplay) return this.errorReply(this.tr`The replay for this battle is already set to hidden.`);\r\n\t\troom.hideReplay = true;\r\n\t\t// If a replay has already been saved, /savereplay again to update the uploaded replay's hidden status\r\n\t\tif (room.battle.replaySaved) this.parse('/savereplay');\r\n\t\tthis.addModAction(room.tr`${user.name} hid the replay of this battle.`);\r\n\t},\r\n\thidereplayhelp: [`/hidereplay - Hides the replay of the current battle. Requires: ${Users.PLAYER_SYMBOL} &`],\r\n\r\n\taddplayer: 'invitebattle',\r\n\tinvitebattle(target, room, user, connection) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.battle) return this.errorReply(this.tr`You can only do this in battle rooms.`);\r\n\t\tif (room.rated) return this.errorReply(this.tr`You can only add a Player to unrated battles.`);\r\n\r\n\t\tthis.checkCan('joinbattle', null, room);\r\n\r\n\t\tconst {targetUser, targetUsername: name, rest: slot} = this.splitUser(target, {exactName: true});\r\n\t\tif (slot !== 'p1' && slot !== 'p2' && slot !== 'p3' && slot !== 'p4') {\r\n\t\t\tthis.errorReply(this.tr`Player must be set to \"p1\" or \"p2\", not \"${slot}\".`);\r\n\t\t\treturn this.parse('/help addplayer');\r\n\t\t}\r\n\r\n\t\tconst battle = room.battle;\r\n\t\tconst player = battle[slot];\r\n\r\n\t\tif (!player) {\r\n\t\t\treturn this.errorReply(`This battle does not support having players in ${slot}`);\r\n\t\t}\r\n\t\tif (!targetUser) {\r\n\t\t\tbattle.sendInviteForm(connection);\r\n\t\t\treturn this.errorReply(this.tr`User ${name} not found.`);\r\n\t\t}\r\n\t\tif (player.id) {\r\n\t\t\tbattle.sendInviteForm(connection);\r\n\t\t\treturn this.errorReply(this.tr`This room already has a player in slot ${slot}.`);\r\n\t\t}\r\n\t\tif (player.invite) {\r\n\t\t\tbattle.sendInviteForm(connection);\r\n\t\t\treturn this.errorReply(`Someone else (${player.invite}) has already been invited to be ${slot}!`);\r\n\t\t}\r\n\t\tif (targetUser.id in battle.playerTable) {\r\n\t\t\tbattle.sendInviteForm(connection);\r\n\t\t\treturn this.errorReply(this.tr`${targetUser.name} is already a player in this battle.`);\r\n\t\t}\r\n\r\n\t\tif (targetUser.settings.blockChallenges && !user.can('bypassblocks', targetUser)) {\r\n\t\t\tbattle.sendInviteForm(connection);\r\n\t\t\tChat.maybeNotifyBlocked('challenge', targetUser, user);\r\n\t\t\treturn this.errorReply(this.tr`The user '${targetUser.name}' is not accepting challenges right now.`);\r\n\t\t}\r\n\r\n\t\t// INVITE\r\n\r\n\t\tif (!targetUser.inRooms.has(room.roomid) || !player.hasTeam) {\r\n\t\t\tplayer.invite = targetUser.id;\r\n\t\t\tconst playerNames = battle.players.map(p => p.id && p.name).filter(Boolean).join(', ');\r\n\t\t\tconst ready = player.hasTeam ? battle.format : new Ladders.BattleReady(user.id, battle.format, user.battleSettings);\r\n\t\t\tLadders.challenges.add(\r\n\t\t\t\tnew Ladders.BattleInvite(user.id, targetUser.id, ready, {\r\n\t\t\t\t\tacceptCommand: `/acceptbattle ${user.id}`,\r\n\t\t\t\t\tmessage: `You're invited to join a battle (with ${playerNames})`,\r\n\t\t\t\t\troomid: room.roomid,\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t\t\tbattle.sendInviteForm(battle.invitesFull() ? true : connection);\r\n\t\t\treturn this.add(`||Invite sent to ${targetUser.name}!`);\r\n\t\t}\r\n\r\n\t\troom.auth.set(targetUser.id, Users.PLAYER_SYMBOL);\r\n\t\tconst success = battle.joinGame(targetUser, slot);\r\n\t\tif (!success) {\r\n\t\t\troom.auth.delete(targetUser.id);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!battle.started) battle.sendInviteForm(connection);\r\n\t},\r\n\tinvitebattlehelp: [\r\n\t\t`/addplayer [username], [p1|p2|p3|p4] - Invites the player to join your current battle.`,\r\n\t],\r\n\r\n\tasync acceptbattle(target, room, user, connection) {\r\n\t\tconst chall = Ladders.challenges.resolveAcceptCommand(this);\r\n\r\n\t\tconst targetRoom = Rooms.get(chall.roomid);\r\n\t\tif (!targetRoom) return this.errorReply(`Room ${chall.roomid} not found`);\r\n\t\tconst battle = targetRoom.battle!;\r\n\t\tconst player = battle.players.find(maybe => maybe.invite === user.id);\r\n\t\tif (!player) {\r\n\t\t\treturn this.errorReply(`You haven't been invited to that battle.`);\r\n\t\t}\r\n\t\tconst slot = player.slot;\r\n\t\tif (player.id) {\r\n\t\t\tthrow new Error(`Player ${player.slot} in ${chall.roomid} should not have both 'id' and 'invite'`);\r\n\t\t}\r\n\r\n\t\tlet playerOpts = undefined;\r\n\t\tif (!player.hasTeam) {\r\n\t\t\tconst ladder = Ladders(battle.format);\r\n\t\t\tconst ready = await ladder.prepBattle(connection, 'challenge');\r\n\t\t\tif (!ready) return;\r\n\t\t\tplayerOpts = ready.settings;\r\n\t\t}\r\n\r\n\t\tconst fromUser = Ladders.challenges.accept(this);\r\n\r\n\t\tthis.pmTarget = fromUser;\r\n\t\tthis.sendChatMessage(`/text You accepted the battle invite`);\r\n\t\tthis.parse(`/join ${targetRoom.roomid}`);\r\n\t\tbattle.joinGame(user, slot, playerOpts);\r\n\t},\r\n\tacceptbattlehelp: [`/acceptbattle - Accept an invite from someone to join a battle.`],\r\n\r\n\tuninvitebattle(target, room, user, connection) {\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkCan('joinbattle', null, room);\r\n\r\n\t\tif (!room.battle) return this.errorReply(this.tr`You can only do this in battle rooms.`);\r\n\t\tconst invitesFull = room.battle.invitesFull();\r\n\t\tconst challenges = Ladders.challenges.get(target as ID);\r\n\r\n\t\tif (!challenges) throw new Chat.ErrorMessage(`User ${target} is not currently invited to the battle`);\r\n\t\tfor (const challenge of challenges) {\r\n\t\t\tif (challenge.to === target && challenge.roomid === room.roomid) {\r\n\t\t\t\tLadders.challenges.remove(challenge);\r\n\t\t\t\tLadders.challenges.send(challenge.from, target, `/text The battle invite was changed to someone else; sorry!`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\troom.battle.sendInviteForm(invitesFull ? true : connection);\r\n\t},\r\n\tuninvitebattlehelp: [\r\n\t\t`/uninvitebattle [username] - Revokes an invite from a user to join a battle.`,\r\n\t\t`Requires: ${Users.PLAYER_SYMBOL} &`,\r\n\t],\r\n\r\n\trestoreplayers(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.battle) return this.errorReply(this.tr`You can only do this in battle rooms.`);\r\n\t\tif (room.rated) return this.errorReply(this.tr`You can only add a Player to unrated battles.`);\r\n\r\n\t\tlet didSomething = false;\r\n\t\tfor (const player of room.battle.players) {\r\n\t\t\tif (!player.id && player.name !== `Player ${player.num}`) {\r\n\t\t\t\tthis.parse(`/invitebattle ${player.name}, ${player.slot}`);\r\n\t\t\t\tdidSomething = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!didSomething) {\r\n\t\t\treturn this.errorReply(this.tr`Players could not be restored (maybe this battle already has two players?).`);\r\n\t\t}\r\n\t},\r\n\trestoreplayershelp: [\r\n\t\t`/restoreplayers - Restore previous players in an imported input log.`,\r\n\t],\r\n\r\n\tjoinbattle: 'joingame',\r\n\tjoingame(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.game) return this.errorReply(this.tr`This room doesn't have an active game.`);\r\n\t\tif (!room.game.joinGame) return this.errorReply(this.tr`This game doesn't support /joingame`);\r\n\r\n\t\troom.game.joinGame(user, target);\r\n\t},\r\n\tjoingamehelp: [`/joingame [username] - Join the game being played in the current room.`],\r\n\r\n\tleavebattle: 'leavegame',\r\n\tpartbattle: 'leavegame',\r\n\tleavegame(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.game) return this.errorReply(this.tr`This room doesn't have an active game.`);\r\n\t\tif (!room.game.leaveGame) return this.errorReply(this.tr`This game doesn't support /leavegame`);\r\n\r\n\t\troom.game.leaveGame(user);\r\n\t},\r\n\tleavegamehelp: [`/leavegame - Leave the current game.`],\r\n\r\n\tkickbattle: 'kickgame',\r\n\tkickgame(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.battle) return this.errorReply(this.tr`You can only do this in battle rooms.`);\r\n\t\tif (room.battle.challengeType === 'tour' || room.battle.rated) {\r\n\t\t\treturn this.errorReply(this.tr`You can only do this in unrated non-tour battles.`);\r\n\t\t}\r\n\t\tconst {targetUser, rest: reason} = this.requireUser(target, {allowOffline: true});\r\n\t\tthis.checkCan('kick', targetUser, room);\r\n\t\tif (room.battle.leaveGame(targetUser)) {\r\n\t\t\tconst displayReason = reason ? ` (${reason})` : ``;\r\n\t\t\tthis.addModAction(room.tr`${targetUser.name} was kicked from a battle by ${user.name}.${displayReason}`);\r\n\t\t\tthis.modlog('KICKBATTLE', targetUser, reason, {noip: 1, noalts: 1});\r\n\t\t} else {\r\n\t\t\tthis.errorReply(\"/kickbattle - User isn't in battle.\");\r\n\t\t}\r\n\t},\r\n\tkickbattlehelp: [`/kickbattle [username], [reason] - Kicks a user from a battle with reason. Requires: % @ &`],\r\n\r\n\tkickinactive(target, room, user) {\r\n\t\tthis.parse(`/timer on`);\r\n\t},\r\n\tkickinactivehelp: [\r\n\t\t`/kickinactive - Activates the inactive timer, if the game supports it.`,\r\n\t],\r\n\r\n\ttimer(target, room, user) {\r\n\t\ttarget = toID(target);\r\n\t\troom = this.requireRoom();\r\n\t\tif (!room.game?.timer) {\r\n\t\t\treturn this.errorReply(this.tr`You can only set the timer from inside a battle room.`);\r\n\t\t}\r\n\t\tconst timer = room.game.timer as any;\r\n\t\tif (!timer.timerRequesters) {\r\n\t\t\treturn this.sendReply(this.tr`This game's timer is managed by a different command.`);\r\n\t\t}\r\n\t\tif (!target) {\r\n\t\t\tif (!timer.timerRequesters.size) {\r\n\t\t\t\treturn this.sendReply(this.tr`The game timer is OFF.`);\r\n\t\t\t}\r\n\t\t\tconst requester = [...timer.timerRequesters].join(', ');\r\n\t\t\treturn this.sendReply(this.tr`The game timer is ON (requested by ${requester})`);\r\n\t\t}\r\n\t\tconst force = user.can('timer', null, room);\r\n\t\tif (!force && !room.game.playerTable[user.id]) {\r\n\t\t\treturn this.errorReply(this.tr`Access denied.`);\r\n\t\t}\r\n\t\tif (this.meansNo(target) || target === 'stop') {\r\n\t\t\tif (timer.timerRequesters.size) {\r\n\t\t\t\ttimer.stop(force ? undefined : user);\r\n\t\t\t\tif (force) {\r\n\t\t\t\t\troom.send(`|inactiveoff|${room.tr`Timer was turned off by staff. Please do not turn it back on until our staff say it's okay.`}`);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthis.errorReply(this.tr`The timer is already off.`);\r\n\t\t\t}\r\n\t\t} else if (this.meansYes(target) || target === 'start') {\r\n\t\t\ttimer.start(user);\r\n\t\t} else {\r\n\t\t\tthis.errorReply(this.tr`\"${target}\" is not a recognized timer state.`);\r\n\t\t}\r\n\t},\r\n\ttimerhelp: [\r\n\t\t`/timer [start|stop] - Starts or stops the game timer. Requires: ${Users.PLAYER_SYMBOL} % @ &`,\r\n\t],\r\n\r\n\tautotimer: 'forcetimer',\r\n\tforcetimer(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\ttarget = toID(target);\r\n\t\tthis.checkCan('autotimer');\r\n\t\tif (this.meansNo(target) || target === 'stop') {\r\n\t\t\tConfig.forcetimer = false;\r\n\t\t\tthis.addModAction(room.tr`Forcetimer is now OFF: The timer is now opt-in. (set by ${user.name})`);\r\n\t\t} else if (this.meansYes(target) || target === 'start' || !target) {\r\n\t\t\tConfig.forcetimer = true;\r\n\t\t\tthis.addModAction(room.tr`Forcetimer is now ON: All battles will be timed. (set by ${user.name})`);\r\n\t\t} else {\r\n\t\t\tthis.errorReply(this.tr`'${target}' is not a recognized forcetimer setting.`);\r\n\t\t}\r\n\t},\r\n\tforcetimerhelp: [\r\n\t\t`/forcetimer [start|stop] - Forces all battles to have the inactive timer enabled. Requires: &`,\r\n\t],\r\n\r\n\tforcetie: 'forcewin',\r\n\tforcewin(target, room, user) {\r\n\t\troom = this.requireRoom();\r\n\t\tthis.checkCan('forcewin');\r\n\t\tif (!room.battle) {\r\n\t\t\tthis.errorReply(\"/forcewin - This is not a battle room.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\troom.battle.endType = 'forced';\r\n\t\tif (!target) {\r\n\t\t\troom.battle.tie();\r\n\t\t\tthis.modlog('FORCETIE');\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst targetUser = Users.getExact(target);\r\n\t\tif (!targetUser) return this.errorReply(this.tr`User '${target}' not found.`);\r\n\r\n\t\troom.battle.win(targetUser);\r\n\t\tthis.modlog('FORCEWIN', targetUser.id);\r\n\t},\r\n\tforcewinhelp: [\r\n\t\t`/forcetie - Forces the current match to end in a tie. Requires: &`,\r\n\t\t`/forcewin [user] - Forces the current match to end in a win for a user. Requires: &`,\r\n\t],\r\n\r\n\t/*********************************************************\r\n\t * Challenging and searching commands\r\n\t *********************************************************/\r\n\r\n\tasync search(target, room, user, connection) {\r\n\t\tif (target) {\r\n\t\t\tif (Config.laddermodchat && !Users.globalAuth.atLeast(user, Config.laddermodchat)) {\r\n\t\t\t\tconst groupName = Config.groups[Config.laddermodchat].name || Config.laddermodchat;\r\n\t\t\t\tthis.popupReply(this.tr`This server requires you to be rank ${groupName} or higher to search for a battle.`);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tconst ladder = Ladders(target);\r\n\t\t\tif (!user.registered && Config.forceregisterelo && await ladder.getRating(user.id) >= Config.forceregisterelo) {\r\n\t\t\t\tuser.send(\r\n\t\t\t\t\tUtils.html`|popup||html|${this.tr`Since you have reached ${Config.forceregisterelo} ELO in ${target}, you must register your account to continue playing that format on ladder.`}

`\r\n\t\t\t\t);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tChat.runHandlers('onLadderSearch', user, connection, ladder.formatid as ID);\r\n\t\t\treturn ladder.searchBattle(user, connection);\r\n\t\t}\r\n\t\treturn Ladders.cancelSearches(user);\r\n\t},\r\n\tsearchhelp: [\r\n\t\t`/search [format] - Searches for a battle in the specified format.`,\r\n\t],\r\n\r\n\tcancelsearch(target, room, user) {\r\n\t\tif (target) {\r\n\t\t\tLadders(toID(target)).cancelSearch(user);\r\n\t\t} else {\r\n\t\t\tLadders.cancelSearches(user);\r\n\t\t}\r\n\t},\r\n\tcancelsearchhelp: [\r\n\t\t`/cancelsearch [format] - Cancels a search for a battle in the specified format.`,\r\n\t\t`If no format is given, cancels searches for all formats.`,\r\n\t],\r\n\r\n\tchall: 'challenge',\r\n\tchallenge(target, room, user, connection) {\r\n\t\tconst {targetUser, targetUsername, rest: formatName} = this.splitUser(target);\r\n\t\tif (!targetUser?.connected) {\r\n\t\t\treturn this.popupReply(this.tr`The user '${targetUsername}' was not found.`);\r\n\t\t}\r\n\t\tif (user.locked && !targetUser.locked) {\r\n\t\t\treturn this.popupReply(this.tr`You are locked and cannot challenge unlocked users. If this user is your friend, ask them to challenge you instead.`);\r\n\t\t}\r\n\t\tif (Punishments.isBattleBanned(user)) {\r\n\t\t\treturn this.popupReply(this.tr`You are banned from battling and cannot challenge users.`);\r\n\t\t}\r\n\t\tif (!user.named) {\r\n\t\t\treturn this.popupReply(this.tr`You must choose a username before you challenge someone.`);\r\n\t\t}\r\n\t\tif (Config.pmmodchat && !user.hasSysopAccess() && !Users.globalAuth.atLeast(user, Config.pmmodchat as GroupSymbol)) {\r\n\t\t\tconst groupName = Config.groups[Config.pmmodchat].name || Config.pmmodchat;\r\n\t\t\tthis.popupReply(this.tr`This server requires you to be rank ${groupName} or higher to challenge users.`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn Ladders(formatName).makeChallenge(connection, targetUser);\r\n\t},\r\n\tchallengehelp: [\r\n\t\t`/challenge [user], [format] - Challenges the given [user] to a battle in the given [format].`,\r\n\t],\r\n\r\n\tbch: 'blockchallenges',\r\n\tblockchall: 'blockchallenges',\r\n\tblockchalls: 'blockchallenges',\r\n\tblockchallenges(target, room, user) {\r\n\t\tif (toID(target) === 'ac') target = 'autoconfirmed';\r\n\t\tif (user.settings.blockChallenges === (target || true)) {\r\n\t\t\treturn this.errorReply(this.tr`You are already blocking challenges!`);\r\n\t\t}\r\n\t\tif (Users.Auth.isAuthLevel(target)) {\r\n\t\t\tuser.settings.blockChallenges = target;\r\n\t\t\tthis.sendReply(this.tr`You are now blocking challenges, except from staff and ${target}.`);\r\n\t\t} else if (target === 'autoconfirmed' || target === 'trusted' || target === 'unlocked' || target === 'friends') {\r\n\t\t\tuser.settings.blockChallenges = target;\r\n\t\t\tif (target === 'friends') target = 'friended';\r\n\t\t\ttarget = this.tr(target);\r\n\t\t\tthis.sendReply(this.tr`You are now blocking challenges, except from staff and ${target} users.`);\r\n\t\t} else {\r\n\t\t\tuser.settings.blockChallenges = true;\r\n\t\t\tthis.sendReply(this.tr`You are now blocking all incoming challenge requests.`);\r\n\t\t}\r\n\t\tuser.update();\r\n\t},\r\n\tblockchallengeshelp: [\r\n\t\t`/blockchallenges - Blocks challenges so no one can challenge you. Unblock them with /unblockchallenges.`,\r\n\t],\r\n\r\n\tunbch: 'allowchallenges',\r\n\tunblockchall: 'allowchallenges',\r\n\tunblockchalls: 'allowchallenges',\r\n\tunblockchallenges: 'allowchallenges',\r\n\tallowchallenges(target, room, user) {\r\n\t\tif (!user.settings.blockChallenges) return this.errorReply(this.tr`You are already available for challenges!`);\r\n\t\tuser.settings.blockChallenges = false;\r\n\t\tuser.update();\r\n\t\tthis.sendReply(this.tr`You are available for challenges from now on.`);\r\n\t},\r\n\tallowchallengeshelp: [\r\n\t\t`/unblockchallenges - Unblocks challenges so you can be challenged again. Block them with /blockchallenges.`,\r\n\t],\r\n\tcchall: 'cancelchallenge',\r\n\tcancelchallenge(target, room, user, connection) {\r\n\t\tconst {targetUser, targetUsername, rest} = this.splitUser(target);\r\n\t\tif (rest) return this.popupReply(this.tr`This command does not support specifying multiple users`);\r\n\t\tthis.pmTarget = targetUser || this.pmTarget;\r\n\t\tif (!this.pmTarget) return this.popupReply(this.tr`User \"${targetUsername}\" not found.`);\r\n\r\n\t\tconst chall = Ladders.challenges.search(user.id, this.pmTarget.id);\r\n\t\tif (!chall || chall.from !== user.id) {\r\n\t\t\tconnection.popup(`You are not challenging ${this.pmTarget.name}. Maybe they accepted/rejected before you cancelled?`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.sendChatMessage(`/log ${user.name} cancelled the challenge.`);\r\n\t\treturn Ladders.challenges.remove(chall);\r\n\t},\r\n\tcancelchallengehelp: [\r\n\t\t`/cancelchallenge [user] - Cancels a pending challenge to the given [user].`,\r\n\t],\r\n\r\n\tasync accept(target, room, user, connection) {\r\n\t\tconst {targetUser, targetUsername, rest} = this.splitUser(target);\r\n\t\tif (rest) return this.popupReply(this.tr`This command does not support specifying multiple users`);\r\n\t\tthis.pmTarget = targetUser || this.pmTarget;\r\n\t\tif (!this.pmTarget) return this.popupReply(this.tr`User \"${targetUsername}\" not found.`);\r\n\r\n\t\tconst chall = Ladders.challenges.search(user.id, this.pmTarget.id);\r\n\t\tif (!chall || chall.to !== user.id) {\r\n\t\t\tconnection.popup(`${this.pmTarget.id} is not challenging you. Maybe they cancelled before you accepted?`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (chall.acceptCommand) {\r\n\t\t\treturn this.parse(chall.acceptCommand);\r\n\t\t}\r\n\t\tconst gameRoom = await Ladders.acceptChallenge(connection, chall as Ladders.BattleChallenge);\r\n\t\tif (!gameRoom) return false;\r\n\t\tthis.sendChatMessage(Utils.html`/nonotify ${user.name} accepted the challenge, starting «${gameRoom.roomid}»`);\r\n\t\treturn true;\r\n\t},\r\n\taccepthelp: [`/accept [user] - Accepts a challenge from the given user.`],\r\n\r\n\treject(target, room, user, connection) {\r\n\t\tconst {targetUser, targetUsername, rest} = this.splitUser(target);\r\n\t\tif (rest) return this.popupReply(this.tr`This command does not support specifying multiple users`);\r\n\t\tthis.pmTarget = targetUser || this.pmTarget;\r\n\t\tif (!this.pmTarget) return this.popupReply(this.tr`User \"${targetUsername}\" not found.`);\r\n\r\n\t\tconst chall = Ladders.challenges.search(user.id, this.pmTarget.id);\r\n\t\tif (!chall || chall.to !== user.id) {\r\n\t\t\tconnection.popup(`${this.pmTarget.id} is not challenging you. Maybe they cancelled before you rejected?`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.sendChatMessage(`/nonotify ${user.name} rejected the challenge.`);\r\n\t\treturn Ladders.challenges.remove(chall, false);\r\n\t},\r\n\trejecthelp: [`/reject [user] - Rejects a challenge from the given user.`],\r\n\r\n\tsaveteam: 'useteam',\r\n\tutm: 'useteam',\r\n\tuseteam(target, room, user) {\r\n\t\tuser.battleSettings.team = target;\r\n\t},\r\n\tuseteamhelp: [`/useteam [packed team] - Sets your team for your next battles to the given [team].`],\r\n\r\n\tvtm(target, room, user, connection) {\r\n\t\tif (Monitor.countPrepBattle(connection.ip, connection)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!target) return this.errorReply(this.tr`Provide a valid format.`);\r\n\t\tconst originalFormat = Dex.formats.get(target);\r\n\t\t// Note: The default here of Anything Goes isn't normally hit; since the web client will send a default format\r\n\t\tconst format = originalFormat.effectType === 'Format' ? originalFormat : Dex.formats.get('Anything Goes');\r\n\t\tif (format.effectType !== 'Format') return this.popupReply(this.tr`Please provide a valid format.`);\r\n\r\n\t\treturn TeamValidatorAsync.get(format.id).validateTeam(user.battleSettings.team).then(result => {\r\n\t\t\tconst matchMessage = (originalFormat === format ? \"\" : this.tr`The format '${originalFormat.name}' was not found.`);\r\n\t\t\tif (result.startsWith('1')) {\r\n\t\t\t\tconnection.popup(`${(matchMessage ? matchMessage + \"\\n\\n\" : \"\")}${this.tr`Your team is valid for ${format.name}.`}`);\r\n\t\t\t} else {\r\n\t\t\t\tconnection.popup(`${(matchMessage ? matchMessage + \"\\n\\n\" : \"\")}${this.tr`Your team was rejected for the following reasons:`}\\n\\n- ${result.slice(1).replace(/\\n/g, '\\n- ')}`);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\tvtmhelp: [`/vtm [format] - Validates your current team (set with /utm).`],\r\n\r\n\thbtc: 'hidebattlesfromtrainercard',\r\n\tsbtc: 'hidebattlesfromtrainercard',\r\n\tshowbattlesinusercard: 'hidebattlesfromtrainercard',\r\n\thidebattlesfromusercard: 'hidebattlesfromtrainercard',\r\n\tshowbattlesintrainercard: 'hidebattlesfromtrainercard',\r\n\thidebattlesfromtrainercard(target, room, user, connection, cmd) {\r\n\t\tconst shouldHide = cmd.includes('hide') || cmd === 'hbtc';\r\n\t\tuser.settings.hideBattlesFromTrainerCard = shouldHide;\r\n\t\tuser.update();\r\n\t\tif (shouldHide) {\r\n\t\t\tthis.sendReply(this.tr`Battles are now hidden (except to staff) in your trainer card.`);\r\n\t\t} else {\r\n\t\t\tthis.sendReply(this.tr`Battles are now visible in your trainer card.`);\r\n\t\t}\r\n\t},\r\n\thidebattlesfromtrainercardhelp: [\r\n\t\t`/hidebattlesfromtrainercard OR /hbtc - Hides your battles in your trainer card.`,\r\n\t\t`/showbattlesintrainercard OR /sbtc - Displays your battles in your trainer card.`,\r\n\t],\r\n\r\n\t/*********************************************************\r\n\t * Low-level\r\n\t *********************************************************/\r\n\r\n\tcmd: 'crq',\r\n\tquery: 'crq',\r\n\tasync crq(target, room, user, connection) {\r\n\t\t// In emergency mode, clamp down on data returned from crq's\r\n\t\tconst trustable = (!Config.emergency || (user.named && user.registered));\r\n\t\tlet cmd;\r\n\t\t[cmd, target] = Utils.splitFirst(target, ' ');\r\n\r\n\t\tconst handler = Chat.crqHandlers[cmd];\r\n\t\tif (!handler) return connection.send(`|queryresponse|${cmd}|null`);\r\n\t\tlet data = handler.call(this, target, user, trustable);\r\n\t\tif (data && data.then) data = await data;\r\n\t\tconnection.send(`|queryresponse|${cmd}|${JSON.stringify(data)}`);\r\n\t},\r\n\r\n\ttrn(target, room, user, connection) {\r\n\t\tif (target === user.name) return false;\r\n\r\n\t\tconst [name, registeredString, token] = Utils.splitFirst(target, ',', 2);\r\n\t\tconst registered = !!parseInt(registeredString);\r\n\r\n\t\treturn user.rename(name, token || '', registered, connection);\r\n\t},\r\n\ttrnhelp: [\r\n\t\t`/trn [username], [registered], [token] - Finishes a rename to the [username] with a given [token].`,\r\n\t],\r\n\r\n\t/*********************************************************\r\n\t * Help commands\r\n\t *********************************************************/\r\n\r\n\tcommands: 'help',\r\n\th: 'help',\r\n\t'?': 'help',\r\n\tman: 'help',\r\n\thelp(target, room, user) {\r\n\t\tif (!this.runBroadcast()) return;\r\n\t\ttarget = target.toLowerCase().trim();\r\n\t\tif (target.startsWith('/') || target.startsWith('!')) target = target.slice(1);\r\n\r\n\t\tif (!target) {\r\n\t\t\tconst broadcastMsg = this.tr`(replace / with ! to broadcast. Broadcasting requires: + % @ # &)`;\r\n\r\n\t\t\tthis.sendReply(`${this.tr`COMMANDS`}: /report, /msg, /reply, /logout, /challenge, /search, /rating, /whois, /user, /join, /leave, /userauth, /roomauth`);\r\n\t\t\tthis.sendReply(`${this.tr`BATTLE ROOM COMMANDS`}: /savereplay, /hideroom, /inviteonly, /invite, /timer, /forfeit`);\r\n\t\t\tthis.sendReply(`${this.tr`OPTION COMMANDS`}: /nick, /avatar, /ignore, /status, /away, /busy, /back, /timestamps, /highlight, /showjoins, /hidejoins, /blockchallenges, /blockpms`);\r\n\t\t\tthis.sendReply(`${this.tr`INFORMATIONAL/RESOURCE COMMANDS`}: /groups, /faq, /rules, /intro, /formatshelp, /othermetas, /analysis, /punishments, /calc, /git, /cap, /roomhelp, /roomfaq ${broadcastMsg}`);\r\n\t\t\tthis.sendReply(`${this.tr`DATA COMMANDS`}: /data, /dexsearch, /movesearch, /itemsearch, /learn, /statcalc, /effectiveness, /weakness, /coverage, /randommove, /randompokemon ${broadcastMsg}`);\r\n\t\t\tif (user.tempGroup !== Users.Auth.defaultSymbol()) {\r\n\t\t\t\tthis.sendReply(`${this.tr`DRIVER COMMANDS`}: /warn, /mute, /hourmute, /unmute, /alts, /forcerename, /modlog, /modnote, /modchat, /lock, /weeklock, /unlock, /announce`);\r\n\t\t\t\tthis.sendReply(`${this.tr`MODERATOR COMMANDS`}: /globalban, /unglobalban, /ip, /markshared, /unlockip`);\r\n\t\t\t\tthis.sendReply(`${this.tr`ADMIN COMMANDS`}: /declare, /forcetie, /forcewin, /promote, /demote, /banip, /host, /ipsearch`);\r\n\t\t\t}\r\n\t\t\tthis.sendReply(this.tr`For an overview of room commands, use /roomhelp`);\r\n\t\t\tthis.sendReply(this.tr`For details of a specific command, use something like: /help data`);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst getHelp = (namespace: Chat.AnnotatedChatCommands, cmds: string[]): boolean => {\r\n\t\t\tconst [cmd, ...subCmds] = cmds;\r\n\r\n\t\t\tif (subCmds.length) {\r\n\t\t\t\t// more specific help first\r\n\t\t\t\tconst subNamespace = namespace[cmd];\r\n\t\t\t\tif (typeof subNamespace === 'object' && !Array.isArray(subNamespace)) {\r\n\t\t\t\t\tif (getHelp(subNamespace, subCmds)) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet help = namespace[`${cmd}help`];\r\n\t\t\tif (typeof help === 'string') {\r\n\t\t\t\thelp = namespace[help];\r\n\t\t\t}\r\n\t\t\tif (!help && typeof namespace[cmd] === 'string') {\r\n\t\t\t\thelp = namespace[`${namespace[cmd]}help`];\r\n\t\t\t}\r\n\t\t\tif (!help && namespace !== Chat.commands && namespace['help']) {\r\n\t\t\t\thelp = namespace['help'];\r\n\t\t\t}\r\n\r\n\t\t\tconst curHandler = namespace[cmd] as Chat.AnnotatedChatHandler;\r\n\t\t\tconst requiredPerm = curHandler?.requiredPermission || 'lock';\r\n\t\t\tif (curHandler?.isPrivate && !user.can(requiredPerm as GlobalPermission)) {\r\n\t\t\t\tthrow new Chat.ErrorMessage(this.tr`The command '/${target}' does not exist.`);\r\n\t\t\t}\r\n\r\n\t\t\tif (typeof help === 'function') {\r\n\t\t\t\t// If the help command is a function, parse it instead\r\n\t\t\t\tthis.run(help);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (Array.isArray(help)) {\r\n\t\t\t\tthis.sendReply(help.map(line => this.tr(line)).join('\\n'));\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tif (!curHandler) {\r\n\t\t\t\tfor (const g in Config.groups) {\r\n\t\t\t\t\tconst groupid = Config.groups[g].id;\r\n\t\t\t\t\tif (new RegExp(`(global)?(un|de)?${groupid}`).test(cmd)) {\r\n\t\t\t\t\t\treturn this.parse(`/help promote`);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (new RegExp(`room(un|de)?${groupid}`).test(cmd)) {\r\n\t\t\t\t\t\treturn this.parse(`/help roompromote`);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthrow new Chat.ErrorMessage(this.tr`The command '/${target}' does not exist.`);\r\n\t\t\t}\r\n\r\n\t\t\tif (cmd.endsWith('help')) {\r\n\t\t\t\tthis.sendReply(this.tr`'/${target}' is a help command.`);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\tif (!getHelp(Chat.commands, target.split(' '))) {\r\n\t\t\tthrow new Chat.ErrorMessage(this.tr`Could not find help for '/${target}'. Try /help for general help.`);\r\n\t\t}\r\n\t},\r\n\thelphelp: [\r\n\t\t`/help OR /h OR /? - Gives you help.`,\r\n\t\t`/help [command] - Gives you help for a specific command.`,\r\n\t],\r\n};\r\n\r\nprocess.nextTick(() => {\r\n\t// We might want to migrate most of this to a JSON schema of command attributes.\r\n\tChat.multiLinePattern.register(\r\n\t\t'>>>? ', '/(?:room|staff)intro ', '/(?:staff)?topic ', '/(?:add|widen)datacenters ', '/bash ', '!code ', '/code ', '/modnote ', '/mn ',\r\n\t\t'/eval', '!eval', '/evalbattle', '/evalsql', '>>sql',\r\n\t\t'/importinputlog '\r\n\t);\r\n});\r\n"], "mappings": "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", "names": ["roominfo", "targetRoom", "language", "player"] }