Apps Home
|
Create an App
sequence
Author:
codeanon_master
Description
Source Code
Launch App
Current Users
Created by:
Codeanon_Master
cb.settings_choices = [ {name: 'start', type: 'int', label: 'Starting tip number', defaultValue: 10, minValue: 10}, {name: 'goals', type: 'str', label: 'Goals', defaultValue: '25: shirtless, 50: topless, 75: naked, 100: cum show'}, {name: 'rotator', type: 'int', label: 'Display graphic every __ seconds', minvalue: 0, defaultValue: 120}, {name: 'fgcolor', type: 'str', label: 'Text foreground color', defaultValue: '#000000'}, {name: 'bgcolor', type: 'str', label: 'Text background color', defaultValue: '#FFFFFF'}, {name: 'commanders', type: 'str', label: 'Users able to use commands', defaultValue: 'codeanon', required: false}, {name: 'subj', label: 'Room subject', type: 'str', required: false, defaultValue: 'Do the thing!'} ]; var tipTotal = function (num) { if (num && num > 0) return calcTri(num - 1); return 0; }(cb.settings.start); var goals = function (input) { if (input) { var output = []; var processed = input.split(','); for (var i = 0; i < processed.length; i++) { var item = processed[i].split(':'); if (item.length === 2) { item[0] = item[0].trim(); item[1] = item[1].trim(); if (Number(item[0]) !== NaN && item[1].length >0) { output.push({num: Number(item[0]), val: item[1].charAt(0).toUpperCase() + item[1].slice(1)}) } } } return output.sort((a,b) => a.num - b.num); } return void 0; }(cb.settings.goals); var goalIndex = 0; var lastTip = {user: 'N/A', amount: '0'}; var lastGraphic = 0; var ms = cb.settings.rotator * 1000; var now = () => (new Date).getTime(); /********** ------------ PANEL ------------ **********/ cb.onDrawPanel(function () { var obj = seqValue(); return { 'template': '3_rows_12_21_31', 'row1_label': obj.label, 'row1_value': obj.value, 'row2_value': goalValue(), 'row3_value': 'Latest tip from ' + lastTip.user + ' (' + lastTip.amount + ')', }; }); function seqValue() { var currentTriGoal = floorReverseTri(tipTotal) + 1; var diff = calcTri(currentTriGoal) - tipTotal; return { label: currentTriGoal + ' tokens needed', value: '\u25A0\u00A0\u00A0[' + diff + ' left]' }; } function goalValue() { if (goalIndex >= goals.length) { return 'All goals reached!'; } else { return goals[goalIndex].val + ' when we pass ' + goals[goalIndex].num + '!'; } } /********** ------------ TIPS ------------ **********/ cb.onTip(function(tip) { addTip(tip); checkGoal(); cb.drawPanel(); }); function addTip (tip) { tipTotal += tip.amount; lastTip = {user: tip.from_user, amount: tip.amount}; } function checkGoal() { var oldIndex = goalIndex; var currentTri = floorReverseTri(tipTotal); for (var i = 0; i <= goals.length; i++) { if (i === goals.length || currentTri < goals[i].num) { goalIndex = i; if (goalIndex > oldIndex) { roomNotice(':goalreached\n * * * ' + goals[i - 1].val + ' * * *'); } break; } } } /********** ------------ MESSAGES ------------ **********/ var commanders = function () { if (cb.settings.commanders) { var arr = cb.settings.commanders.split(','); arr.forEach((elm) => elm = elm.trim()); return arr; } }(); cb.onMessage(function (msg) { if (isCommander(msg.user) && msg.m.toLowerCase().startsWith('/st')) { cmd(msg); } }); function isCommander(user) { return user === cb.room_slug || commanders.includes(user); } function cmd (msg) { var data = msg.m.split(' '); switch (data[0].toLowerCase().slice(3)) { case '#': try { var str = data.slice(1).join(' '); var result = eval(str); var notice = 'INPUT: ' + str + '\nTYPE: ' + typeof result + '\nVALUE: '; result !== void 0 ? notice += JSON.stringify(result).replace(/},{/g, '},\n{').replace(/:{/,':{\n') : notice += 'undefined'; cb.setTimeout(function(){ cb.sendNotice(newLines(notice), msg.user, '', '#0000FF', 'bold', ''); }, 100); } catch (e) { cb.setTimeout(function () { cb.sendNotice(newLines(e.name + ': ' + e.message), msg.user, '', '#FF0000', 'bold', ''); }, 100); } break; case '_subj': if (data[1]) cb.changeRoomSubject(data.slice(1).join(' ')); break; } } /********** ------------ MATH ------------ **********/ function calcTri(num) { var val = (num * (num + 1))/2; return val; } function floorReverseTri(num) { var val = Math.floor(((Math.sqrt((8 * num) + 1)) - 1)/2); return val; } /********** ------------ COMMUNICATION ------------ **********/ function showGraphic (time) { lastGraphic = time; var num = floorReverseTri(tipTotal) + 1; num < 100 ? roomNotice(':next' + num) : roomNotice('NEXT TIP NEEDED: ' + num); } function roomNotice(msg) { cb.sendNotice(newLines(msg), '', cb.settings.bgcolor, cb.settings.fgcolor, 'bold', ''); } function newLines(input) { return '\u25A0 ' + input.replace(new RegExp('\n', 'g'), '\n\u25A0 '); } /********** ------------ EXECUTE ------------ **********/ if (cb.settings.rotator > 0) { (function rotator() { var time = now(); if (time - lastGraphic >= ms) showGraphic(time); cb.setTimeout(rotator, 2000); })(); } if (cb.settings.subj && cb.settings.subj.length > 0) cb.changeRoomSubject(cb.settings.subj.trim());
© Copyright Chaturbate 2011- 2025. All Rights Reserved.