diff --git a/chat-plugins.js b/chat-plugins.js
deleted file mode 100644
index 4404bd76dc..0000000000
--- a/chat-plugins.js
+++ /dev/null
@@ -1,304 +0,0 @@
-/**
- * Chat plug-ins
- * Pokemon Showdown - http://pokemonshowdown.com/
- *
- * These are chat plugins - small programs to enhance the chat rooms on Pokemon Showdown.
- * Plugins are objects inside the plugins object. The objects are expected to have data values and a commands object inside.
- * The data object saves the data relevant to the plugin, like scores.
- * The commands object is used to import the commands onto the chat commands.
- * It's very important not to add plug-in commands with the same name as existing commands.
- *
- * @license MIT license
- */
-
-var plugins = exports.plugins = {
- /**
- * Scavenger hunts plugin. Only works in a room with the id 'scavengers'.
- * This game shows a hint. Once a player submits the correct answer, they move on to the next hint.
- * You finish upon correctly answering the third hint.
- * In an official hunt, the first three to finish within 60 seconds achieve blitz.
- */
- scavengers: {
- status: 'off',
- blitz: null,
- hintOne: '',
- answerOne: '',
- hintTwo: '',
- answerTwo: '',
- hintThree: '',
- answerThree: '',
- participants: {},
- finished: [],
- result: null,
- commands: {
- scavenger: 'scavengers',
- scavengers: function (target, room, user) {
- return this.parse('/join scavengers');
- },
- startofficialhunt: 'starthunt',
- starthunt: function (target, room, user, connection, cmd) {
- if (room.id !== 'scavengers') return;
- if (!this.can('mute', null, room)) return false;
- if (plugins.scavengers.status === 'on') return this.sendReply('There is already an active scavenger hunt.');
- var targets = target.split(',');
- if (!targets[0] || !targets[1] || !targets[2] || !targets[3] || !targets[4] || !targets[5] || targets[6]) {
- return this.sendReply('You must specify three hints and three answers.');
- }
- plugins.scavengers.status = 'on';
- if (cmd === 'startofficialhunt') {
- if (!this.can('ban', null, room)) return false;
- plugins.scavengers.blitz = setTimeout(function () {
- plugins.scavengers.blitz = null;
- }, 60000);
- }
- plugins.scavengers.hintOne = targets[0].trim();
- plugins.scavengers.answerOne = toId(targets[1]);
- plugins.scavengers.hintTwo = targets[2].trim();
- plugins.scavengers.answerTwo = toId(targets[3]);
- plugins.scavengers.hintThree = targets[4].trim();
- plugins.scavengers.answerThree = toId(targets[5]);
- var result = (cmd === 'startofficialhunt' ? 'An official' : 'A new') + ' Scavenger Hunt has been started by ' + Tools.escapeHTML(user.name) + '! The first hint is: ' + Tools.escapeHTML(plugins.scavengers.hintOne);
- Rooms.rooms.scavengers.addRaw('
' + result + '
');
- },
- joinhunt: function (target, room, user) {
- if (room.id !== 'scavengers') return;
- if (plugins.scavengers.status !== 'on') return this.sendReply('There is no active scavenger hunt.');
- if (user.userid in plugins.scavengers.participants) return this.sendReply('You are already participating in the current scavenger hunt.');
- plugins.scavengers.participants[user.userid] = {room: 0};
- this.sendReply('You joined the scavenger hunt! Use the command /scavenge to answer. The first hint is: ' + plugins.scavengers.hintOne);
- },
- scavenge: function (target, room, user) {
- if (room.id !== 'scavengers') return;
- if (plugins.scavengers.status !== 'on') return this.sendReply('There is no active scavenger hunt.');
- if (!plugins.scavengers.participants[user.userid]) return this.sendReply('You are not participating in the current scavenger hunt. Use the command /joinhunt to participate.');
- if (plugins.scavengers.participants[user.userid].room >= 3) return this.sendReply('You have already finished!');
- target = toId(target);
- var room = plugins.scavengers.participants[user.userid].room;
- if (plugins.scavengers[{0:'answerOne', 1:'answerTwo', 2:'answerThree'}[room]] === target) {
- plugins.scavengers.participants[user.userid].room++;
- room++;
- if (room < 3) {
- var hints = {1:'hintTwo', 2:'hintThree'};
- this.sendReply('Well done! Your ' + (room === 1 ? 'second' : 'final') + ' hint is: ' + plugins.scavengers[hints[room]]);
- } else {
- plugins.scavengers.finished.push(user.name);
- var position = plugins.scavengers.finished.length;
- var result = '' + Tools.escapeHTML(user.name) + ' has finished the hunt ';
- result += (position === 1) ? 'and is the winner!' : (position === 2) ? 'in 2nd place!' : (position === 3) ? 'in 3rd place!' : 'in ' + position + 'th place!';
- result += (position < 4 && plugins.scavengers.blitz ? ' [BLITZ]' : '');
- Rooms.rooms.scavengers.addRaw('' + result + '
');
- }
- } else {
- this.sendReply('That is not the answer - try again!');
- }
- },
- scavengerhint: 'scavengerstatus',
- scavengerstatus: function (target, room, user) {
- if (room.id !== 'scavengers') return;
- if (plugins.scavengers.status !== 'on') return this.sendReply('There is no active scavenger hunt.');
- if (!plugins.scavengers.participants[user.userid]) return this.sendReply('You are not participating in the current scavenger hunt. Use the command /joinhunt to participate.');
- if (plugins.scavengers.participants[user.userid].room >= 3) return this.sendReply('You have finished the current scavenger hunt.');
- var hints = {0:'hintOne', 1:'hintTwo', 2:'hintThree'};
- var room = plugins.scavengers.participants[user.userid].room;
- this.sendReply('You are on hint number ' + (room + 1) + ': ' + plugins.scavengers[hints[room]]);
- },
- endhunt: function (target, room, user) {
- if (room.id !== 'scavengers') return;
- if (!this.can('mute', null, room)) return false;
- if (plugins.scavengers.status !== 'on') return this.sendReply('There is no active scavenger hunt.');
- var winner = plugins.scavengers.finished[0];
- var second = plugins.scavengers.finished[1];
- var third = plugins.scavengers.finished[2];
- var consolation = plugins.scavengers.finished.slice(3).join(', ');
- var result = 'The Scavenger Hunt was ended by ' + Tools.escapeHTML(user.name) + '. ';
- if (winner) {
- result += '
Winner: ' + Tools.escapeHTML(winner) + '.';
- if (second) result += ' Second place: ' + Tools.escapeHTML(second) + '.';
- if (third) result += ' Third place: ' + Tools.escapeHTML(third) + '.';
- if (consolation) result += ' Consolation prize to: ' + Tools.escapeHTML(consolation) + '.';
- } else {
- result += 'No user has completed the hunt.';
- }
- result += '
Solution: ' + Tools.escapeHTML(plugins.scavengers.answerOne) + ', ' + Tools.escapeHTML(plugins.scavengers.answerTwo) + ', ' + Tools.escapeHTML(plugins.scavengers.answerThree) + '.';
- plugins.scavengers.result = result;
- this.parse('/resethunt');
- },
- resethunt: function (target, room, user) {
- if (room.id !== 'scavengers') return;
- if (!this.can('mute', null, room)) return false;
- if (plugins.scavengers.status !== 'on') return this.sendReply('There is no active scavenger hunt.');
- plugins.scavengers.status = 'off';
- if (plugins.scavengers.blitz) clearTimeout(plugins.scavengers.blitz);
- plugins.scavengers.blitz = null;
- plugins.scavengers.hintOne = '';
- plugins.scavengers.answerOne = '';
- plugins.scavengers.hintTwo = '';
- plugins.scavengers.answerTwo = '';
- plugins.scavengers.hintThree = '';
- plugins.scavengers.answerThree = '';
- plugins.scavengers.participants = {};
- plugins.scavengers.finished = [];
- if (plugins.scavengers.result) {
- Rooms.rooms.scavengers.addRaw('' + plugins.scavengers.result + '
');
- } else {
- Rooms.rooms.scavengers.addRaw('The Scavenger Hunt was reset by ' + Tools.escapeHTML(user.name) + '.
');
- }
- plugins.scavengers.result = null;
- },
- scavengershelp: 'scavengerhelp',
- scavengerhelp: function (target, room, user) {
- if (room.id !== 'scavengers') return;
- if (!this.canBroadcast()) return;
- this.sendReplyBox(
- 'Player commands:
' +
- '- /scavengers - Join the scavengers room
' +
- '- /joinhunt - Join the current scavenger hunt
' +
- '- /scavenge guess - Attempt to answer the hint
' +
- '- /scavengerstatus - Get your current game status
' +
- '
' +
- 'Staff commands:
' +
- '- /starthunt hint, answer, hint, answer, hint, answer - Start a new scavenger hunt (Requires: % @ # & ~)
' +
- '- /startofficialhunt hint, answer, hint, answer, hint, answer - Start an official hunt with 60 seconds blitz period (Requires: @ # & ~)
' +
- '- /endhunt - Finish the current hunt and announce the winners (Requires: % @ # & ~)
' +
- '- /resethunt - Reset the scavenger hunt to mint status (Requires: % @ # & ~)'
- );
- }
- }
- },
-
- /**
- * The Studio: Artist of the Day Plugin
- * This is a daily activity where users get to nominate an artist to be Artist of the day, and it's randomly selected
- * Only works in a room with the id "The Studio"
- */
- studio: {
- commands: {
- startaotd: function () {
- return this.parse('/toggleaotd on');
- },
-
- endaotd: function () {
- return this.parse('/toggleaotd off');
- },
-
- taotd: 'toggleaotd',
- toggleaotd: function (target, room, user) {
- if (room.id !== 'thestudio') return this.sendReply("This command can only be used in The Studio.");
- if (!this.canTalk()) return;
- if (!this.can('mute', null, room)) return;
- if (!target) {
- return this.sendReply("/toggleaotd [on / off] - If on, this will start AOTD, if off, this will no longer allow people to use /naotd.");
- }
- if (target === 'on') {
- if (room.aotdOn == true) return this.sendReply("The Artist of the Day has already started.");
- room.addRaw(
- '' +
- 'Artist of the Day has started!
' +
- "(Started by " + Tools.escapeHTML(user.name) + ")
" +
- "Use /naotd [artist] to nominate an artist!
" +
- ' '
- );
- room.aotdOn = true;
- this.logModCommand("Artist of the Day was started by " + Tools.escapeHTML(user.name) + ".");
- }
- if (target === 'off') {
- if (!room.aotdOn) return this.sendReply("The Artist of the Day has already ended.");
- room.addRaw("Nominations are over! (Turned off by " + Tools.escapeHTML(user.name) + ")");
- room.aotdOn = false;
- }
- },
-
- aotdfaq: 'aotdhelp',
- aotdhelp: function (target, room) {
- if (!this.canBroadcast()) return;
- if (room.id !== 'thestudio') return this.sendReply("This command can only be used in The Studio.");
- this.sendReplyBox(
- "Artist of the Day:
" +
- "This is a room activity for The Studio where users nominate artists for the title of 'Artist of the Day'.
" +
- '' +
- "Command List:" +
- '
' +
- "- /naotd (artist) - This will nominate your artist of the day; only do this once, please.
" +
- "- /aotd - This allows you to see who the current Artist of the Day is.
" +
- "- /aotd (artist) - Sets an artist of the day. (requires %, @, #)
" +
- "- /startaotd - Will start AOTD (requires %, @, #)
" +
- "- /endaotd - Will turn off the use of /naotd, ending AOTD (requires %, @, #)
" +
- '
' +
- '' +
- "More information on Artist of the Day and these commands.
"
- );
- },
-
- nominateartistoftheday: 'naotd',
- naotd: function (target, room, user) {
- if (room.id !== 'thestudio') return this.sendReply("This command can only be used in The Studio.");
- if (!room.aotdOn) return this.sendReply("The Artist of the Day has already been chosen.");
- if (!target) return this.sendReply("/naotd [artist] - Nominates an artist for Artist of the Day.");
- if (target.length > 25) return this.sendReply("This Artist's name is too long; it cannot exceed 25 characters.");
- if (!this.canTalk()) return;
- room.addRaw(Tools.escapeHTML(user.name) + "'s nomination for Artist of the Day is: " + Tools.escapeHTML(target) + "");
- },
-
- artistoftheday: 'aotd',
- aotd: function (target, room, user) {
- if (room.id !== 'thestudio') return this.sendReply("This command can only be used in The Studio.");
- if (!target) {
- if (!this.canBroadcast()) return;
- this.sendReplyBox("The current Artist of the Day is: " + Tools.escapeHTML(room.aotd) + "");
- return;
- }
- if (!this.canTalk()) return;
- if (target.length > 25) return this.sendReply("This Artist\'s name is too long; it cannot exceed 25 characters.");
- if (!this.can('mute', null, room)) return;
- room.aotd = target;
- room.addRaw(
- '' +
- "
The Artist of the Day is now " + Tools.escapeHTML(target) + "
" +
- "
(Set by " + Tools.escapeHTML(user.name) + ".)
" +
- "
This Artist will be posted on our Artist of the Day page.
" +
- '
'
- );
- room.aotdOn = false;
- this.logModCommand("The Artist of the Day was changed to " + Tools.escapeHTML(target) + " by " + Tools.escapeHTML(user.name) + ".");
- }
- }
- },
-
- /**
- * The Happy Place: Quote of the Day Plugin
- * This is a command that allows a room owner to set an inspirational "quote" of the day.
- * Others may braodcast this at any time to remind the room of such.
- * Only works in a room with the id "The Happy Place"
- * Credits: panpawn, TalkTakesTime, Morfent, and sirDonovan
- */
- happy: {
- quote: "",
- commands: {
- quoteoftheday: 'qotd',
- qotd: function (target, room, user) {
- if (room.id !== 'thehappyplace') return this.sendReply("This command can only be used in The Happy Place.");
- if (!this.canBroadcast()) return;
- if (!target) {
- if (!plugins.happy.quote) return this.sendReplyBox("The Quote of the Day has not been set.");
- return this.sendReplyBox("The current 'Inspirational Quote of the Day' is:
" + plugins.happy.quote);
- }
- if (!this.can('declare', null, room)) return false;
- if (target === 'off' || target === 'disable' || target === 'reset') {
- if (!plugins.happy.quote) return this.sendReply("The Quote of the Day has already been reset.");
- plugins.happy.quote = "";
- this.sendReply("The Quote of the Day was reset by " + Tools.escapeHTML(user.name) + ".");
- this.logModCommand(user.name + " has reset the Quote of the Day.");
- return;
- }
- plugins.happy.quote = Tools.escapeHTML(target);
- room.addRaw(
- '' +
- "
The 'Inspirational Quote of the Day' has been updated by " + Tools.escapeHTML(user.name) + ".
" +
- "
Quote: " + plugins.happy.quote + '
' +
- '
'
- );
- this.logModCommand(Tools.escapeHTML(user.name) + " has updated the quote of the day to: " + plugins.happy.quote);
- }
- }
- }
-};
diff --git a/chat-plugins/scavengers.js b/chat-plugins/scavengers.js
new file mode 100644
index 0000000000..8cd35303bf
--- /dev/null
+++ b/chat-plugins/scavengers.js
@@ -0,0 +1,139 @@
+/**
+* Scavenger hunts plugin. Only works in a room with the id 'scavengers'.
+* This game shows a hint. Once a player submits the correct answer, they move on to the next hint.
+* You finish upon correctly answering the third hint.
+* In an official hunt, the first three to finish within 60 seconds achieve blitz.
+*/
+
+var status = 'off';
+var blitz = null;
+var hints = null;
+var answers = null;
+var participants = {};
+var finished = [];
+var result = null;
+
+exports.commands = {
+ scavenger: 'scavengers',
+ scavengers: function (target, room, user) {
+ return this.parse('/join scavengers');
+ },
+ startofficialhunt: 'starthunt',
+ starthunt: function (target, room, user, connection, cmd) {
+ if (room.id !== 'scavengers') return;
+ if (!this.can('mute', null, room)) return false;
+ if (status === 'on') return this.sendReply('There is already an active scavenger hunt.');
+ var targets = target.split(',');
+ if (!targets[0] || !targets[1] || !targets[2] || !targets[3] || !targets[4] || !targets[5] || targets[6]) {
+ return this.sendReply('You must specify three hints and three answers.');
+ }
+ status = 'on';
+ if (cmd === 'startofficialhunt') {
+ if (!this.can('ban', null, room)) return false;
+ blitz = setTimeout(function () {
+ blitz = null;
+ }, 60000);
+ }
+ hints = [targets[0].trim(), targets[2].trim(), targets[4].trim()];
+ answers = [toId(targets[1]), toId(targets[3]), toId(targets[5])];
+ var result = (cmd === 'startofficialhunt' ? 'An official' : 'A new') + ' Scavenger Hunt has been started by ' + Tools.escapeHTML(user.name) + '! The first hint is: ' + Tools.escapeHTML(hints[0]);
+ Rooms.rooms.scavengers.addRaw('' + result + '
');
+ },
+ joinhunt: function (target, room, user) {
+ if (room.id !== 'scavengers') return;
+ if (status !== 'on') return this.sendReply('There is no active scavenger hunt.');
+ if (user.userid in participants) return this.sendReply('You are already participating in the current scavenger hunt.');
+ participants[user.userid] = {room: 0};
+ this.sendReply('You joined the scavenger hunt! Use the command /scavenge to answer. The first hint is: ' + hints[0]);
+ },
+ scavenge: function (target, room, user) {
+ if (room.id !== 'scavengers') return;
+ if (status !== 'on') return this.sendReply('There is no active scavenger hunt.');
+ if (!participants[user.userid]) return this.sendReply('You are not participating in the current scavenger hunt. Use the command /joinhunt to participate.');
+ if (participants[user.userid].room >= 3) return this.sendReply('You have already finished!');
+ target = toId(target);
+ var room = participants[user.userid].room;
+ if (answers[room] === target) {
+ participants[user.userid].room++;
+ room++;
+ if (room < 3) {
+ this.sendReply('Well done! Your ' + (room === 1 ? 'second' : 'final') + ' hint is: ' + hints[room]);
+ } else {
+ finished.push(user.name);
+ var position = finished.length;
+ var result = '' + Tools.escapeHTML(user.name) + ' has finished the hunt ';
+ result += (position === 1) ? 'and is the winner!' : (position === 2) ? 'in 2nd place!' : (position === 3) ? 'in 3rd place!' : 'in ' + position + 'th place!';
+ result += (position < 4 && blitz ? ' [BLITZ]' : '');
+ Rooms.rooms.scavengers.addRaw('' + result + '
');
+ }
+ } else {
+ this.sendReply('That is not the answer - try again!');
+ }
+ },
+ scavengerhint: 'scavengerstatus',
+ scavengerstatus: function (target, room, user) {
+ if (room.id !== 'scavengers') return;
+ if (status !== 'on') return this.sendReply('There is no active scavenger hunt.');
+ if (!participants[user.userid]) return this.sendReply('You are not participating in the current scavenger hunt. Use the command /joinhunt to participate.');
+ if (participants[user.userid].room >= 3) return this.sendReply('You have finished the current scavenger hunt.');
+ var room = participants[user.userid].room;
+ this.sendReply('You are on hint number ' + (room + 1) + ': ' + hints[room]);
+ },
+ endhunt: function (target, room, user) {
+ if (room.id !== 'scavengers') return;
+ if (!this.can('mute', null, room)) return false;
+ if (status !== 'on') return this.sendReply('There is no active scavenger hunt.');
+ var winner = finished[0];
+ var second = finished[1];
+ var third = finished[2];
+ var consolation = finished.slice(3).join(', ');
+ var msg = 'The Scavenger Hunt was ended by ' + Tools.escapeHTML(user.name) + '. ';
+ if (winner) {
+ msg += '
Winner: ' + Tools.escapeHTML(winner) + '.';
+ if (second) msg += ' Second place: ' + Tools.escapeHTML(second) + '.';
+ if (third) msg += ' Third place: ' + Tools.escapeHTML(third) + '.';
+ if (consolation) msg += ' Consolation prize to: ' + Tools.escapeHTML(consolation) + '.';
+ } else {
+ msg += 'No user has completed the hunt.';
+ }
+ msg += '
Solution: ' + Tools.escapeHTML(answers.join(', ')) + '.';
+ result = msg;
+ this.parse('/resethunt');
+ },
+ resethunt: function (target, room, user) {
+ if (room.id !== 'scavengers') return;
+ if (!this.can('mute', null, room)) return false;
+ if (status !== 'on') return this.sendReply('There is no active scavenger hunt.');
+ status = 'off';
+ if (blitz) clearTimeout(blitz);
+ blitz = null;
+ hints = null;
+ answers = null;
+ participants = {};
+ finished = [];
+ if (result) {
+ Rooms.rooms.scavengers.addRaw('' + result + '
');
+ } else {
+ Rooms.rooms.scavengers.addRaw('The Scavenger Hunt was reset by ' + Tools.escapeHTML(user.name) + '.
');
+ }
+ result = null;
+ },
+ scavengershelp: 'scavengerhelp',
+ scavengerhelp: function (target, room, user) {
+ if (room.id !== 'scavengers') return;
+ if (!this.canBroadcast()) return;
+ this.sendReplyBox(
+ 'Player commands:
' +
+ '- /scavengers - Join the scavengers room
' +
+ '- /joinhunt - Join the current scavenger hunt
' +
+ '- /scavenge guess - Attempt to answer the hint
' +
+ '- /scavengerstatus - Get your current game status
' +
+ '
' +
+ 'Staff commands:
' +
+ '- /starthunt hint, answer, hint, answer, hint, answer - Start a new scavenger hunt (Requires: % @ # & ~)
' +
+ '- /startofficialhunt hint, answer, hint, answer, hint, answer - Start an official hunt with 60 seconds blitz period (Requires: @ # & ~)
' +
+ '- /endhunt - Finish the current hunt and announce the winners (Requires: % @ # & ~)
' +
+ '- /resethunt - Reset the scavenger hunt to mint status (Requires: % @ # & ~)'
+ );
+ }
+}
diff --git a/chat-plugins/thehappyplace.js b/chat-plugins/thehappyplace.js
new file mode 100644
index 0000000000..edb73795fb
--- /dev/null
+++ b/chat-plugins/thehappyplace.js
@@ -0,0 +1,37 @@
+/**
+* The Happy Place: Quote of the Day Plugin
+* This is a command that allows a room owner to set an inspirational "quote" of the day.
+* Others may braodcast this at any time to remind the room of such.
+* Only works in a room with the id "thehappyplace"
+* Credits: panpawn, TalkTakesTime, Morfent, and sirDonovan
+*/
+
+var quote = "";
+
+exports.commands = {
+ quoteoftheday: 'qotd',
+ qotd: function (target, room, user) {
+ if (room.id !== 'thehappyplace') return this.sendReply("This command can only be used in The Happy Place.");
+ if (!this.canBroadcast()) return;
+ if (!target) {
+ if (!quote) return this.sendReplyBox("The Quote of the Day has not been set.");
+ return this.sendReplyBox("The current 'Inspirational Quote of the Day' is:
" + quote);
+ }
+ if (!this.can('declare', null, room)) return false;
+ if (target === 'off' || target === 'disable' || target === 'reset') {
+ if (!quote) return this.sendReply("The Quote of the Day has already been reset.");
+ quote = "";
+ this.sendReply("The Quote of the Day was reset by " + Tools.escapeHTML(user.name) + ".");
+ this.logModCommand(user.name + " has reset the Quote of the Day.");
+ return;
+ }
+ quote = Tools.escapeHTML(target);
+ room.addRaw(
+ '' +
+ "
The 'Inspirational Quote of the Day' has been updated by " + Tools.escapeHTML(user.name) + ".
" +
+ "
Quote: " + quote + '
' +
+ '
'
+ );
+ this.logModCommand(Tools.escapeHTML(user.name) + " has updated the quote of the day to: " + quote);
+ }
+}
diff --git a/chat-plugins/thestudio.js b/chat-plugins/thestudio.js
new file mode 100644
index 0000000000..59171dc479
--- /dev/null
+++ b/chat-plugins/thestudio.js
@@ -0,0 +1,96 @@
+/**
+* The Studio: Artist of the Day Plugin
+* This is a daily activity where users get to nominate an artist to be Artist of the day, and it's randomly selected
+* Only works in a room with the id "thestudio"
+*/
+
+exports.commands = {
+ startaotd: function () {
+ return this.parse('/toggleaotd on');
+ },
+
+ endaotd: function () {
+ return this.parse('/toggleaotd off');
+ },
+
+ taotd: 'toggleaotd',
+ toggleaotd: function (target, room, user) {
+ if (room.id !== 'thestudio') return this.sendReply("This command can only be used in The Studio.");
+ if (!this.canTalk()) return;
+ if (!this.can('mute', null, room)) return;
+ if (!target) {
+ return this.sendReply("/toggleaotd [on / off] - If on, this will start AOTD, if off, this will no longer allow people to use /naotd.");
+ }
+ if (target === 'on') {
+ if (room.aotdOn == true) return this.sendReply("The Artist of the Day has already started.");
+ room.addRaw(
+ '' +
+ 'Artist of the Day has started!
' +
+ "(Started by " + Tools.escapeHTML(user.name) + ")
" +
+ "Use /naotd [artist] to nominate an artist!
" +
+ ' '
+ );
+ room.aotdOn = true;
+ this.logModCommand("Artist of the Day was started by " + Tools.escapeHTML(user.name) + ".");
+ }
+ if (target === 'off') {
+ if (!room.aotdOn) return this.sendReply("The Artist of the Day has already ended.");
+ room.addRaw("Nominations are over! (Turned off by " + Tools.escapeHTML(user.name) + ")");
+ room.aotdOn = false;
+ }
+ },
+
+ aotdfaq: 'aotdhelp',
+ aotdhelp: function (target, room) {
+ if (!this.canBroadcast()) return;
+ if (room.id !== 'thestudio') return this.sendReply("This command can only be used in The Studio.");
+ this.sendReplyBox(
+ "Artist of the Day:
" +
+ "This is a room activity for The Studio where users nominate artists for the title of 'Artist of the Day'.
" +
+ '' +
+ "Command List:" +
+ '
' +
+ "- /naotd (artist) - This will nominate your artist of the day; only do this once, please.
" +
+ "- /aotd - This allows you to see who the current Artist of the Day is.
" +
+ "- /aotd (artist) - Sets an artist of the day. (requires %, @, #)
" +
+ "- /startaotd - Will start AOTD (requires %, @, #)
" +
+ "- /endaotd - Will turn off the use of /naotd, ending AOTD (requires %, @, #)
" +
+ '
' +
+ '' +
+ "More information on Artist of the Day and these commands.
"
+ );
+ },
+
+ nominateartistoftheday: 'naotd',
+ naotd: function (target, room, user) {
+ if (room.id !== 'thestudio') return this.sendReply("This command can only be used in The Studio.");
+ if (!room.aotdOn) return this.sendReply("The Artist of the Day has already been chosen.");
+ if (!target) return this.sendReply("/naotd [artist] - Nominates an artist for Artist of the Day.");
+ if (target.length > 25) return this.sendReply("This Artist's name is too long; it cannot exceed 25 characters.");
+ if (!this.canTalk()) return;
+ room.addRaw(Tools.escapeHTML(user.name) + "'s nomination for Artist of the Day is: " + Tools.escapeHTML(target) + "");
+ },
+
+ artistoftheday: 'aotd',
+ aotd: function (target, room, user) {
+ if (room.id !== 'thestudio') return this.sendReply("This command can only be used in The Studio.");
+ if (!target) {
+ if (!this.canBroadcast()) return;
+ this.sendReplyBox("The current Artist of the Day is: " + Tools.escapeHTML(room.aotd) + "");
+ return;
+ }
+ if (!this.canTalk()) return;
+ if (target.length > 25) return this.sendReply("This Artist\'s name is too long; it cannot exceed 25 characters.");
+ if (!this.can('mute', null, room)) return;
+ room.aotd = target;
+ room.addRaw(
+ '' +
+ "
The Artist of the Day is now " + Tools.escapeHTML(target) + "
" +
+ "
(Set by " + Tools.escapeHTML(user.name) + ".)
" +
+ "
This Artist will be posted on our Artist of the Day page.
" +
+ '
'
+ );
+ room.aotdOn = false;
+ this.logModCommand("The Artist of the Day was changed to " + Tools.escapeHTML(target) + " by " + Tools.escapeHTML(user.name) + ".");
+ }
+}
diff --git a/command-parser.js b/command-parser.js
index bd9f4d54c5..add7271553 100644
--- a/command-parser.js
+++ b/command-parser.js
@@ -399,7 +399,7 @@ if (customCommands && customCommands.commands) {
/*********************************************************
* Install plug-in commands
*********************************************************/
-var plugins = require('./chat-plugins.js').plugins;
-for (var p in plugins) {
- if (plugins[p].commands) Object.merge(commands, plugins[p].commands);
-}
+
+fs.readdirSync('./chat-plugins').forEach(function (file) {
+ Object.merge(commands, require('./chat-plugins/' + file).commands);
+});