init commit
This commit is contained in:
419
libs/phantombot/scripts/systems/ranksSystem.js
Normal file
419
libs/phantombot/scripts/systems/ranksSystem.js
Normal file
@@ -0,0 +1,419 @@
|
||||
/*
|
||||
* 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;
|
||||
})();
|
||||
Reference in New Issue
Block a user