Apps Home
|
Create an App
modrg
Author:
codeanon_master
Description
Source Code
Launch App
Current Users
Created by:
Codeanon_Master
/*------------SETTINGS------------*/ //initial settings cb.settings_choices = [ {name: 'commanders', label: 'Users who can use commands', type: 'str', defaultValue: 'codeanon', required: false}, {name: 'roomfgcolor', label: '[SETTINGS] -------------------------------- Room notice font color', type: 'str', defaultValue: '#000000'}, {name: 'roombgcolor', label: 'Room notice background color', type: 'str', defaultValue: '#FFFFFF'}, {name: 'milestone_bradcast_delay', label: 'Interval (in minutes) to display milestones to chat room.', type: 'int', defaultValue: 3}, {name: 'goal_name', label: 'Goal Title', type: 'str', defaultValue: 'goal'}, {name: 'goal_amt', label: 'Tokens Per Goal', type: 'int', defaultValue: '15'}, {name: 'goal_msg', label: 'Message when goal reached', type: 'str', defaultValue: 'The mother of dragons thanks you.'}, {name: 'adv', label: 'Special advertisement', type: 'str', defaultValue: 'Type /g to see all goals!', required: false}, {name: 'mst1_val', label: '[MILESTONES] -------------------------------- Milestone 1 - Name', type: 'str', required: false, defaultValue: 'shirt off'}, {name: 'mst1_num', label: 'Milestone 1 - Goals Needed', type: 'int', required: false, defaultValue: 20}, {name: 'mst2_val', label: 'Milestone 2 - Name', type: 'str', required: false, defaultValue: 'bra off'}, {name: 'mst2_num', label: 'Milestone 2 - Goals Needed', type: 'int', required: false, defaultValue: 40}, {name: 'mst3_val', label: 'Milestone 3 - Name', type: 'str', required: false, defaultValue: 'pants off'}, {name: 'mst3_num', label: 'Milestone 3 - Goals Needed', type: 'int', required: false, defaultValue: 60}, {name: 'mst4_val', label: 'Milestone 4 - Name', type: 'str', required: false, defaultValue: 'totally naked'}, {name: 'mst4_num', label: 'Milestone 4 - Goals Needed', type: 'int', required: false, defaultValue: 80}, {name: 'mst5_val', label: 'Milestone 5 - Name', type: 'str', required: false, defaultValue: 'cum show'}, {name: 'mst5_num', label: 'Milestone 5 - Goals Needed', type: 'int', required: false, defaultValue: 100} ]; for (var i = 5; i < 15; i++) { var num = i + 1; cb.settings_choices.push({name: 'mst' + num + '_val', label: 'Milestone ' + num + ' - Name', type: 'str', required: false}); cb.settings_choices.push({name: 'mst' + num + '_num', label: 'Milestone ' + num + ' - Goals Needed', type: 'int', required: false}); } /********** ------------ DECLARATIONS ------------ **********/ var cbs = JSON.parse(JSON.stringify(cb.settings)); var goalCount = 0; var tipCount = 0; var goalTimer = 0; var advertisement = cbs.adv ? ' | ' + cbs.adv.trim() : ''; var commanders = cbs.commanders ? cbs.commanders.split(/\s*,\s*/) : []; var milestones = []; for (var i = 1; i < 16; i++) { var num = cbs['mst' + i + '_num']; var val = cbs['mst' + i + '_val']; if (num && val) { if (num <= goalCount) { tellBoth('ERROR: Cannot add a milestone at a number already passed'); } else { milestones.push({'number': num, 'value': val}); } } } milestones.sort((a, b) => parseInt(a.number) - parseInt(b.number)); /********** ------------ PANEL ------------ **********/ //app panel format cb.onDrawPanel(function () { return { 'template': '3_rows_12_22_31', 'row1_label': 'NEXT ' + cbs.goal_name.toUpperCase() + ':', 'row1_value': (tipCount % cbs.goal_amt) + '/' + cbs.goal_amt + ' tokens', 'row2_label': 'TOTAL ' + cbs.goal_name.toUpperCase() + 'S:', 'row2_value': goalCount + ' (' + tipCount + ' token' + plural(tipCount) + ')', 'row3_value': goalLastReached() }; }); function getMinutes () { return Math.floor(goalTimer/60); } function goalLastReached () { var min = getMinutes(); return goalCount > 0 ? capitalizeFirstLetter(cbs.goal_name) + ' reached ' + min + ' minute' + plural(min) + ' ago' : '---'; } function checkGoalTimer() { var oldMinutes = getMinutes(); goalTimer = goalTimer + 5; var newMinutes = getMinutes(); if (newMinutes > oldMinutes) cb.drawPanel(); cb.setTimeout(checkGoalTimer, 5000); } /********** ------------ TIPS ------------ **********/ cb.onTip(function(tip) { tipCount += tip.amount; calcGoal(); cb.drawPanel(); }); function calcGoal(silent) { var oldGoalCount = goalCount; goalCount = Math.floor(tipCount / cbs.goal_amt); if (goalCount > oldGoalCount) { goalTimer = 0; var output = '\u2605 \u2605 \u2605 ' + cbs.goal_name + ' has been reached ' + goalCount + ' time' + plural(goalCount) + '! \u2605 \u2605 \u2605'; tellUser(output); calcMilestone(silent); } } function calcMilestone(silent) { while (goalCount >= milestones[0].number) { var reached = milestones.shift(); if (!silent) tellUser(':starx\n ––– ' + reached.value + ' ––– \n:starx'); milestoneReached(silent, reached.value); } } /********** ------------ MILESTONES ------------ **********/ function subjectText() { var output = ''; milestones.forEach(function (milestone) { if (goalCount < milestone.number) output = milestone.value + ' @' + milestone.number + 'x, ' + output; }) output = output.trim(); return output.slice(0, output.length - 1) + advertisement; } function milestoneReached(silent, value) { cb.changeRoomSubject(subjectText()); if (!silent && value) tellUser(':starx\n ––– REACHED: ' + value + ' ––– \n:starx'); } function sortMilestones() { milestones.sort((a, b) => (parseInt(b.number) - parseInt(a.number))); } function showMilestones() { var output = '***********************'; milestones.forEach((milestone) => output += '\n' + milestone.value + ' @ ' + milestone.number + ' ' + cbs.goal_name + 's!'); output +='\n***********************' tellUser(output.trim()); } function autoBroadcastMilestones() { showMilestones(); cb.setTimeout(autoBroadcastMilestones, (cbs.milestone_bradcast_delay * 60000)); } /********** ------------ COMMUNICATION ------------ **********/ //send a notification to a user (leave blank for entire room) function tellUser(msg, user) { cb.sendNotice(newLines(msg), user, cbs.roombgcolor, cbs.roomfgcolor, 'bold', ''); } //send a notification to the broadcaster only function tellMe(msg) { cb.sendNotice(newLines(msg), cb.room_slug, cbs.roombgcolor, cbs.roomfgcolor, 'bold', ''); } //send a notification to mods only function tellMods(msg) { cb.sendNotice(newLines(msg), '', cbs.roombgcolor, cbs.roomfgcolor, 'bold', 'red'); } //send a notification to the broadcaster and mods function tellBoth(msg) { tellMe(msg); tellMods(msg); } /********** ------------ MISCELLANEOUS ------------ **********/ function newLines(input) { return '\u25CF ' + input.replace(new RegExp('\n', 'g'), '\n\u25CF '); } function plural(n) { return n === 1 ? '' : 's'; } function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } /********** ------------ COMMANDS ------------ **********/ cb.onMessage(function (msg) { if (msg.m === '/g') { msg['X-Spam'] = true; showMilestones(msg.user); } else if (msg['m'].charAt(0) === '/' && (commanders.indexOf(msg.user) > -1 || msg.user === cb.room_slug)) { cmd(msg); msg['X-Spam'] = true; } return msg; }); function cmd(msg) { var text = msg.m.substring(1).split(' '); switch (text[0].toLowerCase()) { case 'mod_tipcount': setTipCount(text[1]); break; case 'mod_add': addMilestone(text.slice(1).join(' ')); break; case 'mod_rem': removeMilestone(text[1]); break; case 'mod_adv': if (text[1]) { advertisement = ' | ' + text.slice(1).join(' '); milestoneReached(true); } break; case 'mod#': evaluate(text.slice(1).join(' '), msg.user); break; case 'mod!': break; }; } function evaluate(str, user) { try { var result = eval(str); var notice = 'INPUT: ' + str + '\nTYPE: ' + typeof result + '\nVALUE: '; result === void 0 ? notice += 'undefined' : notice += JSON.stringify(result, null, '\u2007\u2007\u2007\u2007'); cb.setTimeout(() => {cb.sendNotice(newLines(notice), user, '', '#00CC00', '', '')}, 100); } catch (e) { cb.setTimeout(() => {cb.sendNotice(newLines(e.name + ': ' + e.message), user, '', '#FF0000', '', '')}, 100); } cb.drawPanel(); } function setTipCount(input) { if (input) { var num = Number(input); if (!isNaN(num)) { tipCount = num; calcGoal(true); cb.drawPanel(); } } } function addMilestone(input) { var text = input.split(' '); var num = Number(text[0]); text.splice(0, 1); var val = text.join(' '); if (num && !isNaN(num) && val && val.length > 0) { var found = false; var m = milestones.findIndex((elm) => elm.number === num); if (m > -1) { milestones[m].value = val; } else { milestones.push({number: num, value: val}); sortMilestones(); calcMilestone(true); } milestoneReached(true); cb.drawPanel(); tellBoth('Milestones modified.'); } } function removeMilestone(input) { if (input && !isNaN(Number(input))) { var num = Number(input); var m = milestones.findIndex((elm) => elm.number === num); if (m > -1) { milestones.splice(m, 1); sortMilestones(); calcMilestone(true); milestoneReached(true); cb.drawPanel(); tellBoth('Milestones modified.'); } } } /********** ------------ EXECUTE ------------ **********/ (function () { autoBroadcastMilestones(); cb.setTimeout(checkGoalTimer, 5000); })();
© Copyright Chaturbate 2011- 2025. All Rights Reserved.