Bots Home
|
Create an App
Super Nova Countdown Timer
Author:
velcro999
Description
Source Code
Launch Bot
Current Users
Created by:
Velcro999
/** * Bot: Super Nova Countdowm Time * Version: 1.0.0 * Author:velcro999 * Date: 2022-11-27 */ const MAIN_TIMER = 0; const ACT_TIMER = 1; var out = ''; var model = ''; const timers = [ { type: 'main', remaining: 0, boost: 0, activity: null, active: false, timeout: null }, { type: 'act', remaining: 0, boost: 0, activity: '', active: false, timeout: null } ]; cb.settings_choices = [ { name: 'runMainOnStart', type: 'choice', label: 'Start main timer on startup', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes' }, { name: 'defaultMainMinutes', type: 'int', minValue: 0, maxValue: 1440, label: 'Minutes on main timer (default)', defaultValue: 30 }, { name: 'defaultMainBoost', type: 'int', minValue: 1, maxValue: 100, label: 'Add this many minutes to main timer for every 100 tokens tipped', defaultValue: 5 }, { name: 'runActivityOnStart', type: 'choice', label: 'Start activity timer on startup', choice1: 'Yes', choice2: 'No', defaultValue: 'No' }, { name: 'defaultActivityMinutes', type: 'int', minValue: 0, maxValue: 360, label: 'Minutes on activity timer (default)', defaultValue: 5 }, { name: 'defaultActivityBoost', type: 'int', minValue: 1, maxValue: 100, label: 'Add this many minutes to main timer for every 100 tokens tipped', defaultValue: 2 }, { name: 'activityText', type: 'str', label: 'Activity (default)', defaultValue: 'Activity' } ]; function init() { timers[MAIN_TIMER].boost = cb.settings.defaultMainBoost; timers[ACT_TIMER].boost = cb.settings.defaultActivityBoost; timers[ACT_TIMER].activity = cb.settings.activityText; cb.log('runMainOnStart: ' + cb.settings.runMainOnStart); cb.log('mainBoost: ' + timers[MAIN_TIMER].boost); if (cb.settings.runMainOnStart == 'Yes') { initiateTimer(MAIN_TIMER, cb.settings.defaultMainMinutes, cb.settings.defaultMainBoost, 'null'); } cb.log('runActivityOnStart : ' + cb.settings.runActivityOnStart); cb.log('activityBoost: ' + timers[ACT_TIMER].boost); if (cb.settings.runActivityOnStart == 'Yes') { initiateTimer(ACT_TIMER, cb.settings.defaultActivityMinutes, cb.settings.defaultActivityBoost, timers[ACT_TIMER].activity); } //cb.sendNotice('Type "/timer help" to see commands (visible to model only)', cb.room_slug); model = model + 'Type "/timer help" to see commands (visible to model only)'; sayit(); } cb.onTip(function (tip) { var message = ''; if (timers[MAIN_TIMER].active == true) { var addMain = Number(timers[MAIN_TIMER].boost) * Number(tip['amount']) / 100; var unitMain = (addMain == 1) ? 'minute' : 'minutes'; cb.log('addMain: ' + addMain); cb.log('timers[MAIN_TIMER].remaining: ' + timers[MAIN_TIMER].remaining); timers[MAIN_TIMER].remaining = Number(timers[MAIN_TIMER].remaining) + Number(addMain); message = addMain + ' ' + unitMain + ' added to "Main" timer.'; } if (timers[ACT_TIMER].active == true) { var addActivity = Number(timers[ACT_TIMER].boost) * Number(tip['amount']) / 100; var unitActivity = (addActivity == 1) ? 'minute' : 'minutes'; cb.log('addActivity: ' + addActivity); cb.log('timers[ACT_TIMER].remaining: ' + timers[ACT_TIMER].remaining); timers[ACT_TIMER].remaining = Number(timers[ACT_TIMER].remaining) + Number(addActivity); message = message + ' ' + Number(addActivity) + ' ' + unitActivity + ' added to ' + timers[ACT_TIMER].activity + ' timer.' } if (message != '') { out = out + '\n' + message.trim(); } sayit(); }); cb.onMessage(msg => { var tokens = msg['m'].split(' '); if ((msg.user != cb.room_slug) || (tokens[0] != '/timer')) { return msg; // if not model or not timer command, bailout } var valid = false; var command = (tokens.length >= 2) ? (tokens[1]) : (null); var type = (tokens.length >= 3) ? (tokens[2]) : (null); var time = (tokens.length >= 4) ? (tokens[3]) : (null); var boost = (tokens.length >= 5) ? (tokens[4]) : (null); var activity = (tokens.length >= 6) ? (recombineActivity(tokens)) : (null); var index = (type == 'act') ? ACT_TIMER : MAIN_TIMER; cb.log('command: ' + command); cb.log('type: ' + type); cb.log('time: ' + time); cb.log('boost: ' + boost); cb.log('activity: ' + activity); if (command == 'start') { cb.log('start: ' + index); if ((index == ACT_TIMER) && (activity != null) && isNumber(time) && isWholeNumber(boost)) { cb.log('activity - isNumber(time): ' + isNumber(time) + ', ' + 'isWholeNumber(boost) :' + isWholeNumber(boost)); valid = true; if (activity != null) { initiateTimer(index, time, boost, activity); // start act } } else if (index == ACT_TIMER) { cb.log('index: ' + index); valid = true; initiateTimer(ACT_TIMER, cb.settings.defaultActivityMinutes, cb.settings.defaultActivityBoost, timers[ACT_TIMER].activity); // start act default } else if ((index == MAIN_TIMER) && isNumber(time) && isWholeNumber(boost)) { cb.log('main - isNumber(time): ' + isNumber(time) + ', ' + 'isWholeNumber(boost) :' + isWholeNumber(boost)); valid = true; initiateTimer(MAIN_TIMER, time, boost, activity); // start main } else { cb.log('index: ' + index); valid = true; initiateTimer(MAIN_TIMER, cb.settings.defaultMainMinutes, cb.settings.defaultMainBoost, cb.settings.activityText); // start main default } } else if (command == 'stop') { cb.log('stop: ' + index); if (index == ACT_TIMER) { valid = true; stopTimer(ACT_TIMER); out = out + '\n' + 'Your "' + timers[ACT_TIMER].activity + '" timer has been stopped.'; } else { // stop act valid = true; stopTimer(MAIN_TIMER); out = out + '\n' + 'Your "Main" timer has been stopped.'; } } else if (command == 'add') { cb.log('add: ' + index); if (isNumber(time)) { cb.log('isNumber(boost): ' + isNumber(boost)); if (index == ACT_TIMER) { valid = true; addToTimer(ACT_TIMER, time); } else { valid = true; addToTimer(MAIN_TIMER, time); } } } else if (command == 'left') { valid = true; var unit = 'minutes'; if (timers[MAIN_TIMER].active == true) { unit = (timers[MAIN_TIMER].remaining == 1) ? 'minute' : 'minutes'; out = out + '\n' + timers[MAIN_TIMER].remaining + ' ' + unit + ' left on the "Main" timer.'; } if (timers[ACT_TIMER].active == true) { unit = (timers[ACT_TIMER].remaining == 1) ? 'minute' : 'minutes'; out = out + '\n' + timers[ACT_TIMER].remaining + ' ' + unit + ' left on the "' + timers[ACT_TIMER].activity + '" timer.'; } if ((timers[MAIN_TIMER].active != true) && (timers[ACT_TIMER].active != true)) { out = out + '\n' + 'No timers active.'; } } else if (command == 'help') { valid = true; showRules(); } if (valid == false) { model = model + 'Could not parse command.'; } sayit(); return msg; }) function initiateTimer(index, time, boost, activity) { if (timers[index].active == true) { timers[index].active = false; cb.cancelTimeout(timers[index].timeout); } if (index == ACT_TIMER) { timers[ACT_TIMER].activity = activity; } cb.log('initiateTimer: ' + index + ', ' + time + ', ' + boost + ', ' + activity + '.'); timers[index].remaining = Number(time); timers[index].boost = Number(boost); timerCall(index); } function stopTimer(index) {; var name = (index == MAIN_TIMER) ? 'Main' : timers[ACT_TIMER].activity; cb.log('index: ' + index); cb.log('name: ' + name); cb.log('remaining: ' + timers[index].remaining); cb.log('timeout: ' + timers[index].timeout); timers[index].remaining = 0; timers[index].active = false; cb.cancelTimeout(timers[index].timeout); cb.log('stopTimer: ' + index + '.'); } function addToTimer(index, time) { var name = (index == MAIN_TIMER) ? 'Main' : timers[ACT_TIMER].activity; var unit = (time == 1) ? 'minute' : 'minutes'; cb.log('index: ' + index); cb.log('name: ' + name); cb.log('remaining: ' + timers[index].remaining); timers[index].remaining = Number(timers[index].remaining) + Number(time); cb.log('index: ' + index); cb.log('name: ' + name); cb.log('remaining: ' + timers[index].remaining); out = out + '\n' + time + ' ' + unit + ' added to your "' + name + '" timer. ' + timers[index].remaining + ' minutes left.'; cb.log('addToTimer: ' + index + ', ' + time + '.'); } function timerCall(index) { var recur = 60000; var name = 'Main'; if (index == ACT_TIMER) { name = timers[ACT_TIMER].activity; } cb.log('timerCall: ' + index); if(timers[index].remaining > 1) { cb.log('remaining if: ' + index); if (timers[index].active == true) { cb.log('old if: ' + index); timers[index].remaining = timers[index].remaining - 1; } else { cb.log('new if: ' + index); timers[index].active = true; } if (timers[index].remaining < 1) { recur = Math.floor(timers[index].remaining * 60000) + 10; cb.log('under 1 minute - recur: ' + recur + '.'); } if ((index == ACT_TIMER) || (timers[index].remaining <= 10)) { cb.log('act / <10 if: ' + index); if (Math.floor(timers[index].remaining) == 0) { out = out + '\n' + timers[index].remaining + ' minutes left on the "' + name + '" timer.'; } else { out = out + '\n' + Math.floor(timers[index].remaining) + ' minutes left on the "' + name + '" timer.'; } } else if ((timers[index].remaining > 10) && (timers[index].remaining <= 20)) { if (Math.floor(timers[index].remaining % 2) == 0) { out = out + '\n' + Math.floor(timers[index].remaining) + ' minutes left on the "' + name + '" timer.'; } } else { if (Math.floor(timers[index].remaining % 5) == 0) { out = out + '\n' + Math.floor(timers[index].remaining) + ' minutes left on the "' + name + '" timer.'; } } } else { // no time left cb.log('index: ' + index); cb.log('timeout: ' + timers[index].timeout); out = out + '\n' + name + ' Timer Has Expired!'; cb.log('index: ' + index); stopTimer(index); sayit(); return; } cb.log('timeout: ' + timers[index].timeout + ' index: ' + index + ' recur: ' + recur + '.'); timers[index].timeout = cb.setTimeout(function() { timerCall(index); }, recur); sayit(); cb.log('timeout: ' + timers[index].timeout); } function showRules() { var sep = '\u2007'.repeat(3); var rules = ''; cb.sendNotice('### Super Nova Countdown Timer ###', cb.room_slug, '#7D2C3D', '#FFF', 'bold'); rules = rules + 'You can always start the timer using the launch window when you start the bot, but if you wish to stop, restart or - most importantly - start the activity timer separately from the main timer, use these command line operations.' rules = rules + '\n' + '| /timer help => shows this menu (to the model only)' rules = rules + '\n' + '| /timer start => starts/restarts main timer with default settings' rules = rules + '\n' + '|' + sep + '/timer start main => same as above, main timer + default settings' rules = rules + '\n' + '|' + sep + '/timer start act => starts/restarts activity timer with default settings' rules = rules + '\n' + '| /timer start [timer] [min] [min / 100tks] [OPTIONAL: Activity Name]' rules = rules + '\n' + '|' + sep + 'ex: /timer start main 30 5' rules = rules + '\n' + '|' + sep + '=> main timer set to 30min + 5min/100tks tipped' rules = rules + '\n' + '|' + sep + 'ex: /timer start act 5 2 Suck Dildo' rules = rules + '\n' + '|' + sep + '=> activity timer set to Suck Dildo for 5min + 2min/100tks' rules = rules + '\n' + '| /timer add [timer] [min] => adds min to timer' rules = rules + '\n' + '|' + sep + 'ex: /timer add main 10 => adds 10min to main timer' rules = rules + '\n' + '|' + sep + 'ex: /timer add act 5 => adds 5min to activity timer' rules = rules + '\n' + '| /timer stop => stops main timer' rules = rules + '\n' + '| /timer stop [timer] => stops timer "main" or "act" based on keyword' rules = rules + '\n' + '|' + sep + 'ex: /timer stop main' rules = rules + '\n' + '|' + sep + 'ex: /timer stop act' rules = rules + '\n' + '| /timer left => tells you how much time is left on both' cb.sendNotice(rules, cb.room_slug, '', '#7D2C3D', 'bold'); } function sayit() { cb.sendNotice(out.trim(), '', '#7D2C3D', '#FFF', 'bold'); out = ''; cb.sendNotice(model.trim(), cb.room_slug); model = ''; } function recombineActivity(tokens) { var result = ''; for (i = 5; i < tokens.length; i++) { result = result + tokens[i] + ' '; } return ((result == '') ? null : result.trim()); } function isWholeNumber(n) { if (n != null) { return 0 === n % (!Number.isNaN(parseFloat(n)) && 0 <= ~~n); } else { return false; } } function isNumber(n) { if (n != null) { return !isNaN(n); } else { return false; } } function sleep(milliseconds) { const date = Date.now(); let currentDate = null; do { currentDate = Date.now(); } while (currentDate - date < milliseconds); } init();
© Copyright Chaturbate 2011- 2026. All Rights Reserved.