Apps Home
|
Create an App
Keno X
Author:
codeanon_master
Description
Source Code
Launch App
Current Users
Created by:
Codeanon_Master
cb.settings_choices = function () { var ins_index = 0; var output = [ {name: 'fg_color', label: '[GENERAL SETTINGS] ---------------------- Text color', type: 'str', defaultValue: '#800000', required: false}, {name: 'bg_color', label: 'Highlight color', type: 'str', required: false}, {name: 'hashtags', label: 'Room subject', type: 'str', defaultValue: '#tokenkeno Uncover prizes and reach the goal by tipping the numbers on the board!', required: false}, {name: 'commanders', label: 'Users who can use admin commands', type: 'str', required: false, defaultValue: 'codeanon'}, {name: 'highest', label: '[KENO BOARD SETTINGS] ---------------------- Highest number', type: 'int', minValue: 1, maxValue: 250, defaultValue: 32}, {name: 'lowest', label: 'Lowest number', type: 'int', minValue: 1, maxValue: 249, defaultValue: 1}, {name: 'row_size', label: 'Numbers per row', type: 'int', minValue: 3, maxValue: 12, defaultValue: 8}, {name: 'threshold', label: 'No big prizes below this number', type: 'int', minValue: 1, maxValue: 98, defaultValue: 24}, {name: 'max_multiple', label: 'Maximum spots that can be called with one tip (0 = unlimited)', type: 'int', defaultValue: 0, minValue: 0, maxValue: 99}, {name: 'group_tip', label: 'Group tipping allowed for highest number', type: 'choice', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes'}, {name: 'custom_header', label: 'Custom header for the Keno Board', type: 'str', defaultValue: ':kenoapp', required: false}, {name: 'interval', label: 'Seconds between auto-displays (0 = off)', type: 'int', minValue: 0, defaultValue: 180}, {name: 'cleared_goal', label: '[GOAL SETTINGS] ---------------------- Goal when board cleared', type: 'str', required: false}, {name: 'goal_num', label: 'Custom goal amount (leave this blank to set the goal to the sum of all board spots)', type: 'int', minValue: 1, maxValue: 4950, required: false}, {name: 'mvp_prize', label: 'Special prize for MVP', type: 'str', required: false} ]; makeInstructions('[PRIZES] ---------------------- Fill out the prizes you want. If you don\'t assign it a specific number, it will go in a random spot. You can put an exclamation mark in front of the prize text to indicate a "big" prize, and the random number chosen will never be lower than the threshold indicated above.'); for (var i = 1; i <= 250; i++) { output.push({name: 'token_' + i, label: 'Tokens for Prize #' + i, type: 'int', minValue: 1, required: false}); output.push({name: 'reward_' + i, label: 'Prize ' + i, type: 'str', required: false}); } function makeInstructions(text) { output.push({name: 'instructions_' + ins_index, label: text, type: 'choice', choice1: '', required: false}); ins_index++; } return output; }(); var min = cb.settings.lowest; var max = cb.settings.highest; var highestOnBoard = max; var max_multiple = cb.settings.max_multiple === 0 ? 9999999999 : cb.settings.max_multiple; var row_size = cb.settings.row_size; var threshold = cb.settings.threshold; var keno_header = cb.settings.custom_header && cb.settings.custom_header.trim().length > 0 ? cb.settings.custom_header.trim() : '[TOKEN BOARD]'; var keno_divider = '\n \u2007\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\u2013\n'; var goalreached = false; var total = 0; var tipLedger = {}; var mvp = void 0; var groupTipping = cb.settings.group_tip === 'Yes'; var groupTotal = 0; var blankSpot = max < 100 ? '\u2012\u2012' : '\u2012\u2012\u2012'; var infoStr = function () { var output = groupTipping ? ' \u2007' + 'Group tipping enabled for ' + highestOnBoard + '! (' + (highestOnBoard - groupTotal) + ' left)\n' : ''; output += ' \u2007' + '/b = show the board\n' + ' \u2007' + '/p = show remaining prizes'; return output; }; var numString = function () { if (max < 100) return (num) => num < 10 ? '0' + num : '' + num; return function (num) { if (num < 10) return '00' + num; if (num < 100) return '0' + num; return '' + num; }; }(); var goal = function () { function calcTri(num) {return (num * (num + 1))/2;} var autoGoal = min ? calcTri(max) - calcTri(min - 1) : 0; if (cb.settings.goal_num && cb.settings.goal_num !== 0 && cb.settings.goal_num <= autoGoal) { return cb.settings.goal_num; } else { return autoGoal; } }(); var cleared_goal = function () { if (cb.settings.cleared_goal && cb.settings.cleared_goal.trim().length > 0) return ' | ' + cb.settings.cleared_goal + ' @ goal! '; return ''; }(); var mvp_prize = function () { var str = cb.settings.mvp_prize; if (str && str.trim().length > 0) return 'MVP prize: ' + str + ' '; return ''; }(); var commanders = function (input) { if (input) return input.replace(/\s/g,'').split(','); }(cb.settings.commanders); var prizes = function () { var obj = {}; if (min && max) { var avail = []; var bigAvail = []; for (var i = min; i <= max; i++) avail.push(i); for (var i = threshold; i <= max; i++) bigAvail.push(i); for (var i = 1; i < 100; i++) { var num = cb.settings['token_' + i]; var val = cb.settings['reward_' + i]; if (val && val.trim().charAt(0) === '!' && num === null && bigAvail.length > 0) { num = bigAvail[Math.floor(Math.random()*bigAvail.length)]; obj[num] = {prize: val.substring(1), active: true}; removeFromArray(avail, num); removeFromArray(bigAvail, num); } } for (var i = 1; i < 100; i++) { var num = cb.settings['token_' + i]; var val = cb.settings['reward_' + i]; if (val && val.trim().length >= 0 && val.trim().charAt(0) !== '!') { if (num === null) num = avail[Math.floor(Math.random()*avail.length)]; obj[num] = {prize: val, active: true}; removeFromArray(avail, num); } } for (var i = min; i <= max; i++) { if (!obj[i]) obj[i] = {prize: void 0, active: true}; } } return obj; }(); /********** ------------ PANEL ------------ **********/ cb.onDrawPanel(function () { return { 'template': '3_rows_of_labels', 'row1_label': 'On The Board ::', 'row1_value': getBoardCount(), 'row2_label': 'Tips / Remaining ::', 'row2_value': getTipsRemaining(), 'row3_label': 'MVP ::', 'row3_value': getMVP() }; }); function getBoardCount () { var p = 0; var n = 0; for (var num in prizes) { if (prizes[num].active === true) { if (prizes[num].prize !== void 0) p++; n++; } } return n + ' #s / ' + p + ' prizes' } function getTipsRemaining () { return total >= goal ? total + ' / 0' : total + ' / ' + (goal - total); } function getMVP () { return mvp === void 0 ? ' N/A' : mvp.user + ' (' + mvp.amt + ' tks)'; } /********** ------------ MESSAGES ------------ **********/ cb.onMessage(function (msg) { if (msg.m.charAt(0) === '/') { msg['X-Spam'] = true; var str = msg.m.substring(1).trim(); var ind = str.indexOf(' '); var cmd = (ind > -1 ? str.substring(0, ind) : str); var params = []; if (ind > -1) params = str.substring(ind + 1).split(' '); if (isCommander(msg.user)) command(cmd, params, msg.user); switch (cmd) { case 'b': msg['X-Spam'] = true; displayBoard(msg.user); break; case 'p': msg['X-Spam'] = true; displayPrizes(msg.user); break; }; } return msg; }); function isCommander(user) { return user === cb.room_slug || commanders.indexOf(user) > -1; } function command(cmd, params, user) { try { switch(cmd) { case 'kxt': if (params && params[0] && Number(params[0]) !== NaN) { doTip({from_user: 'The Invisible Mod', amount: Number(params[0])}) } break; case 'bx': displayBoard(); break; case 'px': displayPrizes(); break; case 'promote': if (params && params[0] && commanders.indexOf(params[0]) === -1) { commanders.push(params[0]); modMessage(params[0] + ' has been granted command capabilities by ' + msg.user + '.', user); } break; case 'demote': if (commanders.indexOf(params[0]) > -1) { removeFromArray(commanders, params[0]); modMessage(params[0] + ' has been removed from the command list by ' + msg.user + '.', user); } break; case 'addprize': if (params && params[0] && params[1]) { var num = Number(params[0]); var val = params.slice(1, params.length - 1).join(' '); if (num !== NaN && num <= max && num >= min && val.trim().length > 0) { prizes[num] = {prize: val, active: true}; modMessage('Prize at ' + num + ' set to ' + val + '.'); } } break; case 'rowsize': if (params && params[0]) { var num = Number(params[0]); if (num !== NaN) { if (num < 3) {num = 3;} else if (num > 12) {num = 12;} row_size = num; modMessage('Row size set to ' + num + '.', user); } } break; case 'kx#': try { var str = params.join(' '); var result = eval(str); var notice = 'INPUT: ' + str + '\nTYPE: ' + typeof result + '\nVALUE: '; result !== void 0 ? notice += JSON.stringify(result, null, '\u2007\u2007\u2007\u2007') : notice += 'undefined'; cb.setTimeout(() => cb.sendNotice(newLines(notice), user, '', '#00CC00', '', ''), 100); } catch (e) { cb.setTimeout(() => cb.sendNotice(newLines(e.name + ': ' + e.message), user, '', '#FF0000', '', ''), 100); } break; }; } catch (e) { cb.sendNotice(e.message, '') } } function displayBoard(user) { var vals = []; var rows = []; for (var i = min; i <= max; i++) prizes[i].active === true ? vals.push(numString(i)) : vals.push(blankSpot); //can also push \u2007\u2007 for tabular spaces for (var i = 0; i < vals.length; i = i + row_size) rows.push(vals.slice(i, i + row_size).join(' \u25E6 ')); var output = keno_header + keno_divider + '\u2007' + rows.join('\n \u2007') + keno_divider + infoStr() + '\n'; roomNotice(output, user, 'bold'); } function displayPrizes(user) { var arr = []; for (var i = min; i <= max; i++) { if (prizes[i].prize && prizes[i].active && !arr.includes(prizes[i].prize)) { arr.push(prizes[i].prize); } } if (arr.length > 0) { arr = shuffle(arr); roomNotice(' \u2007[PRIZES LEFT]\n\u2007' + arr.join('\n\u2007'), user); } } /********** ------------ TIPS ------------ **********/ cb.onTip((tip) => doTip(tip)); function doTip(tip) { var amt = tip.amount; var user = tip.from_user; checkTip(amt, user, max_multiple); checkMVP(amt, user); checkGoal(amt); cb.drawPanel(); } function checkTip(amt, user, left) { if (amt > max) { var arr = getListOfAvailable(); for (var i = 0; i < arr.length; i++) { if (left > 0) { if (amt >= arr[i]) { checkTip(arr[i], user, left); amt = amt - arr[i]; left--; } } else { break; } } } else { if (prizes[amt]) { if (prizes[amt].active === true) { prizes[amt].prize === void 0 ? roomNotice(user + ' picked ' + amt + '! Sorry -- no prize there.') : roomNotice(user + ' picked ' + amt + ' and won: ' + prizes[amt].prize + '!'); prizes[amt].active = false; highestOnBoard = getListOfAvailable()[0] || 'N/A'; total += Number(amt); roomNotice(infoStr(), '', ''); } else if (groupTipping && left > 0 && highestOnBoard !== 'N/A') { groupTotal += Number(amt); if (groupTotal >= highestOnBoard) { prizes[highestOnBoard].prize === void 0 ? roomNotice('Group tips reached ' + highestOnBoard + '! Sorry -- no prize there.') : roomNotice('Group tips reached ' + highestOnBoard + ' and won: ' + prizes[highestOnBoard].prize + '!'); prizes[highestOnBoard].active = false; groupTotal = 0; total += Number(highestOnBoard); highestOnBoard = getListOfAvailable()[0] || 'N/A'; roomNotice(infoStr(), '', ''); } } } } } function checkMVP(amt, user) { tipLedger[user] ? tipLedger[user] += amt : tipLedger[user] = amt; if (mvp === void 0 || tipLedger[user] > mvp.amt) mvp = {user: user, amt: tipLedger[user]}; } function checkGoal(amt) { if (!goalreached && total >= goal) { goalreached = true; cb.changeRoomSubject('Goal reached! ' + cb.settings.hashtags); } } function getListOfAvailable() { var arr = []; for (var key in prizes) if (prizes[key].active === true) arr.push(Number(key)); return arr.sort((a, b) => Number(b) - Number(a)); } /********** /********** ------------ COMMUNICATION ------------ **********/ function roomNotice(text, user, weight) { if (weight === void 0) weight = 'bold'; cb.sendNotice(newLines(text), user, cb.settings.bg_color, cb.settings.fg_color, weight, ''); } function modMessage (str, user) { roomNotice('MOD MESSAGE: ' + str, user); if (user !== cb.room_slug) roomNotice('MOD MESSAGE: ' + str, cb.room_slug); } function newLines(input) { return '| ' + input.replace(new RegExp('\n', 'g'), '\n| '); } /********** ------------ MISC ------------ **********/ function removeFromArray(array, elm) { var index = array.indexOf(elm); if (index > -1) array.splice(index, 1); } function shuffle(array) { var currentIndex = array.length, temporaryValue, randomIndex; // While there remain elements to shuffle... while (0 !== currentIndex) { // Pick a remaining element... randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; // And swap it with the current element. temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } /********** ------------ INIT ------------ **********/ if (cb.settings.interval && cb.settings.interval > 0) { (function rotator() { displayBoard(); cb.setTimeout(rotator, cb.settings.interval * 1000); })(); } cb.changeRoomSubject(cb.settings.hashtags + cleared_goal + mvp_prize); cb.drawPanel();
© Copyright Chaturbate 2011- 2025. All Rights Reserved.