mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-05-09 04:23:45 -05:00
Move config/commands.js to chat-plugins
This commit is contained in:
parent
f985b68a4b
commit
336cbc462a
|
|
@ -1,9 +1,9 @@
|
|||
/**
|
||||
* Commands
|
||||
* Informational Commands
|
||||
* Pokemon Showdown - https://pokemonshowdown.com/
|
||||
*
|
||||
* These are commands. For instance, you can define the command 'whois'
|
||||
* here, then use it by typing /whois into Pokemon Showdown.
|
||||
* These are informational commands. For instance, you can define the command
|
||||
* 'whois' here, then use it by typing /whois into Pokemon Showdown.
|
||||
*
|
||||
* For the API, see chat-plugins/COMMANDS.md
|
||||
*
|
||||
|
|
@ -145,7 +145,7 @@ var commands = exports.commands = {
|
|||
},
|
||||
|
||||
/*********************************************************
|
||||
* Informational commands
|
||||
* Data Search Tools
|
||||
*********************************************************/
|
||||
|
||||
pstats: 'data',
|
||||
|
|
@ -1152,6 +1152,10 @@ var commands = exports.commands = {
|
|||
this.sendReplyBox("" + atkName + " is " + factor + "x effective against " + defName + ".");
|
||||
},
|
||||
|
||||
/*********************************************************
|
||||
* Informational commands
|
||||
*********************************************************/
|
||||
|
||||
uptime: function (target, room, user) {
|
||||
if (!this.canBroadcast()) return;
|
||||
var uptime = process.uptime();
|
||||
|
|
@ -1694,6 +1698,11 @@ var commands = exports.commands = {
|
|||
}
|
||||
},
|
||||
|
||||
register: function () {
|
||||
if (!this.canBroadcast()) return;
|
||||
this.sendReplyBox('You will be prompted to register upon winning a rated battle. Alternatively, there is a register button in the <button name="openOptions"><i class="icon-cog"></i> Options</button> menu in the upper right.');
|
||||
},
|
||||
|
||||
/*********************************************************
|
||||
* Miscellaneous commands
|
||||
*********************************************************/
|
||||
|
|
@ -1780,24 +1789,6 @@ var commands = exports.commands = {
|
|||
return this.sendReplyBox('<em>We randomly picked:</em> ' + Tools.escapeHTML(options.sample().trim()));
|
||||
},
|
||||
|
||||
register: function () {
|
||||
if (!this.canBroadcast()) return;
|
||||
this.sendReplyBox('You will be prompted to register upon winning a rated battle. Alternatively, there is a register button in the <button name="openOptions"><i class="icon-cog"></i> Options</button> menu in the upper right.');
|
||||
},
|
||||
|
||||
lobbychat: function (target, room, user, connection) {
|
||||
if (!Rooms.lobby) return this.popupReply("This server doesn't have a lobby.");
|
||||
target = toId(target);
|
||||
if (target === 'off') {
|
||||
user.leaveRoom(Rooms.lobby, connection.socket);
|
||||
connection.send('|users|');
|
||||
this.sendReply("You are now blocking lobby chat.");
|
||||
} else {
|
||||
user.joinRoom(Rooms.lobby, connection);
|
||||
this.sendReply("You are now receiving lobby chat.");
|
||||
}
|
||||
},
|
||||
|
||||
showimage: function (target, room, user) {
|
||||
if (!target) return this.parse('/help showimage');
|
||||
if (!this.can('declare', null, room)) return false;
|
||||
|
|
@ -1826,363 +1817,33 @@ var commands = exports.commands = {
|
|||
this.sendReplyBox(target);
|
||||
},
|
||||
|
||||
a: function (target, room, user) {
|
||||
if (!this.can('rawpacket')) return false;
|
||||
// secret sysop command
|
||||
room.add(target);
|
||||
bofrocket: function (target, room, user) {
|
||||
if (room.id !== 'bof') return this.sendReply("The command '/bofrocket' was unrecognized. To send a message starting with '/bofrocket', type '//bofrocket'.");
|
||||
if (!this.can('modchat', null, room)) return;
|
||||
target = this.splitTarget(target);
|
||||
if (!this.targetUser) return this.sendReply("User not found");
|
||||
if (!room.users[this.targetUser.userid]) return this.sendReply("Not in bof");
|
||||
this.targetUser.avatar = '#bofrocket';
|
||||
room.add("" + user.name + " applied bofrocket to " + this.targetUser.name);
|
||||
},
|
||||
|
||||
/*********************************************************
|
||||
* Help commands
|
||||
*********************************************************/
|
||||
showtan: function (target, room, user) {
|
||||
if (room.id !== 'showderp') return this.sendReply("The command '/showtan' was unrecognized. To send a message starting with '/showtan', type '//showtan'.");
|
||||
if (!this.can('modchat', null, room)) return;
|
||||
target = this.splitTarget(target);
|
||||
if (!this.targetUser) return this.sendReply("User not found");
|
||||
if (!room.users[this.targetUser.userid]) return this.sendReply("Not a showderper");
|
||||
this.targetUser.avatar = '#showtan';
|
||||
room.add("" + user.name + " applied showtan to affected area of " + this.targetUser.name);
|
||||
},
|
||||
|
||||
commands: 'help',
|
||||
h: 'help',
|
||||
'?': 'help',
|
||||
help: function (target, room, user) {
|
||||
target = target.toLowerCase();
|
||||
var matched = false;
|
||||
if (target === 'msg' || target === 'pm' || target === 'whisper' || target === 'w') {
|
||||
matched = true;
|
||||
this.sendReply("/msg OR /whisper OR /w [username], [message] - Send a private message.");
|
||||
}
|
||||
if (target === 'r' || target === 'reply') {
|
||||
matched = true;
|
||||
this.sendReply("/reply OR /r [message] - Send a private message to the last person you received a message from, or sent a message to.");
|
||||
}
|
||||
if (target === 'avatar') {
|
||||
matched = true;
|
||||
this.sendReply("/avatar [new avatar number] - Change your trainer sprite.");
|
||||
}
|
||||
if (target === 'whois' || target === 'alts' || target === 'ip' || target === 'rooms') {
|
||||
matched = true;
|
||||
this.sendReply("/whois - Get details on yourself: alts, group, IP address, and rooms.");
|
||||
this.sendReply("/whois [username] - Get details on a username: alts (Requires: % @ & ~), group, IP address (Requires: @ & ~), and rooms.");
|
||||
}
|
||||
if (target === 'data') {
|
||||
matched = true;
|
||||
this.sendReply("/data [pokemon/item/move/ability] - Get details on this pokemon/item/move/ability/nature.");
|
||||
this.sendReply("!data [pokemon/item/move/ability] - Show everyone these details. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'details' || target === 'dt') {
|
||||
matched = true;
|
||||
this.sendReply("/details [pokemon] - Get additional details on this pokemon/item/move/ability/nature.");
|
||||
this.sendReply("!details [pokemon] - Show everyone these details. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'analysis') {
|
||||
matched = true;
|
||||
this.sendReply("/analysis [pokemon], [generation] - Links to the Smogon University analysis for this Pokemon in the given generation.");
|
||||
this.sendReply("!analysis [pokemon], [generation] - Shows everyone this link. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'groups') {
|
||||
matched = true;
|
||||
this.sendReply("/groups - Explains what the + % @ & next to people's names mean.");
|
||||
this.sendReply("!groups - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'opensource') {
|
||||
matched = true;
|
||||
this.sendReply("/opensource - Links to PS's source code repository.");
|
||||
this.sendReply("!opensource - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'avatars') {
|
||||
matched = true;
|
||||
this.sendReply("/avatars - Explains how to change avatars.");
|
||||
this.sendReply("!avatars - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'intro') {
|
||||
matched = true;
|
||||
this.sendReply("/intro - Provides an introduction to competitive pokemon.");
|
||||
this.sendReply("!intro - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'cap') {
|
||||
matched = true;
|
||||
this.sendReply("/cap - Provides an introduction to the Create-A-Pokemon project.");
|
||||
this.sendReply("!cap - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'om') {
|
||||
matched = true;
|
||||
this.sendReply("/om - Provides links to information on the Other Metagames.");
|
||||
this.sendReply("!om - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'learn' || target === 'learnset' || target === 'learnall') {
|
||||
matched = true;
|
||||
this.sendReply("/learn [pokemon], [move, move, ...] - Displays how a Pokemon can learn the given moves, if it can at all.");
|
||||
this.sendReply("!learn [pokemon], [move, move, ...] - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'calc' || target === 'calculator') {
|
||||
matched = true;
|
||||
this.sendReply("/calc - Provides a link to a damage calculator");
|
||||
this.sendReply("!calc - Shows everyone a link to a damage calculator. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'away' || target === 'idle') {
|
||||
matched = true;
|
||||
this.sendReply("/away - Blocks challenges and private messages. Unblock them with /back.");
|
||||
}
|
||||
if (target === 'blockchallenges') {
|
||||
matched = true;
|
||||
this.sendReply("/blockchallenges - Blocks challenges so no one can challenge you. Unblock them with /unblockchallenges.");
|
||||
}
|
||||
if (target === 'blockpms' || target === 'ignorepms') {
|
||||
matched = true;
|
||||
this.sendReply("/blockpms - Blocks private messages. Unblock them with /unignorepms.");
|
||||
}
|
||||
if (target === 'back') {
|
||||
matched = true;
|
||||
this.sendReply("/back - Unblocks challenges and/or private messages, if either are blocked.");
|
||||
}
|
||||
if (target === 'unblockchallenges' || target === 'allowchallenges') {
|
||||
matched = true;
|
||||
this.sendReply("/unblockchallenges - Unblocks challenges so you can be challenged again. Block them with /blockchallenges.");
|
||||
}
|
||||
if (target === 'unblockpms' || target === 'unignorepms') {
|
||||
matched = true;
|
||||
this.sendReply("/unblockpms - Unblocks private messages. Block them with /blockpms.");
|
||||
}
|
||||
if (target === 'faq') {
|
||||
matched = true;
|
||||
this.sendReply("/faq [theme] - Provides a link to the FAQ. Add deviation, doubles, randomcap, restart, or staff for a link to these questions. Add all for all of them.");
|
||||
this.sendReply("!faq [theme] - Shows everyone a link to the FAQ. Add deviation, doubles, randomcap, restart, or staff for a link to these questions. Add all for all of them. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'effectiveness' || target === 'matchup' || target === 'eff' || target === 'type') {
|
||||
matched = true;
|
||||
this.sendReply("/effectiveness [attack], [defender] - Provides the effectiveness of a move or type on another type or a Pokémon.");
|
||||
this.sendReply("!effectiveness [attack], [defender] - Shows everyone the effectiveness of a move or type on another type or a Pokémon.");
|
||||
}
|
||||
if (target === 'weakness' || target === 'weaknesses' || target === 'weak' || target === 'resist') {
|
||||
matched = true;
|
||||
this.sendReply("/weakness [pokemon] - Provides a Pokemon's resistances, weaknesses, and immunities, ignoring abilities.");
|
||||
this.sendReply("/weakness [type 1]/[type 2] - Provides a type or type combination's resistances, weaknesses, and immunities, ignoring abilities.");
|
||||
this.sendReply("!weakness [pokemon] - Shows everyone a Pokemon's resistances, weaknesses, and immunities, ignoring abilities. Requires: + % @ & ~");
|
||||
this.sendReply("!weakness [type 1]/[type 2] - Shows everyone a type or type combination's resistances, weaknesses, and immunities, ignoring abilities. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'dexsearch' || target === 'dsearch' || target === 'ds') {
|
||||
matched = true;
|
||||
this.sendReply("/dexsearch [type], [move], [move], ... - Searches for Pokemon that fulfill the selected criteria.");
|
||||
this.sendReply("Search categories are: type, tier, color, moves, ability, gen.");
|
||||
this.sendReply("Valid colors are: green, red, blue, white, brown, yellow, purple, pink, gray and black.");
|
||||
this.sendReply("Valid tiers are: Uber/OU/BL/UU/BL2/RU/BL3/NU/PU/NFE/LC/CAP.");
|
||||
this.sendReply("Types must be followed by ' type', e.g., 'dragon type'.");
|
||||
this.sendReply("Parameters can be excluded through the use of '!', e.g., '!water type' excludes all water types.");
|
||||
this.sendReply("The parameter 'mega' can be added to search for Mega Evolutions only, and the parameters 'FE' or 'NFE' can be added to search fully or not-fully evolved Pokemon only.");
|
||||
this.sendReply("The order of the parameters does not matter.");
|
||||
}
|
||||
if (target === 'movesearch' || target === 'msearch' || target === 'ms') {
|
||||
matched = true;
|
||||
this.sendReply("/movesearch [parameter], [parameter], [parameter], ... - Searches for moves that fulfill the selected criteria.");
|
||||
this.sendReply("Search categories are: type, category, flag, status inflicted, type boosted, and numeric range for base power, pp, and accuracy.");
|
||||
this.sendReply("Types must be followed by ' type', e.g., 'dragon type'.");
|
||||
this.sendReply("Stat boosts must be preceded with 'boosts ', e.g., 'boosts attack' searches for moves that boost the attack stat.");
|
||||
this.sendReply("Inequality ranges use the characters '>' and '<' though they behave as '≥' and '≤', e.g., 'bp > 100' searches for all moves equal to and greater than 100 base power.");
|
||||
this.sendReply("Parameters can be excluded through the use of '!', e.g., !water type' excludes all water type moves.");
|
||||
this.sendReply("The order of the parameters does not matter.");
|
||||
}
|
||||
if (target === 'dice' || target === 'roll') {
|
||||
matched = true;
|
||||
this.sendReply("/dice [optional max number] - Randomly picks a number between 1 and 6, or between 1 and the number you choose.");
|
||||
this.sendReply("/dice [number of dice]d[number of sides] - Simulates rolling a number of dice, e.g., /dice 2d4 simulates rolling two 4-sided dice.");
|
||||
}
|
||||
if (target === 'pick' || target === 'pickrandom') {
|
||||
matched = true;
|
||||
this.sendReply("/pick [option], [option], ... - Randomly selects an item from a list containing 2 or more elements.");
|
||||
}
|
||||
if (target === 'invite') {
|
||||
matched = true;
|
||||
this.sendReply("/invite [username], [roomname] - Invites the player [username] to join the room [roomname].");
|
||||
}
|
||||
if (target === 'addplayer') {
|
||||
matched = true;
|
||||
this.sendReply("/addplayer [username] - Allow the specified user to join the battle as a player.");
|
||||
}
|
||||
|
||||
// driver commands
|
||||
if (target === 'lock' || target === 'l') {
|
||||
matched = true;
|
||||
this.sendReply("/lock OR /l [username], [reason] - Locks the user from talking in all chats. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'unlock') {
|
||||
matched = true;
|
||||
this.sendReply("/unlock [username] - Unlocks the user. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'redirect' || target === 'redir') {
|
||||
matched = true;
|
||||
this.sendReply("/redirect OR /redir [username], [roomname] - Attempts to redirect the user [username] to the room [roomname]. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'modnote') {
|
||||
matched = true;
|
||||
this.sendReply("/modnote [note] - Adds a moderator note that can be read through modlog. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'forcerename' || target === 'fr') {
|
||||
matched = true;
|
||||
this.sendReply("/forcerename OR /fr [username], [reason] - Forcibly change a user's name and shows them the [reason]. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'kickbattle') {
|
||||
matched = true;
|
||||
this.sendReply("/kickbattle [username], [reason] - Kicks a user from a battle with reason. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'warn' || target === 'k') {
|
||||
matched = true;
|
||||
this.sendReply("/warn OR /k [username], [reason] - Warns a user showing them the Pokemon Showdown Rules and [reason] in an overlay. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'modlog') {
|
||||
matched = true;
|
||||
this.sendReply("/modlog [roomid|all], [n] - Roomid defaults to current room. If n is a number or omitted, display the last n lines of the moderator log. Defaults to 15. If n is not a number, search the moderator log for 'n' on room's log [roomid]. If you set [all] as [roomid], searches for 'n' on all rooms's logs. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'mute' || target === 'm') {
|
||||
matched = true;
|
||||
this.sendReply("/mute OR /m [username], [reason] - Mutes a user with reason for 7 minutes. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'hourmute' || target === 'hm') {
|
||||
matched = true;
|
||||
this.sendReply("/hourmute OR /hm [username], [reason] - Mutes a user with reason for an hour. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'unmute' || target === 'um') {
|
||||
matched = true;
|
||||
this.sendReply("/unmute [username] - Removes mute from user. Requires: % @ & ~");
|
||||
}
|
||||
|
||||
// mod commands
|
||||
if (target === 'roomban' || target === 'rb') {
|
||||
matched = true;
|
||||
this.sendReply("/roomban [username] - Bans the user from the room you are in. Requires: @ & ~");
|
||||
}
|
||||
if (target === 'roomunban') {
|
||||
matched = true;
|
||||
this.sendReply("/roomunban [username] - Unbans the user from the room you are in. Requires: @ & ~");
|
||||
}
|
||||
if (target === 'ban' || target === 'b') {
|
||||
matched = true;
|
||||
this.sendReply("/ban OR /b [username], [reason] - Kick user from all rooms and ban user's IP address with reason. Requires: @ & ~");
|
||||
}
|
||||
if (target === 'unban') {
|
||||
matched = true;
|
||||
this.sendReply("/unban [username] - Unban a user. Requires: @ & ~");
|
||||
}
|
||||
|
||||
// RO commands
|
||||
if (target === 'showimage') {
|
||||
matched = true;
|
||||
this.sendReply("/showimage [url], [width], [height] - Show an image. Requires: # & ~");
|
||||
}
|
||||
if (target === 'roompromote') {
|
||||
matched = true;
|
||||
this.sendReply("/roompromote [username], [group] - Promotes the user to the specified group or next ranked group. Requires: @ # & ~");
|
||||
}
|
||||
if (target === 'roomdemote') {
|
||||
matched = true;
|
||||
this.sendReply("/roomdemote [username], [group] - Demotes the user to the specified group or previous ranked group. Requires: @ # & ~");
|
||||
}
|
||||
|
||||
// leader commands
|
||||
if (target === 'banip') {
|
||||
matched = true;
|
||||
this.sendReply("/banip [ip] - Kick users on this IP or IP range from all rooms and bans it. Accepts wildcards to ban ranges. Requires: & ~");
|
||||
}
|
||||
if (target === 'unbanip') {
|
||||
matched = true;
|
||||
this.sendReply("/unbanip [ip] - Kick users on this IP or IP range from all rooms and bans it. Accepts wildcards to ban ranges. Requires: & ~");
|
||||
}
|
||||
if (target === 'unbanall') {
|
||||
matched = true;
|
||||
this.sendReply("/unbanall - Unban all IP addresses. Requires: & ~");
|
||||
}
|
||||
if (target === 'promote') {
|
||||
matched = true;
|
||||
this.sendReply("/promote [username], [group] - Promotes the user to the specified group or next ranked group. Requires: & ~");
|
||||
}
|
||||
if (target === 'demote') {
|
||||
matched = true;
|
||||
this.sendReply("/demote [username], [group] - Demotes the user to the specified group or previous ranked group. Requires: & ~");
|
||||
}
|
||||
if (target === 'forcetie') {
|
||||
matched = true;
|
||||
this.sendReply("/forcetie - Forces the current match to tie. Requires: & ~");
|
||||
}
|
||||
if (target === 'declare') {
|
||||
matched = true;
|
||||
this.sendReply("/declare [message] - Anonymously announces a message. Requires: & ~");
|
||||
}
|
||||
|
||||
// admin commands
|
||||
if (target === 'chatdeclare' || target === 'cdeclare') {
|
||||
matched = true;
|
||||
this.sendReply("/cdeclare [message] - Anonymously announces a message to all chatrooms on the server. Requires: ~");
|
||||
}
|
||||
if (target === 'globaldeclare' || target === 'gdeclare') {
|
||||
matched = true;
|
||||
this.sendReply("/globaldeclare [message] - Anonymously announces a message to every room on the server. Requires: ~");
|
||||
}
|
||||
if (target === 'htmlbox') {
|
||||
matched = true;
|
||||
this.sendReply("/htmlbox [message] - Displays a message, parsing HTML code contained. Requires: ~ # with global authority");
|
||||
}
|
||||
if (target === 'announce' || target === 'wall') {
|
||||
matched = true;
|
||||
this.sendReply("/announce OR /wall [message] - Makes an announcement. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'modchat') {
|
||||
matched = true;
|
||||
this.sendReply("/modchat [off/autoconfirmed/+/%/@/&/~] - Set the level of moderated chat. Requires: @ for off/autoconfirmed/+ options, & ~ for all the options");
|
||||
}
|
||||
if (target === 'hotpatch') {
|
||||
matched = true;
|
||||
this.sendReply("Hot-patching the game engine allows you to update parts of Showdown without interrupting currently-running battles. Requires: ~");
|
||||
this.sendReply("Hot-patching has greater memory requirements than restarting.");
|
||||
this.sendReply("/hotpatch chat - reload chat-commands.js");
|
||||
this.sendReply("/hotpatch battles - spawn new simulator processes");
|
||||
this.sendReply("/hotpatch formats - reload the tools.js tree, rebuild and rebroad the formats list, and also spawn new simulator processes");
|
||||
}
|
||||
if (target === 'lockdown') {
|
||||
matched = true;
|
||||
this.sendReply("/lockdown - locks down the server, which prevents new battles from starting so that the server can eventually be restarted. Requires: ~");
|
||||
}
|
||||
if (target === 'kill') {
|
||||
matched = true;
|
||||
this.sendReply("/kill - kills the server. Can't be done unless the server is in lockdown state. Requires: ~");
|
||||
}
|
||||
if (target === 'loadbanlist') {
|
||||
matched = true;
|
||||
this.sendReply("/loadbanlist - Loads the bans located at ipbans.txt. The command is executed automatically at startup. Requires: ~");
|
||||
}
|
||||
if (target === 'makechatroom') {
|
||||
matched = true;
|
||||
this.sendReply("/makechatroom [roomname] - Creates a new room named [roomname]. Requires: ~");
|
||||
}
|
||||
if (target === 'deregisterchatroom') {
|
||||
matched = true;
|
||||
this.sendReply("/deregisterchatroom [roomname] - Deletes room [roomname] after the next server restart. Requires: ~");
|
||||
}
|
||||
if (target === 'roomowner') {
|
||||
matched = true;
|
||||
this.sendReply("/roomowner [username] - Appoints [username] as a room owner. Removes official status. Requires: ~");
|
||||
}
|
||||
if (target === 'roomdeowner') {
|
||||
matched = true;
|
||||
this.sendReply("/roomdeowner [username] - Removes [username]'s status as a room owner. Requires: ~");
|
||||
}
|
||||
if (target === 'privateroom' || target === 'hiddenroom') {
|
||||
matched = true;
|
||||
this.sendReply("/privateroom [on/off] - Makes or unmakes a room private. Requires: ~");
|
||||
this.sendReply("/hiddenroom [on/off] - Makes or unmakes a room hidden. Hidden rooms will maintain global ranks of users. Requires: \u2605 ~");
|
||||
}
|
||||
|
||||
// overall
|
||||
if (target === 'help' || target === 'h' || target === '?' || target === 'commands') {
|
||||
matched = true;
|
||||
this.sendReply("/help OR /h OR /? - Gives you help.");
|
||||
}
|
||||
if (!target) {
|
||||
this.sendReply("COMMANDS: /nick, /avatar, /rating, /whois, /msg, /reply, /ignore, /away, /back, /timestamps, /highlight");
|
||||
this.sendReply("INFORMATIONAL COMMANDS: /data, /dexsearch, /movesearch, /groups, /opensource, /avatars, /faq, /rules, /intro, /tiers, /othermetas, /learn, /analysis, /calc (replace / with ! to broadcast. Broadcasting requires: + % @ & ~)");
|
||||
if (user.group !== Config.groupsranking[0]) {
|
||||
this.sendReply("DRIVER COMMANDS: /warn, /mute, /unmute, /alts, /forcerename, /modlog, /lock, /unlock, /announce, /redirect");
|
||||
this.sendReply("MODERATOR COMMANDS: /ban, /unban, /ip");
|
||||
this.sendReply("LEADER COMMANDS: /declare, /forcetie, /forcewin, /promote, /demote, /banip, /unbanall");
|
||||
}
|
||||
this.sendReply("For an overview of room commands, use /roomhelp");
|
||||
this.sendReply("For details of a specific command, use something like: /help data");
|
||||
} else if (!matched) {
|
||||
this.sendReply("Help for the command '" + target + "' was not found. Try /help for general help");
|
||||
}
|
||||
cpgtan: function (target, room, user) {
|
||||
if (room.id !== 'cpg') return this.sendReply("The command '/cpgtan' was unrecognized. To send a message starting with '/cpgtan', type '//cpgtan'.");
|
||||
if (!this.can('modchat', null, room)) return;
|
||||
target = this.splitTarget(target);
|
||||
if (!this.targetUser) return this.sendReply("User not found");
|
||||
if (!room.users[this.targetUser.userid]) return this.sendReply("Not a cpger");
|
||||
this.targetUser.avatar = '#cpgtan';
|
||||
room.add("" + user.name + " applied cpgtan to affected area of " + this.targetUser.name);
|
||||
}
|
||||
|
||||
};
|
||||
|
|
@ -7,9 +7,9 @@
|
|||
*
|
||||
* Individual commands are put in:
|
||||
* commands.js - "core" commands that shouldn't be modified
|
||||
* config/commands.js - other commands that can be safely modified
|
||||
* chat-plugins/ - other commands that can be safely modified
|
||||
*
|
||||
* The command API is (mostly) documented in config/commands.js
|
||||
* The command API is (mostly) documented in chat-plugins/COMMANDS.md
|
||||
*
|
||||
* @license MIT license
|
||||
*/
|
||||
|
|
@ -38,11 +38,6 @@ var fs = require('fs');
|
|||
|
||||
var commands = exports.commands = require('./commands.js').commands;
|
||||
|
||||
var customCommands = require('./config/commands.js');
|
||||
if (customCommands && customCommands.commands) {
|
||||
Object.merge(commands, customCommands.commands);
|
||||
}
|
||||
|
||||
// Install plug-in commands
|
||||
|
||||
fs.readdirSync('./chat-plugins').forEach(function (file) {
|
||||
|
|
|
|||
359
commands.js
359
commands.js
|
|
@ -2069,6 +2069,365 @@ var commands = exports.commands = {
|
|||
}
|
||||
}
|
||||
user.rename(targetName, targetToken, targetAuth, connection);
|
||||
},
|
||||
|
||||
a: function (target, room, user) {
|
||||
if (!this.can('rawpacket')) return false;
|
||||
// secret sysop command
|
||||
room.add(target);
|
||||
},
|
||||
|
||||
/*********************************************************
|
||||
* Help commands
|
||||
*********************************************************/
|
||||
|
||||
commands: 'help',
|
||||
h: 'help',
|
||||
'?': 'help',
|
||||
help: function (target, room, user) {
|
||||
target = target.toLowerCase();
|
||||
var matched = false;
|
||||
if (target === 'msg' || target === 'pm' || target === 'whisper' || target === 'w') {
|
||||
matched = true;
|
||||
this.sendReply("/msg OR /whisper OR /w [username], [message] - Send a private message.");
|
||||
}
|
||||
if (target === 'r' || target === 'reply') {
|
||||
matched = true;
|
||||
this.sendReply("/reply OR /r [message] - Send a private message to the last person you received a message from, or sent a message to.");
|
||||
}
|
||||
if (target === 'avatar') {
|
||||
matched = true;
|
||||
this.sendReply("/avatar [new avatar number] - Change your trainer sprite.");
|
||||
}
|
||||
if (target === 'whois' || target === 'alts' || target === 'ip' || target === 'rooms') {
|
||||
matched = true;
|
||||
this.sendReply("/whois - Get details on yourself: alts, group, IP address, and rooms.");
|
||||
this.sendReply("/whois [username] - Get details on a username: alts (Requires: % @ & ~), group, IP address (Requires: @ & ~), and rooms.");
|
||||
}
|
||||
if (target === 'data') {
|
||||
matched = true;
|
||||
this.sendReply("/data [pokemon/item/move/ability] - Get details on this pokemon/item/move/ability/nature.");
|
||||
this.sendReply("!data [pokemon/item/move/ability] - Show everyone these details. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'details' || target === 'dt') {
|
||||
matched = true;
|
||||
this.sendReply("/details [pokemon] - Get additional details on this pokemon/item/move/ability/nature.");
|
||||
this.sendReply("!details [pokemon] - Show everyone these details. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'analysis') {
|
||||
matched = true;
|
||||
this.sendReply("/analysis [pokemon], [generation] - Links to the Smogon University analysis for this Pokemon in the given generation.");
|
||||
this.sendReply("!analysis [pokemon], [generation] - Shows everyone this link. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'groups') {
|
||||
matched = true;
|
||||
this.sendReply("/groups - Explains what the + % @ & next to people's names mean.");
|
||||
this.sendReply("!groups - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'opensource') {
|
||||
matched = true;
|
||||
this.sendReply("/opensource - Links to PS's source code repository.");
|
||||
this.sendReply("!opensource - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'avatars') {
|
||||
matched = true;
|
||||
this.sendReply("/avatars - Explains how to change avatars.");
|
||||
this.sendReply("!avatars - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'intro') {
|
||||
matched = true;
|
||||
this.sendReply("/intro - Provides an introduction to competitive pokemon.");
|
||||
this.sendReply("!intro - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'cap') {
|
||||
matched = true;
|
||||
this.sendReply("/cap - Provides an introduction to the Create-A-Pokemon project.");
|
||||
this.sendReply("!cap - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'om') {
|
||||
matched = true;
|
||||
this.sendReply("/om - Provides links to information on the Other Metagames.");
|
||||
this.sendReply("!om - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'learn' || target === 'learnset' || target === 'learnall') {
|
||||
matched = true;
|
||||
this.sendReply("/learn [pokemon], [move, move, ...] - Displays how a Pokemon can learn the given moves, if it can at all.");
|
||||
this.sendReply("!learn [pokemon], [move, move, ...] - Show everyone that information. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'calc' || target === 'calculator') {
|
||||
matched = true;
|
||||
this.sendReply("/calc - Provides a link to a damage calculator");
|
||||
this.sendReply("!calc - Shows everyone a link to a damage calculator. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'away' || target === 'idle') {
|
||||
matched = true;
|
||||
this.sendReply("/away - Blocks challenges and private messages. Unblock them with /back.");
|
||||
}
|
||||
if (target === 'blockchallenges') {
|
||||
matched = true;
|
||||
this.sendReply("/blockchallenges - Blocks challenges so no one can challenge you. Unblock them with /unblockchallenges.");
|
||||
}
|
||||
if (target === 'blockpms' || target === 'ignorepms') {
|
||||
matched = true;
|
||||
this.sendReply("/blockpms - Blocks private messages. Unblock them with /unignorepms.");
|
||||
}
|
||||
if (target === 'back') {
|
||||
matched = true;
|
||||
this.sendReply("/back - Unblocks challenges and/or private messages, if either are blocked.");
|
||||
}
|
||||
if (target === 'unblockchallenges' || target === 'allowchallenges') {
|
||||
matched = true;
|
||||
this.sendReply("/unblockchallenges - Unblocks challenges so you can be challenged again. Block them with /blockchallenges.");
|
||||
}
|
||||
if (target === 'unblockpms' || target === 'unignorepms') {
|
||||
matched = true;
|
||||
this.sendReply("/unblockpms - Unblocks private messages. Block them with /blockpms.");
|
||||
}
|
||||
if (target === 'faq') {
|
||||
matched = true;
|
||||
this.sendReply("/faq [theme] - Provides a link to the FAQ. Add deviation, doubles, randomcap, restart, or staff for a link to these questions. Add all for all of them.");
|
||||
this.sendReply("!faq [theme] - Shows everyone a link to the FAQ. Add deviation, doubles, randomcap, restart, or staff for a link to these questions. Add all for all of them. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'effectiveness' || target === 'matchup' || target === 'eff' || target === 'type') {
|
||||
matched = true;
|
||||
this.sendReply("/effectiveness [attack], [defender] - Provides the effectiveness of a move or type on another type or a Pokémon.");
|
||||
this.sendReply("!effectiveness [attack], [defender] - Shows everyone the effectiveness of a move or type on another type or a Pokémon.");
|
||||
}
|
||||
if (target === 'weakness' || target === 'weaknesses' || target === 'weak' || target === 'resist') {
|
||||
matched = true;
|
||||
this.sendReply("/weakness [pokemon] - Provides a Pokemon's resistances, weaknesses, and immunities, ignoring abilities.");
|
||||
this.sendReply("/weakness [type 1]/[type 2] - Provides a type or type combination's resistances, weaknesses, and immunities, ignoring abilities.");
|
||||
this.sendReply("!weakness [pokemon] - Shows everyone a Pokemon's resistances, weaknesses, and immunities, ignoring abilities. Requires: + % @ & ~");
|
||||
this.sendReply("!weakness [type 1]/[type 2] - Shows everyone a type or type combination's resistances, weaknesses, and immunities, ignoring abilities. Requires: + % @ & ~");
|
||||
}
|
||||
if (target === 'dexsearch' || target === 'dsearch' || target === 'ds') {
|
||||
matched = true;
|
||||
this.sendReply("/dexsearch [type], [move], [move], ... - Searches for Pokemon that fulfill the selected criteria.");
|
||||
this.sendReply("Search categories are: type, tier, color, moves, ability, gen.");
|
||||
this.sendReply("Valid colors are: green, red, blue, white, brown, yellow, purple, pink, gray and black.");
|
||||
this.sendReply("Valid tiers are: Uber/OU/BL/UU/BL2/RU/BL3/NU/PU/NFE/LC/CAP.");
|
||||
this.sendReply("Types must be followed by ' type', e.g., 'dragon type'.");
|
||||
this.sendReply("Parameters can be excluded through the use of '!', e.g., '!water type' excludes all water types.");
|
||||
this.sendReply("The parameter 'mega' can be added to search for Mega Evolutions only, and the parameters 'FE' or 'NFE' can be added to search fully or not-fully evolved Pokemon only.");
|
||||
this.sendReply("The order of the parameters does not matter.");
|
||||
}
|
||||
if (target === 'movesearch' || target === 'msearch' || target === 'ms') {
|
||||
matched = true;
|
||||
this.sendReply("/movesearch [parameter], [parameter], [parameter], ... - Searches for moves that fulfill the selected criteria.");
|
||||
this.sendReply("Search categories are: type, category, flag, status inflicted, type boosted, and numeric range for base power, pp, and accuracy.");
|
||||
this.sendReply("Types must be followed by ' type', e.g., 'dragon type'.");
|
||||
this.sendReply("Stat boosts must be preceded with 'boosts ', e.g., 'boosts attack' searches for moves that boost the attack stat.");
|
||||
this.sendReply("Inequality ranges use the characters '>' and '<' though they behave as '≥' and '≤', e.g., 'bp > 100' searches for all moves equal to and greater than 100 base power.");
|
||||
this.sendReply("Parameters can be excluded through the use of '!', e.g., !water type' excludes all water type moves.");
|
||||
this.sendReply("The order of the parameters does not matter.");
|
||||
}
|
||||
if (target === 'dice' || target === 'roll') {
|
||||
matched = true;
|
||||
this.sendReply("/dice [optional max number] - Randomly picks a number between 1 and 6, or between 1 and the number you choose.");
|
||||
this.sendReply("/dice [number of dice]d[number of sides] - Simulates rolling a number of dice, e.g., /dice 2d4 simulates rolling two 4-sided dice.");
|
||||
}
|
||||
if (target === 'pick' || target === 'pickrandom') {
|
||||
matched = true;
|
||||
this.sendReply("/pick [option], [option], ... - Randomly selects an item from a list containing 2 or more elements.");
|
||||
}
|
||||
if (target === 'invite') {
|
||||
matched = true;
|
||||
this.sendReply("/invite [username], [roomname] - Invites the player [username] to join the room [roomname].");
|
||||
}
|
||||
if (target === 'addplayer') {
|
||||
matched = true;
|
||||
this.sendReply("/addplayer [username] - Allow the specified user to join the battle as a player.");
|
||||
}
|
||||
|
||||
// driver commands
|
||||
if (target === 'lock' || target === 'l') {
|
||||
matched = true;
|
||||
this.sendReply("/lock OR /l [username], [reason] - Locks the user from talking in all chats. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'unlock') {
|
||||
matched = true;
|
||||
this.sendReply("/unlock [username] - Unlocks the user. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'redirect' || target === 'redir') {
|
||||
matched = true;
|
||||
this.sendReply("/redirect OR /redir [username], [roomname] - Attempts to redirect the user [username] to the room [roomname]. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'modnote') {
|
||||
matched = true;
|
||||
this.sendReply("/modnote [note] - Adds a moderator note that can be read through modlog. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'forcerename' || target === 'fr') {
|
||||
matched = true;
|
||||
this.sendReply("/forcerename OR /fr [username], [reason] - Forcibly change a user's name and shows them the [reason]. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'kickbattle') {
|
||||
matched = true;
|
||||
this.sendReply("/kickbattle [username], [reason] - Kicks a user from a battle with reason. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'warn' || target === 'k') {
|
||||
matched = true;
|
||||
this.sendReply("/warn OR /k [username], [reason] - Warns a user showing them the Pokemon Showdown Rules and [reason] in an overlay. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'modlog') {
|
||||
matched = true;
|
||||
this.sendReply("/modlog [roomid|all], [n] - Roomid defaults to current room. If n is a number or omitted, display the last n lines of the moderator log. Defaults to 15. If n is not a number, search the moderator log for 'n' on room's log [roomid]. If you set [all] as [roomid], searches for 'n' on all rooms's logs. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'mute' || target === 'm') {
|
||||
matched = true;
|
||||
this.sendReply("/mute OR /m [username], [reason] - Mutes a user with reason for 7 minutes. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'hourmute' || target === 'hm') {
|
||||
matched = true;
|
||||
this.sendReply("/hourmute OR /hm [username], [reason] - Mutes a user with reason for an hour. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'unmute' || target === 'um') {
|
||||
matched = true;
|
||||
this.sendReply("/unmute [username] - Removes mute from user. Requires: % @ & ~");
|
||||
}
|
||||
|
||||
// mod commands
|
||||
if (target === 'roomban' || target === 'rb') {
|
||||
matched = true;
|
||||
this.sendReply("/roomban [username] - Bans the user from the room you are in. Requires: @ & ~");
|
||||
}
|
||||
if (target === 'roomunban') {
|
||||
matched = true;
|
||||
this.sendReply("/roomunban [username] - Unbans the user from the room you are in. Requires: @ & ~");
|
||||
}
|
||||
if (target === 'ban' || target === 'b') {
|
||||
matched = true;
|
||||
this.sendReply("/ban OR /b [username], [reason] - Kick user from all rooms and ban user's IP address with reason. Requires: @ & ~");
|
||||
}
|
||||
if (target === 'unban') {
|
||||
matched = true;
|
||||
this.sendReply("/unban [username] - Unban a user. Requires: @ & ~");
|
||||
}
|
||||
|
||||
// RO commands
|
||||
if (target === 'showimage') {
|
||||
matched = true;
|
||||
this.sendReply("/showimage [url], [width], [height] - Show an image. Requires: # & ~");
|
||||
}
|
||||
if (target === 'roompromote') {
|
||||
matched = true;
|
||||
this.sendReply("/roompromote [username], [group] - Promotes the user to the specified group or next ranked group. Requires: @ # & ~");
|
||||
}
|
||||
if (target === 'roomdemote') {
|
||||
matched = true;
|
||||
this.sendReply("/roomdemote [username], [group] - Demotes the user to the specified group or previous ranked group. Requires: @ # & ~");
|
||||
}
|
||||
|
||||
// leader commands
|
||||
if (target === 'banip') {
|
||||
matched = true;
|
||||
this.sendReply("/banip [ip] - Kick users on this IP or IP range from all rooms and bans it. Accepts wildcards to ban ranges. Requires: & ~");
|
||||
}
|
||||
if (target === 'unbanip') {
|
||||
matched = true;
|
||||
this.sendReply("/unbanip [ip] - Kick users on this IP or IP range from all rooms and bans it. Accepts wildcards to ban ranges. Requires: & ~");
|
||||
}
|
||||
if (target === 'unbanall') {
|
||||
matched = true;
|
||||
this.sendReply("/unbanall - Unban all IP addresses. Requires: & ~");
|
||||
}
|
||||
if (target === 'promote') {
|
||||
matched = true;
|
||||
this.sendReply("/promote [username], [group] - Promotes the user to the specified group or next ranked group. Requires: & ~");
|
||||
}
|
||||
if (target === 'demote') {
|
||||
matched = true;
|
||||
this.sendReply("/demote [username], [group] - Demotes the user to the specified group or previous ranked group. Requires: & ~");
|
||||
}
|
||||
if (target === 'forcetie') {
|
||||
matched = true;
|
||||
this.sendReply("/forcetie - Forces the current match to tie. Requires: & ~");
|
||||
}
|
||||
if (target === 'declare') {
|
||||
matched = true;
|
||||
this.sendReply("/declare [message] - Anonymously announces a message. Requires: & ~");
|
||||
}
|
||||
|
||||
// admin commands
|
||||
if (target === 'chatdeclare' || target === 'cdeclare') {
|
||||
matched = true;
|
||||
this.sendReply("/cdeclare [message] - Anonymously announces a message to all chatrooms on the server. Requires: ~");
|
||||
}
|
||||
if (target === 'globaldeclare' || target === 'gdeclare') {
|
||||
matched = true;
|
||||
this.sendReply("/globaldeclare [message] - Anonymously announces a message to every room on the server. Requires: ~");
|
||||
}
|
||||
if (target === 'htmlbox') {
|
||||
matched = true;
|
||||
this.sendReply("/htmlbox [message] - Displays a message, parsing HTML code contained. Requires: ~ # with global authority");
|
||||
}
|
||||
if (target === 'announce' || target === 'wall') {
|
||||
matched = true;
|
||||
this.sendReply("/announce OR /wall [message] - Makes an announcement. Requires: % @ & ~");
|
||||
}
|
||||
if (target === 'modchat') {
|
||||
matched = true;
|
||||
this.sendReply("/modchat [off/autoconfirmed/+/%/@/&/~] - Set the level of moderated chat. Requires: @ for off/autoconfirmed/+ options, & ~ for all the options");
|
||||
}
|
||||
if (target === 'hotpatch') {
|
||||
matched = true;
|
||||
this.sendReply("Hot-patching the game engine allows you to update parts of Showdown without interrupting currently-running battles. Requires: ~");
|
||||
this.sendReply("Hot-patching has greater memory requirements than restarting.");
|
||||
this.sendReply("/hotpatch chat - reload chat-commands.js");
|
||||
this.sendReply("/hotpatch battles - spawn new simulator processes");
|
||||
this.sendReply("/hotpatch formats - reload the tools.js tree, rebuild and rebroad the formats list, and also spawn new simulator processes");
|
||||
}
|
||||
if (target === 'lockdown') {
|
||||
matched = true;
|
||||
this.sendReply("/lockdown - locks down the server, which prevents new battles from starting so that the server can eventually be restarted. Requires: ~");
|
||||
}
|
||||
if (target === 'kill') {
|
||||
matched = true;
|
||||
this.sendReply("/kill - kills the server. Can't be done unless the server is in lockdown state. Requires: ~");
|
||||
}
|
||||
if (target === 'loadbanlist') {
|
||||
matched = true;
|
||||
this.sendReply("/loadbanlist - Loads the bans located at ipbans.txt. The command is executed automatically at startup. Requires: ~");
|
||||
}
|
||||
if (target === 'makechatroom') {
|
||||
matched = true;
|
||||
this.sendReply("/makechatroom [roomname] - Creates a new room named [roomname]. Requires: ~");
|
||||
}
|
||||
if (target === 'deregisterchatroom') {
|
||||
matched = true;
|
||||
this.sendReply("/deregisterchatroom [roomname] - Deletes room [roomname] after the next server restart. Requires: ~");
|
||||
}
|
||||
if (target === 'roomowner') {
|
||||
matched = true;
|
||||
this.sendReply("/roomowner [username] - Appoints [username] as a room owner. Removes official status. Requires: ~");
|
||||
}
|
||||
if (target === 'roomdeowner') {
|
||||
matched = true;
|
||||
this.sendReply("/roomdeowner [username] - Removes [username]'s status as a room owner. Requires: ~");
|
||||
}
|
||||
if (target === 'privateroom' || target === 'hiddenroom') {
|
||||
matched = true;
|
||||
this.sendReply("/privateroom [on/off] - Makes or unmakes a room private. Requires: ~");
|
||||
this.sendReply("/hiddenroom [on/off] - Makes or unmakes a room hidden. Hidden rooms will maintain global ranks of users. Requires: \u2605 ~");
|
||||
}
|
||||
|
||||
// overall
|
||||
if (target === 'help' || target === 'h' || target === '?' || target === 'commands') {
|
||||
matched = true;
|
||||
this.sendReply("/help OR /h OR /? - Gives you help.");
|
||||
}
|
||||
if (!target) {
|
||||
this.sendReply("COMMANDS: /nick, /avatar, /rating, /whois, /msg, /reply, /ignore, /away, /back, /timestamps, /highlight");
|
||||
this.sendReply("INFORMATIONAL COMMANDS: /data, /dexsearch, /movesearch, /groups, /opensource, /avatars, /faq, /rules, /intro, /tiers, /othermetas, /learn, /analysis, /calc (replace / with ! to broadcast. Broadcasting requires: + % @ & ~)");
|
||||
if (user.group !== Config.groupsranking[0]) {
|
||||
this.sendReply("DRIVER COMMANDS: /warn, /mute, /unmute, /alts, /forcerename, /modlog, /lock, /unlock, /announce, /redirect");
|
||||
this.sendReply("MODERATOR COMMANDS: /ban, /unban, /ip");
|
||||
this.sendReply("LEADER COMMANDS: /declare, /forcetie, /forcewin, /promote, /demote, /banip, /unbanall");
|
||||
}
|
||||
this.sendReply("For an overview of room commands, use /roomhelp");
|
||||
this.sendReply("For details of a specific command, use something like: /help data");
|
||||
} else if (!matched) {
|
||||
this.sendReply("Help for the command '" + target + "' was not found. Try /help for general help");
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user