420 lines
16 KiB
JavaScript
420 lines
16 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/>.
|
|
*/
|
|
|
|
/**
|
|
* Provides for a configurable rank system with various different configurable ranks
|
|
* based on time spent in the channel. This is just aesthetic but could, in theory,
|
|
* be used for other purposes if really desired.
|
|
*/
|
|
|
|
(function() {
|
|
|
|
var rankEligableTime = $.getSetIniDbNumber('settings', 'rankEligableTime', 50),
|
|
rankEligableCost = $.getSetIniDbNumber('settings', 'rankEligableCost', 200),
|
|
time,
|
|
ranksTimeTable;
|
|
|
|
/**
|
|
* @function sortCompare
|
|
* Callback function for sorting the ranksMapping table.
|
|
*/
|
|
function sortCompare(a, b) {
|
|
var numA = parseInt(a),
|
|
numB = parseInt(b);
|
|
|
|
if (numA > numB) {
|
|
return 1;
|
|
} else if (numA == numB) {
|
|
return 0;
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @function loadRanksTimeTable
|
|
* Loads the time portion of the ranksMapping table into local memory and sorts it.
|
|
* The table is then used to map to the rank that a person belongs to.
|
|
*/
|
|
function loadRanksTimeTable() {
|
|
ranksTimeTable = $.inidb.GetKeyList('ranksMapping', '');
|
|
ranksTimeTable.sort(sortCompare);
|
|
}
|
|
|
|
/**
|
|
* @function hasRank
|
|
* @export $
|
|
* @param {string} username
|
|
* @param {int} time (optional) Time for the user in seconds. If not set, read from the DB.
|
|
* @returns {boolean}
|
|
*/
|
|
function hasRank(username) {
|
|
var userTime;
|
|
|
|
username = username.toLowerCase();
|
|
|
|
// Has a custom rank.
|
|
if ($.inidb.exists('viewerRanks', username.toLowerCase())) {
|
|
return true;
|
|
}
|
|
|
|
// Look for data in the ranksMapping table, if none, the user has no rank, else, has a rank.
|
|
if (ranksTimeTable === undefined) {
|
|
loadRanksTimeTable();
|
|
}
|
|
if (ranksTimeTable.length == 0) {
|
|
return false;
|
|
}
|
|
|
|
if (time === undefined) {
|
|
time = parseInt($.inidb.get('time', username));
|
|
}
|
|
userTime = parseInt(time / 3600);
|
|
if (isNaN(userTime)) {
|
|
userTime = 0;
|
|
}
|
|
for (var i = 0; i < ranksTimeTable.length; i++) {
|
|
if (parseInt(userTime) >= parseInt(ranksTimeTable[i])) {
|
|
return true;
|
|
} else {
|
|
i = ranksTimeTable.length;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @function getRank
|
|
* @export $
|
|
* @param {string} username
|
|
* @param {int} time (optional) Time for the user in seconds. If not set, read from the DB.
|
|
* @returns {string}
|
|
*/
|
|
function getRank(username, time) {
|
|
var userTime,
|
|
userLevel;
|
|
|
|
username = username.toLowerCase();
|
|
|
|
if (!hasRank(username, time)) {
|
|
return '';
|
|
}
|
|
|
|
// Return Custom Rank
|
|
if ($.inidb.exists('viewerRanks', username.toLowerCase())) {
|
|
return $.inidb.get('viewerRanks', username.toLowerCase());
|
|
}
|
|
|
|
// Return System Rank
|
|
userLevel = -1;
|
|
if (time === undefined) {
|
|
time = parseInt($.inidb.get('time', username));
|
|
}
|
|
userTime = parseInt(time / 3600);
|
|
if (isNaN(userTime)) {
|
|
userTime = 0;
|
|
}
|
|
for (var i = 0; i < ranksTimeTable.length; i++) {
|
|
if (parseInt(userTime) >= parseInt(ranksTimeTable[i])) {
|
|
userLevel = i;
|
|
} else {
|
|
i = ranksTimeTable.length;
|
|
}
|
|
}
|
|
if (userLevel != -1) {
|
|
return $.inidb.get('ranksMapping', ranksTimeTable[userLevel].toString());
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* @function resolveRank
|
|
* @export $
|
|
* @param {string} username
|
|
* @param {boolean} resolveName
|
|
* @returns {string}
|
|
*/
|
|
function resolveRank(username) {
|
|
return (getRank(username.toLowerCase()) + ' ' + ($.username.hasUser(username) == true ? $.username.get(username) : username)).trim();
|
|
}
|
|
|
|
/**
|
|
* @event command
|
|
*/
|
|
$.bind('command', function(event) {
|
|
var command = event.getCommand(),
|
|
args = event.getArgs(),
|
|
sender = event.getSender().toLowerCase(),
|
|
username = $.username.resolve(sender),
|
|
levelTime,
|
|
levelName,
|
|
userTime = parseInt(parseInt($.inidb.get('time', sender)) / 3600),
|
|
rankEligableTime = $.getIniDbNumber('settings', 'rankEligableTime', 50),
|
|
rankEligableCost = $.getIniDbNumber('settings', 'rankEligableCost', 200),
|
|
userLevel,
|
|
timeUntilNextRank,
|
|
nextLevel,
|
|
isReplace,
|
|
customUser,
|
|
customRank;
|
|
|
|
if (isNaN(userTime)) {
|
|
userTime = 0;
|
|
}
|
|
|
|
/*
|
|
* @commandpath rankedit - Displays the usage of rankedit.
|
|
* @commandpath rankedit add [time] [rankname] - Add a new rank. Time is in hours.
|
|
* @commandpath rankedit del [time] - Deletes the rank associated with the given time
|
|
* @commandpath rankedit custom [user] [rankname] - Add a custom rank to a user.
|
|
* @commandpath rankedit customdel [user] - Remove a custom rank from a user.
|
|
* @commandpath rankedit settime [time] - Number of minimum hours before user can choose custom rank.
|
|
* @commandpath rankedit setcost [points] - Cost of custom rank.
|
|
*/
|
|
if (command.equalsIgnoreCase('rankedit')) {
|
|
if (!args[0]) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.edit.usage'));
|
|
return;
|
|
}
|
|
|
|
if (args[0].equalsIgnoreCase('settime')) {
|
|
if (args.length < 2) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.settime.usage'));
|
|
return;
|
|
}
|
|
|
|
if (isNaN(args[1])) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.settime.usage'));
|
|
return;
|
|
}
|
|
|
|
rankEligableTime = parseInt(args[1]);
|
|
$.inidb.set('settings', 'rankEligableTime', rankEligableTime);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.settime.success', rankEligableTime));
|
|
return;
|
|
}
|
|
|
|
if (args[0].equalsIgnoreCase('setcost')) {
|
|
if (args.length < 2) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.setcost.usage', $.pointNameMultiple));
|
|
return;
|
|
}
|
|
|
|
if (isNaN(args[1])) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.setcost.usage', $.pointNameMultiple));
|
|
return;
|
|
}
|
|
|
|
rankEligableCost = parseInt(args[1]);
|
|
$.inidb.set('settings', 'rankEligableCost', rankEligableCost);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.setcost.success', rankEligableCost, $.pointNameMultiple));
|
|
return;
|
|
}
|
|
|
|
if (args[0].equalsIgnoreCase('custom')) {
|
|
if (args.length < 3) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.custom.usage'));
|
|
return;
|
|
}
|
|
|
|
customUser = args[1];
|
|
customRank = args.splice(2).join(' ');
|
|
|
|
if (!$.inidb.exists('time', customUser.toLowerCase())) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.custom.404', customUser));
|
|
return;
|
|
}
|
|
|
|
$.inidb.set('viewerRanks', customUser.toLowerCase(), customRank);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.custom.success', $.username.resolve(customUser), customRank));
|
|
return;
|
|
}
|
|
|
|
if (args[0].equalsIgnoreCase('customdel')) {
|
|
if (args.length < 2) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.customdel.usage'));
|
|
return;
|
|
}
|
|
|
|
customUser = args[1];
|
|
|
|
if (!$.inidb.exists('viewerRanks', customUser.toLowerCase())) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.customdel.404', customUser));
|
|
return;
|
|
}
|
|
|
|
$.inidb.del('viewerRanks', customUser.toLowerCase());
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.customdel.success', $.username.resolve(customUser)));
|
|
return;
|
|
}
|
|
|
|
if (args[0].equalsIgnoreCase('add')) {
|
|
if (args.length < 3) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.add.usage'));
|
|
return;
|
|
}
|
|
if (isNaN(args[1])) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.add.usage'));
|
|
return;
|
|
}
|
|
|
|
levelTime = args[1];
|
|
levelName = args.splice(2).join(' ');
|
|
|
|
isReplace = $.inidb.exists('ranksMapping', levelTime);
|
|
$.inidb.set('ranksMapping', levelTime, levelName);
|
|
if (isReplace) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.add.success-update', levelTime, levelName));
|
|
} else {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.add.success-new', levelTime, levelName));
|
|
}
|
|
|
|
if (!isReplace) {
|
|
loadRanksTimeTable();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (args[0].equalsIgnoreCase('del')) {
|
|
if (args.length < 2) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.del.usage'));
|
|
return;
|
|
}
|
|
|
|
if (!$.inidb.exists('ranksMapping', args[1])) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.del.404', args[1]));
|
|
} else {
|
|
$.inidb.del('ranksMapping', args[1]);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.del.success', args[1]));
|
|
loadRanksTimeTable();
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @commandpath rank - Display current rank.
|
|
* @commandpath rank set [rankname] - Set rank for self if enough hours and points, if applicable, available in chat.
|
|
* @commandpath rank del - Deletes customized rank.
|
|
*/
|
|
if (command.equalsIgnoreCase('rank')) {
|
|
if (args[0]) {
|
|
if (args[0].equalsIgnoreCase('del')) {
|
|
if (inidb.exists('viewerRanks', sender.toLowerCase())) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.delself.success'));
|
|
$.inidb.del('viewerRanks', sender.toLowerCase());
|
|
} else {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.delself.404'));
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (args[0].equalsIgnoreCase('set')) {
|
|
if (!args[1]) {
|
|
if ($.bot.isModuleEnabled('./systems/pointSystem.js')) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.set.usage', rankEligableTime, rankEligableCost, $.pointNameMultiple));
|
|
} else {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.set.usage.nopoints', rankEligableTime));
|
|
}
|
|
return;
|
|
}
|
|
|
|
customRank = args.splice(1).join(' ');
|
|
|
|
if (userTime >= rankEligableTime &&
|
|
($.bot.isModuleEnabled('./systems/pointSystem.js') && $.getUserPoints(sender) > rankEligableCost) || !$.bot.isModuleEnabled('./systems/pointSystem.js')) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.set.success', customRank));
|
|
$.inidb.set('viewerRanks', sender.toLowerCase(), customRank);
|
|
if ($.bot.isModuleEnabled('./systems/pointSystem.js')) {
|
|
$.inidb.decr('points', sender.toLowerCase(), rankEligableCost);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if ($.bot.isModuleEnabled('./systems/pointSystem.js')) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.set.failure', rankEligableTime, $.pointNameMultiple, rankEligableCost));
|
|
} else {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.set.failure.nopoints', rankEligableTime));
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ($.inidb.exists('viewerRanks', username.toLowerCase())) {
|
|
$.say($.lang.get('ranks.rank.customsuccess', username, $.inidb.get('viewerRanks', username.toLowerCase())));
|
|
return;
|
|
}
|
|
|
|
if (ranksTimeTable === undefined) {
|
|
loadRanksTimeTable();
|
|
}
|
|
if (ranksTimeTable.length == 0) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('ranks.rank.404'));
|
|
return;
|
|
}
|
|
|
|
userLevel = -1;
|
|
for (var i = 0; i < ranksTimeTable.length; i++) {
|
|
if (parseInt(userTime) >= parseInt(ranksTimeTable[i])) {
|
|
userLevel = i;
|
|
} else {
|
|
i = ranksTimeTable.length;
|
|
}
|
|
}
|
|
|
|
if (userLevel <= ranksTimeTable.length - 2) {
|
|
nextLevel = parseInt(userLevel) + 1;
|
|
timeUntilNextRank = parseInt(ranksTimeTable[nextLevel]) - userTime;
|
|
if (userLevel == -1) {
|
|
$.say($.lang.get('ranks.rank.norank.success', username, timeUntilNextRank, $.inidb.get('ranksMapping', ranksTimeTable[nextLevel].toString())));
|
|
} else {
|
|
$.say($.lang.get('ranks.rank.success', username, $.inidb.get('ranksMapping', ranksTimeTable[userLevel].toString()), timeUntilNextRank, $.inidb.get('ranksMapping', ranksTimeTable[nextLevel].toString())));
|
|
}
|
|
} else {
|
|
$.say($.lang.get('ranks.rank.maxsuccess', username, $.inidb.get('ranksMapping', ranksTimeTable[userLevel].toString())));
|
|
}
|
|
return;
|
|
}
|
|
|
|
});
|
|
|
|
/**
|
|
* @event initReady
|
|
*
|
|
*/
|
|
$.bind('initReady', function() {
|
|
$.registerChatCommand('./systems/ranksSystem.js', 'rank', 7);
|
|
$.registerChatCommand('./systems/ranksSystem.js', 'rankedit', 1);
|
|
|
|
$.registerChatSubcommand('rankedit', 'add', 1);
|
|
$.registerChatSubcommand('rankedit', 'del', 1);
|
|
$.registerChatSubcommand('rankedit', 'custom', 1);
|
|
$.registerChatSubcommand('rankedit', 'customdel', 1);
|
|
|
|
$.registerChatSubcommand('rank', 'set', 7);
|
|
$.registerChatSubcommand('rank', 'del', 7);
|
|
});
|
|
|
|
/**
|
|
* Export functions to API
|
|
*/
|
|
$.resolveRank = resolveRank;
|
|
$.getRank = getRank;
|
|
$.hasRank = hasRank;
|
|
$.loadRanksTimeTable = loadRanksTimeTable;
|
|
})();
|