/**
* System commands
* Pokemon Showdown - http://pokemonshowdown.com/
*
* These are system commands - commands required for Pokemon Showdown
* to run. A lot of these are sent by the client.
*
* If you'd like to modify commands, please go to config/commands.js,
* which also teaches you how to use commands.
*
* @license MIT license
*/
var crypto = require('crypto');
var commands = exports.commands = {
version: function(target, room, user) {
if (!this.canBroadcast()) return;
this.sendReplyBox('Server version: '+CommandParser.package.version+' (' + CommandParser.serverVersion.substr(0,10) + ')');
},
me: function(target, room, user, connection) {
// By default, /me allows a blank message
if (target) target = this.canTalk(target);
if (!target) return;
return '/me ' + target;
},
mee: function(target, room, user, connection) {
// By default, /mee allows a blank message
if (target) target = this.canTalk(target);
if (!target) return;
return '/mee ' + target;
},
avatar: function(target, room, user) {
if (!target) return this.parse('/avatars');
var parts = target.split(',');
var avatar = parseInt(parts[0]);
if (!avatar || avatar > 294 || avatar < 1) {
if (!parts[1]) {
this.sendReply("Invalid avatar.");
}
return false;
}
user.avatar = avatar;
if (!parts[1]) {
this.sendReply("Avatar changed to:\n" +
'|raw|
');
}
},
logout: function(target, room, user) {
user.resetName();
},
r: 'reply',
reply: function(target, room, user) {
if (!target) return this.parse('/help reply');
if (!user.lastPM) {
return this.sendReply('No one has PMed you yet.');
}
return this.parse('/msg '+(user.lastPM||'')+', '+target);
},
pm: 'msg',
whisper: 'msg',
w: 'msg',
msg: function(target, room, user) {
if (!target) return this.parse('/help msg');
target = this.splitTarget(target);
var targetUser = this.targetUser;
if (!target) {
this.sendReply('You forgot the comma.');
return this.parse('/help msg');
}
if (!targetUser || !targetUser.connected) {
if (!target) {
this.sendReply('User '+this.targetUsername+' not found. Did you forget a comma?');
} else {
this.sendReply('User '+this.targetUsername+' not found. Did you misspell their name?');
}
return this.parse('/help msg');
}
if (user.locked && !targetUser.can('lock', user)) {
return this.popupReply('You can only private message members of the moderation team (users marked by %, @, &, or ~) when locked.');
}
if (targetUser.locked && !user.can('lock', targetUser)) {
return this.popupReply('This user is locked and cannot PM.');
}
target = this.canTalk(target, null);
if (!target) return false;
var message = '|pm|'+user.getIdentity()+'|'+targetUser.getIdentity()+'|'+target;
user.send(message);
if (targetUser !== user) targetUser.send(message);
targetUser.lastPM = user.userid;
user.lastPM = targetUser.userid;
},
makechatroom: function(target, room, user) {
if (!this.can('makeroom')) return;
var id = toId(target);
if (!id) return this.parse('/help makechatroom');
if (Rooms.rooms[id]) {
return this.sendReply("The room '"+target+"' already exists.");
}
if (Rooms.global.addChatRoom(target)) {
return this.sendReply("The room '"+target+"' was created.");
}
return this.sendReply("An error occurred while trying to create the room '"+target+"'.");
},
deregisterchatroom: function(target, room, user) {
if (!this.can('makeroom')) return;
var id = toId(target);
if (!id) return this.parse('/help deregisterchatroom');
var targetRoom = Rooms.get(id);
if (!targetRoom) return this.sendReply("The room '"+id+"' doesn't exist.");
target = targetRoom.title || targetRoom.id;
if (Rooms.global.deregisterChatRoom(id)) {
this.sendReply("The room '"+target+"' was deregistered.");
this.sendReply("It will be deleted as of the next server restart.");
return;
}
return this.sendReply("The room '"+target+"' isn't registered.");
},
privateroom: function(target, room, user) {
if (!this.can('makeroom')) return;
if (target === 'off') {
delete room.isPrivate;
this.addModCommand(user.name+' made the room public.');
if (room.chatRoomData) {
delete room.chatRoomData.isPrivate;
Rooms.global.writeChatRoomData();
}
} else {
room.isPrivate = true;
this.addModCommand(user.name+' made the room private.');
if (room.chatRoomData) {
room.chatRoomData.isPrivate = true;
Rooms.global.writeChatRoomData();
}
}
},
roomowner: function(target, room, user) {
if (!room.chatRoomData) {
return this.sendReply("/roomowner - This room isn't designed for per-room moderation to be added");
}
var target = this.splitTarget(target, true);
var targetUser = this.targetUser;
if (!targetUser) return this.sendReply("User '"+this.targetUsername+"' is not online.");
if (!this.can('makeroom', targetUser, room)) return false;
if (!room.auth) room.auth = room.chatRoomData.auth = {};
var name = targetUser.name;
room.auth[targetUser.userid] = '#';
this.addModCommand(''+name+' was appointed Room Owner by '+user.name+'.');
room.onUpdateIdentity(targetUser);
Rooms.global.writeChatRoomData();
},
roomdeowner: 'deroomowner',
deroomowner: function(target, room, user) {
if (!room.auth) {
return this.sendReply("/roomdeowner - This room isn't designed for per-room moderation");
}
var target = this.splitTarget(target, true);
var targetUser = this.targetUser;
var name = this.targetUsername;
var userid = toId(name);
if (!userid || userid === '') return this.sendReply("User '"+name+"' does not exist.");
if (room.auth[userid] !== '#') return this.sendReply("User '"+name+"' is not a room owner.");
if (!this.can('makeroom', null, room)) return false;
delete room.auth[userid];
this.sendReply('('+name+' is no longer Room Owner.)');
if (targetUser) targetUser.updateIdentity();
if (room.chatRoomData) {
Rooms.global.writeChatRoomData();
}
},
roomdesc: function(target, room, user) {
if (!target) {
if (!this.canBroadcast()) return;
this.sendReply('The room description is: '+room.desc);
return;
}
if (!this.can('roommod', null, room)) return false;
if (target.length > 80) {
return this.sendReply('Error: Room description is too long (must be at most 80 characters).');
}
room.desc = target;
this.sendReply('(The room description is now: '+target+')');
if (room.chatRoomData) {
room.chatRoomData.desc = room.desc;
Rooms.global.writeChatRoomData();
}
},
roommod: function(target, room, user) {
if (!room.auth) {
this.sendReply("/roommod - This room isn't designed for per-room moderation");
return this.sendReply("Before setting room mods, you need to set it up with /roomowner");
}
var target = this.splitTarget(target, true);
var targetUser = this.targetUser;
if (!targetUser) return this.sendReply("User '"+this.targetUsername+"' is not online.");
if (!this.can('roommod', null, room)) return false;
var name = targetUser.name;
if (room.auth[targetUser.userid] === '#') {
if (!this.can('roomowner', null, room)) return false;
}
room.auth[targetUser.userid] = '%';
this.add(''+name+' was appointed Room Moderator by '+user.name+'.');
targetUser.updateIdentity();
if (room.chatRoomData) {
Rooms.global.writeChatRoomData();
}
},
roomdemod: 'deroommod',
deroommod: function(target, room, user) {
if (!room.auth) {
this.sendReply("/roommod - This room isn't designed for per-room moderation");
return this.sendReply("Before setting room mods, you need to set it up with /roomowner");
}
var target = this.splitTarget(target, true);
var targetUser = this.targetUser;
var name = this.targetUsername;
var userid = toId(name);
if (!userid || userid === '') return this.sendReply("User '"+name+"' does not exist.");
if (room.auth[userid] !== '%') return this.sendReply("User '"+name+"' is not a room mod.");
if (!this.can('roommod', null, room)) return false;
delete room.auth[userid];
this.sendReply('('+name+' is no longer Room Moderator.)');
if (targetUser) targetUser.updateIdentity();
if (room.chatRoomData) {
Rooms.global.writeChatRoomData();
}
},
roomvoice: function(target, room, user) {
if (!room.auth) {
this.sendReply("/roomvoice - This room isn't designed for per-room moderation");
return this.sendReply("Before setting room voices, you need to set it up with /roomowner");
}
var target = this.splitTarget(target, true);
var targetUser = this.targetUser;
if (!targetUser) return this.sendReply("User '"+this.targetUsername+"' is not online.");
if (!this.can('roomvoice', null, room)) return false;
var name = targetUser.name;
if (room.auth[targetUser.userid] === '%') {
if (!this.can('roommod', null, room)) return false;
} else if (room.auth[targetUser.userid]) {
if (!this.can('roomowner', null, room)) return false;
}
room.auth[targetUser.userid] = '+';
this.add(''+name+' was appointed Room Voice by '+user.name+'.');
targetUser.updateIdentity();
if (room.chatRoomData) {
Rooms.global.writeChatRoomData();
}
},
roomdevoice: 'deroomvoice',
deroomvoice: function(target, room, user) {
if (!room.auth) {
this.sendReply("/roomdevoice - This room isn't designed for per-room moderation");
return this.sendReply("Before setting room voices, you need to set it up with /roomowner");
}
var target = this.splitTarget(target, true);
var targetUser = this.targetUser;
var name = this.targetUsername;
var userid = toId(name);
if (!userid || userid === '') return this.sendReply("User '"+name+"' does not exist.");
if (room.auth[userid] !== '+') return this.sendReply("User '"+name+"' is not a room voice.");
if (!this.can('roomvoice', null, room)) return false;
delete room.auth[userid];
this.sendReply('('+name+' is no longer Room Voice.)');
if (targetUser) targetUser.updateIdentity();
if (room.chatRoomData) {
Rooms.global.writeChatRoomData();
}
},
autojoin: function(target, room, user, connection) {
Rooms.global.autojoinRooms(user, connection)
},
join: function(target, room, user, connection) {
if (!target) return false;
var targetRoom = Rooms.get(target) || Rooms.get(toId(target));
if (!targetRoom) {
if (target === 'lobby') return connection.sendTo(target, "|noinit|nonexistent|");
return connection.sendTo(target, "|noinit|nonexistent|The room '"+target+"' does not exist.");
}
if (targetRoom.isPrivate && !user.named) {
return connection.sendTo(target, "|noinit|namerequired|You must have a name in order to join the room '"+target+"'.");
}
if (!user.joinRoom(targetRoom || room, connection)) {
return connection.sendTo(target, "|noinit|joinfailed|The room '"+target+"' could not be joined.");
}
},
roomban: function(target, room, user, connection) {
if (!target) return this.parse('/help roomban');
target = this.splitTarget(target, true);
var targetUser = this.targetUser;
var name = this.targetUsername;
var userid = toId(name);
if (!userid) return this.sendReply("User '" + name + "' does not exist.");
if (!this.can('ban', targetUser, room)) return false;
if (!Rooms.rooms[room.id].users[userid]) {
return this.sendReply('User ' + this.targetUsername + ' is not in the room ' + room.id + '.');
}
if (!room.bannedUsers || !room.bannedIps) {
return this.sendReply('Room bans are not meant to be used in room ' + room.id + '.');
}
room.bannedUsers[userid] = true;
for (var ip in targetUser.ips) {
room.bannedIps[ip] = true;
}
targetUser.popup(user.name+" has banned you from the room " + room.id + "." + (target ? " (" + target + ")" : ""));
this.addModCommand(""+targetUser.name+" was banned from room " + room.id + " by "+user.name+"." + (target ? " (" + target + ")" : ""));
var alts = targetUser.getAlts();
if (alts.length) {
this.addModCommand(""+targetUser.name+"'s alts were also banned from room " + room.id + ": "+alts.join(", "));
for (var i = 0; i < alts.length; ++i) {
var altId = toId(alts[i]);
this.add('|unlink|' + altId);
room.bannedUsers[altId] = true;
}
}
this.add('|unlink|' + targetUser.userid);
targetUser.leaveRoom(room.id);
},
roomunban: function(target, room, user, connection) {
if (!target) return this.parse('/help roomunban');
target = this.splitTarget(target, true);
var targetUser = this.targetUser;
var name = this.targetUsername;
var userid = toId(name);
if (!userid) return this.sendReply("User '"+name+"' does not exist.");
if (!this.can('ban', targetUser, room)) return false;
if (!room.bannedUsers || !room.bannedIps) {
return this.sendReply('Room bans are not meant to be used in room ' + room.id + '.');
}
if (room.bannedUsers[userid]) delete room.bannedUsers[userid];
for (var ip in targetUser.ips) {
if (room.bannedIps[ip]) delete room.bannedIps[ip];
}
targetUser.popup(user.name+" has unbanned you from the room " + room.id + ".");
this.addModCommand(""+targetUser.name+" was unbanned from room " + room.id + " by "+user.name+".");
var alts = targetUser.getAlts();
if (alts.length) {
this.addModCommand(""+targetUser.name+"'s alts were also unbanned from room " + room.id + ": "+alts.join(", "));
for (var i = 0; i < alts.length; ++i) {
var altId = toId(alts[i]);
if (room.bannedUsers[altId]) delete room.bannedUsers[altId];
}
}
},
leave: 'part',
part: function(target, room, user, connection) {
if (room.id === 'global') return false;
var targetRoom = Rooms.get(target);
if (target && !targetRoom) {
return this.sendReply("The room '"+target+"' does not exist.");
}
user.leaveRoom(targetRoom || room, connection);
},
/*********************************************************
* Moderating: Punishments
*********************************************************/
kick: 'warn',
k: 'warn',
warn: function(target, room, user) {
if (!target) return this.parse('/help warn');
target = this.splitTarget(target);
var targetUser = this.targetUser;
if (!targetUser || !targetUser.connected) {
return this.sendReply('User '+this.targetUsername+' not found.');
}
if (room.isPrivate && room.auth) {
return this.sendReply('You can\'t warn here: This is a privately-owned room not subject to global rules.');
}
if (!this.can('warn', targetUser, room)) return false;
this.addModCommand(''+targetUser.name+' was warned by '+user.name+'.' + (target ? " (" + target + ")" : ""));
targetUser.send('|c|~|/warn '+target);
},
redirect: 'redir',
redir: function (target, room, user, connection) {
if (!target) return this.parse('/help redirect');
target = this.splitTarget(target);
var targetUser = this.targetUser;
var targetRoom = Rooms.get(target) || Rooms.get(toId(target));
if (!targetRoom) {
return this.sendReply("The room '" + target + "' does not exist.");
}
if (!this.can('kick', targetUser, room)) return false;
if (!targetUser || !targetUser.connected) {
return this.sendReply('User '+this.targetUsername+' not found.');
}
if (Rooms.rooms[targetRoom.id].users[targetUser.userid]) {
return this.sendReply("User " + targetUser.name + " is already in the room " + target + "!");
}
if (!Rooms.rooms[room.id].users[targetUser.userid]) {
return this.sendReply('User '+this.targetUsername+' is not in the room ' + room.id + '.');
}
if (targetUser.joinRoom(target) === false) return this.sendReply('User "' + targetUser.name + '" could not be joined to room ' + target + '. They could be banned from the room.');
var roomName = (targetRoom.isPrivate)? 'a private room' : 'room ' + target;
this.addModCommand(targetUser.name + ' was redirected to ' + roomName + ' by ' + user.name + '.');
targetUser.leaveRoom(room);
},
m: 'mute',
mute: function(target, room, user) {
if (!target) return this.parse('/help mute');
target = this.splitTarget(target);
var targetUser = this.targetUser;
if (!targetUser) {
return this.sendReply('User '+this.targetUsername+' not found.');
}
if (!this.can('mute', targetUser, room)) return false;
if (targetUser.mutedRooms[room.id] || targetUser.locked || !targetUser.connected) {
var problem = ' but was already '+(!targetUser.connected ? 'offline' : targetUser.locked ? 'locked' : 'muted');
if (!target) {
return this.privateModCommand('('+targetUser.name+' would be muted by '+user.name+problem+'.)');
}
return this.addModCommand(''+targetUser.name+' would be muted by '+user.name+problem+'.' + (target ? " (" + target + ")" : ""));
}
targetUser.popup(user.name+' has muted you for 7 minutes. '+target);
this.addModCommand(''+targetUser.name+' was muted by '+user.name+' for 7 minutes.' + (target ? " (" + target + ")" : ""));
var alts = targetUser.getAlts();
if (alts.length) this.addModCommand(""+targetUser.name+"'s alts were also muted: "+alts.join(", "));
targetUser.mute(room.id, 7*60*1000);
},
hourmute: function(target, room, user) {
if (!target) return this.parse('/help hourmute');
target = this.splitTarget(target);
var targetUser = this.targetUser;
if (!targetUser) {
return this.sendReply('User '+this.targetUsername+' not found.');
}
if (!this.can('mute', targetUser, room)) return false;
if (((targetUser.mutedRooms[room.id] && (targetUser.muteDuration[room.id]||0) >= 50*60*1000) || targetUser.locked) && !target) {
var problem = ' but was already '+(!targetUser.connected ? 'offline' : targetUser.locked ? 'locked' : 'muted');
return this.privateModCommand('('+targetUser.name+' would be muted by '+user.name+problem+'.)');
}
targetUser.popup(user.name+' has muted you for 60 minutes. '+target);
this.addModCommand(''+targetUser.name+' was muted by '+user.name+' for 60 minutes.' + (target ? " (" + target + ")" : ""));
var alts = targetUser.getAlts();
if (alts.length) this.addModCommand(""+targetUser.name+"'s alts were also muted: "+alts.join(", "));
targetUser.mute(room.id, 60*60*1000, true);
},
um: 'unmute',
unmute: function(target, room, user) {
if (!target) return this.parse('/help something');
var targetid = toUserid(target);
var targetUser = Users.get(target);
if (!targetUser) {
return this.sendReply('User '+target+' not found.');
}
if (!this.can('mute', targetUser, room)) return false;
if (!targetUser.mutedRooms[room.id]) {
return this.sendReply(''+targetUser.name+' isn\'t muted.');
}
this.addModCommand(''+targetUser.name+' was unmuted by '+user.name+'.');
targetUser.unmute(room.id);
},
ipmute: 'lock',
lock: function(target, room, user) {
if (!target) return this.parse('/help lock');
target = this.splitTarget(target);
var targetUser = this.targetUser;
if (!targetUser) {
return this.sendReply('User '+this.targetUser+' not found.');
}
if (!user.can('lock', targetUser)) {
return this.sendReply('/lock - Access denied.');
}
if ((targetUser.locked || Users.checkBanned(targetUser.latestIp)) && !target) {
var problem = ' but was already '+(targetUser.locked ? 'locked' : 'banned');
return this.privateModCommand('('+targetUser.name+' would be locked by '+user.name+problem+'.)');
}
targetUser.popup(user.name+' has locked you from talking in chats, battles, and PMing regular users.\n\n'+target+'\n\nIf you feel that your lock was unjustified, you can still PM staff members (%, @, &, and ~) to discuss it.');
this.addModCommand(""+targetUser.name+" was locked from talking by "+user.name+"." + (target ? " (" + target + ")" : ""));
var alts = targetUser.getAlts();
if (alts.length) this.addModCommand(""+targetUser.name+"'s alts were also locked: "+alts.join(", "));
this.add('|unlink|' + targetUser.userid);
targetUser.lock();
},
unlock: function(target, room, user) {
if (!target) return this.parse('/help unlock');
if (!this.can('lock')) return false;
var unlocked = Users.unlock(target);
if (unlocked) {
var names = Object.keys(unlocked);
this.addModCommand('' + names.join(', ') + ' ' +
((names.length > 1) ? 'were' : 'was') +
' unlocked by ' + user.name + '.');
} else {
this.sendReply('User '+target+' is not locked.');
}
},
b: 'ban',
ban: function(target, room, user) {
if (!target) return this.parse('/help ban');
target = this.splitTarget(target);
var targetUser = this.targetUser;
if (!targetUser) {
return this.sendReply('User '+this.targetUsername+' not found.');
}
if (!this.can('ban', targetUser)) return false;
if (Users.checkBanned(targetUser.latestIp) && !target && !targetUser.connected) {
var problem = ' but was already banned';
return this.privateModCommand('('+targetUser.name+' would be banned by '+user.name+problem+'.)');
}
targetUser.popup(user.name+" has banned you." + (config.appealurl ? (" If you feel that your banning was unjustified you can appeal the ban:\n" + config.appealurl) : "") + "\n\n"+target);
this.addModCommand(""+targetUser.name+" was banned by "+user.name+"." + (target ? " (" + target + ")" : ""));
var alts = targetUser.getAlts();
if (alts.length) {
this.addModCommand(""+targetUser.name+"'s alts were also banned: "+alts.join(", "));
for (var i = 0; i < alts.length; ++i) {
this.add('|unlink|' + toId(alts[i]));
}
}
this.add('|unlink|' + targetUser.userid);
targetUser.ban();
},
unban: function(target, room, user) {
if (!target) return this.parse('/help unban');
if (!user.can('ban')) {
return this.sendReply('/unban - Access denied.');
}
var name = Users.unban(target);
if (name) {
this.addModCommand(''+name+' was unbanned by '+user.name+'.');
} else {
this.sendReply('User '+target+' is not banned.');
}
},
unbanall: function(target, room, user) {
if (!user.can('ban')) {
return this.sendReply('/unbanall - Access denied.');
}
// we have to do this the hard way since it's no longer a global
for (var i in Users.bannedIps) {
delete Users.bannedIps[i];
}
for (var i in Users.lockedIps) {
delete Users.lockedIps[i];
}
this.addModCommand('All bans and locks have been lifted by '+user.name+'.');
},
banip: function(target, room, user) {
target = target.trim();
if (!target) {
return this.parse('/help banip');
}
if (!this.can('rangeban')) return false;
Users.bannedIps[target] = '#ipban';
this.addModCommand(user.name+' temporarily banned the '+(target.charAt(target.length-1)==='*'?'IP range':'IP')+': '+target);
},
unbanip: function(target, room, user) {
target = target.trim();
if (!target) {
return this.parse('/help unbanip');
}
if (!this.can('rangeban')) return false;
if (!Users.bannedIps[target]) {
return this.sendReply(''+target+' is not a banned IP or IP range.');
}
delete Users.bannedIps[target];
this.addModCommand(user.name+' unbanned the '+(target.charAt(target.length-1)==='*'?'IP range':'IP')+': '+target);
},
/*********************************************************
* Moderating: Other
*********************************************************/
modnote: function(target, room, user, connection, cmd) {
if (!target) return this.parse('/help note');
if (!this.can('mute')) return false;
return this.privateModCommand('(' + user.name + ' notes: ' + target + ')');
},
demote: 'promote',
promote: function(target, room, user, connection, cmd) {
if (!target) return this.parse('/help promote');
var target = this.splitTarget(target, true);
var targetUser = this.targetUser;
var userid = toUserid(this.targetUsername);
var name = targetUser ? targetUser.name : this.targetUsername;
var currentGroup = ' ';
if (targetUser) {
currentGroup = targetUser.group;
} else if (Users.usergroups[userid]) {
currentGroup = Users.usergroups[userid].substr(0,1);
}
var nextGroup = target ? target : Users.getNextGroupSymbol(currentGroup, cmd === 'demote', true);
if (target === 'deauth') nextGroup = config.groupsranking[0];
if (!config.groups[nextGroup]) {
return this.sendReply('Group \'' + nextGroup + '\' does not exist.');
}
if (!user.checkPromotePermission(currentGroup, nextGroup)) {
return this.sendReply('/' + cmd + ' - Access denied.');
}
var isDemotion = (config.groups[nextGroup].rank < config.groups[currentGroup].rank);
if (!Users.setOfflineGroup(name, nextGroup)) {
return this.sendReply('/promote - WARNING: This user is offline and could be unregistered. Use /forcepromote if you\'re sure you want to risk it.');
}
var groupName = (config.groups[nextGroup].name || nextGroup || '').trim() || 'a regular user';
if (isDemotion) {
this.privateModCommand('('+name+' was demoted to ' + groupName + ' by '+user.name+'.)');
if (targetUser) {
targetUser.popup('You were demoted to ' + groupName + ' by ' + user.name + '.');
}
} else {
this.addModCommand(''+name+' was promoted to ' + groupName + ' by '+user.name+'.');
}
if (targetUser) {
targetUser.updateIdentity();
}
},
forcepromote: function(target, room, user) {
// warning: never document this command in /help
if (!this.can('forcepromote')) return false;
var target = this.splitTarget(target, true);
var name = this.targetUsername;
var nextGroup = target ? target : Users.getNextGroupSymbol(' ', false);
if (!Users.setOfflineGroup(name, nextGroup, true)) {
return this.sendReply('/forcepromote - Don\'t forcepromote unless you have to.');
}
var groupName = config.groups[nextGroup].name || nextGroup || '';
this.addModCommand(''+name+' was promoted to ' + (groupName.trim()) + ' by '+user.name+'.');
},
deauth: function(target, room, user) {
return this.parse('/demote '+target+', deauth');
},
modchat: function(target, room, user) {
if (!target) {
return this.sendReply('Moderated chat is currently set to: '+room.modchat);
}
if (!this.can('modchat', null, room) || !this.canTalk()) return false;
target = target.toLowerCase();
switch (target) {
case 'on':
case 'true':
case 'yes':
case 'registered':
this.sendReply("Modchat registered has been removed.");
this.sendReply("If you're dealing with a spammer, make sure to run /loadbanlist.");
return false;
break;
case 'off':
case 'false':
case 'no':
room.modchat = false;
break;
default:
if (!config.groups[target]) {
return this.parse('/help modchat');
}
if (config.groupsranking.indexOf(target) > 1 && !user.can('modchatall')) {
return this.sendReply('/modchat - Access denied for setting higher than ' + config.groupsranking[1] + '.');
}
room.modchat = target;
break;
}
if (room.modchat === true) {
this.add('|raw|