/* * 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 . */ /** * permissions.js * * (Previously known as permissionHandler.js) * * Provide an usergroups API * Use the $ API */ (function() { var userGroups = [], modeOUsers = [], subUsers = new java.util.concurrent.CopyOnWriteArrayList(), vipUsers = [], modListUsers = [], users = [], moderatorsCache = [], botList = [], lastJoinPart = $.systemTime(), firstRun = true, isUpdatingUsers = false; /** * @function cleanTwitchBots */ function cleanTwitchBots() { var twitchBots = $.readFile('./addons/ignorebots.txt'); for (var i in twitchBots) { $.inidb.del('points', twitchBots[i].toLowerCase()); $.inidb.del('time', twitchBots[i].toLowerCase()); } } /** * @function loadTwitchBots * */ function loadTwitchBots() { var twitchBots = $.readFile('./addons/ignorebots.txt'); for (var i = 0; i < twitchBots.length; i++) { botList[twitchBots[i]] = true; } } /** * @function isTwitchBot * @param {string} username * @returns {Boolean} */ function isTwitchBot(username) { return botList[username] !== undefined; } /** * @function removeTwitchBot * */ function removeTwitchBot(username) { if (isTwitchBot(username)) { delete botList[username]; } } /** * @function addTwitchBot * */ function addTwitchBot(username) { if (!isTwitchBot(username)) { botList[username] = true; } } /** * @function savebotList * */ function saveBotList() { $.writeToFile(Object.keys(botList).join(String.fromCharCode(13, 10)), './addons/ignorebots.txt', false); cleanTwitchBots(); } /** * @function hasKey * @param {Array} list * @param {*} value * @returns {boolean} */ function hasKey(list, value) { var exists = false; for (var i = 0; i < list.length; i++) { if (list[i] !== undefined && list[i].equalsIgnoreCase(value)) { exists = true; break; } } return exists; } /** * @function updateUsersObject * @param {Array} list * * This function properly rebuilds the users list from a list of usernames. * The $.users object cannot be modified and if the users object is replaced, * then it disassociates from the original list causing issues. * *** This can take a very long time to complete and is very hard on your CPU when large array. */ function updateUsersObject(newUsers) { for (var i in newUsers) { if (!userExists(newUsers[i])) { users.push(newUsers[i]); } } for (var i = users.length - 1; i >= 0; i--) { if (!hasKey(newUsers, users[i])) { users.splice(i, 1); } } } /** * @function getKeyIndex * @param {Array} list * @param {*} value * @returns {boolean} */ function getKeyIndex(list, value) { var idx = -1; for (var i = 0; i < list.length; i++) { if (list[i] !== undefined && $.equalsIgnoreCase(list[i], value)) { idx = i; break; } } return idx; } /** * @function userExists * @export $ * @param {string} username * @returns {boolean} */ function userExists(username) { return hasKey(users, username); } /** * @function isBot * @export $ * @param {string} username * @returns {boolean} */ function isBot(username) { return username.equalsIgnoreCase($.botName); } /** * @function isOwner * @export $ * @param {string} username * @returns {boolean} */ function isOwner(username) { return username.equalsIgnoreCase($.ownerName) || username.equalsIgnoreCase($.botName); } /** * @function isCaster * @export $ * @param {string} username * @returns {boolean} */ function isCaster(username) { return getUserGroupId(username.toLowerCase()) == 0 || isOwner(username); } /** * @function isAdmin * @export $ * @param {string} username * @returns {boolean} */ function isAdmin(username) { return getUserGroupId(username.toLowerCase()) <= 1 || isOwner(username); } /** * @function isMod * @export $ * @param {string} username * @returns {boolean} */ function isMod(username) { return getUserGroupId(username.toLowerCase()) <= 2 || isOwner(username); } /** * @function isModv3 * @export $ * @param {string} username * @param {Object} tags * @returns {boolean} */ function isModv3(username, tags) { return (tags != null && tags != '{}' && tags.get('user-type').length() > 0) || isModeratorCache(username.toLowerCase()) || isOwner(username); } /** * @function isSub * @export $ * @param {string} username * @returns {boolean} */ function isSub(username) { return subUsers.contains(username.toLowerCase()); } /** * @function isSubv3 * @export $ * @param {string} username * @param {Object} tags * @returns {boolean} */ function isSubv3(username, tags) { return (tags != null && tags != '{}' && tags.get('subscriber').equals('1')) || isSub(username); } /** * @function isTurbo * @export $ * @param {Object} tags * @returns {boolean} */ function isTurbo(tags) { return (tags != null && tags != '{}' && tags.get('turbo').equals('1')) || false; } /** * @function isDonator * @export $ * @param {string} username * @returns {boolean} */ function isDonator(username) { return getUserGroupId(username.toLowerCase()) == 4; } /** * @function isVIP * @export $ * @param {string} username * @returns {boolean} */ function isVIP(username, tags) { return (tags != null && tags != '{}' && tags.get('vip').equals('1')) || getUserGroupId(username.toLowerCase()) == 5; } /** * @function isReg * @export $ * @param {string} username * @returns {boolean} */ function isReg(username) { return getUserGroupId(username.toLowerCase()) <= 6 || isOwner(username); } /** * @function hasModeO * @export $ * @param {string} username * @returns {boolean} */ function hasModeO(username) { return hasKey(modeOUsers, username); } /** * @function hasModList * @export $ * @param {string} username * @returns {boolean} */ function hasModList(username) { return hasKey(modListUsers, username); } /** * @function isTwitchSub * @param {String} * @returns {Boolean} */ function isTwitchSub(username) { return isSub(username); } /** * @function getUserGroupId * @export $ * @param {string} username * @returns {Number} */ function getUserGroupId(username) { if ($.inidb.exists('group', username.toLowerCase())) { return parseInt($.inidb.get('group', username.toLowerCase())); } else { return 7; } } /** * @function getUserGroupName * @export $ * @param {string} username * @returns {string} */ function getUserGroupName(username) { return getGroupNameById(getUserGroupId(username.toLowerCase())); } /** * @function getGroupNameById * @export $ * @param {Number} groupId * @returns {string} */ function getGroupNameById(groupId) { groupId = parseInt(groupId); if ($.inidb.exists('groups', groupId)) { return $.inidb.get('groups', groupId); } else { return userGroups[7]; } } /** * @function getGroupIdByName * @export $ * @param {string} groupName * @returns {Number} */ function getGroupIdByName(groupName) { var i; for (i = 0; i < userGroups.length; i++) { if (userGroups[i].equalsIgnoreCase(groupName.toLowerCase())) { return i; } } return 7; } /** * @function getGroupPointMultiplier * @export $ * @param username * @returns {Number} */ function getGroupPointMultiplier(username) { return parseInt($.inidb.get('grouppoints', getUserGroupName(username.toLowerCase()))); } /** * @function setUserGroupById * @export $ * @param {string} username * @param {Number} id */ function setUserGroupById(username, id) { $.inidb.set('group', username.toLowerCase(), id); } /** * @function setUserGroupByName * @export $ * @param username * @param groupName */ function setUserGroupByName(username, groupName) { setUserGroupById(username.toLowerCase(), getGroupIdByName(groupName.toLowerCase())); } /** * @function reloadGroups */ function reloadGroups() { var groupKeys = $.inidb.GetKeyList('groups', ''), i; userGroups = []; for (i in groupKeys) { userGroups[parseInt(groupKeys[i])] = $.inidb.get('groups', groupKeys[i]); } } /** * @function getUsernamesArrayByGroupId * @param {Number} [filterId] * @returns {Array} */ function getUsernamesArrayByGroupId(filterId) { var i, array = []; for (i in users) { if (filterId) { if ($.getUserGroupId(users[i]) <= filterId) { array.push(users[i]); } } else { array.push(users[i]); } } return array; } /** * @function addSubUsersList * @export $ * @param username */ function addSubUsersList(username) { if (!isSub(username)) { subUsers.add(username); } } /** * @function delSubUsersList * @export $ * @param username */ function delSubUsersList(username) { if (subUsers.contains(username)) { subUsers.remove(username); } } /** * @function isModeratorCache * @export $ * @param username */ function isModeratorCache(username) { return (moderatorsCache[username] !== undefined); } /** * @function addModeratorToCache * @export $ * @param username */ function addModeratorToCache(username) { moderatorsCache[username] = true; } /** * @function removeModeratorFromCache * @export $ * @param username */ function removeModeratorFromCache(username) { if (moderatorsCache[username] !== undefined) { delete moderatorsCache[username]; } } /** * @function loadModeratorsCache */ function loadModeratorsCache() { var keys = $.inidb.GetKeyList('group', ''), i; for (i in keys) { if (parseInt($.inidb.get('group', keys[i])) <= 2) { addModeratorToCache(keys[i].toLowerCase()); } } } /** * @function restoreSubscriberStatus * @param username */ function restoreSubscriberStatus(username) { username = (username + '').toLowerCase(); if (isMod(username) || isAdmin(username)) { return; } if ($.getIniDbBoolean('subscribed', username, false) && !isTwitchSub(username)) { $.setIniDbBoolean('subscribed', username, false); } else if (!$.getIniDbBoolean('subscribed', username, false) && isTwitchSub(username)) { $.setIniDbBoolean('subscribed', username, true); } if (isTwitchSub(username) && getUserGroupId(username) != 3) { $.inidb.set('preSubGroup', username, getUserGroupId(username)); setUserGroupByName(username, 'Subscriber'); } if (!isTwitchSub(username) && getUserGroupId(username) == 3) { if ($.inidb.exists('preSubGroup', username)) { $.inidb.set('group', username, $.inidb.get('preSubGroup', username)); $.inidb.del('preSubGroup', username); } else { $.inidb.set('group', username, 7); } } } function getGroupList() { var keys = $.inidb.GetKeyList('groups', ''), groups = [], temp = [], i; for (i in keys) { groups.push({ id: keys[i], group: $.inidb.get('groups', keys[i]) }); } for (i in groups) { temp.push('Permission IDs: ' + groups[i].id + ' (' + groups[i].group + ')'); } return temp.join(', '); } /** * @function generateDefaultGroupPoints */ function generateDefaultGroupPoints() { $.getSetIniDbString('grouppoints', 'Caster', '-1'); $.getSetIniDbString('grouppointsoffline', 'Caster', '-1'); $.getSetIniDbString('grouppoints', 'Administrator', '-1'); $.getSetIniDbString('grouppointsoffline', 'Administrator', '-1'); $.getSetIniDbString('grouppoints', 'Moderator', '-1'); $.getSetIniDbString('grouppointsoffline', 'Moderator', '-1'); $.getSetIniDbString('grouppoints', 'Subscriber', '-1'); $.getSetIniDbString('grouppointsoffline', 'Subscriber', '-1'); $.getSetIniDbString('grouppoints', 'Donator', '-1'); $.getSetIniDbString('grouppointsoffline', 'Donator', '-1'); $.getSetIniDbString('grouppoints', 'VIP', '-1'); $.getSetIniDbString('grouppointsoffline', 'VIP', '-1'); $.getSetIniDbString('grouppoints', 'Regular', '-1'); $.getSetIniDbString('grouppointsoffline', 'Regular', '-1'); $.getSetIniDbString('grouppoints', 'Viewer', '-1'); $.getSetIniDbString('grouppointsoffline', 'Viewer', '-1'); } /** * @function generateDefaultGroups */ function generateDefaultGroups() { if (!userGroups[0] || userGroups[0] != 'Caster') { userGroups[0] = 'Caster'; $.inidb.set('groups', '0', 'Caster'); } if (!userGroups[1] || userGroups[1] != 'Administrator') { userGroups[1] = 'Administrator'; $.inidb.set('groups', '1', 'Administrator'); } if (!userGroups[2] || userGroups[2] != 'Moderator') { userGroups[2] = 'Moderator'; $.inidb.set('groups', '2', 'Moderator'); } if (!userGroups[3] || userGroups[3] != 'Subscriber') { userGroups[3] = 'Subscriber'; $.inidb.set('groups', '3', 'Subscriber'); } if (!userGroups[4] || userGroups[4] != 'Donator') { userGroups[4] = 'Donator'; $.inidb.set('groups', '4', 'Donator'); } if (!userGroups[5] || userGroups[5] != 'VIP') { userGroups[5] = 'VIP'; $.inidb.set('groups', '5', 'VIP'); } if (!userGroups[6] || userGroups[6] != 'Regular') { userGroups[6] = 'Regular'; $.inidb.set('groups', '6', 'Regular'); } if (!userGroups[7] || userGroups[7] != 'Viewer') { userGroups[7] = 'Viewer'; $.inidb.set('groups', '7', 'Viewer'); } $.inidb.set('group', $.ownerName.toLowerCase(), 0); $.inidb.set('group', $.botName.toLowerCase(), 0); } /** * @event ircChannelJoinUpdate * * @info Event that is sent when a large amount of people join/leave. This is done on a new thread. */ $.bind('ircChannelUsersUpdate', function(event) { setTimeout(function() { // Don't allow other events to add or remove users. isUpdatingUsers = true; var joins = event.getJoins(), parts = event.getParts(), values = [], now = $.systemTime(); // Handle parts for (var i = 0; i < parts.length; i++) { // Cast the user as a string, because Rhino. parts[i] = (parts[i] + ''); // Remove the user from the users array. var t = getKeyIndex($.users, parts[i]); if (t >= 0) { $.users.splice(t, 1); } $.restoreSubscriberStatus(parts[i]); $.username.removeUser(parts[i]); } // Handle joins. for (var i = 0; i < joins.length; i++) { // Cast the user as a string, because Rhino. joins[i] = (joins[i] + ''); values[i] = 'true'; if (isTwitchBot(joins[i])) { continue; } // Since the user's array gets so big, let's skip it on first run in case the bot ever gets shutdown and restarted mid stream. if (!firstRun && !userExists(joins[i])) { $.users.push(joins[i]); } else { $.users.push(joins[i]); } } $.inidb.SetBatchString('visited', '', joins, values); isUpdatingUsers = false; firstRun = false; }, 0, 'core::permissions.js::ircChannelUsersUpdate'); }); /** * @event ircChannelJoin */ $.bind('ircChannelJoin', function(event) { var username = event.getUser().toLowerCase(); if (isTwitchBot(username)) { return; } if (!isUpdatingUsers && !userExists(username)) { if (!$.user.isKnown(username)) { $.setIniDbBoolean('visited', username, true); } lastJoinPart = $.systemTime(); users.push(username); } }); /** * @event ircChannelMessage */ $.bind('ircChannelMessage', function(event) { var username = event.getSender().toLowerCase(); if (isTwitchBot(username)) { return; } if (!isUpdatingUsers && !userExists(username)) { if (!$.user.isKnown(username)) { $.setIniDbBoolean('visited', username, true); } users.push(username); } }); /** * @event ircChannelLeave */ $.bind('ircChannelLeave', function(event) { var username = event.getUser().toLowerCase(), i; if (!isUpdatingUsers) { i = getKeyIndex(users, username); if (i >= 0) { users.splice(i, 1); restoreSubscriberStatus(username.toLowerCase()); $.username.removeUser(username); } } }); /** * @event ircChannelUserMode */ $.bind('ircChannelUserMode', function(event) { var username = event.getUser().toLowerCase(), i; if (event.getMode().equalsIgnoreCase('o')) { if (event.getAdd().toString().equals('true')) { if (!hasModeO(username)) { addModeratorToCache(username.toLowerCase()); if (isOwner(username)) { modeOUsers.push(username); $.inidb.set('group', username, '0'); } else { if (isAdmin(username)) { modeOUsers.push(username); $.inidb.set('group', username, '1'); } else { modeOUsers.push(username); $.inidb.set('group', username, '2'); } } } } else { if (hasModeO(username)) { removeModeratorFromCache(username); i = getKeyIndex(modeOUsers, username); if (i >= 0) { modeOUsers.splice(i, 1); } if (isSub(username)) { $.inidb.set('group', username, '3'); // Subscriber, return to that group. } else { $.inidb.set('group', username, '7'); } } } } else if (event.getMode().equalsIgnoreCase('vip')) { if (event.getAdd().toString().equals('true')) { if (getUserGroupId(username) < 5) { setUserGroupById(username, 5); } } else { if (isVIP(username)) { setUserGroupById(username, 7); } } } }); /** * @event ircPrivateMessage */ $.bind('ircPrivateMessage', function(event) { var sender = event.getSender().toLowerCase(), message = event.getMessage().toLowerCase().trim(), modMessageStart = 'the moderators of this channel are: ', vipMessageStart = 'vips for this channel are: ', novipMessageStart = 'this channel does not have any vips', keys = $.inidb.GetKeyList('group', ''), subsTxtList = [], spl, i; if (sender.equalsIgnoreCase('jtv')) { if (message.indexOf(modMessageStart) > -1) { spl = message.replace(modMessageStart, '').split(', '); modListUsers = []; for (i in keys) { if ($.inidb.get('group', keys[i]).equalsIgnoreCase('2')) { $.inidb.del('group', keys[i]); } } for (i in spl) { modListUsers.push(spl[i]); if (!isAdmin(spl[i]) && !isBot(spl[i])) { $.inidb.set('group', spl[i], '2'); } } $.saveArray(modListUsers, './addons/mods.txt', false); } else if (message.indexOf(vipMessageStart) > -1) { spl = message.replace(vipMessageStart, '').split(', '); vipUsers = []; for (i in keys) { if ($.inidb.get('group', keys[i]).equalsIgnoreCase('5')) { $.inidb.del('group', keys[i]); } } for (i in spl) { vipUsers.push(spl[i]); if (!isMod(spl[i]) && !isAdmin(spl[i]) && !isBot(spl[i])) { $.inidb.set('group', spl[i], '5'); } } $.saveArray(vipUsers, './addons/vips.txt', false); } else if (message.indexOf(novipMessageStart) > -1) { for (i in keys) { if ($.inidb.get('group', keys[i]).equalsIgnoreCase('5')) { $.inidb.del('group', keys[i]); } } $.deleteFile('./addons/vips.txt', true); } else if (message.indexOf('specialuser') > -1) { spl = message.split(' '); if (spl[2].equalsIgnoreCase('subscriber')) { if (!subUsers.contains(spl[1].toLowerCase())) { subUsers.add(spl[1]); restoreSubscriberStatus(spl[1].toLowerCase()); for (var i = 0; i < subUsers.size(); i++) { subsTxtList.push(subUsers.get(i)); } $.saveArray(subsTxtList, './addons/subs.txt', false); } } } } }); /** * @event command */ $.bind('command', function(event) { var sender = event.getSender().toLowerCase(), command = event.getCommand(), args = event.getArgs(); actionValue = args[0]; /* * @commandpath reloadbots - Reload the list of bots and users to ignore. They will not gain points or time. */ if (command.equalsIgnoreCase('reloadbots')) { botList = []; cleanTwitchBots(); loadTwitchBots(); $.say($.whisperPrefix(sender) + $.lang.get('permissions.reloadbots')); } /** * @commandpath users - List users currently in the channel */ if (command.equalsIgnoreCase('users')) { if (users.length > 20) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.current.listtoolong', users.length)); } else { $.say($.whisperPrefix(sender) + $.lang.get('permissions.current.users', getUsernamesArrayByGroupId().join(', '))); } } /** * @commandpath mods - List mods currently in the channel */ if (command.equalsIgnoreCase('mods')) { var tmp = getUsernamesArrayByGroupId(2); if (tmp.length > 20) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.current.listtoolong', tmp.length)); } else { $.say($.whisperPrefix(sender) + $.lang.get('permissions.current.mods', tmp.join(', '))); } } /** * @commandpath ignorelist - List the bots from the ignorebots.txt */ if (command.equalsIgnoreCase('ignorelist')) { var tmp = Object.keys(botList); if (tmp.length > 20) { $.say($.whisperPrefix(sender) + $.lang.get('ignorelist.listtoolong', tmp.length)); } else { $.say($.whisperPrefix(sender) + $.lang.get('ignorelist', Object.keys(botList).join(', '))); } } /** * @commandpath ignoreadd [username] - Add a bot to the ignorebots.txt */ if (command.equalsIgnoreCase('ignoreadd')) { if (!actionValue) { $.say($.whisperPrefix(sender) + $.lang.get('ignoreadd.usage')); } else { actionValue = actionValue.toLowerCase(); actionValue = $.user.sanitize(actionValue.trim()); if (!isTwitchBot(actionValue)) { addTwitchBot(actionValue); saveBotList(); $.say($.whisperPrefix(sender) + $.lang.get('ignoreadd.added', actionValue)); } else { $.say($.whisperPrefix(sender) + $.lang.get('ignoreadd.nouser', actionValue)); } } } /** * @commandpath ignoreremove [username] - Remove a bot from the ignorebots.txt */ if (command.equalsIgnoreCase('ignoreremove')) { if (!actionValue) { $.say($.whisperPrefix(sender) + $.lang.get('ignoreremove.usage')); } else { actionValue = actionValue.toLowerCase(); actionValue = $.user.sanitize(actionValue.trim()); if (isTwitchBot(actionValue)) { removeTwitchBot(actionValue); saveBotList(); $.say($.whisperPrefix(sender) + $.lang.get('ignoreremove.removed', actionValue)); } else { $.say($.whisperPrefix(sender) + $.lang.get('ignoreremove.nouser', actionValue)); } } } /** * @commandpath permission [username] [groupId] - Get your current permission or optionally get/set the user permission for a user. */ if (command.equalsIgnoreCase('permission')) { if (args[0] === undefined) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.group.self.current', $.getUserGroupName(sender))); return; } var username = $.user.sanitize(args[0]), groupId = parseInt(args[1]); if (!$.user.isKnown(username)) { $.say($.whisperPrefix(sender) + $.lang.get('common.user.404', username)); return; } if (args[1] === undefined) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.group.other.current', $.username.resolve(args[0]), $.getUserGroupName(args[0]))); return; } if (isNaN(groupId)) { groupId = parseInt(getGroupIdByName(args[1])); } if ((args.length < 2 && username === undefined) || args.length > 2 || (isNaN(groupId) && username === undefined) || $.outOfRange(groupId, 0, userGroups.length - 1)) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.group.usage')); return; } if (groupId == 3) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.set.sub.error')); return; } if (!isOwner(sender) && groupId < getUserGroupId(sender)) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.group.set.error.abovegroup')); return; } $.say($.whisperPrefix(sender) + $.lang.get('permissions.group.set.success', $.username.resolve(username), getGroupNameById(groupId) + " (" + groupId + ")")); $.inidb.set('group', username, groupId); if (groupId <= 2) { addModeratorToCache(username); } else { removeModeratorFromCache(username); } } /** * @commandpath permissionpoints [permissionID] [online / offline] [points] - Show/set the points gained for each permissions. -1 defaults to the global configuration. */ if (command.equalsIgnoreCase('permissionpoints')) { var groupId, channelStatus, points; if (!args[0]) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.usage')); return; } groupId = parseInt(args[0]); if (isNaN(groupId) || $.outOfRange(groupId, 0, userGroups.length - 1)) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.usage')); return; } if (!args[1]) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.showgroup', getGroupNameById(groupId), ($.inidb.exists('grouppoints', getGroupNameById(groupId)) ? $.inidb.get('grouppoints', getGroupNameById(groupId)) : '(undefined)'), $.pointNameMultiple, ($.inidb.exists('grouppointsoffline', getGroupNameById(groupId)) ? $.inidb.get('grouppointsoffline', getGroupNameById(groupId)) : '(undefined)'), $.pointNameMultiple)); return; } channelStatus = args[1]; if (!channelStatus.equalsIgnoreCase('online') && !channelStatus.equalsIgnoreCase('offline')) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.usage')); return; } if (!args[2]) { if (channelStatus.equalsIgnoreCase('online')) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.showgroup.online', getGroupNameById(groupId), ($.inidb.exists('grouppoints', getGroupNameById(groupId)) ? $.inidb.get('grouppoints', getGroupNameById(groupId)) : '(undefined)'), $.pointNameMultiple)); } else if (channelStatus.equalsIgnoreCase('offline')) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.showgroup.offline', getGroupNameById(groupId), ($.inidb.exists('grouppointsoffline', getGroupNameById(groupId)) ? $.inidb.get('grouppointsoffline', getGroupNameById(groupId)) : '(undefined)'), $.pointNameMultiple)); } return; } points = parseInt(args[2]); if (isNaN(points)) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.usage')); return; } if (points < 0) { points = -1; } if (channelStatus.equalsIgnoreCase('online')) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.set.online', getGroupNameById(groupId), points, $.pointNameMultiple)); $.inidb.set('grouppoints', getGroupNameById(groupId), points); } else if (channelStatus.equalsIgnoreCase('offline')) { $.say($.whisperPrefix(sender) + $.lang.get('permissions.grouppoints.set.offline', getGroupNameById(groupId), points, $.pointNameMultiple)); $.inidb.set('grouppointsoffline', getGroupNameById(groupId), points); } } /** * @commandpath permission - Give's you all the ppermissions with there id's */ if (command.equalsIgnoreCase('permissions') || command.equalsIgnoreCase('permissionlist')) { $.say(getGroupList()); } }); /** * @event initReady */ $.bind('initReady', function() { $.registerChatCommand('./core/permissions.js', 'permission', 1); $.registerChatCommand('./core/permissions.js', 'permissions', 1); $.registerChatCommand('./core/permissions.js', 'permissionlist', 1); $.registerChatCommand('./core/permissions.js', 'permissionpoints', 1); $.registerChatCommand('./core/permissions.js', 'users', 2); $.registerChatCommand('./core/permissions.js', 'mods', 2); $.registerChatCommand('./core/permissions.js', 'reloadbots', 1); $.registerChatCommand('./core/permissions.js', 'ignorelist', 1); $.registerChatCommand('./core/permissions.js', 'ignoreadd', 1); $.registerChatCommand('./core/permissions.js', 'ignoreremove', 1); /** Load groups and generate default groups if they don't exist */ reloadGroups(); generateDefaultGroups(); generateDefaultGroupPoints(); // Load the moderators cache. This needs to load after the privmsg check. setTimeout(loadModeratorsCache, 7e3); // Load up data for Twitch bots. loadTwitchBots(); // Clean up data for Twitch bots. cleanTwitchBots(); }); /** Export functions to API */ $.casterMsg = $.lang.get('cmd.casteronly'); $.adminMsg = $.lang.get('cmd.adminonly'); $.modMsg = $.lang.get('cmd.modonly'); $.userGroups = userGroups; $.modeOUsers = modeOUsers; $.subUsers = subUsers; $.modListUsers = modListUsers; $.users = users; $.lastJoinPart = lastJoinPart; $.userExists = userExists; $.isBot = isBot; $.isTwitchBot = isTwitchBot; $.isOwner = isOwner; $.isCaster = isCaster; $.isAdmin = isAdmin; $.isMod = isMod; $.isModv3 = isModv3; $.isModeratorCache = isModeratorCache; $.isOwner = isOwner; $.isSub = isSub; $.isSubv3 = isSubv3; $.isTurbo = isTurbo; $.isDonator = isDonator; $.isVIP = isVIP; $.isReg = isReg; $.hasModeO = hasModeO; $.hasModList = hasModList; $.getUserGroupId = getUserGroupId; $.getUserGroupName = getUserGroupName; $.getGroupNameById = getGroupNameById; $.getGroupIdByName = getGroupIdByName; $.getGroupPointMultiplier = getGroupPointMultiplier; $.setUserGroupById = setUserGroupById; $.setUserGroupByName = setUserGroupByName; $.addSubUsersList = addSubUsersList; $.delSubUsersList = delSubUsersList; $.addModeratorToCache = addModeratorToCache; $.removeModeratorFromCache = removeModeratorFromCache; $.updateUsersObject = updateUsersObject; $.restoreSubscriberStatus = restoreSubscriberStatus; })();