Apps Home
|
Create an App
magiceye goals
Author:
greenandsexy
Description
Source Code
Launch App
Current Users
Created by:
Greenandsexy
/*------------SETTINGS------------*/ //initial settings cb.settings_choices = [ {name: 'commanders', label: 'Users who can use commands', type: 'str', defaultValue: 'greenandsexy', 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: 'tokensleft_delay', label: 'Display tokens to goal every ___ minutes', type: 'int', defaultValue: 5, minValue: 0}, {name: 'goal_name', label: 'Goal Title', type: 'str', defaultValue: 'goal'}, {name: 'goal_amt', label: 'Tokens Per Goal', type: 'int', defaultValue: '77'}, {name: 'goal_msg', label: 'Message when goal reached', type: 'str', defaultValue: 'Magic Goal Reached. Lots of Love Back.'}, {name: 'adv', label: 'Hashtags #', type: 'str', defaultValue: '#18 #magic #sweet', 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) milestones.push({'number': num, 'value': val}); } sortMilestones(); /********** ------------ PANEL ------------ **********/ //app panel format cb.onDrawPanel(function () { return { 'template': '3_rows_of_labels', 'row1_label': milestones[0].value.toUpperCase() + ' @ ', 'row1_value': milestones[0].number + ' goals', 'row2_label': 'RECEIVED:', 'row2_value': (tipCount % cbs.goal_amt) + '/' + cbs.goal_amt + ' tokens', 'row3_label': 'REACHED GOALS ', 'row3_value': goalCount }; }); 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'; say(output); calcMilestone(silent); cb.changeRoomSubject(subjectText()); } } function calcMilestone(silent) { while (milestones[0] && goalCount >= milestones[0].number) { var reached = milestones.shift(); milestoneReached(silent, reached.value); } } /********** ------------ MILESTONES ------------ **********/ function subjectText() { var output = []; milestones.forEach((milestone) => output.push(goalsLeft() + ' goals left until ' + milestone.value)); return output[0] + ' ' + advertisement; } function milestoneReached(silent, value) { cb.changeRoomSubject(subjectText()); if (!silent && value) say(':yay2\n ––– REACHED: ' + value + ' ––– \n:yay2'); } function sortMilestones() { milestones.sort((a, b) => (parseInt(a.number) - parseInt(b.number))); } function showMilestones() { var output = '***********************'; milestones.forEach((milestone) => output += '\n' + milestone.value + ' @ ' + milestone.number + ' ' + cbs.goal_name + 's!'); output +='\n***********************' say(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 say(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(/\s+/); 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]) break; advertisement = ' | ' + text.slice(1).join(' '); cb.changeRoomSubject(subjectText()); break; case 'mod#': evaluate(text.slice(1).join(' '), msg.user); break; case 'mod': sayTokensLeft(); break; }; } function sayTokensLeft() { var n = goalsLeft(); if (n) say(':magicxhand1 ' + n + ' goals left until ' + milestones[0].value + '! :magicxhand1'); } function tokensLeft() { if (milestones[0]) return (milestones[0].number * cbs.goal_amt) - tipCount; } function goalsLeft() { if (milestones[0]) return Math.ceil(milestones[0].number - (tipCount / cbs.goal_amt)); } function autoBroadcastTokensLeft() { sayTokensLeft(); cb.setTimeout(autoBroadcastTokensLeft, cbs.tokensleft_delay * 60000); } function evaluate(str, user) { try { var result = eval(str); var notice = 'TYPE: ' + 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) { var num = Number(input); if (!isNaN(num)) { tipCount = num; calcGoal(true); cb.drawPanel(); } } function addMilestone(input) { var text = input.split(/\s+/); 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); cb.drawPanel(); tellBoth('Milestones modified.'); } } } /********** ------------ EXECUTE ------------ **********/ cb.changeRoomSubject(subjectText()); autoBroadcastMilestones(); autoBroadcastTokensLeft(); cb.setTimeout(checkGoalTimer, 5000);
© Copyright Chaturbate 2011- 2025. All Rights Reserved.