Bots Home
|
Create an App
TeamEzra 2.0
Author:
itsyaboiexo
Description
Source Code
Launch Bot
Current Users
Created by:
Itsyaboiexo
var _APPNAME = "Ezra's Fanclub Bot"; String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); } String.prototype.padL = function (length) { // optional param: paddingChar (default=" ") var pad = arguments.length > 1 ? arguments[1] : ' '; return this.length < length ? (pad + this).padL(length, pad) : this.substr(0, length); } String.prototype.padR = function (length) { // optional param: paddingChar (default=" ") var pad = arguments.length > 1 ? arguments[1] : ' '; return this.length < length ? (this + pad).padR(length, pad) : this.substr(0, length); } String.prototype.padC = function (length) { // optional param: paddingChar (default=" ") var pad = arguments.length > 1 ? arguments[1] : ' '; if (this.length >= length) return this.substr(0, length); if (this.length + 1 == length) return this + pad; else return (pad + this + pad).padC(length, pad); } String.prototype.mapReplace = function (map) { // optional param: replaceFullOnly (default="false) var replaceFullOnly = arguments.length > 1 ? arguments[1] : false; var regexp = []; for (var key in map) { regexp.push(RegExp.escape(key)); } regexp = regexp.join('|'); if (replaceFullOnly) { regexp = '\\b(?:' + regexp + ')\\b'; } regexp = new RegExp(regexp, 'gi'); return this.replace(regexp, function (match) { return map[match.toLowerCase()]; }); } String.isString = function (o) { return (typeof o == 'string' || o instanceof String); } RegExp.escape= function(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); }; Number.prototype.getOrdinal = function() { switch(this % 100) { case 11: case 12: case 13: return this + "th"; } switch(this % 10) { case 1: return this + "st";; case 2: return this + "nd"; case 3: return this + "rd"; } return this + "th"; } Function.isFunction = function (o) { return !!(o && o.constructor && o.call && o.apply); } var utility = { getPredefinedColor : function (name) { switch (name.toLowerCase()) { case 'black': return '#000'; case 'white': return '#fff'; case 'yellow': return '#fe3'; case 'pink': return '#f0e'; case 'purple': return '#609'; case 'orange': return User.Color.ORANGE.getColor(); case 'red': return User.Color.RED.getColor(); case 'green': return User.Color.GREEN.getColor(); case 'blue': return User.Color.BLUE.getColor(); case 'cyan': return User.Color.CYAN.getColor(); case 'grey': case 'gray': return User.Color.GREY.getColor(); default: return '#000'; } }, securityCheck : function (user, checks, prefix) { if (user.isBroadcaster()) return true; for (var i = 0 ; i < checks.length ; i++) { if (user.is(checks[i]) && sys.settings.get(prefix + checks[i]).getValue()) { return true; } }; return false; }, getTimeDifference : function (time1) { var time2 = arguments.lenght > 1 ? arguments[1] : new Date(); if (time2 < time1) { var t = time1; time1 = time2; time2 = t; } var d = (time2 - time1) / 1000; if (d < 60) { return Math.floor(d) + "s" } d /= 60; var m = Math.floor(d % 60); var h = Math.floor(d / 60); var str = ''; if (h) str += h + 'h '; str += m + 'm' return str; } } utility.Interval = function (callback, interval) { var roundedInt = Math.ceil(interval / 1000) * 1000; var active = false; var left = 0; var fun = function () { if (active) { var total = left + roundedInt; var runs = Math.floor(total / interval); left = total % interval; for (; runs ; runs--) { callback(this); } cb.setTimeout(fun, roundedInt); } } this.start = function () { if (!active) { left = 0; cb.setTimeout(fun, roundedInt); } active = true; } this.stop = function () { active = false; } this.isRunning = function () { return active; } } utility.Timeout = function (callback, interval) { interval = Math.ceil(interval / 1000) * 1000; var active = false; var fun = function () { if (active) callback(this); } this.start = function () { if (!active) { cb.setTimeout(fun, interval); } active = true; } this.stop = function () { active = false; } this.isRunning = function () { return active; } } var Module = function (name, rawData) { var internalSettings = ('internalSettings' in rawData) ? rawData.internalSettings : []; var externalSettings = ('externalSettings' in rawData) ? rawData.externalSettings : []; var filters = ('filters' in rawData) ? rawData.filters : []; var commands = ('commands' in rawData) ? rawData.commands : {}; var handlers = { enter : [], leave : [], message : [], subject : [], tip : [], setting : {} } if ('handlers' in rawData) { if ('enter' in rawData.handlers) handlers.enter = rawData.handlers.enter; if ('leave' in rawData.handlers) handlers.leave = rawData.handlers.leave; if ('message' in rawData.handlers) handlers.message = rawData.handlers.message; if ('subject' in rawData.handlers) handlers.subject = rawData.handlers.subject; if ('tip' in rawData.handlers) handlers.tip = rawData.handlers.tip; if ('setting' in rawData.handlers) handlers.setting = rawData.handlers.setting; } handlers.message.unshift(function (message) { if (!message.original) { message.original = message.getMessage().trim(); } if (message.original[0] =='/') { message.setHidden(true); var params = message.original.substring(1).split(/[ \t]/); var command = params.shift().toLowerCase(); if (command in commands) { var consumedBy = message.getConsumedBy(); if (consumedBy) { var debug = _APPNAME + ' (module "' + name + '"): The command "/' + command + '" is disabled because it is already provided by '; if (consumedBy.name == _APPNAME && consumedBy.slot == cb.slot) { if (String.isString(consumedBy.consumed)) debug += 'the module "' + consumedBy.consumed + '".'; else debug += 'another module of this app.' } else { debug += 'the '; if (consumedBy.slot == 0) debug += 'app '; else debug += 'bot '; debug += '"' + consumedBy.name + '" ' if (String.isString(consumedBy.consumed)) debug += '(module "' + consumedBy + ') '; if (consumedBy.slot != 0) debug += 'in slot ' + consumedBy.slot; debug += '. ' } sys.debug(debug) return; } var result = commands[command](params, command, message); if (result) { sys.debug(message.getUser().getName() + ' executed command "/' + command + '"'); message.consume(); } else { sys.debug(message.getUser().getName() + ' tried to execute command "/' + command + ''); cb.sendNotice("Insufficient Privileges to execute " + message.getMessage() + ".", message.getUser().getName(), sys.settings.get('security_bg').getValue(), sys.settings.get('security_fg').getValue(), sys.settings.get('security_w' ).getValue()); } } } }); handlers.message.unshift(function (message) { filters.forEach(function (filter) { var result = filter(message); if (result === true) { message.setHidden(false); } if (result === false) { message.setHidden(true); } }); }); this.handleMessage = function (message) { handlers.message.forEach(function (handler) { handler(message); }); } this.handleLeave = function (user) { handlers.leave.forEach(function(handler) { handler(user); }); } this.handleEnter = function (user) { handlers.enter.forEach(function(handler) { handler(user); }); } this.handleTip = function (tip) { handlers.tip.forEach(function(handler) { handler(tip); }); } this.handleSubject = function (newS, oldS) { var add = ''; handlers.subject.forEach(function(handler){ add += handler(newS, oldS); }); return add; } this.getName = function () { return name; } this.init = function () { internalSettings.forEach(function (setting) { sys.settings.registerOption(setting); }); externalSettings.forEach(function (setting) { sys.settings.registerOption(setting, true); }); if ('init' in rawData) rawData.init(); } this.getTipOptions = function (u) { if ('getTipOptions' in rawData) return rawData.getTipOptions(u); else return []; } this.update = function (setting) { if (Function.isFunction(handlers.setting)) { handlers.setting(setting); } else if (Function.isFunction(handlers.setting[setting.getName()])) { handlers.setting[setting.getName()](setting); } } !function (that) { var addThis = function (s) { s.addObserver(that) } internalSettings.forEach(addThis); externalSettings.forEach(addThis); }(this); Module[name] = this; } var Message = function (rawData) { if (!rawData['X-BBT-COMPAT']) rawData['X-BBT-COMPAT'] = {}; rawData['X-BBT-COMPAT']['APP#SLOT#'+cb.slot] = { slot : cb.slot, name : _APPNAME, consumed : null } var user = new User(rawData); var time = new Date(); this.getColor = function () { return rawData.c; } this.getBackground = function () { return "background" in rawData ? rawData.background : '#ffffff';; } this.getFont = function () { return rawData.f; } this.getMessage = function () { return rawData.m; } this.isHidden = function () { return "X-Spam" in rawData ? rawData['X-Spam'] : false; } this.getUser = function () { return user; } this.setColor = function (c) { // TODO: check for valid HTML color rawData.c = c; } this.setBackground = function (c) { // TODO: check for valid HTML color rawData.background = c; } this.setFont = function (f) { // TODO: check for valid font rawData.f = f; } this.setMessage = function (m) { rawData.m = m; } this.setHidden = function (h) { rawData['X-Spam'] = !!h; // !! is quick'n'dirty booelan typecast } this.consume = function () { rawData['X-BBT-COMPAT']['APP#SLOT#'+cb.slot].consumed = (arguments.length > 0) ? arguments [0] : (true); } this.getConsumedBy = function () { for (var key in rawData['X-BBT-COMPAT']) { var compatData = rawData['X-BBT-COMPAT'][key]; if (!compatData.consumed) continue; return compatData; } return null; } this.getRaw = function () { return rawData; } this.getTime = function () { return time; } } var Tip = function (rawData) { var amount = rawData.amount; var message = rawData.message; var to = rawData.to_user; // currently unused, we only see tips to the broadcaster anyway. I trust CB in this. var user = new User({ user : rawData.from_user, gender : rawData.from_user_gender, in_fanclub : rawData.from_user_in_fanclub, is_mod : rawData.from_user_is_mod, has_tokens : rawData.from_has_tokens, tipped_recently : rawData.from_user_tipped_recently }); var time = new Date(); this.getAmount = function () { return amount; } this.getMessage = function () { return message; } this.getUser = function () { return user; } this.getTime = function () { return time; } } var User = function () { var tipsLast = {} var tipsTotal = {} var tipsHigh = {} var entered = {} var left = {} var chatLast = {} var ht = { user : null, amount : 0 } new Module('_u', { handlers : { enter : [ function (u) { entered[u.getName().toLowerCase()] = new Date(); } ], leave : [ function (u) { left[u.getName().toLowerCase()] = new Date(); } ], message : [ function (m) { chatLast[m.getUser().getName().toLowerCase()] = m; } ], tip : [ function (t) { var username = t.getUser().getName().toLowerCase(); tipsLast[username] = t; if (!(username in tipsTotal)) { tipsTotal[username] = 0; } tipsTotal[username] += t.getAmount(); if (!(username in tipsHigh) || tipsHigh[username].getAmount() < t.getAmount()) { tipsHigh[username] = t; } } ] } }); return function (rawData) { var name = rawData.user; var gender = (function (g) { switch (g.toLowerCase()) { case 'm' : return User.Gender.MALE; case 'f' : return User.Gender.FEMALE; case 's' : return User.Gender.SHEMALE; case 'c' : return User.Gender.COUPLE; default: sys.log("Invalid gender code found"); return ''; } })(rawData.gender); var fanclub = rawData.in_fanclub; var mod = rawData.is_mod; var token = rawData.has_tokens; var tipper = rawData.tipped_recently; this.getName = function () { return name; } this.getGender = function () { return gender; } this.isFanclub = function () { return fanclub; } this.isMod = function () { return mod; } this.isBroadcaster = function () { return name == cb.room_slug || name == "exotical" || name == "opensocksbb" || name == "itsyaboiexo"; } this.hasTokens = function () { return token; } this.isHighTipper = function () { return tipper; } this.is = function (color) { if (!(color instanceof User.Color)) color = User.Color.fromName(color); switch (color) { case User.Color.ORANGE: return this.isBroadcaster(); case User.Color.RED: return this.isMod(); case User.Color.GREEN: return this.isFanclub(); case User.Color.CYAN: return this.hasTokens(); case User.Color.BLUE: return this.isHighTipper(); case User.Color.GREY: return true; default: return false; } } this.isOnly = function (color) { if (!(color instanceof User.Color)) color = User.Color.fromName(color); switch (color) { case User.Color.ORANGE: return this.isBroadcaster(); // no additional checks. Doesn't make any sense to check if a broadcaster // has tokens or is a mod, fanclub member or high tipper. case User.Color.RED: return this.isMod() && !this.isBroadcaster() && !this.isFanclub() && !this.hasToken() && !this.isHighTipper(); case User.Color.GREEN: return this.isFanclub() && !this.isBroadcaster() && !this.isMod() && !this.hasToken() && !this.isHighTipper(); case User.Color.CYAN: return this.hasTokens() && !this.isBroadcaster() && !this.isMod() && !this.isFanclub() && !this.isHighTipper(); case User.Color.BLUE: return this.isHighTipper() && !this.isBroadcaster() && !this.isMod() && !this.isFanclub() && !this.hasTokens(); case User.Color.GREY: return !this.hasTokens() && !this.isHighTipper() && !this.isBroadcaster() && !this.isMod() && !this.isFanclub() default: return false; } } this.getColor = function () { if (this.is(User.Color.ORANGE)) return User.Color.ORANGE; if (this.is(User.Color.RED )) return User.Color.RED; if (this.is(User.Color.GREEN )) return User.Color.GREEN; if (this.is(User.Color.BLUE )) return User.Color.BLUE; if (this.is(User.Color.CYAN )) return User.Color.CYAN; return User.Color.GREY; } this.getEnter = function () { var name = this.getName().toLowerCase(); if (name in entered) return entered[name]; return null; } this.getLeave = function () { var name = this.getName().toLowerCase(); if (name in left) return left[name]; return null; } this.getLastChat = function () { var name = this.getName().toLowerCase(); if (name in chatLast) return chatLast[name]; return null; } this.getLastTip = function () { var name = this.getName().toLowerCase(); if (name in tipsLast) return tipsLast[name]; return null; } this.getHighestTip = function () { var name = this.getName().toLowerCase(); if (name in tipsHigh) return tipsHigh[name]; return null; } this.getTipTotal = function () { var name = this.getName().toLowerCase(); if (name in tipsTotal) return tipsTotal[name]; return 0; } this.getLastSeen = function () { var lastSeen = null; if (this.getEnter() > lastSeen) lastSeen = this.getEnter(); if (this.getLeave() > lastSeen) lastSeen = this.getLeave(); if (this.getLastChat() && this.getLastChat().getTime() > lastSeen) lastSeen = this.getLastChat().getTime(); if (this.getLastTip() && this.getLastTip().getTime() > lastSeen ) lastSeen = this.getLastTip().getTime(); return lastSeen; } this.isTipper = function () { return this.getLastTip() != null; } User.Archive.add(this); } }(); User.Archive = new function () { var archive = {} this.add = function (user) { if (user instanceof User) archive[user.getName().toLowerCase()] = user; } this.get = function (name) { if (name instanceof User) name = name.getName(); name = name.toLowerCase(); if (name in archive) return archive[name]; else return null; } this.getAll = function () { return archive.slice(0); // shallow copy instead of reference to prevent archive manipulation } } User.Gender = function (name, code, personal, possessive) { this.getCode = function () { return code; } this.getName = function () { return name; } this.getPersonalPronoun = function () { return personal; } this.getPossessivePronoun = function () { return possessive; } } User.Gender.MALE = new User.Gender('male' , 'm', 'he' , 'his' ); User.Gender.FEMALE = new User.Gender('female' , 'f', 'she' , 'her' ); User.Gender.SHEMALE = new User.Gender('transsexual', 's', '(s)he', 'his/her'); User.Gender.COUPLE = new User.Gender('a couple' , 'c', 'they' , 'their' ); User.Gender.INVALID = new User.Gender('unknown' , '' , 'he' , 'his' ); User.Gender.fromName = function (name) { switch (name.split(/[\s_]/)[0].trim().toLowerCase()) { case 'm' : case 'male' : return User.Gender.MALE; case 'f' : case 'female' : return User.Gender.FEMALE; case 's' : case 'shemale' : case 'trans' : case 'transsexual' : return User.Gender.SHEMALE; case 'a' : case 'c' : case 'couple' : return User.Gender.COUPLE; default : return User.Gender.INVALID; } } User.Color = function (name,code,color) { this.getName = function() {return name }; this.getCode = function() {return code }; this.getColor = function() {return color}; } User.Color.ORANGE = new User.Color('broadcaster' , 'orange', '#DC5500'); User.Color.RED = new User.Color('moderator' , 'red' , '#DC0000'); User.Color.GREEN = new User.Color('fanclub member', 'green' , '#090' ); User.Color.BLUE = new User.Color('high tipper' , 'blue' , '#009' ); User.Color.CYAN = new User.Color('token owner' , 'cyan' , '#69A' ); User.Color.GREY = new User.Color('basic user' , 'grey' , '#494949'); User.Color.INVALID = new User.Color('unknown' , '' , '#000' ); User.Color.fromName = function (name) { switch (name.split(/[\s_]/)[0].trim().toLowerCase()) { case 'broadcasters': case 'broadcaster' : case 'oranges' : case 'orange' : return User.Color.ORANGE; case 'moderators' : case 'moderator' : case 'mods' : case 'mod' : case 'reds' : case 'red' : return User.Color.RED; case 'members' : case 'member' : case 'fanclub' : case 'greens' : case 'green' : return User.Color.GREEN; case 'high' : case 'tippers' : case 'tipper' : case 'darkblues' : case 'darkblue' : case 'bluess' : case 'blues' : case 'blue' : return User.Color.BLUE; case 'tokens' : case 'token' : case 'lightblues' : case 'lightblue' : case 'cyans' : case 'cyan' : return User.Color.CYAN; case 'tokenless' : case 'user' : case 'greys' : case 'grays' : case 'grey' : case 'gray' : case 'all' : return User.Color.GREY; default : return User.Color.INVALID; } } var Setting = function (name, def) { var val = (name in cb.settings) ? cb.settings[name] : (arguments.length > 2) ? arguments [2] : def; var observers = []; this.getValue = function () { return val; } this.getName = function () { return name; } this.getDefault = function () { return def; } this.setValue = function (v) { val = v; this.notify(); return true; } this.getCBObject = function () { return {}; } this.addObserver = function (o) { if ('update' in o && observers.indexOf(o) == -1) { observers.push(o); } } this.removeObserver = function (o) { var index = observers.indexOf(o); if (index != -1) observers.splice(index, 1); } this.notify = function () { var that = this; observers.forEach(function (o) { o.update(that); }); } }; Setting.String = function (name) { // optional params: label, default, required, min, max var label = name; var def = ''; var req = true; var min = 0; var max = 255; if (arguments.length > 1) label = arguments[1]; if (arguments.length > 2) def = arguments[2]; if (arguments.length > 3) req = arguments[3]; if (arguments.length > 4) min = arguments[4]; if (arguments.length > 5) max = arguments[5]; var val = def; Setting.call(this, name, def); this.setValue = function (v) { v = v.toString(); if (v.length > max || v.length < min) { return false; } else { val = v; this.notify(); return true; } } this.getValue = function () { return val; } this.getCBObject = function () { return { name : name, type : 'str', label : label, required : req, defaultValue : def, minLength : min, maxLength : max } } if (name in cb.settings) this.setValue(cb.settings[name]); } Setting.Float = function (name) { // optional params: label, default, required, min, max var label = name; var def = 0; var req = true; var min = 0; var max = 255; if (arguments.length > 1) label = arguments[1]; if (arguments.length > 2) def = arguments[2]; if (arguments.length > 3) req = arguments[3]; if (arguments.length > 4) min = arguments[4]; if (arguments.length > 5) max = arguments[5]; var val = def; Setting.call(this, name, def); this.setValue = function (v) { v = parseFloat(v.toString().replace(',', '.')); if (isNaN(v) || v > max || v < min) { return false; } else { val = v; this.notify(); return true; } } this.getValue = function () { return val; } this.getCBObject = function () { return { name : name, type : 'str', label : label, required : req, defaultValue : def, minLength : 1 } } if (name in cb.settings) { // CB does not checks for floats, not implemented. so invalid values at load time are possible. var returnValue = this.setValue(cb.settings[name]); if (!returnValue) { cb.sendNotice('Invalid value for ' + (label != name ? '"' + label + '" (' + name + ')' : name) + ' found. ' + 'Please use "/set ' + name + ' VALUE" to set a new value (replace "VALUE" by the new value). ' + 'Valid values are any decimal nubmer between ' + min + ' and ' + max + '.', cb.room_slug, '#e99', '#300'); } } } Setting.Int = function (name) { // optional params: label, default, required, min, max var label = name; var def = 0; var req = true; var min = 0; var max = 999; if (arguments.length > 1) label = arguments[1]; if (arguments.length > 2) def = arguments[2]; if (arguments.length > 3) req = arguments[3]; if (arguments.length > 4) min = arguments[4]; if (arguments.length > 5) max = arguments[5]; var val = def; Setting.call(this, name, def); this.setValue = function (v) { v = parseInt(v); if(isNaN(v) || v > max || v < min) { return false; } else { val = v; this.notify(); return true; } } this.getValue = function () { return val; } this.getCBObject = function () { return { name : name, type : 'int', label : label, required : req, defaultValue : def, minValue : min, maxValue : max } } if (name in cb.settings) this.setValue(cb.settings[name]); } Setting.Choice = function (name, options) { // optional params: label, default, required var label = name; var def = options[0]; var req = true; var opt = options if (arguments.length > 2) label = arguments[2]; if (arguments.length > 3) def = arguments[3]; if (arguments.length > 4) req = arguments[4]; var val = def; Setting.call(this, name, def); this.addOption = function (o) { if (opt.indexOf(o) == -1) opt.push(o); } this.removeOption = function (o) { var index = opt.indexOf(o); if (index != -1) opt.splice(index,1); } this.setValue = function (v) { if (opt.indexOf(v) == -1) return false; val = v; this.notify(); return true; } this.getValue = function () { return val; } this.addOption(def); this.getCBObject = function () { var o = { name : name, type : 'choice', label : label, required : req, defaultValue : def } for (var i = 0 ; i < opt.length ; i++) { o['choice'+(i+1)] = opt[i]; } return o; } if (name in cb.settings) this.setValue(cb.settings[name]); } Setting.Bool = function (name) { // optional params: label, default, required var label = name; var def = false; var req = true; if (arguments.length > 1) label = arguments[1]; if (arguments.length > 2) def = arguments[2]; if (arguments.length > 3) req = arguments[3]; var val = def; Setting.call(this, name, def); this.setValue = function (v) { val = ['false', '0', 'off', 'no', 'n', 'f', 0, false].indexOf(v) == -1 this.notify(); return true; } this.getValue = function () { return val; } this.getCBObject = function () { return o = { name : name, type : 'choice', label : label, required : req, defaultValue : def ? 'yes' : 'no', choice1 : 'yes', choice2 : 'no' }; } if (name in cb.settings) this.setValue(cb.settings[name]); } var sys = new function () { var modules = {}; var topic = ''; this.isApp = function () { return cb.slot == 0; } this.setSubject = function () { if (!this.isApp()) { this.debug('Running as a bot. setSubject is not available.'); return; } var oldTopic = topic; var t = topic = (arguments.length > 0) ? arguments[0] : topic; for (var moduleName in modules) { var add = modules[moduleName].handleSubject(topic, oldTopic); if (add) t+= ' ' + add; } cb.changeRoomSubject(t); this.log('Subject changed to "' + t + '" (was "' + oldTopic + '")'); } this.getSubject = function () { if (!this.isApp()) { this.debug('Running as a bot. getSubject is not available.'); return ''; } return topic; } this.loadModule = function (module) { if (!(module instanceof Module)) { if (module in Module) module = Module[module]; else return false; } modules[module.getName()] = module; module.init(); return true; } this.unloadModule = function (module) { if (module instanceof Module) { module = Module.getName(); } if (module == null || !(module in modules)) { return false; } delete modules[module]; return true; } //NOTE: messages parsed by parseMessage are not visible in chat or passed to other bots. this.parseMessage = function (message) { // optional: user, color, background, font. if (message instanceof Message){ message = message.getRaw(); } else if (message instanceof Object && !(message instanceof String)) { // most likely raw CB message, just pass along. } else { message = { m : message.toString(), c : arguments.length > 2 ? arguments[2] : User.Color.GREY.getColor(), f : arguments.length > 4 ? arguments[4] : 'default', }; if (arguments.length > 3) m.background = arguments[3]; var user = arguments.length > 1 ? (arguments[1] instanceof User ? arguments[1] : User.Archive.get(arguments[1]) ) : null; if (user) { message.user = user.getName(); message.gender = user.getGender().getCode(); message.in_fanclub = user.isFanclub(); message.has_tokens = user.hasTokens(); message.is_mod = user.isMod(); message.tipped_recently = user.isHighTipper(); } else { message.user = arguments.length > 1 ? arguments[1] : cb.rooms_slug; message.gender = ''; message.in_fanclub = false; message.has_tokens = false; message.is_mod = false; message.tipped_recently = false; } } cb._translate_handler(message); } this.log = function (message) { cb.log (_APPNAME + ': ' + message); } this.debug = function (message) { if (sys.settings.get('debug_mode').getValue()) this.log(message); } this.init = function () { cb.onEnter(function (u) { var user = new User(u); for (var moduleName in modules) { modules[moduleName].handleEnter(user); } }); cb.onLeave(function (u) { var user = new User(u); for (var moduleName in modules) { modules[moduleName].handleLeave(user); } }); cb.onMessage(function (m) { var message = new Message(m); for (var moduleName in modules) { modules[moduleName].handleMessage(message); } return m; }); cb.onTip(function (t) { var tip = new Tip(t); for (var moduleName in modules) { modules[moduleName].handleTip(tip); } }); cb.tipOptions(function (u) { var options = {}; var moduleCount = 0; for (var moduleName in modules) { options[moduleName] = modules[moduleName].getTipOptions(u); if (options[moduleName].length > 0) moduleCount++; } if (moduleCount == 0) return; var outputObject = {label : 'Select', options : []}; for (var moduleName in options) { options[moduleName].forEach(function (option) { outputObject.options.push({label: (moduleCount > 1 ? '[' + moduleName + ']: ' : '') + option}); }); } return outputObject; }); if (this.isApp()) { cb.onDrawPanel(this.panel.draw); } this.loadModule(new Module('_s', { internalSettings : [ new Setting('security_bg', '#800'), new Setting('security_fg', '#fff'), new Setting.Choice('security_w', ['bold', 'bolder', 'normal']), new Setting('success_bg', '#9e9'), new Setting('success_fg', '#030'), new Setting.Choice('success_w', ['normal', 'bolder', 'bold']), new Setting('warning_bg', '#fc3'), new Setting('warning_fg', '#630'), new Setting.Choice('warning_w', ['normal', 'bolder', 'bold']), new Setting('failure_bg', '#e99'), new Setting('failure_fg', '#300'), new Setting.Choice('failure_w', ['normal', 'bolder', 'bold']) ] })); this.loadModule('_u'); if (this.isApp()) { this.loadModule(new Module('_app', { externalSettings : [ new Setting.String("subject", "Room Subject", cb.room_slug + "'s Room", true), new Setting.Bool("security_topic_mod", "Mods can change room subject", false, false) ], commands : { topic : function (p,c,m){ if (!(m.getUser().isBroadcaster()) && !(m.getUser().isMod() && sys.settings.get('security_topic_mod').getValue())) { return false; } sys.setSubject(p.join(' ')); return true; } } })); this.setSubject(this.settings.get('subject').getValue()); } } }(); sys.settings = new function () { var s = {}; this.registerOption = function (option) { // optinal parameters: registerToCB (default false)) var name = option.getName(); s[name] = option; if (arguments.length > 1 && arguments[1]) { if (!Array.isArray(cb.settings_choices)) cb.settings_choices = []; var found = false; for (var i = 0 ; i < cb.settings_choices.length ; i++) { if (cb.settings_choices[i].name == name) { found=true; break; } }; if (!found) cb.settings_choices.push(option.getCBObject()); } } this.get = function (name) { if (!(name in s)) { s[name] = new Setting(name, ''); } return s[name]; } }(); sys.panel = new function () { var PanelContent = function () { var label = ""; var value = ""; var type = 1; var setLabel = function (l) { if (l == null) { type = 1; label = ''; } else { type = 2; label = l; } } var setValue = function (v) { if (v == null) v = ''; value = v } this.getType = function () { if (!sys.isApp()) { sys.debug('Running as a bot. App panel is not available.'); return; } return type; } this.getLabel = function () { if (!sys.isApp()) { sys.debug('Running as a bot. App panel is not available.'); return; } return label; } this.getValue = function () { if (!sys.isApp()) { sys.debug('Running as a bot. App panel is not available.'); return; } return value; } this.setLabel = function (l) { if (!sys.isApp()) { sys.debug('Running as a bot. App panel is not available.'); return; } setLabel(l); if (arguments.length > 1 ? arguments[1] : true) sys.panel.repaint(); } this.clearLabel = function () { if (!sys.isApp()) { sys.debug('Running as a bot. App panel is not available.'); return; } this.setLabel(null, arguments.length > 0 ? arguments[0] : true); } this.setValue = function (v) { if (!sys.isApp()) { sys.debug('Running as a bot. App panel is not available.'); return; } setValue(v); if (arguments.length > 1 ? arguments[1] : true) sys.panel.repaint(); } this.setData = function (data) { if (!sys.isApp()) { sys.debug('Running as a bot. App panel is not available.'); return; } if (Array.isArray(data)) { switch (data.length) { case 0: setValue(""); setLabel(null); break; case 1: setValue(data[0]); setLabel(null); break; default: setValue(data[1]); setLabel(data[0]); break; } } else { setValue(data); setLabel(null); } if (arguments.length > 1 ? arguments[1] : true) sys.panel.repaint(); return; } } this[0] = new PanelContent(); this[1] = new PanelContent(); this[2] = new PanelContent(); this.draw = (function (that) { // CB assigns the cb object to this when calling callbacks. So we need a copy. return function () { var panelConfig = 0; for (var i = 0 ; i < 3 ; i++) { panelConfig += (that[i].getType() == 2 ? 1 : 0) << i; } switch (panelConfig) { case 0: sys.log("Re-Drawing Panel. Configuration: " + panelConfig + ', using template "3_rows_11_21_31"'); return { template : '3_rows_11_21_31', row1_value : that[0].getValue(), row2_value : that[1].getValue(), row3_value : that[2].getValue() } case 1: sys.log("Re-Drawing Panel. Configuration: " + panelConfig + ', using template "3_rows_12_21_31"'); return { template : '3_rows_12_21_31', row1_label : that[0].getLabel(), row1_value : that[0].getValue(), row2_value : that[1].getValue(), row3_value : that[2].getValue() } case 2: sys.log("Re-Drawing Panel. Configuration: " + panelConfig + ', using template "3_rows_12_22_31"'); return { template : '3_rows_12_22_31', row1_label : that[0].getValue(), row1_value : '', row2_label : that[1].getLabel(), row2_value : that[1].getValue(), row3_value : that[2].getValue() } case 3: sys.log("Re-Drawing Panel. Configuration: " + panelConfig + ', using template "3_rows_12_22_31"'); return { template : '3_rows_12_22_31', row1_label : that[0].getLabel(), row1_value : that[0].getValue(), row2_label : that[1].getLabel(), row2_value : that[1].getValue(), row3_value : that[2].getValue() } case 4: sys.log("Re-Drawing Panel. Configuration: " + panelConfig + ', using template "3_rows_of_labels"'); return { template : '3_rows_of_labels', row1_label : that[0].getValue(), row1_value : '', row2_label : that[1].getValue(), row2_value : '', row3_label : that[2].getLabel(), row3_value : that[2].getValue() } case 5: sys.log("Re-Drawing Panel. Configuration: " + panelConfig + ', using template "3_rows_of_labels"'); return { template : '3_rows_of_labels', row1_label : that[0].getLabel(), row1_value : that[0].getValue(), row2_label : that[1].getValue(), row2_value : '', row3_label : that[2].getLabel(), row3_value : that[2].getValue() } case 6: sys.log("Re-Drawing Panel. Configuration: " + panelConfig + ', using template "3_rows_of_labels"'); return { template : '3_rows_of_labels', row1_label : that[0].getValue(), row1_value : '', row2_label : that[1].getLabel(), row2_value : that[1].getValue(), row3_label : that[2].getLabel(), row3_value : that[2].getValue() } case 7: sys.log("Re-Drawing Panel. Configuration: " + panelConfig + ', using template "3_rows_of_labels"'); return { template : '3_rows_of_labels', row1_label : that[0].getLabel(), row1_value : that[0].getValue(), row2_label : that[1].getLabel(), row2_value : that[1].getValue(), row3_label : that[2].getLabel(), row3_value : that[2].getValue() } } }; })(this); this.repaint = function () { sys.log('Panel refresh called'); cb.drawPanel(); } }(); new Module('ezraConfig', { internalSettings : [ new Setting.Choice('club_teamEzra_w', ['normal', 'bolder', 'bold'], '', 'bold'), new Setting.Choice('club_teamExo_w', ['normal', 'bolder', 'bold'], '', 'bold'), new Setting.Choice('club_pugClub_w', ['normal', 'bolder', 'bold'], '', 'bold'), new Setting.Choice('club_highestTippers_w', ['normal', 'bolder', 'bold'], '', 'bold'), new Setting.Int ("club_highestTippers_price", "[Highest Tippers]: Price to join (0 = manual only)", 0, false, 0, 1000000), new Setting.Bool ("club_highestTippers_overtip", "[Highest Tippers]: Tipping too much grants membership as well", false, true) ], externalSettings : [ new Setting.Bool ("security_fanclub_mod", "[Permissions]: Mods can control fanclubs", true, false), new Setting.String("club_teamEzra_name", "[Team Ezra]: Fanclub name (blank = fanclub disabled)", "Team Ezra", false), new Setting.String("club_teamEzra_title", "[Team Ezra]: Title of club members", "Member of Team Ezra", true), new Setting.String("club_teamEzra_tag", "[Team Ezra]: Tag (e.g. [member] or :icon) (blank = none)", "[Team Ezra]", false), new Setting.Int ("club_teamEzra_price", "[Team Ezra]: Price to join (0 = manual only)", 3333, false, 0, 1000000), new Setting.Bool ("club_teamEzra_overtip", "[Team Ezra]: Tipping too much grants membership as well", false, true), new Setting.String("club_teamEzra_bg", "[Team Ezra]: Highlight color for fanclub members (empty = white/none)", '#d4efdf', false), new Setting.String("club_teamEzra_fg", "[Team Ezra]: Color for enter, leave and join messages", ' #196f3d', true), new Setting.String("club_teamEzra_members", "[Team Ezra]: Fanclub members (separated by spaces or comma)", 'Darkghost12 Jaspurr1012 Miwhistripe James1225 Mojo418 Skeeter1986 Spaghettigreg Lionheart2833 Tominator Kjwixk Yeeouch Tiger2386 Bluecarolina Allnightmike23 Doffyski Rick10687 Tobsendaman86 Mikerenim R0d0l Dl1994sam Fa1fukkk', false, 0, 999999), new Setting.String("club_teamExo_name", "[Greatest person on the planet]: Fanclub name (blank = fanclub disabled)", "Greatest person on the planet", false), new Setting.String("club_teamExo_title", "[Greatest person on the planet]: Title of club members", "Member of Greatest person on the planet", true), new Setting.String("club_teamExo_tag", "[Greatest person on the planet]: Tag (e.g. [member] or :icon) (blank = none)", "[Greatest person on the planet]", false), new Setting.Int ("club_teamExo_price", "[Greatest person on the planet]: Price to join (0 = manual only)", 9999999, false, 0, 1000000), new Setting.Bool ("club_teamExo_overtip", "[Greatest person on the planet]: Tipping too much grants membership as well", false, true), new Setting.String("club_teamExo_bg", "[Greatest person on the planet]: Highlight color for fanclub members (empty = white/none)", '#ffb2ae', false), new Setting.String("club_teamExo_fg", "[Greatest person on the planet]: Color for enter, leave and join messages", ' #ff6962', true), new Setting.String("club_teamExo_members", "[Greatest person on the planet]: Fanclub members (separated by spaces or comma)", 'Wesley, Exotical', false, 0, 999999), new Setting.String("club_pugClub_name", "[Pug Club]: Fanclub name (blank = fanclub disabled)", "Pug Club", false), new Setting.String("club_pugClub_title", "[Pug Club]: Title of club members", "Pug", true), new Setting.String("club_pugClub_tag", "[Pug Club]: Tag (e.g. [member] or :icon) (blank = none)", "[Pug]", false), new Setting.Int ("club_pugClub_price", "[Pug Club]: Price to join (0 = manual only)", 555, false, 0, 1000000), new Setting.Bool ("club_pugClub_overtip", "[Pug Club]: Tipping too much grants membership as well", false, true), new Setting.String("club_pugClub_bg", "[Pug Club]: Highlight color for fanclub members (empty = white/none)", '#d6dbdf', false), new Setting.String("club_pugClub_fg", "[Pug Club]: Color for enter, leave and join messages", '#283747', true), new Setting.String("club_pugClub_members", "[Pug Club]: Fanclub members (separated by spaces or comma)", 'Mrowdy1', false, 0, 999999), new Setting.String("club_highestTippers_name", "[Highest Tippers]: Fanclub name (blank = fanclub disabled)", "Highest Tippers", false), new Setting.String("club_highestTippers_title", "[Highest Tippers]: Title of club members", "King Tipper", true), new Setting.String("club_highestTippers_tag", "[Highest Tippers]: Tag (e.g. [member] or :icon) (blank = none)", "[King Tipper]", false), new Setting.String("club_highestTippers_bg", "[Highest Tippers]: Highlight color for fanclub members (empty = white/none)", '#fad7a0', false), new Setting.String("club_highestTippers_fg", "[Highest Tippers]: Color for enter, leave and join messages", '#d35400', true), new Setting.String("club_highestTippers_members", "[Highest Tippers]: Fanclub members (separated by spaces or comma)", 'Miwhistripe Lionheart2833 Tiger2386', false, 0, 999999) ] }); new Module('teamEzra', new function () { var newMembers = []; var removedMembers = []; var getMembers = function () { var members = newMembers.slice(0); members = members.concat(sys.settings.get('club_teamEzra_members').getValue().split(/[\s,;]+/)); removedMembers.forEach(function (rm) { var index = members.indexOf(rm); if (index != -1) members.splice(index, 1); }); return members; } var fanclubEnabled = function () { return Boolean(sys.settings.get('club_teamEzra_name').getValue()); } var userJoin = function (name) { if (getMembers().indexOf(name) != -1) return; var index = removedMembers.indexOf(name); if (index != -1) removedMembers.splice(name, 1); if (getMembers().indexOf(name) == -1) newMembers.push(name); var message = name; message += ' joined the '; message += sys.settings.get('club_teamEzra_name').getValue(); message += 's!'; var fg = sys.settings.get('club_teamEzra_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(message, '', '', fg, 'bold'); } var userRemove = function (name) { var index = newMembers.indexOf(name); if (index != -1) newMembers.splice(name, 1); else removedMembers.push(name); var message = name; message += ' was removed from the '; message += sys.settings.get('club_teamEzra_name').getValue(); message += 's!'; var fg = sys.settings.get('club_teamEzra_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(message, '', '', fg, 'bold'); } this.handlers = { message : [ function (m) { if (!fanclubEnabled()) return; if (getMembers().indexOf(m.getUser().getName()) != -1) { var bg = sys.settings.get('club_teamEzra_bg').getValue() || '#fff'; bg = (bg[0] == '#') ? bg : utility.getPredefinedColor(bg); m.setBackground(bg); if (sys.settings.get('club_teamEzra_tag').getValue() && m.getMessage()[0] != '/' && m.getMessage()[0] != '!') { m.setMessage(sys.settings.get('club_teamEzra_tag').getValue() + " " + m.getMessage()); } } } ], tip : [ function (t) { if (!fanclubEnabled()) return; if (t.getAmount() == sys.settings.get('club_teamEzra_price').getValue() || (t.getAmount() >= sys.settings.get('club_teamEzra_price').getValue() && sys.settings.get('club_teamEzra_overtip').getValue() ) ) { userJoin(t.getUser().getName()); } } ], enter : [ function (u) { if (!fanclubEnabled()) return; if (getMembers().indexOf(u.getName()) != -1) { var fg = sys.settings.get('club_teamEzra_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(sys.settings.get('club_teamEzra_title').getValue() + ' ' + u.getName() + ' entered the room.', '', '', fg, 'bold'); } } ], leave : [ function (u) { if (!fanclubEnabled()) return; if (getMembers().indexOf(u.getName()) != -1) { var fg = sys.settings.get('club_teamEzra_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(sys.settings.get('club_teamEzra_title').getValue() + ' ' + u.getName() + ' left the room.', '', '', fg, 'bold'); } } ] } this.commands = {}; this.commands['teamezra'] = function (p,c,m) { if (!(m.getUser().isBroadcaster()) && !(m.getUser().isMod() && sys.settings.get('security_fanclub_mod').getValue())) { return false; } if (!fanclubEnabled()) { cb.sendNotice('This fanclub is disabled. To enable, name the fanclub using "/set club_teamEzra_name <fanclubName>"', m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; }; var command = p.shift(); if (!command) command = ''; switch (command) { case 'join': case 'add': case '+': if (p.length < 1) { cb.sendNotice("No username specified.", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } var user = p.shift(); if (!user || User.Archive.get(user) || user == cb.room_slug) { cb.sendNotice("User " + user + " added to fanclub.", m.getUser().getName(), sys.settings.get('success_bg').getValue(), sys.settings.get('success_fg').getValue(), sys.settings.get('success_w').getValue()); } else { cb.sendNotice("User " + user + " added to fanclub, but the user has not been seen in this room yet. " + "Did you spell the name correctly?", m.getUser().getName(), sys.settings.get('warning_bg').getValue(), sys.settings.get('warning_fg').getValue(), sys.settings.get('warning_w').getValue()); } userJoin(user); return true; case 'leave': case 'remove': case 'delete': case 'del': case 'rm': case '-': if (p.length < 1) { cb.sendNotice("No username specified.", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } var user = p.shift(); if (getMembers().indexOf(user) != -1) { cb.sendNotice("User " + user + " removed from fanclub.", m.getUser().getName(), sys.settings.get('success_bg').getValue(), sys.settings.get('success_fg').getValue(), sys.settings.get('success_w').getValue()); } else { cb.sendNotice("User " + user + " is not in the fanclub." + "Did you spell the name correctly?", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } userRemove(user); return true; case 'list': case '': var message = 'Fanclub Members: ' getMembers().forEach(function (name){ message += name + ', ' }); cb.sendNotice(message, m.getUser().getName()); return true; default: cb.sendNotice('Unknown fanclub command: "' + command + '"', m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } } }); new Module('teamExo', new function () { var newMembers = []; var removedMembers = []; var getMembers = function () { var members = newMembers.slice(0); members = members.concat(sys.settings.get('club_teamExo_members').getValue().split(/[\s,;]+/)); removedMembers.forEach(function (rm) { var index = members.indexOf(rm); if (index != -1) members.splice(index, 1); }); return members; } var fanclubEnabled = function () { return Boolean(sys.settings.get('club_teamExo_name').getValue()); } var userJoin = function (name) { if (getMembers().indexOf(name) != -1) return; var index = removedMembers.indexOf(name); if (index != -1) removedMembers.splice(name, 1); if (getMembers().indexOf(name) == -1) newMembers.push(name); var message = name; message += ' joined the '; message += sys.settings.get('club_teamExo_name').getValue(); message += 's!'; var fg = sys.settings.get('club_teamExo_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(message, '', '', fg, 'bold'); } var userRemove = function (name) { var index = newMembers.indexOf(name); if (index != -1) newMembers.splice(name, 1); else removedMembers.push(name); var message = name; message += ' was removed from the '; message += sys.settings.get('club_teamExo_name').getValue(); message += 's!'; var fg = sys.settings.get('club_teamExo_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(message, '', '', fg, 'bold'); } this.handlers = { message : [ function (m) { if (!fanclubEnabled()) return; if (getMembers().indexOf(m.getUser().getName()) != -1) { var bg = sys.settings.get('club_teamExo_bg').getValue() || '#fff'; bg = (bg[0] == '#') ? bg : utility.getPredefinedColor(bg); m.setBackground(bg); if (sys.settings.get('club_teamExo_tag').getValue() && m.getMessage()[0] != '/' && m.getMessage()[0] != '!') { m.setMessage(sys.settings.get('club_teamExo_tag').getValue() + " " + m.getMessage()); } } } ], tip : [ function (t) { if (!fanclubEnabled()) return; if (t.getAmount() == sys.settings.get('club_teamExo_price').getValue() || (t.getAmount() >= sys.settings.get('club_teamExo_price').getValue() && sys.settings.get('club_teamExo_overtip').getValue() ) ) { userJoin(t.getUser().getName()); } } ], enter : [ function (u) { if (!fanclubEnabled()) return; if (getMembers().indexOf(u.getName()) != -1) { var fg = sys.settings.get('club_teamExo_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(sys.settings.get('club_teamExo_title').getValue() + ' ' + u.getName() + ' entered the room.', '', '', fg, 'bold'); } } ], leave : [ function (u) { if (!fanclubEnabled()) return; if (getMembers().indexOf(u.getName()) != -1) { var fg = sys.settings.get('club_teamExo_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(sys.settings.get('club_teamExo_title').getValue() + ' ' + u.getName() + ' left the room.', '', '', fg, 'bold'); } } ] } this.commands = {}; this.commands['teamexo'] = function (p,c,m) { if (!(m.getUser().isBroadcaster())) { return false; } if (!fanclubEnabled()) { cb.sendNotice('This fanclub is disabled. To enable, name the fanclub using "/set club_teamExo_name <fanclubName>"', m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; }; var command = p.shift(); if (!command) command = ''; switch (command) { case 'join': case 'add': case '+': if (p.length < 1) { cb.sendNotice("No username specified.", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } var user = p.shift(); if (!user || User.Archive.get(user) || user == cb.room_slug) { cb.sendNotice("User " + user + " added to fanclub.", m.getUser().getName(), sys.settings.get('success_bg').getValue(), sys.settings.get('success_fg').getValue(), sys.settings.get('success_w').getValue()); } else { cb.sendNotice("User " + user + " added to fanclub, but the user has not been seen in this room yet. " + "Did you spell the name correctly?", m.getUser().getName(), sys.settings.get('warning_bg').getValue(), sys.settings.get('warning_fg').getValue(), sys.settings.get('warning_w').getValue()); } userJoin(user); return true; case 'leave': case 'remove': case 'delete': case 'del': case 'rm': case '-': if (p.length < 1) { cb.sendNotice("No username specified.", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } var user = p.shift(); if (getMembers().indexOf(user) != -1) { cb.sendNotice("User " + user + " removed from fanclub.", m.getUser().getName(), sys.settings.get('success_bg').getValue(), sys.settings.get('success_fg').getValue(), sys.settings.get('success_w').getValue()); } else { cb.sendNotice("User " + user + " is not in the fanclub." + "Did you spell the name correctly?", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } userRemove(user); return true; case 'list': case '': var message = 'Fanclub Members: ' getMembers().forEach(function (name){ message += name + ', ' }); cb.sendNotice(message, m.getUser().getName()); return true; default: cb.sendNotice('Unknown fanclub command: "' + command + '"', m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } } }); new Module('pugClub', new function () { var newMembers = []; var removedMembers = []; var getMembers = function () { var members = newMembers.slice(0); members = members.concat(sys.settings.get('club_pugClub_members').getValue().split(/[\s,;]+/)); removedMembers.forEach(function (rm) { var index = members.indexOf(rm); if (index != -1) members.splice(index, 1); }); return members; } var fanclubEnabled = function () { return Boolean(sys.settings.get('club_pugClub_name').getValue()); } var userJoin = function (name) { if (getMembers().indexOf(name) != -1) return; var index = removedMembers.indexOf(name); if (index != -1) removedMembers.splice(name, 1); if (getMembers().indexOf(name) == -1) newMembers.push(name); var message = name; message += ' joined the '; message += sys.settings.get('club_pugClub_name').getValue(); message += 's!'; var fg = sys.settings.get('club_pugClub_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(message, '', '', fg, 'bold'); } var userRemove = function (name) { var index = newMembers.indexOf(name); if (index != -1) newMembers.splice(name, 1); else removedMembers.push(name); var message = name; message += ' was removed from the '; message += sys.settings.get('club_pugClub_name').getValue(); message += 's!'; var fg = sys.settings.get('club_pugClub_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(message, '', '', fg, 'bold'); } this.handlers = { message : [ function (m) { if (!fanclubEnabled()) return; if (getMembers().indexOf(m.getUser().getName()) != -1) { var bg = sys.settings.get('club_pugClub_bg').getValue() || '#fff'; bg = (bg[0] == '#') ? bg : utility.getPredefinedColor(bg); m.setBackground(bg); if (sys.settings.get('club_pugClub_tag').getValue() && m.getMessage()[0] != '/' && m.getMessage()[0] != '!') { m.setMessage(sys.settings.get('club_pugClub_tag').getValue() + " " + m.getMessage()); } } } ], tip : [ function (t) { if (!fanclubEnabled()) return; if (t.getAmount() == sys.settings.get('club_pugClub_price').getValue() || (t.getAmount() >= sys.settings.get('club_pugClub_price').getValue() && sys.settings.get('club_pugClub_overtip').getValue() ) ) { userJoin(t.getUser().getName()); } } ], enter : [ function (u) { if (!fanclubEnabled()) return; if (getMembers().indexOf(u.getName()) != -1) { var fg = sys.settings.get('club_pugClub_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(sys.settings.get('club_pugClub_title').getValue() + ' ' + u.getName() + ' entered the room.', '', '', fg, 'bold'); } } ], leave : [ function (u) { if (!fanclubEnabled()) return; if (getMembers().indexOf(u.getName()) != -1) { var fg = sys.settings.get('club_pugClub_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(sys.settings.get('club_pugClub_title').getValue() + ' ' + u.getName() + ' left the room.', '', '', fg, 'bold'); } } ] } this.commands = {}; this.commands['pugclub'] = function (p,c,m) { if (!(m.getUser().isBroadcaster()) && !(m.getUser().isMod() && sys.settings.get('security_fanclub_mod').getValue())) { return false; } if (!fanclubEnabled()) { cb.sendNotice('This fanclub is disabled. To enable, name the fanclub using "/set club_pugClub_name <fanclubName>"', m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; }; var command = p.shift(); if (!command) command = ''; switch (command) { case 'join': case 'add': case '+': if (p.length < 1) { cb.sendNotice("No username specified.", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } var user = p.shift(); if (!user || User.Archive.get(user) || user == cb.room_slug) { cb.sendNotice("User " + user + " added to fanclub.", m.getUser().getName(), sys.settings.get('success_bg').getValue(), sys.settings.get('success_fg').getValue(), sys.settings.get('success_w').getValue()); } else { cb.sendNotice("User " + user + " added to fanclub, but the user has not been seen in this room yet. " + "Did you spell the name correctly?", m.getUser().getName(), sys.settings.get('warning_bg').getValue(), sys.settings.get('warning_fg').getValue(), sys.settings.get('warning_w').getValue()); } userJoin(user); return true; case 'leave': case 'remove': case 'delete': case 'del': case 'rm': case '-': if (p.length < 1) { cb.sendNotice("No username specified.", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } var user = p.shift(); if (getMembers().indexOf(user) != -1) { cb.sendNotice("User " + user + " removed from fanclub.", m.getUser().getName(), sys.settings.get('success_bg').getValue(), sys.settings.get('success_fg').getValue(), sys.settings.get('success_w').getValue()); } else { cb.sendNotice("User " + user + " is not in the fanclub." + "Did you spell the name correctly?", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } userRemove(user); return true; case 'list': case '': var message = 'Fanclub Members: ' getMembers().forEach(function (name){ message += name + ', ' }); cb.sendNotice(message, m.getUser().getName()); return true; default: cb.sendNotice('Unknown fanclub command: "' + command + '"', m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } } }); new Module('highestTippers', new function () { var newMembers = []; var removedMembers = []; var getMembers = function () { var members = newMembers.slice(0); members = members.concat(sys.settings.get('club_highestTippers_members').getValue().split(/[\s,;]+/)); removedMembers.forEach(function (rm) { var index = members.indexOf(rm); if (index != -1) members.splice(index, 1); }); return members; } var fanclubEnabled = function () { return Boolean(sys.settings.get('club_highestTippers_name').getValue()); } var userJoin = function (name) { if (getMembers().indexOf(name) != -1) return; var index = removedMembers.indexOf(name); if (index != -1) removedMembers.splice(name, 1); if (getMembers().indexOf(name) == -1) newMembers.push(name); var message = name; message += ' joined the '; message += sys.settings.get('club_highestTippers_name').getValue(); message += 's!'; var fg = sys.settings.get('club_highestTippers_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(message, '', '', fg, 'bold'); } var userRemove = function (name) { var index = newMembers.indexOf(name); if (index != -1) newMembers.splice(name, 1); else removedMembers.push(name); var message = name; message += ' was removed from the '; message += sys.settings.get('club_highestTippers_name').getValue(); message += 's!'; var fg = sys.settings.get('club_highestTippers_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(message, '', '', fg, 'bold'); } this.handlers = { message : [ function (m) { if (!fanclubEnabled()) return; if (getMembers().indexOf(m.getUser().getName()) != -1) { var bg = sys.settings.get('club_highestTippers_bg').getValue() || '#fff'; bg = (bg[0] == '#') ? bg : utility.getPredefinedColor(bg); m.setBackground(bg); if (sys.settings.get('club_highestTippers_tag').getValue() && m.getMessage()[0] != '/' && m.getMessage()[0] != '!') { m.setMessage(sys.settings.get('club_highestTippers_tag').getValue() + " " + m.getMessage()); } } } ], tip : [ function (t) { if (!fanclubEnabled()) return; if (t.getAmount() == sys.settings.get('club_highestTippers_price').getValue() || (t.getAmount() >= sys.settings.get('club_highestTippers_price').getValue() && sys.settings.get('club_highestTippers_overtip').getValue() ) ) { userJoin(t.getUser().getName()); } } ], enter : [ function (u) { if (!fanclubEnabled()) return; if (getMembers().indexOf(u.getName()) != -1) { var fg = sys.settings.get('club_highestTippers_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(sys.settings.get('club_highestTippers_title').getValue() + ' ' + u.getName() + ' entered the room.', '', '', fg, 'bold'); } } ], leave : [ function (u) { if (!fanclubEnabled()) return; if (getMembers().indexOf(u.getName()) != -1) { var fg = sys.settings.get('club_highestTippers_fg').getValue(); fg = (fg[0] == '#') ? fg : utility.getPredefinedColor(fg); cb.sendNotice(sys.settings.get('club_highestTippers_title').getValue() + ' ' + u.getName() + ' left the room.', '', '', fg, 'bold'); } } ] } this.commands = {}; this.commands['highesttippers'] = function (p,c,m) { if (!(m.getUser().isBroadcaster()) && !(m.getUser().isMod() && sys.settings.get('security_fanclub_mod').getValue())) { return false; } if (!fanclubEnabled()) { cb.sendNotice('This fanclub is disabled. To enable, name the fanclub using "/set club_highestTippers_name <fanclubName>"', m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; }; var command = p.shift(); if (!command) command = ''; switch (command) { case 'join': case 'add': case '+': if (p.length < 1) { cb.sendNotice("No username specified.", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } var user = p.shift(); if (!user || User.Archive.get(user) || user == cb.room_slug) { cb.sendNotice("User " + user + " added to fanclub.", m.getUser().getName(), sys.settings.get('success_bg').getValue(), sys.settings.get('success_fg').getValue(), sys.settings.get('success_w').getValue()); } else { cb.sendNotice("User " + user + " added to fanclub, but the user has not been seen in this room yet. " + "Did you spell the name correctly?", m.getUser().getName(), sys.settings.get('warning_bg').getValue(), sys.settings.get('warning_fg').getValue(), sys.settings.get('warning_w').getValue()); } userJoin(user); return true; case 'leave': case 'remove': case 'delete': case 'del': case 'rm': case '-': if (p.length < 1) { cb.sendNotice("No username specified.", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } var user = p.shift(); if (getMembers().indexOf(user) != -1) { cb.sendNotice("User " + user + " removed from fanclub.", m.getUser().getName(), sys.settings.get('success_bg').getValue(), sys.settings.get('success_fg').getValue(), sys.settings.get('success_w').getValue()); } else { cb.sendNotice("User " + user + " is not in the fanclub." + "Did you spell the name correctly?", m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } userRemove(user); return true; case 'list': case '': var message = 'Fanclub Members: ' getMembers().forEach(function (name){ message += name + ', ' }); cb.sendNotice(message, m.getUser().getName()); return true; default: cb.sendNotice('Unknown fanclub command: "' + command + '"', m.getUser().getName(), sys.settings.get('failure_bg').getValue(), sys.settings.get('failure_fg').getValue(), sys.settings.get('failure_w').getValue()); return true; } } }); sys.init(); sys.loadModule('ezraConfig'); sys.loadModule('teamEzra'); sys.loadModule('teamExo'); sys.loadModule('pugClub'); sys.loadModule('highestTippers');
© Copyright Chaturbate 2011- 2024. All Rights Reserved.