359 lines
12 KiB
JavaScript
359 lines
12 KiB
JavaScript
/*
|
|
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* commandCoolDown.js
|
|
*
|
|
* Manage cooldowns for commands
|
|
*
|
|
* To use the cooldown in other scipts use the $.coolDown API
|
|
*/
|
|
|
|
(function() {
|
|
var defaultCooldownTime = $.getSetIniDbNumber('cooldownSettings', 'defaultCooldownTime', 5),
|
|
modCooldown = $.getSetIniDbBoolean('cooldownSettings', 'modCooldown', false),
|
|
defaultCooldowns = {},
|
|
cooldowns = {};
|
|
|
|
$.raffleCommand = null;
|
|
|
|
/*
|
|
* @class Cooldown
|
|
*
|
|
* @param {String} command
|
|
* @param {Number} seconds
|
|
* @param {Boolean} isGlobal
|
|
*/
|
|
function Cooldown(command, seconds, isGlobal) {
|
|
this.isGlobal = isGlobal;
|
|
this.command = command;
|
|
this.seconds = seconds;
|
|
this.cooldowns = [];
|
|
this.time = 0;
|
|
}
|
|
|
|
/*
|
|
* @function loadCooldowns
|
|
*/
|
|
function loadCooldowns() {
|
|
var commands = $.inidb.GetKeyList('cooldown', ''),
|
|
json,
|
|
i;
|
|
|
|
for (i in commands) {
|
|
json = JSON.parse($.inidb.get('cooldown', commands[i]));
|
|
|
|
cooldowns[commands[i]] = new Cooldown(json.command, json.seconds, json.isGlobal.toString().equals('true'));
|
|
}
|
|
}
|
|
|
|
/*
|
|
* @function canIgnore
|
|
*
|
|
* @param {String} username
|
|
* @param {Boolean} isMod
|
|
* @return {Boolean}
|
|
*/
|
|
function canIgnore(username, isMod) {
|
|
return (!modCooldown && isMod) || $.isAdmin(username);
|
|
}
|
|
|
|
/*
|
|
* @function isSpecial
|
|
*
|
|
* @param {String} command
|
|
* @return {Boolean}
|
|
*/
|
|
function isSpecial(command) {
|
|
return command == 'bet' ||
|
|
command == 'tickets' ||
|
|
command == 'bid' ||
|
|
command == 'adventure' ||
|
|
command == 'vote' ||
|
|
command == 'joinqueue' ||
|
|
command == $.raffleCommand;
|
|
}
|
|
|
|
/*
|
|
* @function get
|
|
*
|
|
* @export $.coolDown
|
|
* @param {String} command
|
|
* @param {String} username
|
|
* @param {Boolean} isMod
|
|
* @return {Number}
|
|
*/
|
|
function get(command, username, isMod) {
|
|
var cooldown = cooldowns[command];
|
|
|
|
if (isSpecial(command)) {
|
|
if (command == 'adventure' && defaultCooldowns[command] !== undefined && defaultCooldowns[command] > $.systemTime()) {
|
|
return defaultCooldowns[command];
|
|
} else {
|
|
return 0;
|
|
}
|
|
} else {
|
|
if (cooldown !== undefined && cooldown.seconds > 0) {
|
|
if (cooldown.isGlobal) {
|
|
if (cooldown.time > $.systemTime()) {
|
|
return (canIgnore(username, isMod) ? 0 : cooldown.time);
|
|
} else {
|
|
return set(command, true, cooldown.seconds, isMod);
|
|
}
|
|
} else {
|
|
if (cooldown.cooldowns[username] !== undefined && cooldown.cooldowns[username] > $.systemTime()) {
|
|
return (canIgnore(username, isMod) ? 0 : cooldown.cooldowns[username]);
|
|
} else {
|
|
return set(command, true, cooldown.seconds, isMod, username);
|
|
}
|
|
}
|
|
} else {
|
|
if (defaultCooldowns[command] !== undefined && defaultCooldowns[command] > $.systemTime()) {
|
|
return (canIgnore(username, isMod) ? 0 : defaultCooldowns[command]);
|
|
} else {
|
|
return set(command, false, defaultCooldownTime, isMod);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* @function getSecs
|
|
*
|
|
* @export $.coolDown
|
|
* @param {String} command
|
|
* @param {String} username
|
|
* @return {Number}
|
|
*/
|
|
function getSecs(username, command, isMod) {
|
|
var cooldown = cooldowns[command];
|
|
|
|
if (cooldown !== undefined && cooldown.seconds > 0) {
|
|
if (cooldown.isGlobal) {
|
|
if (cooldown.time > $.systemTime()) {
|
|
return (cooldown.time - $.systemTime() > 1000 ? Math.ceil(((cooldown.time - $.systemTime()) / 1000)) : 1);
|
|
} else {
|
|
return set(command, true, cooldown.seconds, isMod);
|
|
}
|
|
} else {
|
|
if (cooldown.cooldowns[username] !== undefined && cooldown.cooldowns[username] > $.systemTime()) {
|
|
return (cooldown.cooldowns[username] - $.systemTime() > 1000 ? Math.ceil(((cooldown.cooldowns[username] - $.systemTime()) / 1000)) : 1);
|
|
}
|
|
}
|
|
} else {
|
|
if (defaultCooldowns[command] !== undefined && defaultCooldowns[command] > $.systemTime()) {
|
|
return (defaultCooldowns[command] - $.systemTime() > 1000 ? Math.ceil(((defaultCooldowns[command] - $.systemTime()) / 1000)) : 1);
|
|
} else {
|
|
return set(command, false, defaultCooldownTime, isMod);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* @function set
|
|
*
|
|
* @export $.coolDown
|
|
* @param {String} command
|
|
* @param {Boolean} hasCooldown
|
|
* @param {Number} seconds
|
|
* @param {Boolean} isMod
|
|
* @param {String} username
|
|
* @return {Number}
|
|
*/
|
|
function set(command, hasCooldown, seconds, isMod, username) {
|
|
seconds = (seconds > 0 ? ((parseInt(seconds) * 1e3) + $.systemTime()) : 0);
|
|
|
|
if (hasCooldown) {
|
|
if (username === undefined) {
|
|
cooldowns[command].time = seconds;
|
|
} else {
|
|
cooldowns[command].cooldowns[username] = seconds;
|
|
}
|
|
} else {
|
|
defaultCooldowns[command] = seconds;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* @function add
|
|
*
|
|
* @export $.coolDown
|
|
* @param {String} command
|
|
* @param {Number} seconds
|
|
* @param {Boolean} isGlobal
|
|
*/
|
|
function add(command, seconds, isGlobal) {
|
|
// Make sure we have the right type.
|
|
if (typeof seconds !== 'number') {
|
|
seconds = (parseInt(seconds + ''));
|
|
}
|
|
|
|
if (cooldowns[command] === undefined) {
|
|
cooldowns[command] = new Cooldown(command, seconds, isGlobal);
|
|
$.inidb.set('cooldown', command, JSON.stringify({
|
|
command: String(command),
|
|
seconds: String(seconds),
|
|
isGlobal: String(isGlobal)
|
|
}));
|
|
} else {
|
|
cooldowns[command].isGlobal = isGlobal;
|
|
cooldowns[command].seconds = seconds;
|
|
$.inidb.set('cooldown', command, JSON.stringify({
|
|
command: String(command),
|
|
seconds: String(seconds),
|
|
isGlobal: String(isGlobal)
|
|
}));
|
|
}
|
|
}
|
|
|
|
/*
|
|
* @function remove
|
|
*
|
|
* @export $.coolDown
|
|
* @param {String} command
|
|
*/
|
|
function remove(command) {
|
|
$.inidb.del('cooldown', command);
|
|
if (cooldowns[command] !== undefined) {
|
|
delete cooldowns[command];
|
|
}
|
|
}
|
|
|
|
/*
|
|
* @function clear
|
|
*
|
|
* @export $.coolDown
|
|
* @param {String} command
|
|
*/
|
|
function clear(command) {
|
|
if (cooldowns[command] !== undefined) {
|
|
cooldowns[command].time = 0;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* @event command
|
|
*/
|
|
$.bind('command', function(event) {
|
|
var sender = event.getSender(),
|
|
command = event.getCommand(),
|
|
args = event.getArgs(),
|
|
action = args[0],
|
|
subAction = args[1],
|
|
actionArgs = args[2];
|
|
|
|
/*
|
|
* @commandpath coolcom [command] [seconds] [type (global / user)] - Sets a cooldown for a command, default is global. Using -1 for the seconds removes the cooldown.
|
|
*/
|
|
if (command.equalsIgnoreCase('coolcom')) {
|
|
if (action === undefined || isNaN(parseInt(subAction))) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('cooldown.coolcom.usage'));
|
|
return;
|
|
}
|
|
|
|
actionArgs = (actionArgs !== undefined && actionArgs == 'user' ? false : true);
|
|
action = action.replace('!', '').toLowerCase();
|
|
subAction = parseInt(subAction);
|
|
|
|
if (subAction > -1) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('cooldown.coolcom.set', action, subAction));
|
|
add(action, subAction, actionArgs);
|
|
} else {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('cooldown.coolcom.remove', action));
|
|
remove(action);
|
|
}
|
|
clear(command);
|
|
return;
|
|
}
|
|
|
|
if (command.equalsIgnoreCase('cooldown')) {
|
|
if (action === undefined) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('cooldown.cooldown.usage'));
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* @commandpath cooldown togglemoderators - Toggles if moderators ignore command cooldowns.
|
|
*/
|
|
if (action.equalsIgnoreCase('togglemoderators')) {
|
|
modCooldown = !modCooldown;
|
|
$.setIniDbBoolean('cooldownSettings', 'modCooldown', modCooldown);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('cooldown.set.togglemodcooldown', (modCooldown ? $.lang.get('common.enabled') : $.lang.get('common.disabled'))));
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* @commandpath cooldown setdefault [seconds] - Sets a default global cooldown for commands without a cooldown.
|
|
*/
|
|
if (action.equalsIgnoreCase('setdefault')) {
|
|
if (isNaN(parseInt(subAction))) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('cooldown.default.usage'));
|
|
return;
|
|
} else if (parseInt(subAction) < 5) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('cooldown.coolcom.err'));
|
|
return;
|
|
}
|
|
|
|
defaultCooldownTime = parseInt(subAction);
|
|
$.setIniDbNumber('cooldownSettings', 'defaultCooldownTime', defaultCooldownTime);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('cooldown.default.set', defaultCooldownTime));
|
|
}
|
|
}
|
|
});
|
|
|
|
/*
|
|
* @event initReady
|
|
*/
|
|
$.bind('initReady', function() {
|
|
$.registerChatCommand('./core/commandCoolDown.js', 'coolcom', 1);
|
|
|
|
$.registerChatCommand('./core/commandCoolDown.js', 'cooldown', 1);
|
|
$.registerChatSubcommand('cooldown', 'togglemoderators', 1);
|
|
$.registerChatSubcommand('cooldown', 'setdefault', 1);
|
|
loadCooldowns();
|
|
});
|
|
|
|
/*
|
|
* @event webPanelSocketUpdate
|
|
*/
|
|
$.bind('webPanelSocketUpdate', function(event) {
|
|
if (event.getScript().equalsIgnoreCase('./core/commandCoolDown.js')) {
|
|
if (event.getArgs()[0] == 'add') {
|
|
add(event.getArgs()[1], event.getArgs()[2], event.getArgs()[3].equals('true'));
|
|
} else if (event.getArgs()[0] == 'update') {
|
|
defaultCooldownTime = $.getIniDbNumber('cooldownSettings', 'defaultCooldownTime', 5);
|
|
modCooldown = $.getIniDbBoolean('cooldownSettings', 'modCooldown', false);
|
|
} else {
|
|
remove(event.getArgs()[1]);
|
|
}
|
|
}
|
|
});
|
|
|
|
/* Export to the $. API */
|
|
$.coolDown = {
|
|
remove: remove,
|
|
clear: clear,
|
|
get: get,
|
|
set: set,
|
|
add: add,
|
|
getSecs: getSecs
|
|
};
|
|
})();
|