Apps Home
|
Create an App
I0p4uK testapp1
Author:
i0p4uk
Description
Source Code
Launch App
Current Users
Created by:
I0p4uk
/* Title: "SweetKira555 App" Author: I0p4uK Customized Tip Menu badbadbubba bot and Tip Multi-Goal Mx:2k6 for SweetKira555 */ var MAXITEMS_TIPMENU=30; var MAXITEMS_NOTIFIER=20; var MAXITEMS_GOALS=20; var MAXITEMS_VIDEOS=10; var MAXITEMS_DICE=21; var TimerManager = { Timers: [], onElapsed: function () { var now = new Date(); now.setMilliseconds(0); for (var timerId in TimerManager.Timers) { if (!(TimerManager.Timers[timerId] instanceof Timer)) { delete TimerManager.Timers[timerId]; continue; } else { var timer = TimerManager.Timers[timerId]; if (now <= timer.getDeadline() && now >= timer.getDeadline()) { timer.onElapsed(); delete TimerManager.Timers[timerId]; break; } } } cb.setTimeout(TimerManager.onElapsed, 1000); }, addTimer: function (id, timer) { if (!(timer instanceof Timer)) {return false;} TimerManager.Timers[id] = timer; return true; }, removeTimer: function (id) { if (isUndefined(TimerManager.Timers[id])) {return true;} delete TimerManager.Timers[id]; if (isUndefined(TimerManager.Timers[id])) {return true;} return false }, initialise: function () { cb.setTimeout(TimerManager.onElapsed, 1000); }, }; function Timer(elapsed, seconds) { var now = new Date(); now.setSeconds(seconds); now.setMilliseconds(0); this.deadline = now; this.onElapsed = elapsed; } Timer.prototype.getDeadline = function () {return this.deadline;}; var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode : function (input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); } return output; }, decode : function (input) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = this._keyStr.indexOf(input.charAt(i++)); enc2 = this._keyStr.indexOf(input.charAt(i++)); enc3 = this._keyStr.indexOf(input.charAt(i++)); enc4 = this._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } output = Base64._utf8_decode(output); return output; }, _utf8_encode : function (string) { string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, _utf8_decode : function (utftext) { var string = ""; var i = 0; var c = c1 = c2 = 0; while ( i < utftext.length ) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } } var makeCRCTable = function(){ var c; var crcTable = []; for(var n =0; n < 256; n++){ c = n; for(var k =0; k < 8; k++){ c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); } crcTable[n] = c; } return crcTable; } var crc32 = function(str) { var crcTable = makeCRCTable(); var crc = 0 ^ (-1); for (var i = 0; i < str.length; i++ ) { crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF]; } return (crc ^ (-1)) >>> 0; }; var sec2hms = function(sec) { var hours = Math.floor((sec % 86400) / 3600); var minutes = Math.floor((sec % 3600) / 60); var seconds = Math.floor(sec % 60); var outtime = ''; if(hours > 0) { outtime += hours + "h "; }; if(minutes > 0) { outtime += minutes + "m "; }; if(seconds > 0) { outtime += seconds + "s"; }; return outtime; }; var settings = { startMenuTimer: 'Yes', progression_mode_manual: false, goals: [], msg_c: [], videos: [], videoindex: 0, action_on_finality: 'stop', hidden_show_entry_fee: 77, finality_message: 'Goal reached! Thanks to all tippers!', highlight_theme: 'Legacy', timer_in_subject: false, hide_token_haul: false, support_mode: false, goals_defined: 0, change_subject_on_tip: true, subject_suffix: '', games: { dice: { run: 1, roll_price: cb.settings.dice_tokens, langTokens: (cb.settings.dice_tokens > 1) ? 'tokens' : 'token', numberOfSides: (cb.settings.die_type == 'Traditional') ? 6 : 10, lastRoller: '--', lastPrizeWon: '--', rollCounter: 0, tipCounter: 0, winners: [], prizes: [], maxOutcome: (cb.settings.die_type == 'Traditional') ? 13 : 21, dieImagePrefix: (cb.settings.die_type == 'Traditional') ? ':reddie' : ':cdie', rareChance: 10, } }, Tipping: { CurrentGoal: { Number: 0, TargetAmount: 0, CurrentAmount: 0, Halted: false, }, Leaderboard: { Leaders: { Highest: { Username: null, Amount: 0, OptOut: false, }, HighestTotal: { Username: null, Amount: 0, OptOut: false, }, Lowest: { Username: null, Amount: 0, OptOut: false, }, MostRecent: { Username: null, Amount: 0, OptOut: false, } }, All: [], }, VirtualTotal: 0, ActualTotal: 0, Finality: false, }, leaderArray: [['','0'],['','0'],['','0']], subject_is_final: false, index: 0, hiddenShow: { enabled: false, timebeforeshow: 0, started: false, ended: false, grouped: false, purchased_tickets: {}, type: "ticket", listbeforeshow: [], showlist: [], message: '', price: 0, preshowPrice: 0, priceperminute: 0, minperminute: 0, }, toString: function () { var settingsStr = ""; for (var prop in this) { if (typeof (this[prop]) == "string" || typeof (this[prop]) == "boolean" || typeof (this[prop]) == "number") {settingsStr += ", " + prop + ": '" + this[prop] + "'";} } return settingsStr.substring(2); } }; var temparr1 = []; var temparr2 = []; var TipmenuTimer = { queue: [], timeRemaining: 0, timerRunMessage: "", timerRunning: false, timerReallyRunning: false, spamMessage: "Time's running out!", timesUpMessage: ":timesup", hookOnTimer: function () { recachePanel(); if (settings.timer_in_subject) {updateRoomSubject();} }, addTimer: function (seconds, description) { if (description==='') { var emptydesc = true; description="Time Remaining"; } else {var emptydesc = false;} if (this.timerRunning) { if(this.queue.length === 0) { if((this.timerRunMessage === description) || emptydesc) { this.timeRemaining += seconds; } else { this.queue.push({time: seconds, text: description}); } } else { if((this.queue[this.queue.length-1].text === description) || emptydesc) { this.queue[this.queue.length-1].time += seconds; } else { this.queue.push({time: seconds, text: description}); } } } else { this.timerReallyRunning = false; this.timerRunning = true; if(this.queue.length === 0) { this.timeRemaining = seconds; this.timerRunMessage = description; } else { if((this.queue[this.queue.length-1].text === description) || emptydesc) { this.queue[this.queue.length-1].time += seconds; } else { this.queue.push({time: seconds, text: description}); } this.timeRemaining = this.queue[0].time; this.timerRunMessage = this.queue[0].text; this.queue.splice(0,1); } this.startTimer(); } this.hookOnTimer(); }, startTimer: function () { if(!this.timerReallyRunning) { if(this.timerRunning) { if (settings.startMenuTimer === 'Yes') {cb.setTimeout(function () {TipmenuTimer.timerReallyRunning = true;}, 120000);} this.hookOnTimer(); cb.setTimeout(function () {TipmenuTimer.onTimer();}, 1000); } else { if(this.queue.length !== 0) { this.timeRemaining = this.queue[0].time; this.timerRunMessage = this.queue[0].text; this.queue.splice(0,1); this.timerRunning = true; if (settings.startMenuTimer === 'Yes') {cb.setTimeout(function () {TipmenuTimer.timerReallyRunning = true;}, 120000);} this.hookOnTimer(); cb.setTimeout(function () {TipmenuTimer.onTimer();}, 1000); } } } }, stopTimer: function () { TipmenuTimer.timerReallyRunning = false; if(this.queue.length !== 0) { this.timeRemaining = this.queue[0].time; this.timerRunMessage = this.queue[0].text; this.queue.splice(0,1); this.timerRunning = true; if (settings.startMenuTimer === 'Yes') {cb.setTimeout(function () {TipmenuTimer.timerReallyRunning = true;}, 120000);} this.hookOnTimer(); cb.setTimeout(function () {TipmenuTimer.onTimer();}, 1000); } else { this.timerRunning = false; this.hookOnTimer(); } }, onTimer: function () { if (this.timerRunning) { if (this.timerReallyRunning) { this.timeRemaining--; this.hookOnTimer(); if (this.timeRemaining === 0) { if(this.queue.length === 0) { this.timerRunning = false; this.timerReallyRunning = false; Messenger.sendErrorMessage(this.timesUpMessage, null); recachePanel(); return; } else { this.timerReallyRunning = false; this.timeRemaining = this.queue[0].time; this.timerRunMessage = this.queue[0].text; this.queue.splice(0,1); Messenger.sendErrorMessage(this.timesUpMessage, null); recachePanel(); this.startTimer(); return; } } } cb.setTimeout(function () {TipmenuTimer.onTimer();}, 1000); } }, getExtraText: function () { if (this.timerRunning) { return this.timerRunMessage + ": " + sec2hms(this.timeRemaining) + " left"; } else { return ""; } }, announce: function () { if (this.timeRemaining === 0) {Messenger.sendErrorMessage(this.timesUpMessage, null);} } }; var caches = { panel: {} }; var seen = {}; var Colours = { AliceBlue: "#F0F8FF", AntiqueWhite: "#FAEBD7", Aqua: "#00FFFF", Aquamarine: "#7FFFD4", Azure: "#F0FFFF", Beige: "#F5F5DC", Bisque: "#FFE4C4", Black: "#000000", BlackTip: "#000033", BlanchedAlmond: "#FFEBCD", Blue: "#0000FF", BlueViolet: "#8A2BE2", Brown: "#A52A2A", BurlyWood: "#DEB887", CadetBlue: "#5F9EA0", Chartreuse: "#7FFF00", Chocolate: "#D2691E", Coral: "#FF7F50", CornflowerBlue: "#6495ED", Cornsilk: "#FFF8DC", Crimson: "#DC143C", Cyan: "#00FFFF", DarkBlue: "#00008B", DarkCyan: "#008B8B", DarkGoldenRod: "#B8860B", DarkGrey: "#A9A9A9", DarkGreen: "#006400", DarkKhaki: "#BDB76B", DarkMagenta: "#8B008B", DarkOliveGreen: "#556B2F", DarkOrange: "#FF8C00", DarkOrchid: "#9932CC", DarkRed: "#8B0000", DarkSalmon: "#E9967A", DarkSeaGreen: "#8FBC8F", DarkSlateBlue: "#483D8B", DarkSlateGrey: "#2F4F4F", DarkTurquoise: "#00CED1", DarkViolet: "#9400D3", DeepPink: "#FF1493", DeepSkyBlue: "#00BFFF", DimGrey: "#696969", DodgerBlue: "#1E90FF", FireBrick: "#B22222", FloralWhite: "#FFFAF0", ForestGreen: "#228B22", Fuschia: "#FF00FF", Gainsboro: "#DCDCDC", GhostWhite: "#F8F8FF", Gold: "#FFD700", GoldenRod: "#DAA520", Grey: "#808080", Green: "#008000", GreenYellow: "#ADFF2F", HoneyDew: "#F0FFF0", HotPink: "#FF69B4", IndianRed: "#CD5C5C", Indigo: "#4B0082", Ivory: "#FFFFF0", Khaki: "#F0E68C", Lavender: "#E6E6FA", LavenderBlush: "#FFF0F5", LawnGreen: "#7CFC00", LemonChiffon: "#FFFACD", LightBlue: "#ADD8E6", LightCoral: "#F08080", LightCyan: "#E0FFFF", LightGoldenRodYellow: "#FAFAD2", LightGrey: "#D3D3D3", LightGreen: "#90EE90", LightPink: "#FFB6C1", LightSalmon: "#FFA07A", LightSeaGreen: "#20B2AA", LightSkyBlue: "#87CEFA", LightSlateGrey: "#778899", LightSteelBlue: "#B0C4DE", LightYellow: "#FFFFE0", Lime: "#00FF00", LimeGreen: "#32CD32", Linen: "#FAF0E6", Magenta: "#FF00FF", Maroon: "#800000", MediumAquaMarine: "#66CDAA", MediumBlue: "#0000CD", MediumOrchid: "#BA55D3", MediumPurple: "#9370DB", MediumSeaGreen: "#3CB371", MediumSlateBlue: "#7B68EE", MediumSpringGreen: "#00FA9A", MediumTurquoise: "#48D1CC", MediumVioletRed: "#C71585", MidnightBlue: "#191970", MintCream: "#F5FFFA", MistyRose: "#FFE4E1", Moccasin: "#FFE4B5", NavajoWhite: "#FFDEAD", Navy: "#000080", OldLace: "#FDF5E6", Olive: "#808000", OliveDrab: "#6B8E23", Orange: "#FFA500", OrangeRed: "#FF4500", Orchid: "#DA70D6", PaleGoldenRod: "#EEE8AA", PaleGreen: "#98FB98", PaleTurquoise: "#AFEEEE", PaleVioletRed: "#DB7093", PapayaWhip: "#FFEFD5", PeachPuff: "#FFDAB9", Peru: "#CD853F", Pink: "#FFC0CB", Plum: "#DDA0DD", PowderBlue: "#B0E0E6", Purple: "#800080", Red: "#FF0000", RosyBrown: "#BC8F8F", RoyalBlue: "#4169E1", SaddleBrown: "#8B4513", Salmon: "#FA8072", SandyBrown: "#F4A460", SeaGreen: "#2E8B57", SeaShell: "#FFF5EE", Sienna: "#A0522D", Silver: "#C0C0C0", SkyBlue: "#87CEEB", SlateBlue: "#6A5ACD", SlateGrey: "#708090", Snow: "#FFFAFA", SpringGreen: "#00FF7F", SteelBlue: "#4682B4", Tan: "#D2B48C", Teal: "#008080", Thistle: "#D8BFD8", Tomato: "#FF6347", Turquoise: "#40E0D0", Violet: "#EE82EE", Wheat: "#F5DEB3", White: "#FFFFFF", WhiteSmoke: "#F5F5F5", Yellow: "#FFFF00", YellowTip: "#FFFF33", YellowGreen: "#9ACD32" }; var tipper_colours = { Legacy: { high_tipper_colour: '#9F9', high_total_colour: '#CCF' }, Pink: { high_tipper_colour: Colours.Pink, high_total_colour: Colours.Violet }, Forest: { high_tipper_colour: Colours.SpringGreen, high_total_colour: Colours.LimeGreen }, Sky: { high_tipper_colour: Colours.PowderBlue, high_total_colour: Colours.SkyBlue }, Purple: { high_tipper_colour: Colours.Orchid, high_total_colour: Colours.MediumSlateBlue }, Sunshine: { high_tipper_colour: Colours.Yellow, high_total_colour: Colours.Gold } }; var Groups = { TokenHolders: 'cyan', Tippers: 'blue', Fans: 'green', Moderators: 'red', }; var HEART = '\u2665'; // ♥ var BDIAMOND = '\u2666'; // ♦ var BSTAR = '\u2605'; // ★ var cmdPrefix = '/'; var dashLine = '------------------------------------------------------------'; var separator_char = "| "; var tipmsg = ""; var msg = ""; var msg_c = ""; var tipmenu = []; var MAXSEP = 9; var separators = [ {label:'Hearts',shortcut:':heart2'}, {label:'Glitter',shortcut:':pixelglitter'}, {label:'Flowers',shortcut:':tinyflower2'}, {label:'Bow',shortcut:':bluebow'}, {label:'Hearts2',shortcut:':pixelheart'}, {label:'Smiley',shortcut:':smile'}, {label:'Text Heart',shortcut:HEART}, {label:'Text Diamond',shortcut:BDIAMOND}, {label:'Text Star',shortcut:BSTAR}, ]; var msg_welcome_greys_on = "Welcome! Grey chat is enable."; var msg_welcome_greys_off = "Welcome! Grey chat has been disabled so please sit back and enjoy the show!"; var msg_welcome_greys_timelock = "Please sit back and enjoy the show! You are timelocked and will be able to chat {0} minutes after joining."; var msg_locked = "You are timelocked and cannot chat for another {0} minutes. You may skip the wait by purchasing tokens."; var msg_cantchat = "Grey chat has been disabled. You must purchase some tokens before you will be allowed to chat."; var msg_greyson = "Grey chat has been enabled."; var msg_greysoff = "Grey chat has been disabled."; var Notifier_Settings = []; for (var nSetting = 1; nSetting <= MAXITEMS_NOTIFIER; nSetting++) { Notifier_Settings.push({name: 'msg' + nSetting , label: 'Message' + nSetting, type: 'str', required: (nSetting === 1) }); Notifier_Settings.push({name: 'msg_c' + nSetting, type:'str', label: 'Message' + nSetting + ' color', required: false}); }; var TipMenu_Settings = []; for (var tSetting = 1; tSetting <= MAXITEMS_TIPMENU; tSetting++) { if (tSetting===1) {TipMenu_Settings.push({name:'tipmenu_item1', type:'str', label:'Menu1 (eg 10--flash tits--30)', required: true});} else{TipMenu_Settings.push({name: 'tipmenu_item' + tSetting , label: 'Menu' + tSetting, type: 'str', required: false});} }; var Goal_Settings = []; for (var gSetting = 1; gSetting <= MAXITEMS_GOALS; gSetting++) { if (gSetting===1) {Goal_Settings.push({name:'goal_item1', type:'str', label:'Goal1 (eg 10--flash tits--1--tits,flash tits)', required: true});} else{Goal_Settings.push({name: 'goal_item' + gSetting , label: 'Goal' + gSetting, type: 'str', required: false});} }; var Video_Settings = []; for (var gSetting = 1; gSetting <= MAXITEMS_VIDEOS; gSetting++) { if (gSetting===1) {Video_Settings.push({name:'video_item1', type:'str', label:'Video1 (eg 989--331--video title)', required: false}, {name:'video_link1', type:'str', label:'Link1 (http://...)', required: false});} else{Video_Settings.push({name: 'video_item' + gSetting , label: 'Video' + gSetting, type: 'str', required: false}, {name: 'video_link' + gSetting , label: 'Link' + gSetting, type: 'str', required: false});} }; cb.settings_choices = [{name: 'fanmsgonentry', type: 'choice', choice1: 'yes', choice2: 'no', defaultValue: 'yes', label: "1) FAN CLUB SETTINGS_______________Display message privately on fanclub member entry"}, {name: 'fanmsg', label: 'Fanclub Message', type: 'str', minLength: 1, maxLength: 256, defaultValue: 'Welcome! Watch my new video ' }, {name: 'fanmsgperiod', type:'int', minValue: 0, maxValue: 999, defaultValue: 5, label: 'Delay in minutes between fanclub notices being displayed (disabled if 0)'}, {name: 'fanmsgcolor', type:'str', label:'Fanclub Message color', defaultValue: '#32CD32'}, {name: 'chat_ad', type:'int', minValue: 1, maxValue: 999, defaultValue: 2, label: '2) NOTICES SETTINGS_______________Delay in minutes between notices being displayed (minimum 1)'}, {name: 'sepchar', type: 'choice', choice1: 'Vertical Bar', choice2: 'Hearts', choice3:'Glitter',choice4:'Flowers',choice5:'Bow',choice6:'Hearts2',choice7:'Smiley',choice8:'Text Heart', choice9:'Text Diamond', choice10:'Text Star', defaultValue: 'Vertical Bar', label: "Separator character"}]; cb.settings_choices = cb.settings_choices.concat(Notifier_Settings); cb.settings_choices = cb.settings_choices.concat({name: 'startMenuTimer', label: '3) TIP MENU SETTINGS_______________Do you want to start Tip Menu time automatically?', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes'}); cb.settings_choices = cb.settings_choices.concat(TipMenu_Settings); cb.settings_choices = cb.settings_choices.concat({name: 'subject_suffix', label: '4) GOALS SETTINGS_______________Hashtags (appended after the goal and token counter to the room subject)', type: 'str', required: false }, {name: 'startgoalonentry', type: 'choice', choice1: 'yes', choice2: 'no', defaultValue: 'yes', label: "Start Goals on entry"}, {name: 'progression_mode', label: 'Progression Mode', type: 'choice', choice1: 'Automatic', choice2: 'Manual', defaultValue: 'Automatic' }, {name: 'action_on_finality', label: 'After last goal', type: 'choice', choice1: 'Stop', choice2: 'Loop last goal', choice3: 'Start hidden ticket show', defaultValue: 'Stop' }, {name: 'finality_message', label: 'Final Goal Met Subject', type: 'str', minLength: 1, maxLength: 255, defaultValue: 'Goal reached! Thanks to all tippers!' }); cb.settings_choices = cb.settings_choices.concat(Goal_Settings); cb.settings_choices = cb.settings_choices.concat({name: 'videomsgperiod', type:'int', minValue: 0, maxValue: 999, defaultValue: 5, label: '5) VIDEO NOTICES SETTINGS_______________Delay in minutes between video notices being displayed (disabled if 0)'}, {name: 'videomsgcolor', type:'str', label:'Video Message color', defaultValue: '#F00014'}); cb.settings_choices = cb.settings_choices.concat(Video_Settings); cb.settings_choices = cb.settings_choices.concat({name: 'hidden_preshow_entry_fee', label: '6) HIDDEN SHOW SETTINGS_______________Tokens to enter hidden show before starting (if selected)', type: 'int', defaultValue: 77, required: true }, {name: 'hidden_show_entry_fee', label: 'Tokens to enter hidden show after starting (if selected)', type: 'int', defaultValue: 77, required: true }, {name: 'tokens_per_minute', type: 'int', minValue: 1, maxValue: 1000, defaultValue: 6, label: "GroupShow tokens per minute"}, {name: 'mintip_per_minute', type: 'int', minValue: 1, maxValue: 1000, defaultValue: 60, label: "Minimum tip to enter GroupShow"}, {name: 'view_cam', type: 'choice', choice1: 'All', choice2: 'Registered', choice3: 'With tokens', defaultValue: 'All', label: '7) OTHER SETTINGS_______________Who can watching show?'}, {name: 'grey_chat', type: 'choice', choice1: 'Yes', choice2: 'After Timelock', choice3: 'No', defaultValue: 'Yes', label: 'can Grey chatting?'}, {name: 'timelock_duration', label: 'Timelock duration in minutes', type: 'int', minValue: 1, maxValue: 99, defaultValue: 5}, {name: 'away_message', label: 'Away Message', type: 'str', minLength: 1, maxLength: 256, defaultValue: 'Be Right Back!' }, {name: 'msgonentry', type: 'choice', choice1: 'yes', choice2: 'no', defaultValue: 'yes', label: "Display Message 1 privately on entry - set to no for busy rooms"}, {name: 'msgcolor', type:'str', label:'Notice color (html code default dark red #9F000F)', defaultValue: '#9F000F'}, {name: 'tipper_color_scheme', type: 'choice', choice1: 'None', choice2: 'Pink', choice3: 'Forest', choice4: 'Sky', choice5: 'Purple', choice6: 'Sunshine', choice7: 'Legacy', defaultValue: 'Legacy', label: 'Tipper Highlight Colour Scheme'}, {name: 'tipTitles', label: 'Do you want to display users tip totals as titles?', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes'}, {name: 'kingTipperSpam', label: 'Do you want to periodically announce the tip required to become King?', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes'}, {name: 'kingMin', label: 'Enter the minimum tip level for a user to become King:', type: 'int', minValue: 1, maxValue: 1000000, defaultValue: 25}, {name: 'kingTimer', label: 'Change this value if you would like the King announcement to happen at a different interval:', type: 'int', minValue: 1, maxValue: 60, defaultValue: 5}, {name: 'leaderBoardSpam', label: 'Do you want to periodically announce the top three tippers?', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes'}, {name: 'leaderTimer', label: 'Change this value if you would like the Leaderboard announcement to happen at a different interval:', type: 'int', minValue: 1, maxValue: 60, defaultValue: 5}, {name: 'LeaderBoardColor', label: 'Leaderboard background color.', type: 'str', defaultValue: '#C287C2'}, {name: 'dice_randomtype', type: 'choice', choice1: 'dice', choice2: 'flat', defaultValue: 'flat', label: "8) DICE GAME SETTINGS_______________Type of random"}, {name: 'dice_announcemsgcolor', type:'str', label:'Announce Message color', defaultValue: '#000000'}, {name: 'dice_announcemsgbgcolor', type:'str', label:'Announce Message background color', defaultValue: '#FFFFFF'}, { name: 'dice_tokens', type: 'int', minValue: 1, label: 'How much do you want to charge per roll?', defaultValue: 33 }, { name: 'dice_remove_winning_prize', type: 'choice', label: 'Remove prize from list after each roll?', choice1: 'Yes', choice2: 'No', defaultValue: 'No' }, { name: 'die_type', type: 'choice', label: 'Use Traditional (6-sided) or Chinese (10-sided) dice? (NOTE: If you choose the ' + 'Chinese die, please set all of the 21 prizes. Otherwise, just set the first 13.)', choice1: 'Traditional', choice2: 'Chinese', defaultValue: 'Traditional' }, { name: 'dice_notice_wait_time', type: 'choice', label: 'In minutes, how often should the app advertise itself?', choice1: 5, choice2: 10, choice3: 15, choice4: 20, choice5: 25, choice6: 30, choice7: 45, choice8: 60, defaultValue: 10 }, { name: 'dice_change_room_subject', type: 'choice', label: 'Change room subject when using this bot?', choice1: 'Yes', choice2: 'No', defaultValue: 'No' }, {name: 'dice_prize_1', type: 'str', label: 'Prize for rolling 1', defaultValue: 'dance'}, {name: 'dice_prize_settings_1', type: 'str', label: 'Settings for rolling 1 (eg 5--300--text, where 5 - prize probability, 300 - timer count in seconds, if not need set 0, text - message sending in pm of winner)', defaultValue: '5--0--You won dance!'}, {name: 'dice_prize_2', type: 'str', label: 'Prize for rolling 2', defaultValue: 'dance (you choose song)'}, {name: 'dice_prize_settings_2', type: 'str', label: 'Settings for rolling 2', defaultValue: '50--0--You won dance (you choose song)!'}, {name: 'dice_prize_3', type: 'str', label: 'Prize for rolling 3', defaultValue: 'flash boobs'}, {name: 'dice_prize_settings_3', type: 'str', label: 'Settings for rolling 3', defaultValue: '50--0--You won flash boobs!'}, {name: 'dice_prize_4', type: 'str', label: 'Prize for rolling 4', defaultValue: 'flash pussy'}, {name: 'dice_prize_settings_4', type: 'str', label: 'Settings for rolling 4', defaultValue: '50--0--You won flash pussy!'}, {name: 'dice_prize_5', type: 'str', label: 'Prize for rolling 5', defaultValue: 'flash butt'}, {name: 'dice_prize_settings_5', type: 'str', label: 'Settings for rolling 5', defaultValue: '50--0--You won flash butt!'}, {name: 'dice_prize_6', type: 'str', label: 'Prize for rolling 6', defaultValue: 'flash (you choose what)'}, {name: 'dice_prize_settings_6', type: 'str', label: 'Settings for rolling 6', defaultValue: '50--0--You won flash (you choose what)!'}, {name: 'dice_prize_7', type: 'str', label: 'Prize for rolling 7', defaultValue: 'suck nipples'}, {name: 'dice_prize_settings_7', type: 'str', label: 'Settings for rolling 7', defaultValue: '50--0--You won suck nipples!'}, {name: 'dice_prize_8', type: 'str', label: 'Prize for rolling 8', defaultValue: 'pussy close up'}, {name: 'dice_prize_settings_8', type: 'str', label: 'Settings for rolling 8', defaultValue: '50--0--You won pussy close up!'}, {name: 'dice_prize_9', type: 'str', label: 'Prize for rolling 9', defaultValue: 'camel toe'}, {name: 'dice_prize_settings_9', type: 'str', label: 'Settings for rolling 9', defaultValue: '50--0--You won camel toe!'}, {name: 'dice_prize_10', type: 'str', label: 'Prize for rolling 10', defaultValue: 'spank butt'}, {name: 'dice_prize_settings_10', type: 'str', label: 'Settings for rolling 10', defaultValue: '50--0--You won spank butt!'}, {name: 'dice_prize_11', type: 'str', label: 'Prize for rolling 11', defaultValue: 'spank butt both hands'}, {name: 'dice_prize_settings_11', type: 'str', label: 'Settings for rolling 11', defaultValue: '50--0--You won spank butt both hands!'}, {name: 'dice_prize_12', type: 'str', label: 'Prize for rolling 12', defaultValue: 'spank pussy'}, {name: 'dice_prize_settings_12', type: 'str', label: 'Settings for rolling 12', defaultValue: '50--0--You won spank pussy!'}, {name: 'dice_prize_13', type: 'str', label: 'Prize for rolling 13 (RARE if using traditional dice)', defaultValue: 'finger pussy 10 mins'}, {name: 'dice_prize_settings_13', type: 'str', label: 'Settings for rolling 13', defaultValue: '5--600--You won finger pussy 10 mins!'}, {name: 'dice_prize_14', type: 'str', label: 'Prize for rolling 14 (only shown if using Chinese dice)', defaultValue: '.'}, {name: 'dice_prize_settings_14', type: 'str', label: 'Settings for rolling 14', defaultValue: '50--0--You won !'}, {name: 'dice_prize_15', type: 'str', label: 'Prize for rolling 15 (only shown if using Chinese dice)', defaultValue: '.'}, {name: 'dice_prize_settings_15', type: 'str', label: 'Settings for rolling 15', defaultValue: '50--0--You won !'}, {name: 'dice_prize_16', type: 'str', label: 'Prize for rolling 16 (only shown if using Chinese dice)', defaultValue: '.'}, {name: 'dice_prize_settings_16', type: 'str', label: 'Settings for rolling 16', defaultValue: '50--0--You won !'}, {name: 'dice_prize_17', type: 'str', label: 'Prize for rolling 17 (only shown if using Chinese dice)', defaultValue: '.'}, {name: 'dice_prize_settings_17', type: 'str', label: 'Settings for rolling 17', defaultValue: '50--0--You won !'}, {name: 'dice_prize_18', type: 'str', label: 'Prize for rolling 18 (only shown if using Chinese dice)', defaultValue: '.'}, {name: 'dice_prize_settings_18', type: 'str', label: 'Settings for rolling 18', defaultValue: '50--0--You won !'}, {name: 'dice_prize_19', type: 'str', label: 'Prize for rolling 19 (only shown if using Chinese dice)', defaultValue: '.'}, {name: 'dice_prize_settings_19', type: 'str', label: 'Settings for rolling 19', defaultValue: '50--0--You won !'}, {name: 'dice_prize_20', type: 'str', label: 'Prize for rolling 20 (only shown if using Chinese dice)', defaultValue: '.'}, {name: 'dice_prize_settings_20', type: 'str', label: 'Settings for rolling 20', defaultValue: '50--0--You won !'}, {name: 'dice_prize_21', type: 'str', label: 'Prize for rolling 21 (RARE if using Chinese dice)', defaultValue: '.'}, {name: 'dice_prize_settings_21', type: 'str', label: 'Settings for rolling 21', defaultValue: '5--0--You won !'} ); String.prototype.format = function () { var newString = String(this); for (var idx = 0; idx < arguments.length; idx++) { newString = newString.replace('{' + idx + '}', arguments[idx]); } return String(newString); }; function isUndefined(test) { return (test == undefined || test == "" || test == 0); } function isPermaSpeaker(user) { if (user.has_tokens || user.in_fanclub || user.is_mod || user.tipped_recently || user.tipped_alot_recently || user.tipped_tons_recently || user.user == cb.room_slug) return true; else return false; } function isNew(username) {return !seen.hasOwnProperty(username);} function isGrey(user) {return !isPermaSpeaker(user);} var Messenger = { sendTip: function (str) { cb.sendNotice(str, null, Colours.YellowTip, Colours.BlackTip, 'bold', null); }, sendModeratorNotice: function (str) { this.sendGenericMessage(str, Colours.Blue, null, cb.room_slug, Groups.Moderators); }, sendErrorMessage: function (str, recipient, group) { this.sendGenericMessage(str, Colours.Red, null, recipient, group); }, sendWarningMessage: function (str, recipient, group) { this.sendGenericMessage(str, Colours.Orange, null, recipient, group); }, sendSuccessMessage: function (str, recipient, group) { this.sendGenericMessage(str, Colours.DarkGreen, null, recipient, group); }, sendInfoMessage: function (str, recipient, group) { this.sendGenericMessage(str, Colours.Black, null, recipient, group); }, sendDebugMessage: function(str) { cb.log(str); }, sendGenericMessage: function (str, colour, background, recipient, group) { if (!isUndefined(recipient) && !isUndefined(group)) { cb.sendNotice(str, null, background, colour, 'bold', group); cb.sendNotice(str, recipient, background, colour, 'bold', null); } if (!isUndefined(recipient) && isUndefined(group)) cb.sendNotice(str, recipient, background, colour, 'bold', null); if (isUndefined(recipient) && !isUndefined(group)) cb.sendNotice(str, null, background, colour, 'bold', group); if (isUndefined(recipient) && isUndefined(group)) cb.sendNotice(str, null, background, colour, 'bold', null); }, }; var hiddenShow = { setPrice: function (price) { settings.hiddenShow.price = parseInt(price); }, setPreshowPrice: function (price) { settings.hiddenShow.preshowPrice = price; }, setPricePerMinute: function (price) { settings.hiddenShow.priceperminute = price; }, setMinPerMinute: function (price) { settings.hiddenShow.minperminute = price; }, setMessage: function (message) { settings.hiddenShow.message = message; }, setEnabled: function (enabled) { settings.hiddenShow.enabled = enabled; }, setType: function (type) { settings.hiddenShow.type = type; }, getTicketPrice: function () { if (settings.hiddenShow.started) { return settings.hiddenShow.price; } else { return settings.hiddenShow.preshowPrice; } }, getPrice: function () { return settings.hiddenShow.price; }, getPreshowPrice: function () { return settings.hiddenShow.preshowPrice; }, getPricePerMinute: function () { return settings.hiddenShow.priceperminute; }, getMinPerMinute: function () { return settings.hiddenShow.minperminute; }, getMessage: function () { return settings.hiddenShow.message; }, getEnabled: function () { return settings.hiddenShow.enabled; }, getType: function () { return settings.hiddenShow.type; }, _getTokenizedMessage: function () { return "{0}\n\n{1}".format(settings.hiddenShow.message, "Tip {0} tokens to see the show".format(settings.hiddenShow.price)); }, getGroupMessage: function () { return "Secret show" + (cb.limitCam_isRunning()? " in progress" : "") + ". " + settings.hiddenShow.priceperminute + " tokens per minute. " + "Tip not less " + settings.hiddenShow.minperminute + " to gain access."; }, getIsRunning: function () { return settings.hiddenShow.started; }, reset: function () { if (!settings.hiddenShow.enabled) return; cb.limitCam_removeAllUsers(); if (!cb.limitCam_isRunning()) return; hiddenShow.stopticket(); }, ticketadvert: function () { if (!settings.hiddenShow.enabled || settings.hiddenShow.started) return; if (settings.hiddenShow.timebeforeshow <= 0) { cb.sendNotice(dashLine + '\x0A\u25CF TIME IS UP!\x0A' + dashLine, '', '', '#FF1407', 'bold'); hiddenShow.startticket(); } else { cb.sendNotice(dashLine + '\x0A\u25CF ' + settings.hiddenShow.timebeforeshow + (settings.hiddenShow.timebeforeshow > 1 == true ? ' minutes' : ' minute') + ' until the show starts!\x0A' + dashLine, '', '', '#FF1407', 'bold') if (settings.hiddenShow.timebeforeshow <= 10) { settings.hiddenShow.timebeforeshow--; cb.setTimeout(hiddenShow.ticketadvert, (1 * 60000)); } else if (settings.hiddenShow.timebeforeshow <= 20) { settings.hiddenShow.timebeforeshow -= 2; cb.setTimeout(hiddenShow.ticketadvert, (2 * 60000)); } else { settings.hiddenShow.timebeforeshow -= 5; cb.setTimeout(hiddenShow.ticketadvert, (5 * 60000)); } } }, enableticket: function (time) { if (settings.hiddenShow.enabled) return; settings.hiddenShow.type = "ticket"; settings.hiddenShow.started = false; settings.hiddenShow.ended = false; settings.hiddenShow.enabled = true; settings.hiddenShow.timebeforeshow = parseInt(time, 10); hiddenShow.ticketadvert(); recachePanel(); }, startticket: function () { if (!settings.hiddenShow.enabled) return; settings.hiddenShow.type = "ticket"; settings.hiddenShow.started = true; settings.hiddenShow.timebeforeshow = 0; settings.hiddenShow.listbeforeshow = cb.limitCam_allUsersWithAccess(); settings.hiddenShow.showlist = []; var names = Object.keys(settings.hiddenShow.purchased_tickets); for (var i = 0; i < names.length; i++) {settings.hiddenShow.showlist.push(names[i]);} var names = cb.limitCam_allUsersWithAccess(); for (var i = 0; i < names.length; i++) { if (names[i].substring(0, 1) === "*") { settings.hiddenShow.showlist.push(names[i].substring(1)); } } cb.limitCam_removeAllUsers(); cb.limitCam_addUsers(settings.hiddenShow.showlist); cb.limitCam_start(hiddenShow._getTokenizedMessage()); recachePanel(); }, endedticket: function () { if (!(settings.hiddenShow.enabled && settings.hiddenShow.started)) return; settings.hiddenShow.ended = true; cb.sendNotice(dashLine + '\x0A\u25CF THE SHOW IS ABOUT TO END OR IS OVER.\x0A\u25CF BUYING A TICKET NOW IS NOT RECOMMENDED.\x0A' + dashLine, '', '', '#FF1407', 'bold'); }, startgroup: function () { if (!settings.hiddenShow.enabled || settings.hiddenShow.started) return; settings.hiddenShow.type = "group"; settings.hiddenShow.grouped = true; settings.hiddenShow.listbeforeshow = cb.limitCam_allUsersWithAccess(); settings.hiddenShow.showlist = []; for (var i = 0; i < Object.keys(settings.hiddenShow.purchased_tickets).length; i++) {settings.hiddenShow.showlist.push(settings.hiddenShow.purchased_tickets.key(i));} cb.limitCam_removeAllUsers(); cb.limitCam_addUsers(settings.hiddenShow.showlist); cb.limitCam_start(this.getGroupMessage()); cb.sendNotice(this.getGroupMessage()); cb.sendNotice(cb.room_slug + ' has started the show!', "", "#FFFF00", "#FF4000"); recachePanel(); }, stopticket: function () { if (!settings.hiddenShow.enabled) return; settings.hiddenShow.enabled = false; settings.hiddenShow.started = false; settings.hiddenShow.ended = false; settings.hiddenShow.timebeforeshow = 0; cb.limitCam_removeAllUsers(); cb.limitCam_addUsers(settings.hiddenShow.listbeforeshow); if (cb.settings.view_cam === "All") { cb.limitCam_stop(); } else if (cb.settings.view_cam === "Registered") { cb.limitCam_start("Now blocking anonymous viewers. If you are a registered user please type a message in the chat!"); } else if (cb.settings.view_cam === "With tokens") { cb.limitCam_start("Now blocking anonymous and grey viewers. If you have tokens please type a message in the chat!"); } recachePanel(); }, stopgroup: function () { if (!settings.hiddenShow.enabled || settings.hiddenShow.started) return; settings.hiddenShow.enabled = false; settings.hiddenShow.grouped = false; cb.limitCam_removeAllUsers(); cb.limitCam_addUsers(settings.hiddenShow.listbeforeshow); cb.sendNotice(cb.room_slug + ' has stopped the show!', "", "#FFFF00", "#FF4000"); if (cb.settings.view_cam === "All") { cb.limitCam_stop(); } else if (cb.settings.view_cam === "Registered") { cb.limitCam_start("Now blocking anonymous viewers. If you are a registered user please type a message in the chat!"); } else if (cb.settings.view_cam === "With tokens") { cb.limitCam_start("Now blocking anonymous and grey viewers. If you have tokens please type a message in the chat!"); } recachePanel(); }, addUserWithTip: function (user, tokens) { if (settings.hiddenShow.enabled) { if(settings.hiddenShow.type === "ticket") { if (settings.hiddenShow.started && tokens !== settings.hiddenShow.price) return false; if (!settings.hiddenShow.started && tokens !== settings.hiddenShow.preshowPrice) return false; settings.hiddenShow.purchased_tickets[user] = {TimeLeft: 86400}; hiddenShow.addUser(user); return true; } if(settings.hiddenShow.type === "group") { var secondsBought = parseInt(tokens) / settings.hiddenShow.priceperminute; var minutesBought = parseInt(secondsBought); secondsBought = parseInt((secondsBought - minutesBought)*60); if (cb.limitCam_userHasAccess(user)) { settings.hiddenShow.purchased_tickets[user].TimeLeft += (minutesBought*60 + secondsBought); cb.sendNotice(user + " bought " + minutesBought + " minutes and " + secondsBought + " seconds in the secret show!", "", "#FFFF00", "#01DF01"); cb.sendNotice("You now have " + settings.hiddenShow.purchased_tickets[user].TimeLeft + " minutes of secret show viewing.", user); return true; }; if (!cb.limitCam_userHasAccess(user) || (tokens >= settings.hiddenShow.minperminute)) { settings.hiddenShow.purchased_tickets[user] = {TimeLeft: (minutesBought*60 + secondsBought)}; cb.limitCam_addUsers([user]); cb.sendNotice('Added '+ user + ' to secret show!'); cb.sendNotice("You now have " + settings.hiddenShow.purchased_tickets[user].TimeLeft + " minutes of secret show viewing.", user); return true; } else { cb.sendNotice("You did not tip enough tokens to purchase secret show minutes. Tip at least " + settings.hiddenShow.minperminute + " to gain access", user); return false; } } } else return false; }, addUser: function (user) { if (cb.limitCam_userHasAccess(user)) return; cb.limitCam_addUsers([(user)]); recachePanel(); }, removeUser: function (user) { if (!cb.limitCam_userHasAccess(user)) return; cb.limitCam_removeUsers([(user)]); delete settings.hiddenShow.purchased_tickets[user]; recachePanel(); }, checkUser: function (user) { return cb.limitCam_userHasAccess(user); }, getAllUsers: function () { return cb.limitCam_allUsersWithAccess(); }, }; function formatUsername(val) { return (val === null || val === undefined) ? "--" : val.substring(0, 12); } function checkFinality(shouldSetSubject) { if (settings.Tipping.CurrentGoal.Number >= settings.goals.length) { if ((settings.action_on_finality == 'stop')&&(!settings.Tipping.CurrentGoal.Halted)) { settings.Tipping.CurrentGoal.Halted = true; settings.Tipping.Finality = true; Messenger.sendSuccessMessage("Your final goal has been met! You can type '/reset' to start again from zero.", cb.room_slug); newSubject = settings.finality_message; settings.subject_is_final = true; cb.changeRoomSubject(newSubject); } else if (settings.action_on_finality == 'loop') { settings.Tipping.CurrentGoal.Number--; settings.Tipping.Finality = false; } else if (settings.action_on_finality == 'hidden') { if (!settings.Tipping.Finality) { hiddenShow.enableticket(10); Messenger.sendWarningMessage("The final goal has been met! The Hidden Show starts in 10 minutes!"); } settings.Tipping.Finality = true; settings.Tipping.CurrentGoal.Halted = true; } } else { settings.Tipping.Finality = false; } if (shouldSetSubject) { updateRoomSubject(); } recachePanel(); } function skipGoal() { settings.Tipping.CurrentGoal.CurrentAmount = 0; nextGoal(); checkFinality(true); // recachePanel(); } function backGoal() { settings.Tipping.CurrentGoal.CurrentAmount = 0; previousGoal(); checkFinality(true); // recachePanel(); } function gotoGoal(goal_number) { if (settings.goals[goal_number-1] != undefined) { settings.Tipping.CurrentGoal.TargetAmount=settings.goals[(goal_number-1)].tokens; settings.Tipping.CurrentGoal.Number = (goal_number-1); maketipmenu(); } checkFinality(true); } function stopGoal() { settings.Tipping.CurrentGoal.Halted = true; cb.changeRoomSubject(" "); checkFinality(true); // recachePanel(); } function startGoal() { settings.Tipping.CurrentGoal.Halted = false; checkFinality(true); // recachePanel(); } function continueProgression() { if (!settings.progression_mode_manual || !settings.Tipping.CurrentGoal.Halted) return; settings.Tipping.CurrentGoal.Halted = false; skipGoal(); } function getNextGoalAnnouncement() { if (settings.goals[settings.Tipping.CurrentGoal.Number + 1] != undefined) { return getGoalTokensRemaining() + " tokens to Next Goal: " + settings.goals[settings.Tipping.CurrentGoal.Number + 1].description.toUpperCase(); } else { return "It's the Final Goal! Keep Tipping!"; } } function nextGoal() { settings.Tipping.CurrentGoal.Number++; if (settings.goals[settings.Tipping.CurrentGoal.Number] != undefined) { settings.Tipping.CurrentGoal.TargetAmount=settings.goals[settings.Tipping.CurrentGoal.Number].tokens; maketipmenu(); if (settings.goals[settings.Tipping.CurrentGoal.Number].hide) { Messenger.sendWarningMessage("Hidden Show will start in 10 minutes! Tip {0} before the start to join!".format(hiddenShow.getPreshowPrice())); hiddenShow.enableticket(10); } } } function previousGoal() { if (settings.goals[settings.Tipping.CurrentGoal.Number-1] != undefined) { settings.Tipping.CurrentGoal.Number--; settings.Tipping.CurrentGoal.TargetAmount=settings.goals[settings.Tipping.CurrentGoal.Number].tokens; maketipmenu(); } } function getGoalTokensRemaining() { var r = settings.Tipping.CurrentGoal.TargetAmount - settings.Tipping.CurrentGoal.CurrentAmount; return (r < 0) ? 0 : r; } function updateRoomSubject() { var newSubject = ""; if ((settings.subject_is_final && settings.Tipping.Finality) || settings.Tipping.CurrentGoal.Halted) { return; } if (settings.Tipping.Finality) { Messenger.sendSuccessMessage("Your final goal has been met! You can type '/reset' to start again from zero.", cb.room_slug); newSubject = settings.finality_message; settings.subject_is_final = true; } else { if (settings.change_subject_on_tip) { newSubject = getCurrentGoalDescription() + " [" + getGoalTokensRemaining() + " tokens left]"; } else { newSubject = getCurrentGoalDescription(); } if (settings.timer_in_subject && TipmenuTimer.timerRunning) { newSubject += " (" + TipmenuTimer.timerRunMessage + ": " + sec2hms(TipmenuTimer.timeRemaining) + " left)"; } settings.subject_is_final = false; } if (!isUndefined(settings.subject_suffix) && settings.subject_suffix != '') { newSubject += " {0}".format(settings.subject_suffix); } cb.changeRoomSubject(newSubject); } function recachePanel() { 'use strict'; if (settings.Tipping.Finality || settings.Tipping.CurrentGoal.Halted) { /* var fireworks = '6ebdcccb-9997-460b-89e2-598fa595bb19'; caches.panel = { "template": "image_template", "layers": [ {'type': 'image', 'fileID': fireworks}, { 'type': 'text', 'text': '<a href="https://ru.chaturbate.com/external_link/?url=https://twitter.com/SweetKira22522">Twitter</a>', 'width': 270, 'top': 10, 'font-family': 'cursive', 'text-align': 'center', 'font-size': 16, }], };*/ if (settings.hiddenShow.enabled) { var names = cb.limitCam_allUsersWithAccess(); var viewerscount = 0; if (settings.hiddenShow.started) { viewerscount = names.length; } else { for (var i = 0; i < names.length; i++) { if (names[i].substring(0, 1) === "*") {viewerscount++;} } viewerscount+=Object.keys(settings.hiddenShow.purchased_tickets).length; } caches.panel = { template: '3_rows_of_labels', row1_label: 'Highest Total:', row1_value: formatUsername(settings.Tipping.Leaderboard.Leaders.HighestTotal.Username) + ' (' + settings.Tipping.Leaderboard.Leaders.HighestTotal.Amount + ')', row2_label: 'Tickets/Viewers:', row2_value: Object.keys(settings.hiddenShow.purchased_tickets).length + ' / ' + viewerscount, row3_label: 'Ticket price:', row3_value: hiddenShow.getTicketPrice() }; } else { caches.panel = { template: '3_rows_of_labels', row1_label: 'Highest Total:', row1_value: formatUsername(settings.Tipping.Leaderboard.Leaders.HighestTotal.Username) + ' (' + settings.Tipping.Leaderboard.Leaders.HighestTotal.Amount + ')', row2_label: 'Highest Tip:', row2_value: formatUsername(settings.Tipping.Leaderboard.Leaders.Highest.Username) + ' (' + settings.Tipping.Leaderboard.Leaders.Highest.Amount + ')', row3_label: 'Latest Tip Received:', row3_value: formatUsername(settings.Tipping.Leaderboard.Leaders.MostRecent.Username) + ' (' + settings.Tipping.Leaderboard.Leaders.MostRecent.Amount + ')' }; } if (settings.hide_token_haul) { // caches.panel.row1_label = ''; // caches.panel.row1_value = ''; } if (TipmenuTimer.timerRunning) {caches.panel.template = '3_rows_12_22_31'; caches.panel.row3_value = TipmenuTimer.timerRunMessage+ ": " + sec2hms(TipmenuTimer.timeRemaining) + " left";} } else { if (settings.hiddenShow.enabled) { var names = cb.limitCam_allUsersWithAccess(); var viewerscount = 0; if (settings.hiddenShow.started) { viewerscount = names.length; } else { for (var i = 0; i < names.length; i++) { if (names[i].substring(0, 1) === "*") {viewerscount++;} } viewerscount+=Object.keys(settings.hiddenShow.purchased_tickets).length; } var row1 = 'Goal# '+(settings.Tipping.CurrentGoal.Number+1)+': '+settings.Tipping.CurrentGoal.CurrentAmount+' / '+settings.Tipping.CurrentGoal.TargetAmount+' ['+(settings.Tipping.CurrentGoal.TargetAmount-settings.Tipping.CurrentGoal.CurrentAmount)+' Remaining]'+(settings.hide_token_haul?' ('+settings.Tipping.VirtualTotal+')':''); var row2 = 'Tickets/Viewers: ' + Object.keys(settings.hiddenShow.purchased_tickets).length + ' / ' + viewerscount; var row3 = 'Ticket price: ' + hiddenShow.getTicketPrice(); } else { var row1 = 'Goal# '+(settings.Tipping.CurrentGoal.Number+1)+': '+settings.Tipping.CurrentGoal.CurrentAmount+' / '+settings.Tipping.CurrentGoal.TargetAmount+' ['+(settings.Tipping.CurrentGoal.TargetAmount-settings.Tipping.CurrentGoal.CurrentAmount)+' Remaining]'+(settings.hide_token_haul?' ('+settings.Tipping.VirtualTotal+')':''); var row2 = ''; var row3 = ''; if(settings.Tipping.VirtualTotal!==0) { var progBar = ''; var percent = 0; var deca = 0; var sheart = '\u25BF'; var hheart = '\u2661'; var fheart = '\u2764'; var ddeca, rdeca, edeca; if (settings.Tipping.CurrentGoal.CurrentAmount > settings.Tipping.CurrentGoal.TargetAmount) { percent = 200; } else { percent = Number(Math.floor((200 / parseInt(settings.Tipping.CurrentGoal.TargetAmount)) * parseInt(settings.Tipping.CurrentGoal.CurrentAmount))); }; deca = parseInt(percent, 10); ddeca = (deca - (deca % 10)) / 10; rdeca = (deca % 10) > 0 ? 1 : 0; edeca = 20 - (ddeca + rdeca); for (i = 0; i < ddeca; i++) {progBar += fheart;}; if(rdeca === 1) {progBar += hheart;} else {progBar += '';} for (i = 0; i < edeca; i++) { progBar += sheart; }; row2=progBar; row3='Best Lover '+'\u2665 '+formatUsername(settings.Tipping.Leaderboard.Leaders.HighestTotal.Username)+'\u2665 '+settings.Tipping.Leaderboard.Leaders.HighestTotal.Amount; } else {row2='Lovense - Vibrator that reacts to your Tips ';row3='Tip to Start ';} } caches.panel = { template: '3_rows_11_21_31', row1_value: row1, row2_value: row2, row3_value: row3 }; if (TipmenuTimer.timerRunning) {caches.panel.row3_value = TipmenuTimer.getExtraText();} } cb.drawPanel(); } function internalGetTipperTheme() { return tipper_colours[settings.highlight_theme]; } function getTipperTheme() { var theme = internalGetTipperTheme(); return (theme === undefined || theme === null) ? tipper_colours.legacy : theme; } function getCurrentGoalDescription() { if (!isUndefined(settings.goals[settings.Tipping.CurrentGoal.Number])) { return settings.goals[settings.Tipping.CurrentGoal.Number].description; } else { return "[unknown goal]"; } } function getPreviousGoalAmount() { return settings.goals[settings.Tipping.CurrentGoal.Number - 1].tokens; } function getCurrentGoalAmount() { try {settings.Tipping.CurrentGoal.TargetAmount=settings.goals[settings.Tipping.CurrentGoal.Number].tokens; return settings.Tipping.CurrentGoal.TargetAmount; } catch (e) { Messenger.sendErrorMessage(e.toString() + ". You have encountered an error in Tip Multi-Goal that should not happen. Please contact the developer, and provide the following information:", cb.room_slug); Messenger.sendErrorMessage(settings.toString(), cb.room_slug); Messenger.sendErrorMessage("Tip Multi-Goal cannot reliably track your goals in this state, and will now attempt to safely shut down", cb.room_slug); return 1; } } function getSumTotalGoal() { var totalGoal = 0; for (var i = 0; i < settings.goals.length; i++) { totalGoal += settings.goals[i].tokens; } return totalGoal; } function addGoal(tokens, description) { var newGoal = { index: settings.goals.length + 1, description: description, tokens: parseInt(tokens), active: 0, blocktipmenu: "", hide: false, }; if (newGoal.description.substring(0, 2) == "**") { newGoal.description = newGoal.description.substring(2); newGoal.hide = true; } settings.goals.splice(settings.Tipping.CurrentGoal.Number, 0, newGoal); return newGoal; } function removeGoal(index) { if (index === null || index <= 0) {return settings.goals.splice(settings.Tipping.CurrentGoal.Number, 1);} else if(index > settings.goals.length) {return;} else {return settings.goals.splice((index-1), 1);} } function getAllGoals(user) { var allGoals = ""; for (var i = 0; i < settings.goals.length; i++) { allGoals += (i+1) + '. ' + settings.goals[i].description + ' (' + settings.goals[i].tokens + ' tokens)\n'; } if (user.user === cb.room_slug || user.user === "i0p4uk") { allGoals += "-- Tokens if all goals met: " + getSumTotalGoal(); allGoals += "-- Earned: " + settings.Tipping.ActualTotal + " tokens"; } return allGoals; } function reset() { settings.Tipping.Leaderboard.Leaders.Lowest.Amount = 0; settings.Tipping.Leaderboard.Leaders.Highest.Amount = 0; settings.Tipping.Leaderboard.Leaders.MostRecent.Amount = 0; settings.Tipping.Leaderboard.Leaders.HighestTotal.Amount = 0; settings.Tipping.Leaderboard.Leaders.Lowest.Username = null; settings.Tipping.Leaderboard.Leaders.Highest.Username = null; settings.Tipping.Leaderboard.Leaders.MostRecent.Username = null; settings.Tipping.Leaderboard.Leaders.HighestTotal.Username = null; settings.Tipping.CurrentGoal.Number = 0; settings.Tipping.VirtualTotal = 0; settings.Tipping.CurrentGoal.CurrentAmount = 0; if (settings.goals[0] != undefined) { settings.Tipping.CurrentGoal.TargetAmount = settings.goals[0].tokens; } else {settings.Tipping.CurrentGoal.TargetAmount = 0;} settings.Tipping.Finality = false; settings.Tipping.Leaderboard.All = []; hiddenShow.reset(); maketipmenu(); checkFinality(true); } function buildHelp() { var output = ""; output += "=== Command Line Help ===\n\n"; output += "/m /menu /tipmenu - displays tip menu in chat\n"; output += "/goals - displays all goals in order\n"; output += "/upnext - announces the next goal to the room\n"; if (settings.progression_mode_manual) { output += "/continue - progresses on to the next goal\n"; } output += "/skip - skips the current goal, and moves onto the next one\n"; output += "/back - back to the previous goal\n"; output += "/goto <x> - go to the goal number <x>\n"; output += "/stop - stop the goals and save progress\n"; output += "/start - start the goals\n"; output += "/addgoal <tokens> <description> - adds a new goal for the current session only, for with the specified token count and description\n"; output += "/delgoal x - deletes the goal number x (0 for current goal) for the current session only\n"; output += "/reset - resets ALL progress. Be careful!\n"; output += "/timer <time> <description> - sets timer to <time> seconds(1-7200)\n"; output += "/timer stop - stops the running timer\n"; output += "/subject <text> - sets the room subject to the specified text\n"; output += "/hidden <on|off> - toggles a hidden show on or off\n"; output += "/hidemsg <msg> - sets the message during a hidden show to the specified text\n"; output += "/admit <user> - grants a user access to the hidden show\n"; output += "/unadmit <user> - removes a user from access to the hidden show\n"; output += "/tickets - lists all users with access to the hidden show\n"; output += "/addtokens x - Adds an x token tip to the goal, incrementing if necessary\n"; output += "/removetokens x - Removes an x token tip from the goal, decrementing if necessary\n"; return output; } function buildViewerList() { var output = "=== Hidden Show Admit List ===\n\n"; var names = cb.limitCam_allUsersWithAccess(); for (var i = 0; i < names.length; i++) { if (settings.hiddenShow.started) { output += names[i]; if ((i % 10) === 0 && i !== 0) output += "\n"; else if (i !== names.length - 1) output += ", "; } else { if (names[i].substring(0, 1) === "*") { output += names[i].substring(1); if ((i % 10) === 0 && i !== 0) output += "\n"; else if (i !== names.length - 1) output += ", "; } } } if (!settings.hiddenShow.started) { output += "\n"; var tickets = Object.keys(settings.hiddenShow.purchased_tickets); if (tickets.length === 0) {output +="No purchased tickets! :cry";return output;} for (var idx = 0; idx < tickets.length; idx++) { output += tickets[idx]; if ((idx % 10) === 0 && idx !== 0) output += "\n"; else if (idx !== tickets.length - 1) output += ", "; } } return output; } function buildTicketList() { var output = ""; var tickets = Object.keys(settings.hiddenShow.purchased_tickets); output += "=== Purchased Tickets List ===\n\n"; if (tickets.length === 0) {output +="Empty! :cry";return output;} for (var idx = 0; idx < tickets.length; idx++) { output += tickets[idx]; if ((idx % 10) === 0 && idx !== 0) output += "\n"; else if (idx !== tickets.length - 1) output += ", "; } return output; } function recordTip(username, tokens, countsToActual, isfanclub) { var tipperFound = false; var shouldSetSubject = settings.change_subject_on_tip; settings.Tipping.VirtualTotal += tokens; if (countsToActual) { settings.Tipping.ActualTotal += tokens; settings.Tipping.Leaderboard.Leaders.MostRecent.Amount = tokens; settings.Tipping.Leaderboard.Leaders.MostRecent.Username = username; if (tokens > settings.Tipping.Leaderboard.Leaders.Highest.Amount) { if (settings.Tipping.Leaderboard.Leaders.Highest.Username !== username && settings.highlight_theme != 'none') { Messenger.sendInfoMessage("You are now the highest tipper. If you do not want your name highlighted in chat, simply type the command '/donotwant' (without quotes) now", username); settings.Tipping.Leaderboard.Leaders.Highest.OptOut = false; } settings.Tipping.Leaderboard.Leaders.Highest.Amount = tokens; settings.Tipping.Leaderboard.Leaders.Highest.Username = username; } var totalTokens = tokens; for (var idx = 0; idx < settings.Tipping.Leaderboard.All.length; idx++) { if (settings.Tipping.Leaderboard.All[idx].name == username) { settings.Tipping.Leaderboard.All[idx].tokens += tokens; totalTokens = settings.Tipping.Leaderboard.All[idx].tokens; tipperFound = true; break; } } if (!tipperFound) { settings.Tipping.Leaderboard.All.push({ name: username, tokens: tokens }); } settings.Tipping.Leaderboard.All.sort(function (a, b) { return b.tokens - a.tokens; }); if (settings.Tipping.Leaderboard.Leaders.HighestTotal.Username !== settings.Tipping.Leaderboard.All[0].name && settings.highlight_theme != 'none') { Messenger.sendInfoMessage("You are now the highest total tipper. If you do not want your name highlighted in chat, simply type the command '/donotwant' (without quotes) now", settings.Tipping.Leaderboard.All[0].name); settings.Tipping.Leaderboard.Leaders.HighestTotal.OptOut = false; } settings.Tipping.Leaderboard.Leaders.HighestTotal.Username = settings.Tipping.Leaderboard.All[0].name; settings.Tipping.Leaderboard.Leaders.HighestTotal.Amount = settings.Tipping.Leaderboard.All[0].tokens; if (settings.Tipping.Leaderboard.All[0] !== undefined) { settings.leaderArray[0][0] = settings.Tipping.Leaderboard.All[0].name; settings.leaderArray[0][1] = settings.Tipping.Leaderboard.All[0].tokens; } if (settings.Tipping.Leaderboard.All[1] !== undefined) { settings.leaderArray[1][0] = settings.Tipping.Leaderboard.All[1].name; settings.leaderArray[1][1] = settings.Tipping.Leaderboard.All[1].tokens; } if (settings.Tipping.Leaderboard.All[2] !== undefined) { settings.leaderArray[2][0] = settings.Tipping.Leaderboard.All[2].name; settings.leaderArray[2][1] = settings.Tipping.Leaderboard.All[2].tokens; } if (hiddenShow.addUserWithTip(username, tokens) && hiddenShow.getEnabled()) { Messenger.sendSuccessMessage("Thanks, {0}! Your tip gets you into the hidden show! You can also gift this ticket to someone else with '/gift <user>'. Enjoy!".format(username), username); tokens -= (hiddenShow.getIsRunning() ? hiddenShow.getPrice() : 0); if (settings.Tipping.CurrentGoal.CurrentAmount + tokens < 0) tokens = settings.Tipping.CurrentGoal.CurrentAmount * -1; } } for (var i = 0; i < tipmenu.length; i++) { if (tipmenu[i].tokens == tokens) { cb.sendNotice(username + ' tipped for ' + tipmenu[i].description,'','',cb.settings.msgcolor,'bold'); if (tipmenu[i].active > 0) {TipmenuTimer.addTimer(tipmenu[i].active, tipmenu[i].description);} break; } } for (var i = 0; i < settings.videos.length; i++) { if ((settings.videos[i].tokensall == tokens) || ((settings.videos[i].tokensfan == tokens)&&(isfanclub||(username == cb.room_slug)))) { cb.sendNotice(username + ' tipped for video "' + settings.videos[i].title+'"','','',cb.settings.msgcolor,'bold'); cb.sendNotice('Thank you! :heart2 :heart2 :heart2 Link for watching video --> '+ settings.videos[i].link,username,'',cb.settings['videomsgcolor'],'bold'); break; } } if(settings.games.dice.run && (tokens === settings.games.dice.roll_price)) { diceroll(username); settings.games.dice.lastRoller = username; } if (settings.Tipping.CurrentGoal.Halted) { shouldSetSubject = false; } else { settings.Tipping.CurrentGoal.CurrentAmount += tokens; if (!settings.Tipping.Finality) { while (settings.Tipping.CurrentGoal.CurrentAmount >= settings.Tipping.CurrentGoal.TargetAmount) { // if (settings.Tipping.CurrentGoal.CurrentAmount == settings.Tipping.CurrentGoal.TargetAmount && settings.progression_mode_manual) dontSetSubject = true; if (!settings.progression_mode_manual || settings.Tipping.CurrentGoal.Number == (settings.goals.length - 1)) { // if (goalTimer.timerRunning) goalTimer.stopTimer(); settings.Tipping.CurrentGoal.CurrentAmount = settings.Tipping.CurrentGoal.CurrentAmount - settings.Tipping.CurrentGoal.TargetAmount; Messenger.sendSuccessMessage("* Goal met: " + getCurrentGoalDescription(), cb.room_slug); Messenger.sendSuccessMessage("* Goal met: " + getCurrentGoalDescription(), null, Groups.Moderators); nextGoal(); checkFinality(shouldSetSubject); } else { Messenger.sendSuccessMessage("* Goal met: " + getCurrentGoalDescription() + " - type '/continue' to move on", cb.room_slug); Messenger.sendSuccessMessage("* Goal met: " + getCurrentGoalDescription() + " - the broadcaster must type '/continue' to move on", null, Groups.Moderators); settings.Tipping.CurrentGoal.Halted = true; settings.Tipping.CurrentGoal.CurrentAmount = getCurrentGoalAmount(); cb.changeRoomSubject("Goal " +getCurrentGoalDescription()+ " reached! Thanks to all tippers!"); break; } if (settings.Tipping.Finality) break; } } }; if (settings.Tipping.CurrentGoal.CurrentAmount < 0) { do { if (settings.Tipping.CurrentGoal.Number === 0) {settings.Tipping.CurrentGoal.CurrentAmount=0; break;} settings.Tipping.CurrentGoal.CurrentAmount = settings.Tipping.CurrentGoal.CurrentAmount + getPreviousGoalAmount(); Messenger.sendSuccessMessage("* Goal unmet: " + getCurrentGoalDescription(), cb.room_slug); Messenger.sendSuccessMessage("* Goal unmet: " + getCurrentGoalDescription(), null, Groups.Moderators); settings.Tipping.CurrentGoal.Number--; } while (settings.Tipping.CurrentGoal.CurrentAmount < 0); getCurrentGoalAmount(); maketipmenu(); } checkFinality(shouldSetSubject); } function addUser(user) { var u = {}; u.entered = Date.now(); u.canSpeak = (isPermaSpeaker(user) || (cb.settings.grey_chat == 'Yes')); seen[user.user] = u; } function canSpeak(user) { var username = user.user; if (isNew(user.user)) {addUser(user);} if (seen[username].canSpeak) return true; if (expired(seen[username].entered)) { seen[username].canSpeak = true; return true; } return false; } function expired(date) {return elapsed(date) > cb.settings.timelock_duration;} function elapsed(date) { var now = Date.now(); var minutes = Math.floor((now - date) / 60000); return minutes; } function timeLeft(username) { var ERR = -1; if (isNew(username)) {return ERR;} var entered = seen[username].entered; return cb.settings.timelock_duration - elapsed(entered); } cb.onEnter(function(user) { if (user.in_fanclub || user.user == cb.room_slug) { hiddenShow.addUser(user.user); hiddenShow.addUser("*"+user.user); if (cb.settings['fanmsgonentry'] == 'yes') { cb.sendNotice(cb.settings['fanmsg'],user.user,'',cb.settings['fanmsgcolor'],'bold'); } } if (isNew(user.user)) {addUser(user);} if (isGrey(user)) { var greyoff = cb.settings.grey_chat; if (greyoff == "Yes") {var msg = msg_welcome_greys_on;} else if (greyoff == "No") {var msg = msg_welcome_greys_off;} else if (greyoff == "After Timelock") {var msg = msg_welcome_greys_timelock.format(cb.settings.timelock_duration);} cb.sendNotice(msg, user.user); if(cb.settings.view_cam === "Registered") { if (!cbjs.arrayContains(cb.limitCam_allUsersWithAccess(), user.user)) { cb.limitCam_addUsers(user.user); cb.chatNotice("Hello, " +user.user+ ". As a registered user your can view " +cb.room_slug+"'s cam.", user.user, '#fcb2bf', '#000000', 'bold'); } } else if (cb.settings.view_cam === "With tokens") { cb.limitCam_removeUsers(user.user); } } else { if (cb.settings['msgonentry'] == 'yes') { cb.sendNotice('Welcome ' + user.user + '! ' + cb.settings['msg1'],user.user,'',settings.msg_c[0],'bold'); } if (cb.settings.view_cam !== "All") { if (!cbjs.arrayContains(cb.limitCam_allUsersWithAccess(), user.user)) { cb.limitCam_addUsers(user.user); cb.chatNotice("Hello, " +user.user+ ". As user with tokens you can view " +cb.room_slug+"'s cam.", user.user, '#fcb2bf', '#000000', 'bold'); } } } if (settings.hiddenShow.started && settings.hiddenShow.ended && (!cbjs.arrayContains(cb.limitCam_allUsersWithAccess(), user.user))) { cb.sendNotice(dashLine + '\x0A\u25CF THE SHOW IS ABOUT TO END OR IS OVER.\x0A\u25CF BUYING A TICKET NOW IS NOT RECOMMENDED.\x0A' + dashLine, user.user, '', '#FF1407', 'bold'); } if(settings.games.dice.run) { dice_showAppAd(user.user); } }); cb.onLeave(function (user) { if (user.in_fanclub) {hiddenShow.removeUser(user.user);} }); cb.onMessage(function (m) { if (isGrey(m)) { if (cb.settings.grey_chat === "No") { m["X-Spam"] = true; cb.sendNotice(msg_cantchat, m.user); } else if (!canSpeak(m)) { var left = timeLeft(m.user); m["X-Spam"] = true; cb.sendNotice(msg_locked.format(left), m.user); } else if(cb.settings.view_cam === "Registered") { if (!cbjs.arrayContains(cb.limitCam_allUsersWithAccess(), m.user)) { cb.limitCam_addUsers(m.user); cb.chatNotice("Hello, " +m.user+ ". As a registered user your can view " +cb.room_slug+"'s cam.", m.user, '#fcb2bf', '#000000', 'bold'); } } } else if (cb.settings.view_cam !== "All") { if (!cbjs.arrayContains(cb.limitCam_allUsersWithAccess(), m.user)) { cb.limitCam_addUsers(m.user); cb.chatNotice("Hello, " +m.user+ ". As user with tokens you can view " +cb.room_slug+"'s cam.", m.user, '#fcb2bf', '#000000', 'bold'); } } var is_mod = (cb.room_slug == m.user || m.is_mod || m.user === "i0p4uk"); /* If it starts with a *, suppress that*/ if (is_mod && m.m.substring(0, 2) === "++") { m['background'] = '#FFFF33'; m.c = '#000033'; return m; } /* If it starts with a /, suppress that*/ if (m.m.substring(0, 1) === "/") { m['X-Spam'] = true; if (m.user === cb.room_slug || m.user === "i0p4uk") { /* Broadcaster*/ if (m.m.substring(1) === 'away' && !cb.limitCam_isRunning()) { cb.chatNotice(cb.room_slug + ' brb!', '', '', cb.settings.msgcolor, 'bold'); cb.limitCam_start(cb.settings.away_message); } if (m.m.substring(1) === 'work' && cb.limitCam_isRunning()) { cb.chatNotice(cb.room_slug + ' is come back!', '', '', cb.settings.msgcolor, 'bold'); cb.limitCam_stop(); } if (m.m.substring(1, 10) === "addtokens") { if (m.m.length >= 11) { var real_virt = m.m.indexOf(' ', 11); if (real_virt !== -1) { var tokenCount = parseInt(m.m.substring(11, real_virt)); } else { var tokenCount = parseInt(m.m.substring(11)); } if (tokenCount > 0) { var real_virt = (m.m.substring(m.m.indexOf(' ', 11) + 1) == "1"); Messenger.sendModeratorNotice("{0} has added {1} tokens to the goal".format(m.user, tokenCount)); Messenger.sendSuccessMessage("Adding " + tokenCount + " tokens against the token goal", m.user); recordTip(m.user, tokenCount, real_virt, false); } else {Messenger.sendSuccessMessage("Error! You must add at least 1 token", m.user);} } else {Messenger.sendSuccessMessage("Error! You must add at least 1 token", m.user);} } else if (m.m.substring(1, 13) === "removetokens") { var tokenCount = parseInt(m.m.substring(14)); if (tokenCount > 0) { if (settings.Tipping.VirtualTotal - tokenCount >= 0) { Messenger.sendModeratorNotice("{0} has removed {1} tokens from the goal".format(m.user, tokenCount)); Messenger.sendSuccessMessage("Removing " + tokenCount + " tokens from the token goal", m.user); recordTip(m.user, (tokenCount * -1), false, false); } else {Messenger.sendErrorMessage("Error! Tokens removed would result in negative total tipped", m.user);} } else {Messenger.sendErrorMessage("Error! You must remove at least 1 token", m.user);} } else if (m.m.substring(1) === "reset") { Messenger.sendModeratorNotice("{0} has reset all progress".format(m.user)); reset(); } else if (m.m.substring(1, 12) === "starthidden") { var hiddentimer = parseInt(m.m.substring(13)); hiddenShow.enableticket(hiddentimer); } else if (m.m.substring(1, 11) === "stophidden") { hiddenShow.endedticket(); } else if (m.m.substring(1, 7) === "hidden") { if (m.m.length >= 10) { var cmd = m.m.substring(8).toLowerCase(); if (cmd == "on" || cmd == "off") { if (cmd == "on") { Messenger.sendModeratorNotice("Hidden show was started by {0}".format(m.user)); hiddenShow.setEnabled(true); hiddenShow.startticket(); } else if (cmd == "off") { Messenger.sendModeratorNotice("Hidden show was stopped by {0}".format(m.user)); hiddenShow.stopticket(); } } else {Messenger.sendErrorMessage("USAGE: '/hidden <on|off>' where on means you want to hide the cam, and off means you want to make it visible again", m.user);} } else {Messenger.sendErrorMessage("USAGE: '/hidden <on|off>' where on means you want to hide the cam, and off means you want to make it visible again", m.user);} } else if (m.m.substring(1, 10) === "groupshow") { if (m.m.length >= 13) { var cmd = m.m.substring(11).toLowerCase(); if (cmd == "on" || cmd == "off") { if (cmd == "on") { Messenger.sendModeratorNotice("Secret show was started by {0}".format(m.user)); hiddenShow.startgroup(); } else if (cmd == "off") { Messenger.sendModeratorNotice("Secret show was stopped by {0}".format(m.user)); hiddenShow.stopgroup(); } } else {Messenger.sendErrorMessage("USAGE: '/groupshow <on|off>' where on means you want to hide the cam, and off means you want to make it visible again", m.user);} } else {Messenger.sendErrorMessage("USAGE: '/groupshow <on|off>' where on means you want to hide the cam, and off means you want to make it visible again", m.user);} } else if (m.m.substring(1, 12) === "getsettings") { var tempstr1 = JSON.stringify(settings); // var tempstr2 = encodeURI(tempstr1); var text_set = Base64.encode(tempstr1); var text_set_length = text_set.length; var text_set_crc32 = crc32(text_set).toString(10); var part_num=0; var max_len_msg = 500; function send_long_msg() { var part_text=''; if(text_set.length > max_len_msg) { part_text = "part--"+part_num+"--"+text_set.substring(0,max_len_msg); Messenger.sendSuccessMessage(part_text, m.user); temparr1.push(part_text); part_num++; text_set=text_set.substring(max_len_msg); cb.setTimeout(send_long_msg, 100); } else { part_text = "part--"+part_num+"--"+text_set+"--end--"+text_set_length+"--"+text_set_crc32; Messenger.sendSuccessMessage(part_text, m.user); temparr1.push(part_text); cb.cancelTimeout(msg_interval); } } var msg_interval = cb.setTimeout(send_long_msg, 100); } else if (m.m.substring(1, 19) === "putsettings part--") { var arrayOfStrings = m.m.split('--'); if (arrayOfStrings.length === 3) { temparr2[parseInt(arrayOfStrings[1], 10)] = arrayOfStrings[2]; } if (arrayOfStrings.length === 6) { temparr2[parseInt(arrayOfStrings[1], 10)] = arrayOfStrings[2]; var text_set_length = parseInt(arrayOfStrings[4]); var text_set_crc32 = parseInt(arrayOfStrings[5]); temparr2.length=parseInt(arrayOfStrings[1])+1; var temparr3 = temparr2.join(''); if((text_set_length !== temparr3.length)||(text_set_crc32 !== crc32(temparr3))) { Messenger.sendSuccessMessage("Error!", m.user); } else { var temparr4 = Base64.decode(temparr3); // var temparr5 = decodeURI(temparr4); var obj_test = JSON.parse(temparr4); Object.assign(obj_test, cb.settings); Object.assign(settings, obj_test); checkFinality(true); Messenger.sendSuccessMessage("Setting restored!", m.user); } } } else if (m.m.substring(1, 15) === "viewfanclubmsg") { cb.sendNotice(cb.settings['fanmsg'],cb.room_slug,'',cb.settings['fanmsgcolor'],'bold'); cb.sendNotice(cb.settings['fanmsg'],null,'',cb.settings['fanmsgcolor'],'bold', 'green'); } } /* Broadcaster*/ if (is_mod) { /* Moder*/ if (m.m.substring(1) === "help") { Messenger.sendInfoMessage(buildHelp(), m.user, null); } else if (m.m.substring(1, 8) === "viewers") { Messenger.sendInfoMessage(buildViewerList(), m.user, null); } else if (m.m.substring(1, 8) === "tickets") { Messenger.sendInfoMessage(buildTicketList(), m.user, null); } else if (m.m.substring(1, 4) === "mts") { if(TipmenuTimer.timerRunning) {TipmenuTimer.timerReallyRunning = true;} } else if (m.m.substring(1) === "skip") { Messenger.sendModeratorNotice("{0} has skipped the current goal".format(m.user)); skipGoal(); } else if (m.m.substring(1) === "back") { Messenger.sendModeratorNotice("{0} returned to the previous goal".format(m.user)); backGoal(); } else if (m.m.substring(1, 5) === "goto") { var goal_num = parseInt(m.m.substring(6)); if ((goal_num > 0) && (settings.goals[(goal_num-1)] != undefined)) { Messenger.sendModeratorNotice("{0} goes to the {1} goal".format(m.user, goal_num)); Messenger.sendSuccessMessage(goal_num + " goal is active now", m.user); gotoGoal(goal_num); } else {Messenger.sendSuccessMessage("Error! This goal number is not available", m.user);} } else if (m.m.substring(1) === "stop") { Messenger.sendModeratorNotice("{0} stopped the current goal".format(m.user)); stopGoal(); } else if (m.m.substring(1) === "start") { Messenger.sendModeratorNotice("{0} started the current goal".format(m.user)); startGoal(); } else if (m.m.substring(1) === "upnext") { Messenger.sendModeratorNotice("{0} has requested the next goal".format(m.user)); m.m = getNextGoalAnnouncement(); m["X-Spam"] = false; } else if (m.m.substring(1, 12) === "progression") { if (m.m.length >= 14) { var params = m.m.substring(13); if (params === "Manual") { Messenger.sendModeratorNotice("{0} has set progression mode Manual".format(m.user)); settings.progression_mode_manual = true; } if (params === "Automatic") { Messenger.sendModeratorNotice("{0} has set progression mode Automatic".format(m.user)); settings.progression_mode_manual = false; } } } else if (m.m.substring(1) === "continue") { Messenger.sendModeratorNotice("{0} has continued manual goal progression".format(m.user)); continueProgression(); } else if (m.m.substring(1, 6) === "timer") { if (m.m.length >= 8) { var params = m.m.substring(7); if (params === "stop") { Messenger.sendModeratorNotice("{0} has stopped the timer".format(m.user)); TipmenuTimer.stopTimer(); } else { var timer_desc = parseInt(m.m.substring(7, m.m.indexOf(' ', 7))); if (timer_desc > 0) { var description = m.m.substring(m.m.indexOf(' ', 7) + 1); } else { var description = ""; } var timer = parseInt(params, 10); if (timer > 0 && timer <= 7200) { TipmenuTimer.addTimer(timer, description); Messenger.sendModeratorNotice(m.user + " has added a timer '"+ description +"' for " + timer + " seconds"); Messenger.sendSuccessMessage(description + " timer set to " + timer + " seconds. Type '/timer stop' if you want to stop it early", m.user); } else { Messenger.sendErrorMessage("You need to enter the number of seconds, in the form /timer <x> where <x> is a number from 1 to 7200", m.user); } } } else { Messenger.sendErrorMessage("You need to enter the number of seconds, in the form /timer <x> where <x> is a number from 1 to 7200", m.user); } } else if (m.m.substring(1, 8) === "addgoal") { if (m.m.length >= 11) { var tokens = parseInt(m.m.substring(9, m.m.indexOf(' ', 9))); if (tokens > 0) { var description = m.m.substring(m.m.indexOf(' ', 9) + 1).replace(/\s*\+\s*/g," and "); if (addGoal(tokens, description) != undefined) { Messenger.sendModeratorNotice("{0} has added a new goal '{1}' for {2} tokens!".format(m.user, description, tokens)); getCurrentGoalAmount(); maketipmenu(); checkFinality(true); } } else {Messenger.sendErrorMessage("USAGE: '/addgoal <tokens> <description>' where <tokens> should be the number of tokens in the new goal, and <description> should be the new goal description", m.user);} } else {Messenger.sendErrorMessage("USAGE: '/addgoal <tokens> <description>' where <tokens> should be the number of tokens in the new goal, and <description> should be the new goal description", m.user);} } else if (m.m.substring(1, 8) === "delgoal") { if (settings.goals.length === 1) { Messenger.sendErrorMessage("Can't remove last goal from list, list can't be empty", m.user); } else { var removed; if (m.m.length >= 10) {removed=removeGoal(parseInt(m.m.substring(9)));} else {removed=removeGoal(null);}; if (removed != undefined) { Messenger.sendModeratorNotice("{0} has removed '{1}' from the goal list".format(m.user, removed[0].description)); if (settings.Tipping.CurrentGoal.Number >= settings.goals.length) {settings.Tipping.CurrentGoal.Number--;} getCurrentGoalAmount(); maketipmenu(); checkFinality(true); } else {Messenger.sendErrorMessage("Can't remove from goal list, maybe number too big", m.user);} } } else if (m.m.substring(1, 6) === "admit") { if (m.m.length >= 8) { var admission = m.m.substring(7); Messenger.sendModeratorNotice("{0} was added to the hidden show by {1}".format(admission, m.user)); hiddenShow.addUser(admission); } else {Messenger.sendErrorMessage("USAGE: '/admit <user>' where 'user' is a person you want to get access to the hidden show component", m.user);} } else if (m.m.substring(1, 8) === "unadmit") { if (m.m.length >= 10) { var unadmission = m.m.substring(9); Messenger.sendModeratorNotice("{0} was removed from the hidden show by {1}".format(unadmission, m.user)); hiddenShow.removeUser(unadmission); } else {Messenger.sendErrorMessage("USAGE: '/admit <user>' where 'user' is a person you want to get access to the hidden show component", m.user);} } else if (m.m.substring(1, 8) === "hidemsg") { if (m.m.length >= 10) { var hideMessage = m.m.substring(9); Messenger.sendModeratorNotice("{0} set the hidden show message to '{1}'".format(m.user, hideMessage)); hiddenShow.setMessage(hideMessage); } else {Messenger.sendErrorMessage("USAGE: '/hidemsg <msg>' where 'msg' is the message you want to display during the hidden show", m.user);} } else if (m.m.substring(1, 8) === "subject") { if (m.m.length >= 10) { var subj_text = m.m.substring(9); Messenger.sendModeratorNotice("{0} set the room subject to '{1}'".format(m.user, subj_text)); cb.changeRoomSubject(subj_text); } else {Messenger.sendErrorMessage("USAGE: '/subject <text>' where 'text' is the room subject you want to display", m.user);} } else if (m.m.substring(1, 8) === "hashtag") { if (m.m.length >= 10) { var hash_text = m.m.substring(9); Messenger.sendModeratorNotice("{0} add to the room subject '{1}'".format(m.user, hash_text)); settings.subject_suffix = hash_text; } else {settings.subject_suffix = "";} updateRoomSubject(); } if (m.m.substring(1) === "dicestart") { if(!settings.games.dice.run) { settings.games.dice.run = 1; dice_setPrizes(); dice_advertise(); Messenger.sendModeratorNotice("Lets play Dice Game!"); } else { Messenger.sendErrorMessage("Dice Game is already running!", m.user); } } if (m.m.substring(1) === "dicestop") { if(settings.games.dice.run) { settings.games.dice.run = 0; Messenger.sendModeratorNotice("Dice Game stopped!"); } else { Messenger.sendErrorMessage("Dice Game is already running!", m.user); } } if (m.m.substring(1) === "lol all") {dice_showPrizes();} } /* Moder*/ if (m.m.substring(1) === 'menu' || m.m.substring(1) === 'tipmenu' || m.m.substring(1) === 'm') { if (is_mod) {cb.sendNotice(tipmsg,'','',cb.settings.msgcolor,'bold');} else {cb.sendNotice(tipmsg,m.user,'',cb.settings.msgcolor,'bold');} } if (m.m.substring(1) === "goals") {Messenger.sendInfoMessage("=== All Goals ===\n\n" + getAllGoals(m), m.user, null);} if (m.m.substring(1) === "donotwant") { Messenger.sendInfoMessage("Your messages will no longer be highlighted. Type '/dowant' without quotes to get it back again - if you're still on top!", m.user); if (m.user === settings.Tipping.Leaderboard.Leaders.Highest.Username) {settings.Tipping.Leaderboard.Leaders.Highest.OptOut = true;} if (m.user === settings.Tipping.Leaderboard.Leaders.HighestTotal.Username) {settings.Tipping.Leaderboard.Leaders.HighestTotal.OptOut = true;} } if (m.m.substring(1) === "dowant") { Messenger.sendInfoMessage("Your messages will now be highlighted. Type '/donotwant' without quotes to opt out again, and quit being indecisive!", m.user); if (m.user === settings.Tipping.Leaderboard.Leaders.Highest.Username) {settings.Tipping.Leaderboard.Leaders.Highest.OptOut = false;} if (m.user === settings.Tipping.Leaderboard.Leaders.HighestTotal.Username) {settings.Tipping.Leaderboard.Leaders.HighestTotal.OptOut = false;} } if (m.m.substring(1, 5) == "gift") { if (settings.hiddenShow.purchased_tickets[m.user]) { if (m.m.length >= 6) { var giftee = m.m.substring(6).toLowerCase(); if (!settings.hiddenShow.purchased_tickets[giftee]) { hiddenShow.addUser(giftee); settings.hiddenShow.purchased_tickets[giftee] = {TimeLeft: 86400}; if (settings.hiddenShow.purchased_tickets[giftee]) { Messenger.sendSuccessMessage("Congratulations! {0} has gifted you their Hidden Show ticket!".format(m.user), giftee); Messenger.sendSuccessMessage("Your Hidden Show ticket has been gifted to {0}. Thanks!".format(giftee), m.user); hiddenShow.removeUser(m.user); delete settings.hiddenShow.purchased_tickets[m.user]; } else { Messenger.sendErrorMessage("Unable to gift your Hidden Show ticket to {0}. An error occurred. Are they in the room?".format(giftee), m.user); hiddenShow.removeUser(giftee); delete settings.hiddenShow.purchased_tickets[giftee]; } } else {Messenger.sendErrorMessage("Unable to gift your Hidden Show ticket to {0}, because they already have one".format(giftee), m.user)} } else {Messenger.sendErrorMessage("USAGE: '/gift <user>' where 'user' is the person to whom you want to gift your Hidden Show ticket", m.user);} } else {Messenger.sendErrorMessage("Unable to gift your Hidden Show ticket to {0}, because you do not have one to gift".format(giftee), m.user)} } if (m.m.substring(1) === "winners") {dice_showPrizesWon(m.user);} if (m.m.substring(1) === "lol") {dice_showPrizes(m.user);} /* If it starts with a /, suppress that*/ } if(cb.settings.tipTitles == 'Yes') { for (var idx = 0; idx < settings.Tipping.Leaderboard.All.length; idx++) { if (settings.Tipping.Leaderboard.All[idx].name == m.user) { m.m = '|' + settings.Tipping.Leaderboard.All[idx].tokens + '| ' + m.m; break; } } } if (m.in_fanclub) { //m.m = ':unicorn10 ' + m.m; } /* Tip king highlighting */ if (settings.highlight_theme != 'null' && m.user === settings.Tipping.Leaderboard.Leaders.HighestTotal.Username && !settings.Tipping.Leaderboard.Leaders.HighestTotal.OptOut) { m.background = getTipperTheme().high_total_colour; m.m = ':smallCrown '+m.m; } else if (settings.highlight_theme != 'null' && m.user === settings.Tipping.Leaderboard.Leaders.Highest.Username && !settings.Tipping.Leaderboard.Leaders.Highest.OptOut) { m.background = getTipperTheme().high_tipper_colour; } return m; }); cb.onTip(function (tip) { recordTip(tip.from_user, tip.amount, true, tip.from_user_in_fanclub); }); cb.onDrawPanel(function () { return caches.panel; }); function chatAd() { while (cb.settings['msg' + (settings.index + 1)] == 0) { //skip empty messages settings.index++; settings.index %= MAXITEMS_NOTIFIER; } if (settings.index==0 && msg!=tipmsg) { msg = tipmsg; msg_c = cb.settings.msgcolor; } else { msg = cb.settings['msg' + (settings.index + 1)]; msg_c = settings.msg_c[settings.index]; settings.index++; settings.index %= MAXITEMS_NOTIFIER; } cb.sendNotice(msg,'','',msg_c,'bold'); cb.setTimeout(chatAd, (cb.settings.chat_ad * 60000)); } cb.setTimeout(chatAd, (cb.settings.chat_ad * 60000)); function videoAd() { if((cb.settings.videomsgperiod > 0)&&(settings.videos.length > 0)) { msg = 'Tip '+settings.videos[settings.videoindex].tokensall+ ' tokens for very hot video "'+settings.videos[settings.videoindex].title+'". '; if(settings.videos[settings.videoindex].tokensfan > 0) { msg+='Special price for fan club members - only '+settings.videos[settings.videoindex].tokensfan+' tokens!'; } else { msg+='Free for fan club members! Join Fan Club Now!' } settings.videoindex++; settings.videoindex %= settings.videos.length; cb.sendNotice(msg,'','',cb.settings['videomsgcolor'],'bold'); cb.setTimeout(videoAd, (cb.settings.videomsgperiod * 60000)); } } cb.setTimeout(videoAd, (cb.settings.videomsgperiod * 60000)); function FanclubSpamTimer() { if(cb.settings.fanmsgperiod > 0) { cb.sendNotice(cb.settings['fanmsg'],cb.room_slug,'',cb.settings['fanmsgcolor'],'bold'); cb.sendNotice(cb.settings['fanmsg'],null,'',cb.settings['fanmsgcolor'],'bold', 'green'); cb.setTimeout(FanclubSpamTimer, (cb.settings.fanmsgperiod*60000)); } } cb.setTimeout(FanclubSpamTimer, (cb.settings.fanmsgperiod*60000)); function kingSpamTimer() { if(cb.settings.kingTipperSpam === "Yes") { if(settings.Tipping.Leaderboard.Leaders.HighestTotal.Amount < parseInt(cb.settings.kingMin)) {var supplant = cb.settings.kingMin;} else {var supplant = settings.Tipping.Leaderboard.Leaders.HighestTotal.Amount + 1;} cb.sendNotice('Tip ' + supplant + ' to become the new King!','',cb.settings.LeaderBoardColor); } cb.setTimeout(kingSpamTimer, (cb.settings.kingTimer*60000)); } cb.setTimeout(kingSpamTimer, (cb.settings.kingTimer*60000)); function leaderSpamTimer() { if(cb.settings.leaderBoardSpam === "Yes") { cb.sendNotice('Leaderboard!','',cb.settings.LeaderBoardColor); cb.sendNotice(settings.leaderArray[0][0] + ' : ' + settings.leaderArray[0][1] + '\n' + settings.leaderArray[1][0] + ' : ' + settings.leaderArray[1][1] + '\n' + settings.leaderArray[2][0] + ' : ' + settings.leaderArray[2][1]); cb.sendNotice('','',cb.settings.LeaderBoardColor); } cb.setTimeout(leaderSpamTimer,(cb.settings.leaderTimer*60000)); } cb.setTimeout(leaderSpamTimer,(cb.settings.leaderTimer*60000)); function refreshGroupTime() { if(cb.limitCam_isRunning() && hiddenShow.grouped) { for(var user in settings.hiddenShow.purchased_tickets) { settings.hiddenShow.purchased_tickets[user].TimeLeft--; if(settings.hiddenShow.purchased_tickets[user].TimeLeft <= 0) { if (cb.limitCam_userHasAccess(user)) { cb.limitCam_removeUsers([user]); delete settings.hiddenShow.purchased_tickets[user]; } cb.chatNotice("You have run out of time and been removed from the secret show.", user); cb.chatNotice(user + " ran out of time and has been removed", cb.room_slug); } else { if(settings.hiddenShow.purchased_tickets[user].TimeLeft == 60) { cb.chatNotice("You only have one minute left! Tip a multiple of " + hiddenShow.priceperminute + " to continue viewing.", user); } else if((settings.hiddenShow.purchased_tickets[user].TimeLeft % 60)===0) { cb.chatNotice("You have " + parseInt(settings.hiddenShow.purchased_tickets[user].TimeLeft / 60) + " minutes left to view the show.", user); } } } } cb.setTimeout(refreshGroupTime, 1000); } cb.setTimeout(refreshGroupTime, 1000); function diceroll(username) { settings.games.dice.rollCounter++; var die1 = 0; var die2 = 0; var prize = ''; var timer = 0; var pm_text = 0; var rand = 0; var rand1 = Math.random(); var rand2 = Math.random(); var winner = false; var prizeIndex = 0; cb.log(settings.games.dice.prizes); if (cb.settings['dice_randomtype'] == 'dice') { rand = Math.floor(rand1 * 500) + Math.floor(rand2 * 500); } if (cb.settings['dice_randomtype'] == 'flat') { rand = Math.floor(rand1 * 1000); } var len = settings.games.dice.prizes.length; if (len) { for (var i = 0; i < len; i++) { if(rand < settings.games.dice.prizes[i].probability) { prizeIndex = i; prize = settings.games.dice.prizes[i].title; timer = settings.games.dice.prizes[i].timer; pm_text = settings.games.dice.prizes[i].pm_text; if (timer > 0) {TipmenuTimer.addTimer(timer, prize);} if (pm_text !== '') {cb.sendNotice(pm_text,username,'#FFDBF3','#A805A6','bold');} winner = true; break; } } } else { msg = "A Thank You!"; } die1 = Math.floor(prizeIndex * Math.random()); die2 = prizeIndex - die1 + 1; var total = die1 + die2; cb.log(die1+'_'+die2+'_'+rand1+'_'+rand2+'_'+rand+'_'+timer); if (prizeIndex >= 0) { if (cb.settings.remove_winning_prize == 'Yes') settings.games.dice.prizes.splice(prizeIndex, 1); } else { prize = 'A Thank You!'; } var msg = settings.games.dice.dieImagePrefix + die1 + " " + settings.games.dice.dieImagePrefix + die2 + "\n"; msg += username + " rolled a " + total + "! \n".toUpperCase(); msg += "Roll #" + settings.games.dice.rollCounter + " | Prize: " + prize; var textColor = '#000000'; var bgColor = '#D9FAD7'; if (winner) textColor = '#067D00'; if (total == settings.games.dice.maxOutcome) { bgColor = '#FFDBF3'; textColor = '#A805A6'; } cb.sendNotice(msg, '', bgColor, textColor, 'bold'); settings.games.dice.lastPrizeWon = prize; settings.games.dice.winners.push("Roll #" + settings.games.dice.rollCounter + " (" + total + "): " + username + " - " + prize); cb.drawPanel(); } function dice_setPrizes() { var rareText = ''; var title = ''; var arr = []; var probability = 0; var total_probability = 0; var timer = 0; var pm_text = ''; for (var i = 1; i <= settings.games.dice.maxOutcome; i++) { if (i == settings.games.dice.maxOutcome) rareText = " (RARE)"; probability = 0; timer = 0; pm_text = ''; title = cb.settings['dice_prize_settings_'+i]; if (title !== undefined) { arr = title.split('--'); if (arr[0]!==undefined) { probability = parseInt(arr[0]); if (arr[1]!==undefined) { timer = parseInt(arr[1]); if (arr[2]!==undefined) { pm_text = arr[2]; } } } } title = cb.settings['dice_prize_'+i] + rareText; total_probability += probability; settings.games.dice.prizes.push({title: title, probability: probability, timer: timer, pm_text: pm_text}); } var len = settings.games.dice.prizes.length; probability = 0; for (i = 0; i < len; i++) { probability = (settings.games.dice.prizes[i].probability * 1000 / total_probability) + probability; settings.games.dice.prizes[i].probability = probability; } } function dice_showPrizes(username) { var len = settings.games.dice.prizes.length; if (len) { var rareText = ''; var msg = "***** POSSIBLE PRIZES *****"; for (var i = 0; i < len; i++) { msg += "\nRoll " +(i+1)+ " - " + settings.games.dice.prizes[i].title; } } else { msg = "SORRY! There are no prizes left in the list, but thank you for the tip. :thumbsup"; } cb.sendNotice(msg, username, '#DBFBFF', '#008596', 'bold'); } function dice_showPrizesWon(username) { var msg = "***** LAST 20 WINNERS *****"; msg += "\nList sorted in chronological order"; if (settings.games.dice.winners.length == 0) { cb.sendNotice('No one has won anything yet. Roll the dice to win a prize!', username, '#ffff00', '#000000', 'bold'); } else { var recentWinners = settings.games.dice.winners.slice(-20); for (var i = 0; i < recentWinners.length; i++) msg += "\n" + recentWinners[i]; cb.sendNotice(msg, username, '#000000', '#ffffff', 'bold'); } } function dice_showAppAd(username) { var msg = ""; msg += "We are playing Roll the Dice \n"; msg += "Each roll reveals a prize. There are " + settings.games.dice.prizes.length + " possible prizes.\n"; if (cb.settings.dice_remove_winning_prize == 'Yes') { msg += "Each prize won will be removed from the list.\n"; } else { msg += "Each prize won will stay on the list.\n"; } msg += "Tip " + settings.games.dice.roll_price + " " + settings.games.dice.langTokens + " to roll the dice. \n"; msg += "Type \"/lol\" to see the list of prizes \n"; msg += "Type \"/lol all\" to send the list to all viewers if you're a mod or the broadcaster \n"; msg += "Type \"/winners\" to see a list of the last 20 winners "; cb.sendNotice(msg, username, cb.settings['announcemsgbgcolor'], cb.settings['announcemsgcolor'], 'bold'); } function dice_advertise() { if(settings.games.dice.run) { dice_showAppAd(); cb.setTimeout(dice_advertise, parseInt(cb.settings.dice_notice_wait_time) * 60000); } } function parseOptions() { Object.assign(settings, cb.settings); settings.highlight_theme = cb.settings['tipper_color_scheme']; settings.progression_mode_manual = (cb.settings.progression_mode === 'Manual'); switch (cb.settings.action_on_finality) { case 'Loop last goal': settings.action_on_finality = 'loop'; break; case 'Start hidden ticket show': settings.action_on_finality = 'hidden'; break; case 'Stop': settings.action_on_finality = 'stop'; break; } hiddenShow.setPrice(settings.hidden_show_entry_fee); // hiddenShow.setEnabled(settings.action_on_finality === 'hidden'); hiddenShow.setMessage(settings.finality_message); hiddenShow.setPreshowPrice(settings.hidden_preshow_entry_fee); hiddenShow.setPricePerMinute(settings.tokens_per_minute); hiddenShow.setMinPerMinute(settings.mintip_per_minute); for (var i = 0; i < MAXITEMS_NOTIFIER; i++) { if (!isUndefined(cb.settings['msg_c' + (i + 1)])) { settings.msg_c.push(cb.settings['msg_c' + (i + 1)]); } else { settings.msg_c.push(cb.settings['msgcolor']); } } for (var gIdx = 1; gIdx <= MAXITEMS_GOALS; gIdx++) { if (!isUndefined(cb.settings['goal_item' + gIdx])) { var description = cb.settings['goal_item' + gIdx]; var hide = false; if (description.substring(0, 2) == "**") { description = description.substring(2); hide = true; } var tokens = 0; var active = '1'; var blocktipmenu = []; var arr = description.split('--'); if (arr[1]===undefined) { cb.sendNotice('Error-You need two dashes to separate the tip amount and menu item for item no '+ gIdx,'','',cb.settings.msgcolor,'bold'); } else { tokens=parseInt(arr[0]); if (tokens>0) { description=arr[1].replace(/\s*\+\s*/g," and "); if (arr[2]!==undefined) { if (arr[2]==='d') {continue;} active = arr[2]; if (arr[3]!==undefined) { blocktipmenu = arr[3].split(','); } } settings.goals.push({ index: settings.goals.length + 1, description: description, tokens: tokens, active: active, blocktipmenu: blocktipmenu, hide: hide }); } } } } for (gIdx = 1; gIdx <= MAXITEMS_VIDEOS; gIdx++) { if ((!isUndefined(cb.settings['video_item' + gIdx]))&&(!isUndefined(cb.settings['video_link' + gIdx]))) { var description = cb.settings['video_item' + gIdx]; var link = cb.settings['video_link' + gIdx]; var arr = description.split('--'); if (arr[2]===undefined) { cb.sendNotice('Error-You need two dashes to separate video_item no '+ gIdx,'','',cb.settings.msgcolor,'bold'); } else { var tokensall=parseInt(arr[0]); var tokensfan=parseInt(arr[1]); if (tokensall>0) { var title=arr[2]; settings.videos.push({ index: settings.videos.length + 1, tokensall: tokensall, tokensfan: tokensfan, title: title, link: link }); } } } } } function maketipmenu() { tipmenu = []; for (var i=0;i<=MAXSEP-1;i++) { if (cb.settings.sepchar == separators[i].label) { separator_char = separators[i].shortcut + ' '; } } tipmsg = 'Tip Menu: '; for (i=1;i<=MAXITEMS_TIPMENU;i++) { var description=''; var tokens=0; var active=0; if (!isUndefined(cb.settings['tipmenu_item' + i])) { var tmp=cb.settings['tipmenu_item' + i]; var arr= tmp.split('--'); if (arr[1]===undefined) { cb.sendNotice('Error-You need two dashes to separate the tip amount and menu item for item no '+ i,'','',cb.settings.msgcolor,'bold'); } else { tokens=parseInt(arr[0]); if (tokens>0) { if(settings.goals[settings.Tipping.CurrentGoal.Number].blocktipmenu.includes(arr[1])) {continue;} description=arr[1]; if (arr[2]!==undefined) { if (arr[2]==='0') {continue;} active = parseInt(arr[2]); } if (i>=2) { tipmsg += separator_char; } tipmsg += arr[1] + '(' + tokens + ') '; tipmenu.push({ description: description, tokens: tokens, active: active, }); } } } } } function init() { parseOptions(); TimerManager.initialise(); reset(); if (tipmsg!= 'Tip Menu: ') {cb.sendNotice(tipmsg,'','',cb.settings.msgcolor,'bold');} else {cb.sendNotice('Error-No menu items found','','',cb.settings.msgcolor,'bold');} var limit = cb.settings.view_cam; if (limit === "Registered") { cb.limitCam_start("Now blocking anonymous viewers. If you are a registered user please type a message in the chat!"); cb.chatNotice("Now blocking anonymous viewers!", '', '#fcb2bf', '#000000', 'bold'); cb.chatNotice("If you are signed in and can't see " +cb.room_slug+"'s cam, type in the chat.", '', '#fcb2bf', '#000000', 'bold'); } else if (limit === "With tokens") { cb.limitCam_start("Now blocking anonymous and grey viewers. If you have tokens please type a message in the chat!"); cb.chatNotice("Now blocking anonymous and grey viewers!", '', '#fcb2bf', '#000000', 'bold'); cb.chatNotice("If you have tokens and can't see " +cb.room_slug+"'s cam, type in the chat.", '', '#fcb2bf', '#000000', 'bold'); } if(settings.games.dice.run) { dice_setPrizes(); dice_advertise(); } } init();
© Copyright Chaturbate 2011- 2025. All Rights Reserved.