Bots Home
|
Create an App
Simple Vote
Author:
auspunk
Description
Source Code
Launch Bot
Current Users
Created by:
Auspunk
"use strict"; var colours = { aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#00ffff', aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4', black: '#000000', blanchedalmond: '#ffebcd', blue: '#0000ff', blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0', chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#00ffff', darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', darkgreen: '#006400', darkgrey: '#a9a9a9', darkkhaki: '#bdb76b', darkmagenta: '#8b008b', darkolivegreen: '#556b2f', darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a', darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f', darkslategrey: '#2f4f4f', darkturquoise: '#00ced1', darkviolet: '#9400d3', deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dimgrey: '#696969', dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0', forestgreen: '#228b22', fuchsia: '#ff00ff', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff', gold: '#ffd700', goldenrod: '#daa520', gray: '#808080', green: '#008000', greenyellow: '#adff2f', grey: '#808080', honeydew: '#f0fff0', hotpink: '#ff69b4', indianred: '#cd5c5c', indigo: '#4b0082', ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa', lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd', lightblue: '#add8e6', lightcoral: '#f08080', lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgreen: '#90ee90', lightgrey: '#d3d3d3', lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa', lightslategray: '#778899', lightslategrey: '#778899', lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#00ff00', limegreen: '#32cd32', linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000', mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371', mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970', mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080', oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98', paleturquoise: '#afeeee', palevioletred: '#db7093', papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd', powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399', red: '#ff0000', rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513', salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd', slategray: '#708090', slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c', teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3', white: '#ffffff', whitesmoke: '#f5f5f5', yellow: '#ffff00', yellowgreen: '#9acd32' }; cb.settings_choices = [ {name: 'default_timer', type: 'int', label: 'Default timer for voting (in seconds)', defaultValue: 60}, {name: 'tell_boss_votes', type: 'choice', choice1: 'Yes', choice2: 'No', label: 'Display votes to broadcaster', defaultValue: 'Yes'} ]; // ---------------------------------------------------------------------------- // // UTILITY FUNCTIONS // // ---------------------------------------------------------------------------- function is_digits(thing) { if (typeof(thing) !== 'undefined' && /^[0-9]+$/.test(thing.toString())) { return true; } else { return false; } } // ---------------------------------------------------------------------------- // // COMMUNICATION FUNCTIONS // // ---------------------------------------------------------------------------- var interp = { user: function(text, user) { return text.replace(/%%/ig, user); }, admin: function(text) { return text.replace(/&&/ig, cb.room_slug); }, prize: function(text, prizetext) { return text.replace(/\^\^/ig, prizetext); }, number: function(text, num) { return text.replace(/##/ig, num.toString()); }, ordinal: function(text, num) { var ordsuffix = ''; var two = ''; var one = ''; if (is_digits(num)) { // get last two digits and last digit two = parseInt(('00' + num.toString()).slice(-2), 10); one = parseInt(('00' + num.toString()).slice(-1), 10); // teenths are special if (two >= 10 && two <= 19) { ordsuffix = 'th'; } else { switch (one) { case 1: ordsuffix = 'st'; break; case 2: ordsuffix = 'nd'; break; case 3: ordsuffix = 'rd'; break; default: ordsuffix = 'th'; } } } else { ordsuffix = ''; } return text.replace(/##/ig, num.toString() + ordsuffix); } }; var tell = { all: function (message, about) { if (typeof(about) === 'string' && about !== '') { cb.chatNotice(interp.admin(interp.user(message, about)), '', '', colours.deeppink, 'bold'); } else { cb.chatNotice(interp.admin(message), '', '', colours.deeppink, 'bold'); } }, one: function (message, to) { cb.chatNotice(interp.admin(interp.user(message, to)), to, '', colours.blue, 'bold'); }, boss: function(message) { cb.chatNotice(interp.admin(message), cb.room_slug, '', colours.steelblue, ''); }, debug: function(message) { cb.log(message); } }; var format = { timefromseconds: function (seconds) { var m = Math.floor(seconds / 60); var s = seconds % 60; if (s === 0) { return m + "min"; } else if (seconds < 100) { return seconds + "sec"; } else { return m + "min" + s + "sec"; } } }; // ---------------------------------------------------------------------------- // // ROOM WATCHER // // ---------------------------------------------------------------------------- var room = { _welcome: "Welcome to &&'s room!", _users: { all: [cb.room_slug], current: [cb.room_slug] }, _alarms: { users: [], visitors: [] }, notice: function(username) { if (!cbjs.arrayContains(room._users.all, username)) { room._users.all.push(username); } if (!cbjs.arrayContains(room._users.current, username)) { room._users.current.push(username); } }, on_enter: function(username) { room.notice(username); }, on_leave: function(username) { if (cbjs.arrayContains(room._users.current, username)) { cbjs.arrayRemove(room._users.current, username); } }, is_user: function(username) { return cbjs.arrayContains(room._users.current, username); }, user_count: function() { // length - 1 so the broadcaster isn't counted. return room._users.current.length - 1; }, visitor_count: function() { // length - 1 so the broadcaster isn't counted. return room._users.all.length - 1; } }; // ---------------------------------------------------------------------------- // // VOTING // // ---------------------------------------------------------------------------- var vote = { _active: false, _id: 0, _timer: 0, _question: '', _answers: [''], // don't use the zero position _votes: {}, is_active: function() { return (vote._active); }, init: function() { if (vote.is_active()) { tell.boss('No changes possible while a vote is active.'); return; } vote._timer = cb.settings.default_timer; vote.reset(); }, reset: function() { if (vote.is_active()) { tell.boss('No changes possible while a vote is active.'); return false; } vote._question = ''; vote._answers = ['']; vote._votes = {}; tell.boss('Voting question and answers reset.'); return true; }, set_timer: function(params) { if (vote.is_active()) { tell.boss('No changes possible while a vote is active.'); return false; } var new_time_str = params.trim(); if (is_digits(new_time_str)) { var new_time = parseInt(new_time_str, 10); if (new_time > 0) { vote._timer = new_time; tell.boss('Vote timer set to ' + vote._timer + ' seconds.'); return true; } else { tell.boss("Timer can't be zero."); return false; } } else { tell.boss('Timer must be a whole number of seconds.'); return false; } }, set_question: function(params) { if (vote.is_active()) { tell.boss('No changes possible while a vote is active.'); return false; } var new_question = params.trim(); if (new_question !== '') { vote._question = new_question; tell.boss('Question set: ' + vote._question); return true; } else { tell.boss("Question can't be blank."); return false; } }, add_answer: function(params) { if (vote.is_active()) { tell.boss('No changes possible while a vote is active.'); return false; } var new_answer = params.trim(); if (new_answer !== '') { vote._answers.push(new_answer); tell.boss('Answer added: ' + vote._answers[vote._answers.length - 1]); return true; } else { tell.boss("Answers can't be blank."); return false; } }, start: function() { if (vote.is_active()) { tell.boss('A vote is already active.'); return false; } if (vote._question === '') { tell.boss('No question is set.'); return false; } vote._active = true; tell.all('Question: ' + vote._question); if (vote._answers.length == 1) { tell.all('Type to answer! Voting ends in ' + format.timefromseconds(vote._timer) + '.'); } else { for (var i = 1; i < vote._answers.length; i++) { tell.all('' + i + ': ' + vote._answers[i]); } tell.all('Type the number to vote! Voting ends in ' + format.timefromseconds(vote._timer) + '.'); } cb.setTimeout(vote.end, vote._timer * 1000); }, end: function() { if (!vote.is_active()) { tell.boss('Something went wrong. End of voting but no vote active.'); return false; } vote._active = false; if (vote._answers.length == 1) { tell.all("Time's up!"); } else { var vote_counts = [0]; var vote_total = 0; var list_of_answers = []; for (var i = 1; i < vote._answers.length; i++) { vote_counts[i] = 0; list_of_answers.push(i); } for (var user in vote._votes) { if (room.is_user(user)) { vote_total++; vote_counts[vote._votes[user]]++; } } var result_order = list_of_answers.sort(function(a, b) { return vote_counts[b] - vote_counts[a]; }); // descending sort tell.all("Time's up! Here are the results (" + vote_total + " votes total):"); for (var j = 0; j < result_order.length; j++) { tell.all('' + vote._answers[result_order[j]] + ' (' + vote_counts[result_order[j]] + ' votes)'); } } vote.reset(); }, start_all_in_one: function(params) { var result; if (vote.is_active()) { tell.boss('A vote is already active.'); return false; } var words = params.trim().split(/\|/); result = vote.reset(); if (!result) return false; result = vote.set_timer(words[0]); if (!result) return false; result = vote.set_question(words[1]); if (!result) return false; for (var i = 2; i < words.length; i++) { result = vote.add_answer(words[i]); if (!result) return false; } vote.start(); return true; }, record_vote: function(user, number) { if (!vote.is_active()) { tell.boss('Something went wrong. Recording a vote but no vote active.'); return false; } if (!is_digits(number)) { tell.boss("Something went wrong. Recording a vote that isn't a number."); return false; } var new_vote = number; if (typeof(vote._votes[user]) === 'undefined') { vote._votes[user] = new_vote; tell.one('Vote recorded: ' + vote._answers[new_vote], user); if (cb.settings.tell_boss_votes == 'Yes') { tell.boss (user + ' voted for ' + vote._answers[new_vote] + '.'); } return true; } else { var old_vote = vote._votes[user]; vote._votes[user] = new_vote; tell.one('Vote changed: from ' + vote._answers[old_vote] + ' to ' + vote._answers[new_vote], user); if (cb.settings.tell_boss_votes == 'Yes') { tell.boss (user + ' changed from ' + vote._answers[old_vote] + ' to ' + vote._answers[new_vote] + '.'); } return true; } } }; // ---------------------------------------------------------------------------- // // CB TRIGGERS // // ---------------------------------------------------------------------------- cb.onEnter(function (user) { room.on_enter(user.user); } ); cb.onLeave(function (user) { room.on_leave(user.user); } ); cb.onMessage(function(msg) { var m = msg.m; var u = msg.user; var params; room.notice(u); if (m.substr(0, 6) === '/vote ') { msg['X-Spam'] = true; m = m.slice(6); var keyword = (m.length > 0) ? m.toLowerCase().match(/^[\S]+/)[0] : ''; switch (keyword) { case 't': case 'timer': params = m.slice(keyword.length).trim(); vote.set_timer(params); break; case 'q': case 'question': params = m.slice(keyword.length).trim(); vote.set_question(params); break; case 'a': case 'answer': params = m.slice(keyword.length).trim(); vote.add_answer(params); break; case 'reset': vote.reset(); break; case 'start': case 'go': vote.start(); break; default: params = m.trim(); vote.start_all_in_one(params); } } else if (vote.is_active() && is_digits(m)) { msg['X-Spam'] = true; vote.record_vote(u, m); } return msg; }); // ---------------------------------------------------------------------------- // // INITIALISATION // // ---------------------------------------------------------------------------- vote.init();
© Copyright Chaturbate 2011- 2026. All Rights Reserved.