Apps Home
|
Create an App
Annika's Room App
Author:
annika_brooks
Description
Source Code
Launch App
Current Users
Created by:
Annika_Brooks
/* Name: Annika's Room App Author: Annika Brooks IT'S MY APP! IT WAS MADE FOR ME! DRR DRR! */ var current_version = 1.0; // vars var actual_total_tipped = 0; var total_tipped = 0; var current_total_tipped = 0; var high_tip_username = null; var high_tip_amount = 0; var high_total_username = null; var high_total_amount = 0; var low_tip_username = null; var low_tip_amount = 0; var last_tip_username = null; var last_tip_amount = 0; var high_tip_highlight_optout = false; var high_total_highlight_optout = false; var all_tippers = []; var subject_is_final = false; var current_goal = 1; var final_goal_met = false; var startup_time = null; var spit_verbose_output = false; cb.settings_choices = [ {name: 'purchase_email_tokens', label: 'Purchase Email Amount', type: 'int', minValue: 1, defaultValue: 111, required: true}, {name: 'purchase_email_text', label: 'Email Address', type: 'str', minLength: 0, maxLength: 255, required: true}, {name: 'purchase_snapchat_tokens', label: 'Purchase Snapchat Amount', type: 'int', minValue: 1, defaultValue: 444, required: true}, {name: 'purchase_snapchat_text', label: 'Snapchat Username', type: 'str', minLength: 0, maxLength: 255, required: true}, {name: 'minimum_rollover_goal', label: 'Minimum Goal Rollover', type: 'int', minValue: 0, defaultValue: 0, required: false}, {name: 'last_goal_loop', label: 'Loop Last Goal', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'No'}, {name: 'finality_message', label: 'Final Goal Met Subject', type: 'str', minLength: 1, maxLength: 255, defaultValue: 'WE DID IT! WE DID IT! ALL GOALS REACHED! THANK YOU TIPPERS FOR AN AWESOME SHOW!'}, {name: 'highlight_goal_king', label: 'Highlight highest tipper', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes'}, {name: 'highlight_total_king', label: 'Highlight highest total tipper', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes'}, {name: 'show_timer_in_subject', label: 'Add time remaining to subject if running?', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'No'}, {name: 'mod_allow_broadcaster_cmd', label: 'Allow mods to use broadcaster commands?', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'No'} ]; var number_of_goals = 100; for(i = 1; i <= number_of_goals; i++) { var required = (i == 1); cb.settings_choices.push({name: 'goal_' + i + '_description', label: 'Goal ' + i + ' Description', type: 'str', minLength: 0, maxLength: 255, required: false}); cb.settings_choices.push({name: 'goal_' + i + '_tokens', label: 'Goal '+ i + ' Token Amount', type: 'int', minValue: 1, defaultValue: 1, required: false}); } function verboseMessage(message, user) { cb.log("Verbose debug message: " + message); if (spit_verbose_output) { cb.chatNotice("[Verbose] " + message, user); } } var goalTimer = { secondsDown: 60, timeRemaining: 0, timerRunning: false, timerReallyRunning: false, spamMessage: "Time's running out! Only %time minutes left to tip to the goal!", timesUpMessage: ":timesup Sorry, this goal was not met.", hookOnTimer: function() { }, startTimer: function(minutes) { verboseMessage("Timer started at " + new Date().toString(), cb.room_slug); this.timeRemaining = minutes; this.timerRunning = true; this.timerReallyRunning = true; this.hookOnTimer(); this.announce(); cb.setTimeout(function() { goalTimer.onTimer(); }, 60000); }, stopTimer: function() { verboseMessage("Timer stopped at " + new Date().toString(), cb.room_slug); this.timerRunning = false; this.hookOnTimer(); }, onTimer: function() { this.timerReallyRunning = false; if (this.timerRunning) { verboseMessage("Timer interval reached at " + new Date().toString(), cb.room_slug); this.timeRemaining--; this.hookOnTimer(); this.announce(); if (this.timeRemaining === 0) { verboseMessage("Timer expired at " + new Date().toString(), cb.room_slug); this.timerRunning = false; } else { this.timerReallyRunning = true; cb.setTimeout(function() { goalTimer.onTimer(); }, 60000); } } }, getExtraText: function() { if (this.timerRunning) { return this.timeRemaining + " min left"; } else { return ""; } }, announce: function() { if (this.timeRemaining > 0 && cb.settings.show_timer_in_subject !== "Yes" ) { cb.chatNotice(this.spamMessage.replace("%time", this.timeRemaining), '', '#FFFFFF', '#FF0000', 'bold'); } else if ( this.timeRemaining === 0 ) { cb.chatNotice(this.timesUpMessage, '', '#FFFFFF', '#FF0000', 'bold'); } } }; function getCurrentGoalDescription() { return cb.settings['goal_' + current_goal + '_description']; } function getPreviousGoalAmount() { return cb.settings['goal_' + ( current_goal - 1 ) + '_tokens']; } function getCurrentGoalAmount() { return cb.settings['goal_' + current_goal + '_tokens']; } function getSumTotalGoal() { var total_goal = 0; var i = 1; for (i = 1; i <= 6; i++) { if (cb.settings['goal_' + i + '_description'] !== "" && cb.settings['goal_' + i + '_tokens'] !== 0 ) { total_goal += cb.settings['goal_' + i + '_tokens']; } } return total_goal; } function getAllGoals() { var all_goals = ""; for (i = 1; i <= 6; i++) { if (cb.settings['goal_' + i + '_description'] !== "" && cb.settings['goal_' + i + '_tokens'] !== 0 ) { all_goals += cb.settings['goal_' + i + '_description'] + ' (' + cb.settings['goal_' + i + '_tokens'] + ' tokens)\n'; } } all_goals += "- All Goals: " + getSumTotalGoal(); return all_goals; } function getLeaderBoard() { var leaderboard = ""; for (var idx = 0; idx < all_tippers.length && idx < 10; idx++) { if (all_tippers[idx] !== undefined) { leaderboard += all_tippers[idx].name + ' (' + all_tippers[idx].tokens + ')\n'; } } return leaderboard; } function getTokensPerMinute() { var now = new Date(); var timespan = now - time_started; var tokens_per_min = ((Math.round(actual_total_tipped * 10) / 10) / (Math.round(timespan / 1000 / 60 * 10) / 10)); return (Math.round(tokens_per_min * 10) / 10); } function getDollarsPerMinute() { return (0.05 * Math.floor(getTokensPerMinute())).toFixed(2); } function skipGoal() { current_goal++; checkFinality(); update_goals(); } function getNextGoalAnnouncement() { return tips_remaining() + " tokens to next goal: " + cb.settings['goal_' + ( current_goal + 1 ) + '_description']; } function checkFinality() { if (getCurrentGoalAmount() <= 0 || getCurrentGoalDescription() === "" || current_goal === 7) { if (cb.settings.last_goal_loop === 'Yes') { current_goal--; final_goal_met = false; } else { final_goal_met = true; } } else { final_goal_met = false; } } function tips_remaining() { var r = getCurrentGoalAmount() - current_total_tipped; return (r < 0) ? 0 : r; } function format_username(val) { return (val === null) ? "--" : val.substring(0, 12); } function update_goals() { var new_subject = ""; if (subject_is_final && final_goal_met) { return; } if (final_goal_met) { cb.log("Final goal met - notifying broadcaster and setting finality"); cb.chatNotice("Your final goal has been met! You can type '/reset' to start again from zero.", cb.room_slug, '#FFFFFF', '#FF0000', 'bold'); new_subject = cb.settings.finality_message; subject_is_final = true; } else { new_subject = getCurrentGoalDescription() + " [" + tips_remaining() + " tokens remaining]"; if (cb.settings.show_timer_in_subject === "Yes" && goalTimer.timerRunning) { new_subject += " (" + goalTimer.getExtraText() + ")"; } subject_is_final = false; } cb.log("Changing subject to: " + new_subject); cb.changeRoomSubject(new_subject); } function recordTip(username, tokens, record_actual) { var tipper_found = false; total_tipped += tokens; current_total_tipped += tokens; if ( record_actual ) actual_total_tipped += tokens; // Email Purchase if(tokens == cb.settings.purchase_email_tokens) { cb.sendNotice("==EMAIL== Thank you for your puchase! Email: " + cb.settings.purchase_email_text, username, '#9dff9d', '#000000', 'bolder'); cb.sendNotice(username + " has purchased Annika's Email Address! Ooh la la! Want it too? Tip " + cb.settings.purchase_email_tokens + " tokens!", '', '#9dff9d', '#000000', 'bolder'); } // Snapchat Purchase if(tokens == cb.settings.purchase_snapchat_tokens) { cb.sendNotice("==SNAPCHAT== Thank you for your puchase! Username: " + cb.settings.purchase_snapchat_text, username, '#9dff9d', '#000000', 'bolder'); cb.sendNotice(username + " has purchased Annika's Snapchat! Ooh la la! Want it too? Tip " + cb.settings.purchase_snapchat_tokens + " tokens!", '', '#9dff9d', '#000000', 'bolder'); } // Goal Reached while (current_total_tipped >= getCurrentGoalAmount()) { cb.log("Total tipped has exceeded current goal - incrementing step"); current_total_tipped = current_total_tipped - getCurrentGoalAmount(); if ( goalTimer.timerRunning ) { goalTimer.stopTimer(); } cb.sendNotice("*****************", '', '#FFFFFF', '#ff1a75', 'bolder'); cb.sendNotice("GOAL REACHED!", '', '#FFFFFF', '#ff1a75', 'bolder'); cb.sendNotice("" + getCurrentGoalDescription() + "", '', '#FFFFFF', '#ff1a75', 'bolder'); cb.sendNotice("*****************", '', '#FFFFFF', '#ff1a75', 'bolder'); current_goal++; checkFinality(); if(getCurrentGoalAmount() < cb.settings.minimum_rollover_goal) { current_total_tipped = 0; } } // Goal Unmet while (current_total_tipped < 0) { cb.log("Total subtracted has gone below zero [" + current_total_tipped + "] - decrementing step"); current_total_tipped = current_total_tipped + getPreviousGoalAmount(); current_goal--; cb.chatNotice("* Goal unmet: " + getCurrentGoalDescription(), cb.room_slug); checkFinality(); } // Tipper and Token Stats last_tip_amount = tokens; last_tip_username = username; if (tokens > high_tip_amount) { high_tip_amount = tokens; high_tip_username = username; high_tip_highlight_optout = false; } if (tokens <= low_tip_amount || low_tip_amount == 0) { low_tip_amount = tokens; low_tip_username = username; } for (var idx = 0; idx < all_tippers.length; idx++) { if (all_tippers[idx].name == username) { tipper_found = true; all_tippers[idx].tokens += tokens; break; } } if (!tipper_found) { all_tippers.push({ name: username, tokens: tokens }); } all_tippers.sort(function (a, b) { return b.tokens - a.tokens; }); high_total_username = all_tippers[0].name; high_total_amount = all_tippers[0].tokens; high_total_highlight_optout = false; checkFinality(); update_goals(); cb.drawPanel(); } function goalTimerOnTimer() { cb.drawPanel(); if (cb.settings.show_timer_in_subject === "Yes") { update_goals(); } } function reset() { cb.log("Resetting all goals"); low_tip_amount = 0; high_tip_amount = 0; last_tip_amount = 0; high_total_amount = 0; low_tip_username = null; high_tip_username = null; last_tip_username = null; high_total_username = null; current_goal = 1; total_tipped = 0; current_total_tipped = 0; final_goal_met = false; all_tippers = []; cb.drawPanel(); update_goals(); } cb.onTip(function (tip) { recordTip(tip.from_user, tip.amount, true); }); cb.onDrawPanel(function (user) { var panel = {}; if (final_goal_met) { panel = { 'template': '3_rows_of_labels', 'row1_label': 'Total Tips:', 'row1_value': total_tipped, 'row2_label': 'Highest Tip:', 'row2_value': format_username(high_tip_username) + ' (' + high_tip_amount + ')', 'row3_label': 'Latest Tip Received:', 'row3_value': format_username(last_tip_username) + ' (' + last_tip_amount + ')' }; } else { panel = { 'template': '3_rows_of_labels', 'row1_label': 'Tip Received / Goal (Total):', 'row1_value': current_total_tipped + ' / ' + getCurrentGoalAmount(), 'row2_label': 'King of Tips:', 'row2_value': format_username(high_tip_username) + ' (' + high_tip_amount + ')', 'row3_label': 'Latest Tip Received:', 'row3_value': format_username(last_tip_username) + ' (' + last_tip_amount + ')' }; if (goalTimer.timerRunning) { panel.row3_label = 'Time Remaining:'; panel.row3_value = goalTimer.getExtraText(); } } return panel; }); cb.onMessage(function (msg) { var i = 0; var key = null; // King Highlighting if (cb.settings.highlight_goal_king === "Yes" && msg.user === high_tip_username && !high_tip_highlight_optout) { msg.background = '#9F9'; } if (cb.settings.highlight_total_king === "Yes" && msg.user === high_total_username && !high_total_highlight_optout ) { msg.background = '#CCF'; } var bc_only_text = " (broadcaster only)"; if (cb.settings.mod_allow_broadcaster_cmd === "Yes") { bc_only_text = ""; } // Responses to Common Questions var m = msg.m.toLowerCase(); if(m.search('am i gay') >= 0 || m.search('is this gay') >= 0) { cb.sendNotice( "Hi " + msg.user + "! No, you are not gay! Annika is a girl. " + "There are girls and guys with pussies, dicks, both, and none at all! " + "A little bag of flesh between the legs doesn't determine gender. " + "Gender is determined by how the brain is wired - and Annika is wired female. " + "Horomone treatment caused her to go through female puberty- meaning she smells, feels, tastes, " + "and is terrible at driving just like any other girl! (I joke I joke!) " + "Also, your own sexuality is determined by the gender you're attracted to, not the genitals. " + "Guys who prefer cocks on girls and guys who prefer pussies on girls are both 100% straight. This is called genital preference! " + "If you are a man and find Annika's feminity hot, you are straight! And if you are a girl, you're hella gay! " , msg.user, '#ffffff', '#ff0066', 'bolder'); msg['X-Spam'] = true; } if(m.search('who is trans') >= 0 || m.search('which one is trans') >= 0 || m.search('which girl is trans') >= 0 || m.search('are they both trans') >= 0 || m.search('which is trans') >= 0 || m.search('is Kitty trans') >= 0 || m.search('is Annika trans') >= 0 || m.search('who has penis') >= 0 || m.search('are both trans') >= 0 || m.search('which of them is trans') >= 0 || m.search('which is which') >= 0 || m.search('are both trans') >= 0 || m.search('which of them is trans') >= 0) { cb.chatNotice( "Annika (blue eyes) is trans. Kitty (green eyes) is not." , msg.user , '#ffffff', '#ff0066', 'bolder'); msg['X-Spam'] = true; } if(m.search('tranny') >= 0 || m.search('shemale') >= 0 || m.search('ladyboy') >= 0 || m.search('transexual') >= 0) { // Replace troublesome words msg.m = msg.m.replace(/tranny/gi, 'trans girl'); msg.m = msg.m.replace(/shemale/gi, 'trans girl'); msg.m = msg.m.replace(/ladyboy/gi, 'trans girl'); msg.m = msg.m.replace(/transexual/gi, 'trans girl'); cb.chatNotice( "Private Notice: Hi " + msg.user + "! " + "You might not be aware, but the words tranny, shemale, ladyboy, and transexual are derogatory terms. " + "They're kind of like calling a black person the N-word! Unfortunately the porn industry still likes to use them, " + "but us girls would like to see an end to them. No worries if you didn't know! Many people don't. " + "I've gone ahead and replaced the word in your message. Thank you so much for understanding!" , msg.user , '#ffffff', '#ff0066', 'bolder'); } // Handle Chat Commands if (msg.m.substring(0,1) === "/") { msg["X-Spam"] = true; if (msg.user === cb.room_slug || msg.is_mod) { /* Broadcaster or mod commands */ if (msg.m.substring(1) === "stats") { cb.log("Stats command received from " + msg.user); cb.chatNotice("=== Total Stats ===", msg.user, '#FFFFFF', '#000000', 'bold'); cb.chatNotice("Sum total goal: " + getSumTotalGoal(), msg.user); cb.chatNotice("Total tipped so far: " + total_tipped, msg.user); cb.chatNotice("Total goal remaining: " + (getSumTotalGoal() - total_tipped), msg.user); cb.chatNotice("Tokens/min: " + getTokensPerMinute(), msg.user); cb.chatNotice("Disclaimer: per minute figures EXCLUDE private shows, group shows, and other non-tip token gains", msg.user); if (msg.user === cb.room_slug) { cb.chatNotice("=== Broadcaster Only Stats (mods cannot see this section) ===", msg.user, '#FFFFFF', '#000000', 'bold'); cb.chatNotice("Total actual tipped (disregarding resets): " + actual_total_tipped, msg.user); cb.chatNotice("Dollars/min (assuming $0.05/token): $" + getDollarsPerMinute(), msg.user); } cb.chatNotice("=== Tip Stats ===", msg.user, '#FFFFFF', '#000000', 'bold'); cb.chatNotice("Highest total tips: " + high_total_amount + " from " + high_total_username, msg.user); cb.chatNotice("Awesomest tip: " + high_tip_amount + " from " + high_tip_username, msg.user); cb.chatNotice("Stingiest tip: " + low_tip_amount + " from " + low_tip_username, msg.user); cb.chatNotice("Most recent tip: " + last_tip_amount + " from " + last_tip_username, msg.user); cb.chatNotice("=== Leaderboard (Top 10) ===", msg.user, '#FFFFFF', '#000000', 'bold'); cb.chatNotice(getLeaderBoard(), msg.user); } else if (msg.m.substring(1) === "goals") { cb.log("Goals command received from " + msg.user); cb.chatNotice("=== All Goals ===", msg.user, '#FFFFFF', '#000000', 'bold'); cb.chatNotice(getAllGoals(), msg.user); } else if (msg.m.substring(1) === "help") { cb.log("Help command received from " + msg.user); cb.chatNotice("=== Help ===", msg.user, '#FFFFFF', '#000000', 'bold'); cb.chatNotice("/stats - displays token statistics, including the sum total goal, amount so far, and misc information", msg.user); cb.chatNotice("/goals - displays all goals in in order", msg.user); cb.chatNotice("/upnext - announces the next goal to the room" + bc_only_text, msg.user); cb.chatNotice("/skip - skips the current goal, and moves onto the next one" + bc_only_text, msg.user); cb.chatNotice("/reset - resets goal status back to zero" + bc_only_text, msg.user); cb.chatNotice("/timer x - sets goal timer to x minutes" + bc_only_text, msg.user); cb.chatNotice("/timer stop - stops the running goal timer" + bc_only_text, msg.user); cb.chatNotice("/addtokens x - Adds an x token tip to the goal, incrementing if necessary (broadcaster only)", msg.user); cb.chatNotice("/removetokens x - Removes an x token tip from the goal, decrementing if necessary (broadcaster only)", msg.user); cb.chatNotice("=== For more help ===", msg.user, '#FFFFFF', '#000000', 'bold'); cb.chatNotice("View the CB app page: http://chaturbate.com/apps/app_details/tip-multi-goal/", msg.user); cb.chatNotice("Email the developer: c9max69" + "@" + "gmail.com", msg.user); } } if (msg.user === cb.room_slug || (cb.settings.mod_allow_broadcaster_cmd === "Yes" && msg.is_mod)) { /* Broadcaster only commands, unless the option to allow mods to use them is enabled */ if (msg.m.substring(1) === "reset") { cb.log("Reset command received from " + msg.user); reset(); } else if (msg.m.substring(1) === "skip") { cb.log("Skip command received from " + msg.user); skipGoal(); } else if (msg.m.substring(1) === "upnext") { cb.log("Upnext command received from " + msg.user); cb.chatNotice("* I ate your message. Sorry about that. But I did let the viewers know about the next goal!", msg.user, '#FFFFFF', '#000000', 'bold'); msg.m = getNextGoalAnnouncement(); msg["X-Spam"] = false; } else if (msg.m.substring(1,6) === "timer") { cb.log("Timer command received from " + msg.user); if (msg.m.length >= 8) { var params = msg.m.substring(7); if (params === "stop") { goalTimer.stopTimer(); } else { var timer = parseInt(params, 10); if (timer > 0 && timer <= 60) { if (!goalTimer.timerRunning) { if (!goalTimer.timerReallyRunning) { goalTimer.startTimer(timer); cb.chatNotice("Goal timer set to " + timer + " minutes. Type '/timer stop' if you want to stop it early", msg.user, '#FFFFFF', '#000000', 'bold'); } else { cb.chatNotice("A previous stopped timer hasn't completed yet. Please try again in a minute", msg.user, '#FFFFFF', '#FF0000', 'bold'); } } else { cb.chatNotice("A timer is already running. Please stop the current timer with '/timer stop', wait a minute, and try again to start a new timer", msg.user, '#FFFFFF', '#FF0000', 'bold'); } } else { cb.chatNotice("You need to enter the number of minutes, in the form /timer <x> where <x> is a number from 1 to 60", msg.user, '#FFFFFF', '#FF0000', 'bold'); } } } else { cb.chatNotice("You need to enter the number of minutes, in the form /timer <x> where <x> is a number from 1 to 60", msg.user, '#FFFFFF', '#FF0000', 'bold'); } } } if (msg.user === cb.room_slug) { /* Broadcaster only commands at all times */ if (msg.m.substring(1) === "verbose") { spit_verbose_output = !spit_verbose_output; cb.chatNotice("Verbose output is now " + (spit_verbose_output ? "enabled" : "disabled"), msg.user, '#FFFFFF', '#000000', 'bold'); } else if (msg.m.substring(1,10) === "addtokens") { var token_count = parseInt(msg.m.substring(11)); if (token_count > 0) { cb.chatNotice("Adding " + token_count + " tokens against the token goal", msg.user, '#FFFFFF', '#000000', 'bold'); recordTip(msg.user, token_count, false); } else { cb.chatNotice("Error! You must add at least 1 token", msg.user, '#FFFFFF', '#FF0000', 'bold'); } } else if (msg.m.substring(1,13) === "removetokens") { var token_count = parseInt(msg.m.substring(14)); if (token_count > 0) { if (total_tipped - token_count >= 0) { cb.chatNotice("Removing " + token_count + " tokens from the token goal", msg.user, '#FFFFFF', '#000000', 'bold'); recordTip(msg.user, (token_count * -1), false); } else { cb.chatNotice("Error! Tokens removed would result in negative total tipped", msg.user, '#FFFFFF', '#FF0000', 'bold'); } } else { cb.chatNotice("Error! You must remove at least 1 token", msg.user, '#FFFFFF', '#FF0000', 'bold'); } } } if (msg.user === "tristiepixie") { /* Developer commands. Debugging use only! */ if (msg.m.substring(1) === "dumpsettings") { cb.chatNotice(cb.settings, msg.user); } else if (msg.m.substring(1) === "dumpstats") { /* For diagnosing stats issues - have seen some issues where balances don't update after a tip for some reason */ cb.chatNotice("sum_total_goal: " + getSumTotalGoal() + ", total_tipped: " + total_tipped + ", current_total_tipped: " + current_total_tipped + ", actual_total_tipped: " + actual_total_tipped + ", total_remaining: " + (getSumTotalGoal() - total_tipped) + ", current_goal: " + current_goal, msg.user); cb.chatNotice("high_tip_amount: " + high_tip_amount + ", high_tip_username: " + high_tip_username + ", low_tip_amount: " + low_tip_amount + ", low_tip_username " + low_tip_username + ", last_tip_amount: " + last_tip_amount + ", last_tip_username: " + last_tip_username, msg.user); cb.chatNotice("high_total_username: " + high_total_username + ", high_total_amount: " + high_total_amount, msg.user); cb.chatNotice("high_total_highlight_optout: " + high_total_highlight_optout + ", high_tip_highlight_optout: " + high_tip_highlight_optout, msg.user); cb.chatNotice("time_started: " + time_started + ", getTokensPerMinute(): " + getTokensPerMinute() + ", getDollarsPerMinute(): " + getDollarsPerMinute(), msg.user); cb.chatNotice("getLeaderBoard() output:\n" + getLeaderBoard(), msg.user); } } } /* Code to allow the developer to stand out if necessary (e.g. for tech support) */ if (msg.user === "tristiepixie" && msg.m.substring(0,1) === "#") { msg.in_fanclub = true; msg.m = msg.m.substring(1); msg.background = "#3C6793"; msg.c = "#fff"; } return msg; }); function init() { goalTimer.hookOnTimer = function() { goalTimerOnTimer(); }; time_started = new Date(); cb.chatNotice("Hello Annika! I hope you have an amazing show!", '', '#FFFFFF', '#000000', 'bold'); update_goals(); } init();
© Copyright Chaturbate 2011- 2025. All Rights Reserved.