/chat-commands.js
JavaScript | 2134 lines | 1890 code | 181 blank | 63 comment | 424 complexity | b230d2c5713942189b1ead1f84151dd4 MD5 | raw file
Large files files are truncated, but you can click here to view the full file
- /* to reload chat commands:
- >> for (var i in require.cache) delete require.cache[i];parseCommand = require('./chat-commands.js').parseCommand;''
- */
- var crypto = require('crypto');
- /**
- * `parseCommand`. This is the function most of you are interested in,
- * apparently.
- *
- * `message` is exactly what the user typed in.
- * If the user typed in a command, `cmd` and `target` are the command (with "/"
- * omitted) and command target. Otherwise, they're both the empty string.
- *
- * For instance, say a user types in "/foo":
- * cmd === "/foo", target === "", message === "/foo bar baz"
- *
- * Or, say a user types in "/foo bar baz":
- * cmd === "foo", target === "bar baz", message === "/foo bar baz"
- *
- * Or, say a user types in "!foo bar baz":
- * cmd === "!foo", target === "bar baz", message === "!foo bar baz"
- *
- * Or, say a user types in "foo bar baz":
- * cmd === "", target === "", message === "foo bar baz"
- *
- * `user` and `socket` are the user and socket that sent the message,
- * and `room` is the room that sent the message.
- *
- * Deal with the message however you wish:
- * return; will output the message normally: "user: message"
- * return false; will supress the message output.
- * returning a string will replace the message with that string,
- * then output it normally.
- *
- */
- var modlog = modlog || fs.createWriteStream('logs/modlog.txt', {flags:'a+'});
- var updateServerLock = false;
- function parseCommandLocal(user, cmd, target, room, socket, message) {
- if (!room) return;
- cmd = cmd.toLowerCase();
- switch (cmd) {
- case 'cmd':
- var spaceIndex = target.indexOf(' ');
- var cmd = target;
- if (spaceIndex > 0) {
- cmd = target.substr(0, spaceIndex);
- target = target.substr(spaceIndex+1);
- } else {
- target = '';
- }
- if (cmd === 'userdetails') {
- var targetUser = Users.get(target);
- if (!targetUser || !room) return false;
- var roomList = {};
- for (var i in targetUser.roomCount) {
- if (i==='lobby') continue;
- var targetRoom = Rooms.get(i);
- if (!targetRoom) continue;
- var roomData = {};
- if (targetRoom.battle) {
- var battle = targetRoom.battle;
- roomData.p1 = battle.p1?' '+battle.p1:'';
- roomData.p2 = battle.p2?' '+battle.p2:'';
- }
- roomList[i] = roomData;
- }
- var userdetails = {
- command: 'userdetails',
- userid: targetUser.userid,
- avatar: targetUser.avatar,
- rooms: roomList,
- room: room.id
- };
- if (user.can('ip', targetUser)) {
- userdetails.ip = targetUser.ip;
- }
- emit(socket, 'command', userdetails);
- } else if (cmd === 'roomlist') {
- if (!room || !room.getRoomList) return false;
- emit(socket, 'command', {
- command: 'roomlist',
- rooms: room.getRoomList(true),
- room: room.id
- });
- }
- return false;
- break;
- case 'me':
- case 'mee':
- if (canTalk(user, room)) return true;
- break;
- case '!birkal':
- case 'birkal':
- if (canTalk(user, room) && user.can('broadcast') && room.id === 'lobby') {
- if (cmd === '!birkal') {
- room.add('|c|'+user.getIdentity()+'|!birkal '+target, true);
- }
- room.logEntry(user.name + ' used /birkal ' + target);
- room.add('|c| Birkal|/me '+target, true);
- return false;
- }
- break;
- case 'namelock':
- case 'nl':
- if(!target) {
- return false;
- }
- var targets = splitTarget(target);
- var targetUser = targets[0];
- var targetName = targets[1] || (targetUser && targetUser.name);
- if (!user.can('namelock', targetUser)) {
- emit(socket, 'console', '/namelock - access denied.');
- return false;
- } else if (targetUser && targetName) {
- var oldname = targetUser.name;
- var targetId = toUserid(targetName);
- var userOfName = Users.users[targetId];
- var isAlt = false;
- if (userOfName) {
- for(var altName in userOfName.getAlts()) {
- var altUser = Users.users[toUserid(altName)];
- if (!altUser) continue;
- if (targetId === altUser.userid) {
- isAlt = true;
- break;
- }
- for (var prevName in altUser.prevNames) {
- if (targetId === toUserid(prevName)) {
- isAlt = true;
- break;
- }
- }
- if (isAlt) break;
- }
- }
- if (!userOfName || oldname === targetName || isAlt) {
- targetUser.nameLock(targetName, true);
- }
- if (targetUser.nameLocked()) {
- logModCommand(room,user.name+" name-locked "+oldname+" to "+targetName+".");
- return false;
- }
- emit(socket, 'console', oldname+" can't be name-locked to "+targetName+".");
- } else {
- emit(socket, 'console', "User "+targets[2]+" not found.");
- }
- return false;
- break;
- case 'nameunlock':
- case 'unnamelock':
- case 'nul':
- case 'unl':
- if(!user.can('namelock') || !target) {
- return false;
- }
- var removed = false;
- for (var i in nameLockedIps) {
- if (nameLockedIps[i] === target) {
- delete nameLockedIps[i];
- removed = true;
- }
- }
- if (removed) {
- var targetUser = Users.get(target);
- if (targetUser) {
- rooms.lobby.sendIdentity(targetUser);
- }
- logModCommand(room,user.name+" unlocked the name of "+target+".");
- } else {
- emit(socket, 'console', target+" not found.");
- }
- return false;
- break;
- case 'forfeit':
- case 'concede':
- case 'surrender':
- if (!room.battle) {
- emit(socket, 'console', "There's nothing to forfeit here.");
- return false;
- }
- if (!room.forfeit(user)) {
- emit(socket, 'console', "You can't forfeit this battle.");
- }
- return false;
- break;
- case 'register':
- emit(socket, 'console', 'You must win a rated battle to register.');
- return false;
- break;
- case 'avatar':
- if (!target) return parseCommand(user, 'avatars', '', room, socket);
- var parts = target.split(',');
- var avatar = parseInt(parts[0]);
- if (!avatar || avatar > 294 || avatar < 1) {
- if (!parts[1]) {
- emit(socket, 'console', 'Invalid avatar.');
- }
- return false;
- }
- user.avatar = avatar;
- if (!parts[1]) {
- emit(socket, 'console', 'Avatar changed to:');
- emit(socket, 'console', {rawMessage: '<img src="/sprites/trainers/'+avatar+'.png" alt="" width="80" height="80" />'});
- }
- return false;
- break;
- case 'rooms':
- var targetUser = user;
- if (target) targetUser = Users.get(target);
- if (!targetUser) {
- emit(socket, 'console', 'User '+target+' not found.');
- } else {
- var output = "";
- var first = true;
- for (var i in targetUser.roomCount) {
- if (!first) output += ' | ';
- first = false;
- output += '<a href="/'+i+'" room="'+i+'">'+i+'</a>';
- }
- if (!output) {
- emit(socket, 'console', ""+targetUser.name+" is offline.");
- } else {
- emit(socket, 'console', {rawMessage: ""+targetUser.name+" is in: "+output});
- }
- }
- return false;
- break;
- case 'altcheck':
- case 'alt':
- case 'alts':
- case 'getalts':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targetUser = Users.get(target);
- if (!targetUser) {
- emit(socket, 'console', 'User '+target+' not found.');
- return false;
- }
- if (!user.can('alts', targetUser)) {
- emit(socket, 'console', '/alts - Access denied.');
- return false;
- }
- var alts = targetUser.getAlts();
- emit(socket, 'console', 'User: '+targetUser.name);
- if (!user.can('alts', targetUser.getHighestRankedAlt())) {
- return false;
- }
- var output = '';
- for (var i in targetUser.prevNames) {
- if (output) output += ", ";
- output += targetUser.prevNames[i];
- }
- if (output) emit(socket, 'console', 'Previous names: '+output);
- for (var j=0; j<alts.length; j++) {
- var targetAlt = Users.get(alts[j]);
- if (!targetAlt.named && !targetAlt.connected) continue;
- emit(socket, 'console', 'Alt: '+targetAlt.name);
- output = '';
- for (var i in targetAlt.prevNames) {
- if (output) output += ", ";
- output += targetAlt.prevNames[i];
- }
- if (output) emit(socket, 'console', 'Previous names: '+output);
- }
- return false;
- break;
- case 'whois':
- var targetUser = user;
- if (target) {
- targetUser = Users.get(target);
- }
- if (!targetUser) {
- emit(socket, 'console', 'User '+target+' not found.');
- } else {
- emit(socket, 'console', 'User: '+targetUser.name);
- if (config.groups[targetUser.group] && config.groups[targetUser.group].name) {
- emit(socket, 'console', 'Group: ' + config.groups[targetUser.group].name + ' (' + targetUser.group + ')');
- }
- if (!targetUser.authenticated) {
- emit(socket, 'console', '(Unregistered)');
- }
- if (user.can('ip', targetUser)) {
- emit(socket, 'console', 'IP: '+targetUser.ip);
- }
- var output = 'In rooms: ';
- var first = true;
- for (var i in targetUser.roomCount) {
- if (!first) output += ' | ';
- first = false;
- output += '<a href="/'+i+'" room="'+i+'">'+i+'</a>';
- }
- emit(socket, 'console', {rawMessage: output});
- }
- return false;
- break;
- case 'ban':
- case 'b':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targets = splitTarget(target);
- var targetUser = targets[0];
- if (!targetUser) {
- emit(socket, 'console', 'User '+targets[2]+' not found.');
- return false;
- }
- if (!user.can('ban', targetUser)) {
- emit(socket, 'console', '/ban - Access denied.');
- return false;
- }
- logModCommand(room,""+targetUser.name+" was banned by "+user.name+"." + (targets[1] ? " (" + targets[1] + ")" : ""));
- targetUser.emit('message', user.name+' has banned you. If you feel that your banning was unjustified you can <a href="http://www.smogon.com/forums/announcement.php?f=126&a=204" target="_blank">appeal the ban</a>. '+targets[1]);
- var alts = targetUser.getAlts();
- if (alts.length) logModCommand(room,""+targetUser.name+"'s alts were also banned: "+alts.join(", "));
- targetUser.ban();
- return false;
- break;
- case 'banredirect':
- case 'br':
- emit(socket, 'console', '/banredirect - This command is obsolete and has been removed.');
- return false;
- break;
- case 'redirect':
- case 'redir':
- emit(socket, 'console', '/redirect - This command is obsolete and has been removed.');
- return false;
- break;
- case 'kick':
- case 'k':
- // TODO: /kick will be removed in due course.
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targets = splitTarget(target);
- var targetUser = targets[0];
- if (!targetUser || !targetUser.connected) {
- emit(socket, 'console', 'User '+targets[2]+' not found.');
- return false;
- }
- if (!user.can('redirect', targetUser)) {
- emit(socket, 'console', '/redirect - Access denied.');
- return false;
- }
- logModCommand(room,''+targetUser.name+' was kicked to the Rules page by '+user.name+'' + (targets[1] ? " (" + targets[1] + ")" : ""));
- targetUser.emit('console', {evalRulesRedirect: 1});
- return false;
- break;
- case 'unban':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- if (!user.can('ban')) {
- emit(socket, 'console', '/unban - Access denied.');
- return false;
- }
- var targetid = toUserid(target);
- var success = false;
- for (var ip in bannedIps) {
- if (bannedIps[ip] === targetid) {
- delete bannedIps[ip];
- success = true;
- }
- }
- if (success) {
- logModCommand(room,''+target+' was unbanned by '+user.name+'.');
- } else {
- emit(socket, 'console', 'User '+target+' is not banned.');
- }
- return false;
- break;
- case 'unbanall':
- if (!user.can('ban')) {
- emit(socket, 'console', '/unbanall - Access denied.');
- return false;
- }
- logModCommand(room,'All bans and ip mutes have been lifted by '+user.name+'.');
- bannedIps = {};
- mutedIps = {};
- return false;
- break;
- case 'reply':
- case 'r':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- if (!user.lastPM) {
- emit(socket, 'console', 'No one has PMed you yet.');
- return false;
- }
- return parseCommand(user, 'msg', ''+(user.lastPM||'')+', '+target, room, socket);
- break;
- case 'msg':
- case 'pm':
- case 'whisper':
- case 'w':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targets = splitTarget(target);
- var targetUser = targets[0];
- if (!targets[1]) {
- emit(socket, 'console', 'You forgot the comma.');
- return parseCommand(user, '?', cmd, room, socket);
- }
- if (!targets[0] || !targetUser.connected) {
- if (target.indexOf(' ')) {
- emit(socket, 'console', 'User '+targets[2]+' not found. Did you forget a comma?');
- } else {
- emit(socket, 'console', 'User '+targets[2]+' not found. Did you misspell their name?');
- }
- return parseCommand(user, '?', cmd, room, socket);
- }
- // temporarily disable this because blarajan
- /* if (user.muted && !targetUser.can('mute', user)) {
- emit(socket, 'console', 'You can only private message members of the Moderation Team (users marked by %, @, &, or ~) when muted.');
- return false;
- } */
- if (!user.named) {
- emit(socket, 'console', 'You must choose a name before you can send private messages.');
- return false;
- }
- var message = {
- name: user.getIdentity(),
- pm: targetUser.getIdentity(),
- message: targets[1]
- };
- user.emit('console', message);
- targets[0].emit('console', message);
- targets[0].lastPM = user.userid;
- user.lastPM = targets[0].userid;
- return false;
- break;
- case 'ip':
- case 'getip':
- if (!target) {
- emit(socket, 'console', 'Your IP is: '+user.ip);
- return false;
- }
- var targetUser = Users.get(target);
- if (!targetUser) {
- emit(socket, 'console', 'User '+target+' not found.');
- return false;
- }
- if (!user.can('ip', targetUser)) {
- emit(socket, 'console', '/ip - Access denied.');
- return false;
- }
- emit(socket, 'console', 'User '+targetUser.name+' has IP: '+targetUser.ip);
- return false;
- break;
- case 'mute':
- case 'm':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targets = splitTarget(target);
- var targetUser = targets[0];
- if (!targetUser) {
- emit(socket, 'console', 'User '+targets[2]+' not found.');
- return false;
- }
- if (!user.can('mute', targetUser)) {
- emit(socket, 'console', '/mute - Access denied.');
- return false;
- }
- logModCommand(room,''+targetUser.name+' was muted by '+user.name+'.' + (targets[1] ? " (" + targets[1] + ")" : ""));
- targetUser.emit('message', user.name+' has muted you. '+targets[1]);
- var alts = targetUser.getAlts();
- if (alts.length) logModCommand(room,""+targetUser.name+"'s alts were also muted: "+alts.join(", "));
- targetUser.muted = true;
- rooms.lobby.sendIdentity(targetUser);
- for (var i=0; i<alts.length; i++) {
- var targetAlt = Users.get(alts[i]);
- if (targetAlt) {
- targetAlt.muted = true;
- rooms.lobby.sendIdentity(targetAlt);
- }
- }
- return false;
- break;
- case 'ipmute':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targetUser = Users.get(target);
- if (!targetUser) {
- emit(socket, 'console', 'User '+target+' not found.');
- return false;
- }
- if (!user.can('mute', targetUser)) {
- emit(socket, 'console', '/ipmute - Access denied.');
- return false;
- }
- logModCommand(room,''+targetUser.name+"'s IP was muted by "+user.name+'.');
- var alts = targetUser.getAlts();
- if (alts.length) logModCommand(room,""+targetUser.name+"'s alts were also muted: "+alts.join(", "));
- targetUser.muted = true;
- rooms.lobby.sendIdentity(targetUser);
- mutedIps[targetUser.ip] = targetUser.userid;
- for (var i=0; i<alts.length; i++) {
- var targetAlt = Users.get(alts[i]);
- if (targetAlt) {
- targetAlt.muted = true;
- rooms.lobby.sendIdentity(targetAlt);
- }
- }
- return false;
- break;
- case 'unmute':
- case 'um':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targetid = toUserid(target);
- var targetUser = Users.get(target);
- if (!targetUser) {
- emit(socket, 'console', 'User '+target+' not found.');
- return false;
- }
- if (!user.can('mute', targetUser)) {
- emit(socket, 'console', '/unmute - Access denied.');
- return false;
- }
- var success = false;
- for (var ip in mutedIps) {
- if (mutedIps[ip] === targetid) {
- delete mutedIps[ip];
- success = true;
- }
- }
- if (success) {
- logModCommand(room,''+(targetUser?targetUser.name:target)+"'s IP was unmuted by "+user.name+'.');
- }
- targetUser.muted = false;
- rooms.lobby.sendIdentity(targetUser);
- logModCommand(room,''+targetUser.name+' was unmuted by '+user.name+'.');
- return false;
- break;
- case 'promote':
- case 'demote':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targets = splitTarget(target, true);
- var targetUser = targets[0];
- var userid = toUserid(targets[2]);
- var currentGroup = ' ';
- if (targetUser) {
- currentGroup = targetUser.group;
- } else if (Users.usergroups[userid]) {
- currentGroup = Users.usergroups[userid].substr(0,1);
- }
- var name = targetUser ? targetUser.name : targets[2];
- var nextGroup = targets[1] ? targets[1] : Users.getNextGroupSymbol(currentGroup, cmd === 'demote');
- if (targets[1] === 'deauth') nextGroup = config.groupsranking[0];
- if (!config.groups[nextGroup]) {
- emit(socket, 'console', 'Group \'' + nextGroup + '\' does not exist.');
- return false;
- }
- if (!user.checkPromotePermission(currentGroup, nextGroup)) {
- emit(socket, 'console', '/promote - Access denied.');
- return false;
- }
- var isDemotion = (config.groups[nextGroup].rank < config.groups[currentGroup].rank);
- if (!Users.setOfflineGroup(name, nextGroup)) {
- emit(socket, 'console', '/promote - WARNING: This user is offline and could be unregistered. Use /forcepromote if you\'re sure you want to risk it.');
- return false;
- }
- var groupName = (config.groups[nextGroup].name || nextGroup || '').trim() || 'a regular user';
- var entry = ''+name+' was '+(isDemotion?'demoted':'promoted')+' to ' + groupName + ' by '+user.name+'.';
- logModCommand(room, entry, isDemotion);
- if (isDemotion) {
- rooms.lobby.logEntry(entry);
- emit(socket, 'console', 'You demoted ' + name + ' to ' + groupName + '.');
- if (targetUser) {
- targetUser.emit('console', 'You were demoted to ' + groupName + ' by ' + user.name + '.');
- }
- }
- rooms.lobby.sendIdentity(targetUser);
- return false;
- break;
- case 'forcepromote':
- // warning: never document this command in /help
- if (!user.can('forcepromote')) {
- emit(socket, 'console', '/forcepromote - Access denied.');
- return false;
- }
- var targets = splitTarget(target, true);
- var name = targets[2];
- var nextGroup = targets[1] ? targets[1] : Users.getNextGroupSymbol(' ', false);
- if (!Users.setOfflineGroup(name, nextGroup, true)) {
- emit(socket, 'console', '/forcepromote - Don\'t forcepromote unless you have to.');
- return false;
- }
- var groupName = config.groups[nextGroup].name || nextGroup || '';
- logModCommand(room,''+name+' was promoted to ' + (groupName.trim()) + ' by '+user.name+'.');
- return false;
- break;
- case 'deauth':
- return parseCommand(user, 'demote', target+', deauth', room, socket);
- break;
- case 'modchat':
- if (!target) {
- emit(socket, 'console', 'Moderated chat is currently set to: '+config.modchat);
- return false;
- }
- if (!user.can('modchat')) {
- emit(socket, 'console', '/modchat - Access denied.');
- return false;
- }
- target = target.toLowerCase();
- switch (target) {
- case 'on':
- case 'true':
- case 'yes':
- config.modchat = true;
- break;
- case 'off':
- case 'false':
- case 'no':
- config.modchat = false;
- break;
- default:
- if (!config.groups[target]) {
- emit(socket, 'console', 'That moderated chat setting is unrecognized.');
- return false;
- }
- if (config.groupsranking.indexOf(target) > 1 && !user.can('modchatall')) {
- emit(socket, 'console', '/modchat - Access denied for setting higher than ' + config.groupsranking[1] + '.');
- return false;
- }
- config.modchat = target;
- break;
- }
- if (config.modchat === true) {
- room.addRaw('<div class="broadcast-red"><b>Moderated chat was enabled!</b><br />Only registered users can talk.</div>');
- } else if (!config.modchat) {
- room.addRaw('<div class="broadcast-blue"><b>Moderated chat was disabled!</b><br />Anyone may talk now.</div>');
- } else {
- var modchat = sanitize(config.modchat);
- room.addRaw('<div class="broadcast-red"><b>Moderated chat was set to '+modchat+'!</b><br />Only users of rank '+modchat+' and higher can talk.</div>');
- }
- logModCommand(room,user.name+' set modchat to '+config.modchat,true);
- return false;
- break;
- case 'declare':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- if (!user.can('declare')) {
- emit(socket, 'console', '/declare - Access denied.');
- return false;
- }
- room.addRaw('<div class="broadcast-blue"><b>'+target+'</b></div>');
- logModCommand(room,user.name+' declared '+target,true);
- return false;
- break;
- case 'announce':
- case 'wall':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- if (!user.can('announce')) {
- emit(socket, 'console', '/announce - Access denied.');
- return false;
- }
- return '/announce '+target;
- break;
- case 'hotpatch':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- if (!user.can('hotpatch')) {
- emit(socket, 'console', '/hotpatch - Access denied.');
- return false;
- }
- if (target === 'all') {
- for (var i in require.cache) delete require.cache[i];
- Tools = require('./tools.js');
- parseCommand = require('./chat-commands.js').parseCommand;
- sim = require('./battles.js');
- BattlePokemon = sim.BattlePokemon;
- BattleSide = sim.BattleSide;
- Battle = sim.Battle;
- emit(socket, 'console', 'The game engine has been hot-patched.');
- return false;
- } else if (target === 'data') {
- for (var i in require.cache) delete require.cache[i];
- Tools = require('./tools.js');
- emit(socket, 'console', 'Game resources have been hot-patched.');
- return false;
- } else if (target === 'chat') {
- for (var i in require.cache) delete require.cache[i];
- parseCommand = require('./chat-commands.js').parseCommand;
- emit(socket, 'console', 'Chat commands have been hot-patched.');
- return false;
- }
- emit(socket, 'console', 'Your hot-patch command was unrecognized.');
- return false;
- break;
- case 'savelearnsets':
- if (user.can('hotpatch')) {
- emit(socket, 'console', '/savelearnsets - Access denied.');
- return false;
- }
- fs.writeFile('data/learnsets.js', 'exports.BattleLearnsets = '+JSON.stringify(BattleLearnsets)+";\n");
- emit(socket, 'console', 'learnsets.js saved.');
- return false;
- break;
- case 'rating':
- case 'ranking':
- case 'rank':
- case 'ladder':
- emit(socket, 'console', 'You are using an old version of Pokemon Showdown. Please reload the page.');
- return false;
- break;
- case 'nick':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- user.rename(target);
- return false;
- break;
- case 'disableladder':
- if (!user.can('disableladder')) {
- emit(socket, 'console', '/disableladder - Access denied.');
- return false;
- }
- if (LoginServer.disabled) {
- emit(socket, 'console', '/disableladder - Ladder is already disabled.');
- return false;
- }
- LoginServer.disabled = true;
- logModCommand(room, 'The ladder was disabled by ' + user.name + '.', true);
- room.addRaw('<div class="broadcast-red"><b>Due to high server load, the ladder has been temporarily disabled</b><br />Rated games will no longer update the ladder. It will be back momentarily.</div>');
- return false;
- break;
- case 'enableladder':
- if (!user.can('disableladder')) {
- emit(socket, 'console', '/enable - Access denied.');
- return false;
- }
- if (!LoginServer.disabled) {
- emit(socket, 'console', '/enable - Ladder is already enabled.');
- return false;
- }
- LoginServer.disabled = false;
- logModCommand(room, 'The ladder was enabled by ' + user.name + '.', true);
- room.addRaw('<div class="broadcast-green"><b>The ladder is now back.</b><br />Rated games will update the ladder now.</div>');
- return false;
- break;
- case 'savereplay':
- if (!room || !room.battle) return false;
- var data = room.log.join("\n");
- var datahash = crypto.createHash('md5').update(data.replace(/[^(\x20-\x7F)]+/g,'')).digest('hex');
- LoginServer.request('prepreplay', {
- id: room.id.substr(7),
- loghash: datahash,
- p1: room.p1.name,
- p2: room.p2.name,
- format: room.format
- }, function(success) {
- emit(socket, 'command', {
- command: 'savereplay',
- log: data,
- room: 'lobby',
- id: room.id.substr(7)
- });
- });
- return false;
- break;
- case 'trn':
- var commaIndex = target.indexOf(',');
- var targetName = target;
- var targetAuth = false;
- var targetToken = '';
- if (commaIndex >= 0) {
- targetName = target.substr(0,commaIndex);
- target = target.substr(commaIndex+1);
- commaIndex = target.indexOf(',');
- targetAuth = target;
- if (commaIndex >= 0) {
- targetAuth = !!parseInt(target.substr(0,commaIndex),10);
- targetToken = target.substr(commaIndex+1);
- }
- }
- user.rename(targetName, targetToken, targetAuth, socket);
- return false;
- break;
- case 'forcerename':
- case 'fr':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targets = splitTarget(target);
- var targetUser = targets[0];
- if (!targetUser) {
- emit(socket, 'console', 'User '+targets[2]+' not found.');
- return false;
- }
- if (!user.can('forcerename', targetUser)) {
- emit(socket, 'console', '/forcerename - Access denied.');
- return false;
- }
- if (targetUser.userid === toUserid(targets[2])) {
- var entry = ''+targetUser.name+' was forced to choose a new name by '+user.name+'.' + (targets[1] ? " (" + targets[1] + ")" : "");
- logModCommand(room, entry, true);
- rooms.lobby.sendAuth(entry);
- if (room.id !== 'lobby') {
- room.add(entry);
- } else {
- room.logEntry(entry);
- }
- targetUser.resetName();
- targetUser.emit('nameTaken', {reason: user.name+" has forced you to change your name. "+targets[1]});
- } else {
- emit(socket, 'console', "User "+targetUser.name+" is no longer using that name.");
- }
- return false;
- break;
- case 'forcerenameto':
- case 'frt':
- if (!target) return parseCommand(user, '?', cmd, room, socket);
- var targets = splitTarget(target);
- var targetUser = targets[0];
- if (!targetUser) {
- emit(socket, 'console', 'User '+targets[2]+' not found.');
- return false;
- }
- if (!targets[1]) {
- emit(socket, 'console', 'No new name was specified.');
- return false;
- }
- if (!user.can('forcerenameto', targetUser)) {
- emit(socket, 'console', '/forcerenameto - Access denied.');
- return false;
- }
- if (targetUser.userid === toUserid(targets[2])) {
- var entry = ''+targetUser.name+' was forcibly renamed to '+targets[1]+' by '+user.name+'.';
- logModCommand(room, entry, true);
- rooms.lobby.sendAuth(entry);
- if (room.id !== 'lobby') {
- room.add(entry);
- } else {
- room.logEntry(entry);
- }
- targetUser.forceRename(targets[1]);
- } else {
- emit(socket, 'console', "User "+targetUser.name+" is no longer using that name.");
- }
- return false;
- break;
- // INFORMATIONAL COMMANDS
- case 'data':
- case '!data':
- case 'stats':
- case '!stats':
- case 'dex':
- case '!dex':
- case 'pokedex':
- case '!pokedex':
- showOrBroadcastStart(user, cmd, room, socket, message);
- var dataMessages = getDataMessage(target);
- for (var i=0; i<dataMessages.length; i++) {
- if (cmd.substr(0,1) !== '!') {
- sendData(socket, '>'+room.id+'\n'+dataMessages[i]);
- } else if (user.can('broadcast') && canTalk(user, room)) {
- room.add(dataMessages[i]);
- }
- }
- return false;
- break;
- case 'learnset':
- case '!learnset':
- case 'learn':
- case '!learn':
- case 'learnall':
- case '!learnall':
- case 'learn5':
- case '!learn5':
- var lsetData = {set:{}};
- var targets = target.split(',');
- if (!targets[1]) return parseCommand(user, 'help', 'learn', room, socket);
- var template = Tools.getTemplate(targets[0]);
- var move = {};
- var problem;
- var all = (cmd.substr(cmd.length-3) === 'all');
- if (cmd === 'learn5' || cmd === '!learn5') lsetData.set.level = 5;
- showOrBroadcastStart(user, cmd, room, socket, message);
- if (!template.exists) {
- showOrBroadcast(user, cmd, room, socket,
- 'Pokemon "'+template.id+'" not found.');
- return false;
- }
- for (var i=1, len=targets.length; i<len; i++) {
- move = Tools.getMove(targets[i]);
- if (!move.exists) {
- showOrBroadcast(user, cmd, room, socket,
- 'Move "'+move.id+'" not found.');
- return false;
- }
- problem = Tools.checkLearnset(move, template, lsetData);
- if (problem) break;
- }
- var buffer = ''+template.name+(problem?" <span class=\"message-learn-cannotlearn\">can't</span> learn ":" <span class=\"message-learn-canlearn\">can</span> learn ")+(targets.length>2?"these moves":move.name);
- if (!problem) {
- var sourceNames = {E:"egg",S:"event",D:"dream world"};
- if (lsetData.sources || lsetData.sourcesBefore) buffer += " only when obtained from:<ul class=\"message-learn-list\">";
- if (lsetData.sources) {
- var sources = lsetData.sources.sort();
- var prevSource;
- var prevSourceType;
- for (var i=0, len=sources.length; i<len; i++) {
- var source = sources[i];
- if (source.substr(0,2) === prevSourceType) {
- if (prevSourceCount < 0) buffer += ": "+source.substr(2);
- else if (all || prevSourceCount < 3) buffer += ', '+source.substr(2);
- else if (prevSourceCount == 3) buffer += ', ...';
- prevSourceCount++;
- continue;
- }
- prevSourceType = source.substr(0,2);
- prevSourceCount = source.substr(2)?0:-1;
- buffer += "<li>gen "+source.substr(0,1)+" "+sourceNames[source.substr(1,1)];
- if (prevSourceType === '5E' && template.maleOnlyDreamWorld) buffer += " (cannot have DW ability)";
- if (source.substr(2)) buffer += ": "+source.substr(2);
- }
- }
- if (lsetData.sourcesBefore) buffer += "<li>any generation before "+(lsetData.sourcesBefore+1);
- buffer += "</ul>";
- }
- showOrBroadcast(user, cmd, room, socket,
- buffer);
- return false;
- break;
- case 'uptime':
- case '!uptime':
- var uptime = process.uptime();
- var uptimeText;
- if (uptime > 24*60*60) {
- var uptimeDays = Math.floor(uptime/(24*60*60));
- uptimeText = ''+uptimeDays+' '+(uptimeDays == 1 ? 'day' : 'days');
- var uptimeHours = Math.floor(uptime/(60*60)) - uptimeDays*24;
- if (uptimeHours) uptimeText += ', '+uptimeHours+' '+(uptimeHours == 1 ? 'hour' : 'hours');
- } else {
- uptimeText = uptime.seconds().duration();
- }
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">' +
- 'Uptime: <b>'+uptimeText+'</b>'+
- '</div>');
- return false;
- break;
- case 'groups':
- case '!groups':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">' +
- '+ <b>Voice</b> - They can use ! commands like !groups, and talk during moderated chat<br />' +
- '% <b>Driver</b> - The above, and they can also mute users and run tournaments<br />' +
- '@ <b>Moderator</b> - The above, and they can ban users and check for alts<br />' +
- '& <b>Leader</b> - The above, and they can promote moderators and force ties<br />'+
- '~ <b>Administrator</b> - They can do anything, like change what this message says'+
- '</div>');
- return false;
- break;
- case 'opensource':
- case '!opensource':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">Pokemon Showdown is open source:<br />- Language: JavaScript<br />- <a href="https://github.com/Zarel/Pokemon-Showdown/commits/master" target="_blank">What\'s new?</a><br />- <a href="https://github.com/Zarel/Pokemon-Showdown" target="_blank">Server source code</a><br />- <a href="https://github.com/Zarel/Pokemon-Showdown-Client" target="_blank">Client source code</a></div>');
- return false;
- break;
- case 'avatars':
- case '!avatars':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">Want a custom avatar?<br />- <a href="/sprites/trainers/" target="_blank">How to change your avatar</a></div>');
- return false;
- break;
- case 'intro':
- case 'introduction':
- case '!intro':
- case '!introduction':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">New to competitive pokemon?<br />' +
- '- <a href="http://www.smogon.com/dp/articles/intro_comp_pokemon" target="_blank">An introduction to competitive pokemon</a><br />' +
- '- <a href="http://www.smogon.com/bw/articles/bw_tiers" target="_blank">What do "OU", "UU", etc mean?</a><br />' +
- '- <a href="http://www.smogon.com/bw/banlist/" target="_blank">What are the rules for each format? What is "Sleep Clause"?</a>' +
- '</div>');
- return false;
- break;
-
- case 'calc':
- case '!calc':
- case 'calculator':
- case '!calculator':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd , room , socket,
- '<div class="infobox">Pokemon Showdown! damage calculator. (Courtesy of Honko)<br />' +
- '- <a href="http://pokemonshowdown.com/damagecalc/" target="_blank">Damage Calculator</a><br />' +
- '</div>');
- return false;
- break;
-
- case 'cap':
- case '!cap':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">An introduction to the Create-A-Pokemon project:<br />' +
- '- <a href="http://www.smogon.com/cap/" target="_blank">CAP project website and description</a><br />' +
- '- <a href="http://www.smogon.com/forums/showthread.php?t=48782" target="_blank">What Pokemon have been made?</a><br />' +
- '- <a href="http://www.smogon.com/forums/showthread.php?t=3464513" target="_blank">Talk about the metagame here</a><br />' +
- '- <a href="http://www.smogon.com/forums/showthread.php?t=3466826" target="_blank">Practice BW CAP teams</a>' +
- '</div>');
- return false;
- break;
- case 'om':
- case 'othermetas':
- case '!om':
- case '!othermetas':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">Information on the Other Metagames:<br />' +
- '- <a href="http://www.smogon.com/forums/showthread.php?t=3463764" target="_blank">Balanced Hackmons</a><br />' +
- '- <a href="http://www.smogon.com/forums/showthread.php?t=3471810" target="_blank">Dream World OU</a><br />' +
- '- <a href="http://www.smogon.com/forums/showthread.php?t=3467120" target="_blank">Glitchmons</a><br />' +
- '- <a href="http://www.smogon.com/sim/seasonal" target="_blank">Seasonal: Spring Forward</a><br />' +
- '- <a href="http://www.smogon.com/forums/showthread.php?t=3476469" target="_blank">Smogon Doubles</a><br />' +
- '- <a href="http://www.smogon.com/forums/showthread.php?t=3471161" target="_blank">VGC 2013</a>' +
- '</div>');
- return false;
- break;
- case 'rules':
- case 'rule':
- case '!rules':
- case '!rule':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">Please follow the rules:<br />' +
- '- <a href="http://pokemonshowdown.com/rules" target="_blank">Rules</a><br />' +
- '</div>');
- return false;
- break;
-
- case 'faq':
- case '!faq':
- target = target.toLowerCase();
- var buffer = '<div class="infobox">';
- var matched = false;
- if (!target || target === 'all') {
- matched = true;
- buffer += '<a href="http://www.smogon.com/sim/faq" target="_blank">Frequently Asked Questions</a><br />';
- }
- if (target === 'all' || target === 'deviation') {
- matched = true;
- buffer += '<a href="http://www.smogon.com/sim/faq#deviation" target="_blank">Why did this user gain or lose so many points?</a><br />';
- }
- if (target === 'all' || target === 'doubles' || target === 'triples' || target === 'rotation') {
- matched = true;
- buffer += '<a href="http://www.smogon.com/sim/faq#doubles" target="_blank">Can I play doubles/triples/rotation battles here?</a><br />';
- }
- if (target === 'all' || target === 'randomcap') {
- matched = true;
- buffer += '<a href="http://www.smogon.com/sim/faq#randomcap" target="_blank">What is this fakemon and what is it doing in my random battle?</a><br />';
- }
- if (target === 'all' || target === 'restarts') {
- matched = true;
- buffer += '<a href="http://www.smogon.com/sim/faq#restarts" target="_blank">Why is the server restarting?</a><br />';
- }
- if (target === 'all' || target === 'staff') {
- matched = true;
- buffer += '<a href="http://www.smogon.com/sim/staff_faq" target="_blank">Staff FAQ</a><br />';
- }
- if (!matched) {
- emit(socket, 'console', 'The FAQ entry "'+target+'" was not found. Try /faq for general help.');
- return false;
- }
- buffer += '</div>';
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket, buffer);
- return false;
- break;
- case 'banlists':
- case 'tiers':
- case '!banlists':
- case '!tiers':
- showOrBroadcastStart(user, cmd, room, socket, message);
- showOrBroadcast(user, cmd, room, socket,
- '<div class="infobox">Smogon tiers:<br />' +
- '- <a href="http://www.smogon.com/bw/banlist/" target="_blank">The banlists for each tier</a><br />' +
- '- <a href="http://www.smogon.com/bw/tiers/uber" target="_blank">Uber Pokemon</a><br />' +
- '- <a href="http://www.smogon.com/bw/tiers/ou" target="_blank">Overused Pokemon</a><br />' +
- '- <a href="http://www.smogon.com/bw/tiers/uu" target="_blank">Underused Pokemon</a><br />' +
- '- <a href="http://www.smogon.com/bw/tiers/ru" target="_blank">Rarelyused Pokemon</a><br />' +
- '- <a href="http://www.smogon.com/bw/tiers/nu" target="_blank">Neverused Pokemon</a><br />' +
- '- <a href="http://www.smogon.com/bw/tiers/lc" target="_blank">Little Cup Pokemon</a><br />' +
- '</div>');
- return false;
- break;
- case 'analysis':
- case '!analysis':
- case 'strategy':
- case '!strategy':
- case 'smogdex':
- case '!smogdex':
- var targets = target.split(',');
- var pokemon = Tools.getTemplate(targets[0]);
- var item = Tools.getItem(targets[0]);
- var move = Tools.getMove(targets[0]);
- var ability = Tools.getAbility(targets[0]);
- var atLeastOne = false;
- var generation = (targets[1] || "bw").trim().toLowerCase();
- var genNumber = 5;
- showOrBroadcastStart(user, cmd, room, socket, message);
- if (generation === "bw" || generation === "bw2" || generation === "5" || generation === "five") {
- generation = "bw";
- } else if (generation === "dp" || generation === "dpp" || generation === "4" || generation === "four") {
- generation = "dp";
- genNumber = 4;
- } else if (generation === "adv" || generation === "rse" || generation === "rs" || generation === "3" || generation === "three") {
- generation = "rs";
- genNumber = 3;
- } else if (generation === "gsc" || generation === "gs" || generation === "2" || generation === "two") {
- generation = "gs";
- genNumber = 2;
- } else if(generation === "rby" || generation === "rb" || generation === "1" || generation === "one") {
- generation = "rb";
- genNumber = 1;
- } else {
- generation = "bw";
- }
-
- // Pokemon
- if (pokemon.exists) {
- atLeastOne = true;
- if (genNumber < pokemon.gen) {
- showOrBroadcast(user, cmd, room, socket, pokemon.name+' did not exist in '+generation.toUpperCase()+'!');
- return false;
- }
- if (pokemon.tier === 'G4CAP' || pokemon.tier === 'G5CAP') {
- generation = "cap";
- }
-
- var poke = pokemon.name.toLowerCase();
- if (poke === 'nidoranm') poke = 'nidoran-m';
- if (poke === 'nidoranf') poke = 'nidoran-f';
- if (poke === 'farfetch\'d') poke = 'farfetchd';
- if (poke === 'mr. mime') poke = 'mr_mime';
- if (poke === 'mime jr.') poke = 'mime_jr';
- if (poke === 'deoxys-attack' || poke === 'deoxys-defense' || poke === 'deoxys-speed' || poke === 'kyurem-black' || poke === 'kyurem-white') poke = poke.substr(0,8);
- if (poke === 'wormadam-trash') poke = 'wormadam-s';
- if (poke === 'wormadam-sandy') poke = 'wormadam-g';
- if (poke === 'rotom-wash' || poke === 'rotom-frost' || poke === 'rotom-heat') poke = poke.substr(0,7);
- if (poke === 'rotom-mow') poke = 'rotom-c';
- if (poke === 'rotom-fan') poke = 'rotom-s';
- if (poke === 'giratina-origin' || poke === 'tornadus-therian' || poke === 'landorus-therian') poke = poke.substr(0,10);
- if (poke === 'shaymin-sky') poke = 'shaymin-s';
- if (poke === 'arceus') poke = 'arceus-normal';
- if (poke === 'thundurus-therian') poke = 'thundurus-t';
-
- showOrBroadcast(user, cmd, room, socket,
- '<a href="http://www.smogon.com/'+generation+'/pokemon/'+poke+'" target="_blank">'+generation.toUpperCase()+' '+pokemon.name+' analysis</a>, brought to you by <a href="http://www.smogon.com" target="_blank">Smogon University</a>');
- }
-
- // Item
- if (item.exists && genNumber > 1) {
- atLeastOne = true;
- var itemName = item.name.toLowerCase().replace(' ', '_');
- showOrBroadcast(user, cmd, room, socket,
- '<a href="http://www.smogon.com/'+generation+'/items/'+itemName+'" target="_blank">'+generation.toUpperCase()+' '+item.name+' item analysis</a>, brought to you by <a href="http://www.smogon.com" target="_blank">Smogon University</a>');
- }
-
- // Ability
- if (ability.exists && genNumber > 2) {
- atLeastOne = true;
- var abilityName = ability.name.toLowerCase().replace(' ', '_');
- showOrBroadcast(user, cmd, room, socket,
- '<a href="http://www.smogon.com/'+generation+'/abilities/'+abilityName+'" target="_blank">'+generation.toUpperCase()+' '+ability.name+' ability analysis</a>, brought to you by <a href="http://www.smogon.com" target="_blank">Smogon University</a>');
- }
-
- // Move
- if (move.exists) {
- atLeastOne = true;
- var moveName = move.name.toLowerCase().replace(' ', '_');
- showOrBroadcast(user, cmd, room, socket,
- '<a href="http://www.smogon.com/'+generation+'/moves/'+moveName+'" target="_blank">'+generation.toUpperCase()+' '+move.name+' move analysis</a>, brought to you by <a href="http://www.smogon.com" target="_blank">Smogon University</a>');
- }
-
- if (!atLeastOne) {
- showOrBroadcast(user, cmd, room, socket, 'Pokemon, item, move, or ability not found for generation ' + generation.toUpperCase() + '.');
- return false;
- }
-
- return false;
- break;
- case 'join':
- var targetRoom = Rooms.get(target);
- if (!targetRoom) {
- emit(socket, 'console', "The room '"+target+"' does not exist.");
- return false;
- }
- if (!user.joinRoom(targetRoom, socket)) {
- emit(socket, 'console', "The room '"+target+"' could not be joined (most likely, you're already in it).");
- return false;
- }
- return false;
- break;
- case 'leave':
- case 'part':
- if (room.id === 'lobby') return false;
- user.leaveRoom(room, socket);
- return false;
- break;
- // Battle commands
- case 'reset':
- case 'restart':
- emit(socket, 'console', 'This functionality is no longer available.');
- return false;
- break;
- case 'move':
- case 'attack':
- case 'mv':
- if (!room.decision) { emit(socket, 'console', 'You can only do this in battle rooms.'); return false; }
- room.decision(user, 'choose', 'move '+target);
- return false;
- break;
- case 'switch':
- case 'sw':
- if (!room.decision) { emit(socket, 'console', 'You can only do this in battle rooms.'); return false; }
- room.decision(user, 'choose', 'switch '+parseInt(target,10));
- return false;
- break;
- case 'choose':
- if (!room.decision) { emit(socket, 'console', 'You can only do this in battle rooms.'); return false; }
- room.decision(user, 'choose', target);
- return false;
- break;
- case 'undo':
- if (!room.decision) { emit(socket, 'console', 'You can only do this in battle rooms.'); return false; }
- room.decision(user, 'undo', target);
- return false;
- break;
- case 'team':
- if (!room.decision) { emit(socket, 'console', 'You can only do this in battle rooms.'); return false; }
- room.decision(user, 'choose', 'team '+target);
- return false;
- break;
- case 'search':
- case 'cancelsearch':
- if (!room.searchBattle) { emit(socket, 'console', 'You can only do this in lobby rooms.'); return false; }
- if (target) {
- room.searchBattle(user, target);
- } else {
- room.cancelSearch(user);
- }
- return false;
- break;
- case 'challenge':
- case 'chall':
- var targets = splitTarget(target);
- var targetUser = targets[0];
- target = targets[1];
- if (!targetUser || !targetUser.connected) {
- emit(socket, 'message', "The user '"+targets[2]+"' was not found.");
- return false;
- }
- if (targetUser.blockChallenges && !user.can('bypassblocks', targetUser)) {
- emit(socket, 'message', "The user '"+targets[2]+"' is not accepting challenges right now.");
- return false;
- }
- if (typeof target !== 'string') target = 'customgame';
- var problems = Tools.validateTeam(user.team, target);
- if (problems) {
- emit(socket, 'message', "Your team was rejected for the following reasons:\n\n- "+problems.join("\n- "));
- return false;
- }
- user.makeChallenge(targetUser, target);
- return false;
- break;
-
- case 'away':
- case 'idle':
- case 'blockchallenges':
- user.blockChallenges = true;
- emit(socket, 'console', 'You are now blocking all incoming challenge requests.');
- return false;
- break;
- case 'back':
- case 'allowchallenges':
- user.blockChallenges = false;
- emit(socket, 'console', 'You are available for challenges from now on.');
- return false;
- break;
- case 'cancelchallenge':
- case 'cchall':
- user.cancelChallengeTo(target);
- return false;
- break;
- case 'accept':
- var userid = toUserid(target);
- var format = 'debugmode';
- if (user.challengesFrom[userid]) format = user.challengesFrom[userid].format;
- var problems = Tools.validateTeam(user.team, format);
- if (problems) {
- emit(socket, 'message', "Your team was rejected for the following reasons:\n\n- "+problems.join("\n- "));
- return false;
- }
- user.acceptChallengeFrom(userid);
- return false;
- break;
- case 'reject':
- user.rejectChallengeFrom(toUserid(target));
- return false;
- break;
- case 'saveteam':
- case 'utm':
- try {
- user.team = JSON.parse(target);
- user.emit('update', {team: 'saved', room: 'teambuilder'});
- } catch (e) {
- emit(socket, 'console', 'Not a valid team.');
- }
- return false;
- break;
- case 'joinbattle':
- case 'partbattle':
- if (!room.joinBattle) { emit(socket, 'console', 'You can only do this in battle rooms.'); return false; }
- room.joinBattle(user);
- return false;
- break;
- case 'leavebattle':
- if (!room.leaveBattle) { emit(socket, 'console', 'You can only do this in battle rooms.'); return false; }
- room.leaveBattle(user);
- return false;
- break;
- case 'kickinactive':
- if (room.requestKickInactive) {
- room.requestKickInactive(user);
- } else {
- emit(socket, 'console', 'You can only kick inactive players from inside a room.');
- }
- return false;
- break;
- case 'timer':
- target = toId(target);
- if (room.requestKickInactive) {
- if (target === 'off' || target === 'stop') {
- room.stopKickInactive(user, user.can('timer'));
- } else if (target === 'on' || !target) {
- room.requestKickInactive(user, user.can('timer'));
- } else {
- emit(socket, 'console', "'"+target+"' is not a recognized timer state.");
- }
- } else {
- emit(socket, 'console', 'You can only set the timer from inside a room.');
- }
- return false;
- break;
- break;
- case 'lobbychat':
- target = toId(target);
- if (target === 'off') {
- user.blockLobbyChat = true;
- emit(socket, 'console', 'You are now blocking lobby chat.');
- } else {
- user.blockLobbyChat = false;
- emit(socket, 'console', 'You are now receiving lobby chat.');
- }
- return false;
- break;
- break;
- case 'a':
- if (user.can('battlemessage')) {
- // secret sysop command
- room.battle.add(target);
- return false;
- }
- break;
- // Admin commands
- case 'forcewin':
- case 'forcetie':
- if (!user.can('forcewin') || !room.battle) {
- emit(socket, 'console', '/forcewin - Access denied.');
- return false;
- }
- room.battle.endType = 'forced';
- if (!target) {
- room.battle.tie();
- logModCommand(room,user.name+' forced a tie.',true);
- return false;
- }
- target = Users.get(target);
- if (target) target = target.userid;
- else target = '';
- if (target) {
- room.battle.win(target);
- logModCommand(room,user.name+' forced a win for '+target+'.',true);
- }
- return false;
- break;
- case 'potd':
- if (!user.can('potd')) {
- emit(socket, 'console', '/potd - Access denied.');
- return false;
- }
- config.potd = target;
- Simulator.eval('config.potd = \''+toId(target)+'\'');
- if (target) {
- rooms.lobby.addRaw('<div class="broadcast-blue"><b>The Pokemon of the Day is now '+target+'!</b><br />This Pokemon will be guaranteed to show up in random battles.</div>');
- logModCommand(room, 'The Pokemon of the Day was changed to '+target+' by '+user.name+'.', true);
- } else {
- rooms.lobby.addRaw('<div class="broadcast-blue"><b>The Pokemon of the Day was removed!</b><br />No pokemon will be guaranteed in random battles.</div>');
- logModCommand(room, 'The Pokemon of the Day was removed by '+user.name+'.', true);
- }
- return false;
- break;
- case 'lockdown':
- if (!user.can('lockdown')) {
- emit(socket, 'console', '/lockdown - Access denied.');
- return false;
- }
- lockdown = true;
- for (var id in rooms) {
- rooms[id].addRaw('<div class="broadcast-red"><b>The server is restarting soon.</b><br />Please finish your battles quickly. No new battles can be started until the server resets in a few minutes.</div>');
- if (rooms[id].requestKickInactive) rooms[id].requestKickInactive(user, true);
- }
- rooms.lobby.logEntry(user.name + ' used /lockdown');
- return false;
- break;
- case 'endlockdown':
- if (!user.can('lockdown')) {
- emit(socket, 'console', '/endlockdown - Access denied.');
- return false;
- }
- lockdown = false;
- for (var id in rooms) {
- rooms[id].addRaw('<div class="broadcast-green"><b>The server shutdown was canceled.</b></div>');
- }
- rooms.lobby.logEntry(user.name + ' used /endlockdown');
- return false;
- break;
- case 'kill':
- if (!user.can('lockdown')) {
- emit(socket, 'console', '/lockdown - Access denied.');
- return false;
- }
- if (!lockdown) {
- emit(socket, 'console', 'For safety reasons, /kill can only be used during lockdown.');
- return false;
- }
- if (updateServerLock) {
- emit(socket, 'console', 'Wait for /updateserver to fin…
Large files files are truncated, but you can click here to view the full file