Bots Home
|
Create an App
Shark Week Keno
Author:
karmabank
Description
Source Code
Launch Bot
Current Users
Created by:
Karmabank
var VERSION = "2.5", total_tipped = 0, high_tip_username = null, high_tip_amount = 0, last_tip_username = null, sentwin = !1, COMMAND_BOARD_STATUS = "/b", COMMAND_PRIZES = "/p", COMMAND_LB = "/lb", COMMAND_VERSION = "/version", CONFIG_ADVERT_MINUTES = 10, EMOTE_TITLE = " :kenoapp1 ", EMOTE_STARS = " :3star ", EMOTE_STAR = " :1star ", nl = "--------------------------------------", description = "#tokenkeno ", byline = "by calvin06", firstTimeInit = !0, boardNumbers = new Array, boardPrizes = {}, boardPrizesLeft = 0, board = "", prizes = "", userPrizes = new Array, playerStats = {}, gameStats = { firstplace: "", secondplace: "", thirdplace: "", firsttips: 0, secondtips: 0, thirdtips: 0 }, partialTips = {}, CONFIG_PRIZENUMBER = 120; cb.settings_choices = [{ name: "boardnumbermax", type: "int", minValue: 10, maxValue: 120, defaultValue: 30, label: "Highest Number on Board" }, { name: "boardnumbermin", type: "int", minValue: 1, maxValue: 100, defaultValue: 1, label: "Lowest Number on Board" }, { name: "prizenumbermin", type: "int", minValue: 1, maxValue: 119, defaultValue: 1, label: "No random prizes below this number", required: !1 }, { name: "goal_description", type: "str", minLength: 1, maxLength: 255, label: "Cleared Board Goal Description" }, { name: "mvp_goal_description", type: "str", minLength: 0, maxLength: 255, label: "Special prize for the MVP at game end", required: !1 }, { name: "tipcap", type: "int", minValue: 1, maxValue: 5e3, label: "Fixed Tip Amount (all numbers cost the same - leave blank for regular keno. Partial and group tips will be disabled)", required: !1 }, { name: "multitip", type: "choice", choice1: "yes", choice2: "no", defaultValue: "yes", label: "Call multiple numbers with big tips?" }, { name: "trackstats", type: "choice", choice1: "yes", choice2: "no", defaultValue: "no", label: "Show leader board?" }, { name: "partialtips", type: "choice", choice1: "yes", choice2: "no", defaultValue: "no", label: "Allow group tipping? (no wasted tips - small tips add to a progress goal towards the hightest number)" }], cb.settings_choices.push({ name: "prize1", type: "str", minLength: 1, maxLength: 255, label: "Prize 1 " }), cb.settings_choices.push({ name: "prize1num", type: "int", minValue: 1, maxValue: CONFIG_PRIZENUMBER, label: "Prize 1 # (leave #'s blank for random assignment)", required: !1 }); for (var i = 2; i <= CONFIG_PRIZENUMBER; i++) cb.settings_choices.push({ name: "prize" + i, type: "str", minLength: 0, maxLength: 255, label: "Prize " + i, required: !1 }), cb.settings_choices.push({ name: "prize" + i + "num", type: "int", minValue: 1, maxValue: CONFIG_PRIZENUMBER, label: "Prize " + i + " #", required: !1 }); function handleTip(e, t) { var r = ""; if (!sentwin) { if (-1 < boardNumbers.indexOf(e)) cb.log("got match for " + e), "yes" == cb.settings.partialtips && e == getPartialTip() ? r += ("" != r ? "\n" : "") + handlePartialTip(e, t) : r += ("" != r ? "\n" : "") + drawNumberCalled(e, t, null); else { var a = getPartialTip(); 0 < a && ("yes" == cb.settings.partialtips && e == a || "yes" == cb.settings.partialtips && "yes" == cb.settings.multitip && a <= e) && (r += ("" != r ? "\n" : "") + handlePartialTip(a, t), e -= a); var i = getNextBestNumber(e); if (0 < i && "yes" == cb.settings.multitip) for (e -= i; - 1 < boardNumbers.indexOf(i);) r += ("" != r ? "\n" : "") + drawNumberCalled(i, t, null), e -= i = getNextBestNumber(e); if (0 < e && "yes" == cb.settings.partialtips && e < boardNumbers[boardNumbers.length - 1]) hasPartial() ? (e <= getPartialTip() || "yes" == cb.settings.multitip) && (r += ("" != r ? "\n" : "") + handlePartialTip(e, t)) : r += ("" != r ? "\n" : "") + createPartialTip(e, t); else if (0 < e && hasPartial() && 0 == boardNumbers.length) { var s = getPartialTip(); r += e <= s ? ("" != r ? "\n" : "") + handlePartialTip(e, t) : ("" != r ? "\n" : "") + handlePartialTip(s, t) } } "" != r && (updateBoard(), cb.sendNotice(r), cb.sendNotice(getAdvert(), "", "", "", "bold")) } } function handlePartialTip(e, t) { var r = ""; if (hasPartial()) for (var a in partialTips) inArray(t, partialTips[a].users) || partialTips[a].users.push(t), e >= getPartialTip() ? (r += drawNumberCalled(a, null, partialTips[a].users), delete partialTips[a]) : (partialTips[a].tips += e, r += "-- Added (" + e + ") tokens to group number [ " + a + " ]. Remaining: " + getPartialTip()); return r } function createPartialTip(e, t) { var r = "", a = boardNumbers[boardNumbers.length - 1]; boardNumbers.splice(boardNumbers.indexOf(a), 1); var i = [t]; return partialTips[a] = { tips: e, users: i }, r += "-- Group tips started for number [ " + a + " ]. Remaining: " + getPartialTip() } function trackStats(e, t) { e in playerStats ? playerStats[e].totaltips += t : playerStats[e] = { totaltips: t, winstreak: 0, losestreak: 0, numberscalled: 0 }, trackTips(e, t) } function updateSubject() { var e = description; isStaticMode() ? e += " Tip " + cb.settings.tipcap + " and choose a board number. " : e += " Uncover prizes by tipping the numbers on the board. ", e += "\nGoal is: [" + cb.settings.goal_description.replace("'", "") + "]\nType " + COMMAND_BOARD_STATUS + " to see the board. Type " + COMMAND_PRIZES + " to see prizes. ", cb.settings.mvp_goal_description && "" != cb.settings.mvp_goal_description && (e += " MVP wins [" + cb.settings.mvp_goal_description.replace("'", "") + "] "), cb.changeRoomSubject(e) } function getTipCount() { var e = 0; if (isStaticMode()) e = boardNumbers.length * cb.settings.tipcap; else { for (var t = 0; t < boardNumbers.length; t++) e += boardNumbers[t]; e += getPartialTip() } return e } function isStaticMode() { return !(!cb.settings.tipcap || "" == cb.settings.tipcap) } function formatUsername(e) { return e && "undefined" != e ? e.substring(0, 12) : "--" } function drawNumberCalled(e, t, r) { var a = ""; return t ? (a += "-- Number called [ " + e + " ]\n", boardNumbers.splice(boardNumbers.indexOf(e), 1)) : r && (a += "-- GROUP Number called [ " + e + " ]\n"), e in boardPrizes ? (a += EMOTE_STARS + " ** WINNER ** - Prize won: " + boardPrizes[e], t ? userPrizes.push({ prize: boardPrizes[e], user: t, number: e }) : r && userPrizes.push({ prize: boardPrizes[e], user: arrayToString(r), number: e }), delete boardPrizes[e], boardPrizesLeft--, updatePrizes()) : a += "-------- No prize won, try again", a } function drawBoard(e) { e ? cb.sendNotice(board, e) : cb.sendNotice(board) } function updateBoard() { var e = "Token Board\n"; if (e += nl + "\n", numbersRemaining() < 1) e += EMOTE_STARS + " Board Cleared!!! \n" + EMOTE_STARS + " Goal met: " + cb.settings.goal_description + "\n", cb.settings.mvp_goal_description && "" != cb.settings.mvp_goal_description && (e += EMOTE_STAR + " CONGRATS " + gameStats.firstplace + "! \n" + EMOTE_STAR + " You won MVP prize: " + cb.settings.mvp_goal_description + "\n"), "yes" == cb.settings.trackstats && (e += getLeaderBoard() + "\n"); else { var t = 10, r = 1; 100 < cb.settings.boardnumbermax - cb.settings.boardnumbermin && (t = 20); var a = 0; "yes" == cb.settings.partialtips && (a = getPartialTipNumber()); for (var i = cb.settings.boardnumbermin; i <= cb.settings.boardnumbermax; i++) e += " ", -1 < boardNumbers.indexOf(i) ? e += pad(i, 2) : e += i == a ? "gt" : "xx", e += " ", r == t ? (e += "\n", r = 1) : r++ } for (var s in "\n" != e.substring(e.length - 1) && (e += "\n"), e += nl, isStaticMode() && (e += "\nFixed tipping is enabled: Tip " + cb.settings.tipcap + " to choose a board number!"), partialTips) e += "\nGroup tipping open on [ " + s + " ]. Remaining: " + getPartialTip(); board = e } function drawPrizes(e) { e ? cb.sendNotice(prizes, e) : cb.sendNotice(prizes) } function updatePrizes() { var e = nl + "\nPrizes won (oldest to newest):\n"; 0 == userPrizes.length && (e += "None\n"); for (var t = 0; t < userPrizes.length; t++) e += " ** " + userPrizes[t].prize + " [won by " + userPrizes[t].user + " on " + userPrizes[t].number + "]\n"; e += "\nPrizes on the board (in random order):\n", 0 == boardPrizesLeft && (e += "None\n"); var r = Object.keys(boardPrizes); r = shuffle(r); for (t = 0; t < r.length; t++) e += " ** " + boardPrizes[r[t]] + "\n"; prizes = e += nl } function getNextBestNumber(e) { for (var t = 0, r = 0; r < boardNumbers.length; r++) boardNumbers[r] <= e && (t = boardNumbers[r]); return t } function hasPartial() { var e = !1; for (var t in partialTips) e = !0; return e } function getPartialTip() { var e = 0; for (var t in partialTips) e = t - partialTips[t].tips; return e } function getPartialTipNumber() { var e = 0; for (var t in partialTips) e = t; return e } function trackTips(e, t) { var r = "", a = !1; playerStats[e].totaltips > gameStats.firsttips ? (gameStats.firstplace != e && (a = !0, gameStats.secondplace != e && (gameStats.thirdplace = gameStats.secondplace, gameStats.thirdtips = gameStats.secondtips), gameStats.secondplace = gameStats.firstplace, gameStats.secondtips = gameStats.firsttips, gameStats.firstplace = e), gameStats.firsttips = playerStats[e].totaltips, a && (r += e + " is the new MVP! " + getLeaderBoard())) : playerStats[e].totaltips > gameStats.secondtips ? (gameStats.secondplace != e && (a = !0, gameStats.thirdplace = gameStats.secondplace, gameStats.thirdtips = gameStats.secondtips, gameStats.secondplace = e), gameStats.secondtips = playerStats[e].totaltips, a && (r += e + " takes second! " + getLeaderBoard())) : playerStats[e].totaltips > gameStats.thirdtips && (gameStats.thirdplace != e && (a = !0, gameStats.thirdplace = e), gameStats.thirdtips = playerStats[e].totaltips, a && (r += e + " takes third! " + getLeaderBoard())), "yes" == cb.settings.trackstats && "" != r && cb.sendNotice(r) } function getLeaderBoard() { var e = ""; return gameStats.firstplace && "" != gameStats.firstplace && (e += "Keno Tip Leaders - 1. " + gameStats.firstplace + " (" + gameStats.firsttips + ") "), gameStats.secondplace && "" != gameStats.secondplace && (e += " 2. " + gameStats.secondplace + " (" + gameStats.secondtips + ") "), gameStats.thirdplace && "" != gameStats.thirdplace && (e += " 3. " + gameStats.thirdplace + " (" + gameStats.thirdtips + ") "), "" == e && (e += "No leaders yet. Please tip to play!"), e } function pad(e, t) { for (var r = "" + e; r.length < t;) r = "0" + r; return r } function sanitize(e) { return null == e ? "" : e.replace(/[^a-zA-Z 0-9]+/g, "") } function inArray(e, t) { for (var r = 0; r < t.length; r++) if (t[r] === e) return !0; return !1 } function arrayToString(e) { for (var t = "", r = 0; r < e.length; r++) t += e[r], r < e.length - 1 && (t += ", "); return t } function shuffle(e) { for (var t, r, a = e.length; a; t = Math.floor(Math.random() * a), r = e[--a], e[a] = e[t], e[t] = r); return e } function numbersRemaining() { return hasPartial() ? boardNumbers.length + 1 : boardNumbers.length } function prizesRemaining() { return boardPrizesLeft } function getRandomInt(e, t) { return Math.floor(Math.random() * (t - e + 1)) + e } function getRandomArrayVal(e) { return e[Math.floor(Math.random() * e.length)] } function setupBoard() { var prizeTextArr = new Array, prizeNumberArr = new Array, availableSlotsArr = new Array, lowestPrizeNum = cb.settings.boardnumbermin; cb.settings.prizenumbermin && cb.settings.prizenumbermin > cb.settings.boardnumbermin && (lowestPrizeNum = cb.settings.prizenumbermin); for (var x = 1; x <= CONFIG_PRIZENUMBER; x++) prizeTextArr.push(eval("cb.settings.prize" + x)), prizeNumberArr.push(eval("cb.settings.prize" + x + "num")); for (var y = lowestPrizeNum; y <= cb.settings.boardnumbermax; y++) availableSlotsArr.push(y); for (var i = 0; i < prizeNumberArr.length; i++) null != prizeNumberArr[i] && "" != prizeNumberArr[i] && (prizeNumberArr[i] >= cb.settings.boardnumbermin && prizeNumberArr[i] <= cb.settings.boardnumbermax ? (boardPrizes[prizeNumberArr[i]] = sanitize(prizeTextArr[i]), -1 < availableSlotsArr.indexOf(prizeNumberArr[i]) && availableSlotsArr.splice(availableSlotsArr.indexOf(prizeNumberArr[i]), 1), prizeTextArr[i] = "") : (prizeNumberArr[i] < cb.settings.boardnumbermin || prizeNumberArr[i] > cb.settings.boardnumbermax) && cb.sendNotice("WARNING: Prize at number [" + prizeNumberArr[i] + "] does not fit on board. Randomly placing...", cb.room_slug)); for (var i = 0; i < prizeTextArr.length; i++) null != prizeTextArr[i] && "" != prizeTextArr[i] && (0 < availableSlotsArr.length ? (randomNum = getRandomArrayVal(availableSlotsArr), availableSlotsArr.splice(availableSlotsArr.indexOf(randomNum), 1), boardPrizes[randomNum] = sanitize(prizeTextArr[i])) : cb.sendNotice("WARNING: Board not big enough to place all the prizes. Some skipped...", cb.room_slug)); for (var j = cb.settings.boardnumbermin; j <= cb.settings.boardnumbermax; j++) boardNumbers.push(j); for (var k in boardPrizes) boardPrizes.hasOwnProperty(k) && boardPrizesLeft++ } function getAdvert() { var e = "Type " + COMMAND_BOARD_STATUS + " for the board. Type " + COMMAND_PRIZES + " for prize list."; return "yes" == cb.settings.multitip && (e += " Big tips call multiples!"), "yes" == cb.settings.partialtips && (e += " Group tips enabled."), isStaticMode() && (e += " FIXED TIPS ENABLED. Tip " + cb.settings.tipcap + " or more to choose a number."), e } function advert_gamerules() { if (!sentwin) { var e = EMOTE_TITLE + " "; isStaticMode() ? e += "Tip " + cb.settings.tipcap + " tokens and choose a board number to play! " : e += "Tip a number on the board to play! ", e += "Type " + COMMAND_BOARD_STATUS + " to see the board. Type " + COMMAND_PRIZES + " to see prizes remaining.", cb.sendNotice(e, "", "", "", "bold"), cb.setTimeout(advert_gamerules, 7e4 * CONFIG_ADVERT_MINUTES) } } function advert_mvp() { sentwin || cb.settings.mvp_goal_description && "" != cb.settings.mvp_goal_description && (cb.sendNotice("MVP wins [" + cb.settings.mvp_goal_description.replace("'", "") + "] with cleared board!"), cb.setTimeout(advert_mvp, 8e4 * CONFIG_ADVERT_MINUTES)) } function advert_leaderboard() { sentwin || ("" != getLeaderBoard() && cb.sendNotice(getLeaderBoard()), cb.setTimeout(advert_leaderboard, 6e4 * CONFIG_ADVERT_MINUTES)) } function init() { d("YnkgY2FsdmluMDY=") == byline ? cb.settings.boardnumbermin <= cb.settings.boardnumbermax ? (setupBoard(), updateBoard(), updatePrizes(), drawBoard(null), cb.drawPanel(), cb.sendNotice(EMOTE_TITLE + " " + byline, "", "", "", "bold"), cb.setTimeout(advert_gamerules, 7e4 * CONFIG_ADVERT_MINUTES), cb.setTimeout(advert_mvp, 8e4 * CONFIG_ADVERT_MINUTES), "yes" == cb.settings.trackstats && cb.setTimeout(advert_leaderboard, 6e4 * CONFIG_ADVERT_MINUTES), isStaticMode() && (cb.settings.multitip = "no", cb.settings.partialtips = "no")) : cb.sendNotice("ERROR: Min number can't be bigger than max, restart the app", cb.room_slug) : cb.sendNotice("ERROR: This is a copy of the original app. Please use Token Keno " + d("YnkgY2FsdmluMDY="), cb.room_slug) } cb.onTip(function(e) { total_tipped += e.amount, last_tip_username = e.from_user, sentwin || trackStats(e.from_user, e.amount), isStaticMode() ? e.amount >= cb.settings.tipcap ? handleTip(parseInt(e.message), e.from_user) : cb.sendNotice("Thanks for the tip! Broadcaster has a fixed amount for all board numbers. Tip " + cb.settings.tipcap + " or more to play Keno", e.from_user) : handleTip(e.amount, e.from_user), numbersRemaining() < 1 && (sentwin || drawBoard(null), sentwin = !0), cb.drawPanel() }), cb.tipOptions(function(e) { if (isStaticMode() && !sentwin) { for (var t = new Array, r = 0; r < boardNumbers.length; r++) t.push({ label: boardNumbers[r] }); return { options: t, label: "Select a board number:" } } }), cb.onDrawPanel(function(e) { return { template: "3_rows_of_labels", row1_label: "Board Count:", row1_value: numbersRemaining() + " #s / " + prizesRemaining() + " prizes", row2_label: "Tips / On Board:", row2_value: total_tipped + " / " + getTipCount(), row3_label: "MVP:", row3_value: formatUsername(gameStats.firstplace) + " (" + gameStats.firsttips + ")" } }), cb.onMessage(function(e) { return e.m.match(/(^|\s)!b|\/b(\s|$)/) && (e.user == cb.room_slug || e.is_mod ? (e.m = e.m + " (token keno: board sent to all)", drawBoard(null)) : e.has_tokens ? (e.m = e.m + " (token keno: board sent to " + e.user + ")", drawBoard(e.user)) : (e.m = e.m + " (token keno: please buy tokens to play!)", e["X-Spam"] = !0)), e.m.match(/(^|\s)!p|\/p(\s|$)/) && (e.user == cb.room_slug || e.is_mod ? (e.m = e.m + " (token keno: prize list sent to all)", drawPrizes()) : e.has_tokens ? (e.m = e.m + " (token keno: prize list sent to " + e.user + ")", drawPrizes(e.user)) : (e.m = e.m + " (token keno: please buy tokens to play!)", e["X-Spam"] = !0)), e.m.match(/(^|\s)!lb|\/lb(\s|$)/) && (e.user == cb.room_slug || e.is_mod ? (e.m = e.m + " (token keno: leaderboard sent to all)", cb.sendNotice(getLeaderBoard())) : e.has_tokens ? (e.m = e.m + " (token keno: leaderboard sent to " + e.user + ")", cb.sendNotice(getLeaderBoard(), e.user)) : (e.m = e.m + " (token keno: please buy tokens to play!)", e["X-Spam"] = !0)), e.m.match(/(^|\s)!version|\/version(\s|$)/) && cb.sendNotice(VERSION, e.user), e }), d = function(e) { var t, r, a, i = {}, s = 0, n = 0, o = "", l = String.fromCharCode, p = e.length; for (t = 0; t < 64; t++) i["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(t)] = t; for (r = 0; r < p; r++) for (s = (s << 6) + i[e.charAt(r)], n += 6; 8 <= n;)((a = s >>> (n -= 8) & 255) || r < p - 2) && (o += l(a)); return o }, init();
© Copyright Chaturbate 2011- 2026. All Rights Reserved.