-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtokenkeno.js
More file actions
366 lines (321 loc) · 12.5 KB
/
Copy pathtokenkeno.js
File metadata and controls
366 lines (321 loc) · 12.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
/*
* Title: Token Keno
* Author: Calvin06
* Version: 1.0 (02/08/13)
* Summary:
Tip the amount of each number on the board. Reach goal by clearing the board. Uncover prizes that
have been set by the broadcaster and randomly placed under some numbers.
*
* Description:
Start by setting a goal description. Set the number of tip numbers to place on the board (up to 100).
Optionally set prizes that will be randomly placed under board numbers.
Example Number of Board Squares / Total Tips Earned if cleared:
10 / 55
25 / 325
30 / 465 (default)
50 / 1275
100 / 5050
List of commands:
!b = See the token board status
!p = See the prizes remaining on the board
Status:
-------------------------
04/24/13 - Update: Allows for hard placement of prizes on the board, otherwise randomly placed
02/13/13 - Beta testing, any and all feedback welcome!
-- Calvin06
* TODO:
* When chatNotice supports styles, color code the tipped vs. not tipped numbers on the board
*
*/
// vars
var total_tipped = 0;
var high_tip_username = null;
var high_tip_amount = 0;
var last_tip_username = null;
var last_tip_amount = 0;
var COMMAND_BOARD_STATUS = '!b';
var COMMAND_PRIZES = '!p';
var CONFIG_COLOR_FIRST_PLACE = '#FFF700';
var CONFIG_ADVERT_MINUTES = 10;
var nl = '--------------------------------------------';
var description = 'Token Keno running!';
var firstTimeInit = true;
var userTipTotals = {};
var boardNumbers = new Array();
var boardPrizes = {};
var userPrizes = new Array();
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: 'goal_description', type: 'str', minLength: 1, maxLength: 255, label: 'Cleared Board Goal Description'},
{name:'multitip', type:'choice',
choice1:'yes',
choice2:'no', defaultValue:'yes', label: "Call next highest available numbers with big tips?"},
{name:'prize1', type:'str', minLength: 1, maxLength: 255, label: 'Prize 1 '},
{name:'prize1num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 1 # (leave #\'s blank for random assignment)', required: false},
{name:'prize2', type:'str', minLength: 0, maxLength: 255, label: 'Prize 2 ', required: false},
{name:'prize2num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 2 #', required: false},
{name:'prize3', type:'str', minLength: 0, maxLength: 255, label: 'Prize 3 ', required: false},
{name:'prize3num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 3 #', required: false},
{name:'prize4', type:'str', minLength: 0, maxLength: 255, label: 'Prize 4 ', required: false},
{name:'prize4num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 4 #', required: false},
{name:'prize5', type:'str', minLength: 0, maxLength: 255, label: 'Prize 5 ', required: false},
{name:'prize5num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 5 #', required: false},
{name:'prize6', type:'str', minLength: 0, maxLength: 255, label: 'Prize 6 ', required: false},
{name:'prize6num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 6 #', required: false},
{name:'prize7', type:'str', minLength: 0, maxLength: 255, label: 'Prize 7 ', required: false},
{name:'prize7num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 7 #', required: false},
{name:'prize8', type:'str', minLength: 0, maxLength: 255, label: 'Prize 8 ', required: false},
{name:'prize8num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 8 #', required: false},
{name:'prize9', type:'str', minLength: 0, maxLength: 255, label: 'Prize 9 ', required: false},
{name:'prize9num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 9 #', required: false},
{name:'prize10', type:'str', minLength: 0, maxLength: 255, label: 'Prize 10 ', required: false},
{name:'prize10num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 10 #', required: false},
{name:'prize11', type:'str', minLength: 0, maxLength: 255, label: 'Prize 11 ', required: false},
{name:'prize11num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 11 #', required: false},
{name:'prize12', type:'str', minLength: 0, maxLength: 255, label: 'Prize 12 ', required: false},
{name:'prize12num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 12 #', required: false},
{name:'prize13', type:'str', minLength: 0, maxLength: 255, label: 'Prize 13 ', required: false},
{name:'prize13num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 13 #', required: false},
{name:'prize14', type:'str', minLength: 0, maxLength: 255, label: 'Prize 14 ', required: false},
{name:'prize14num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 14 #', required: false},
{name:'prize15', type:'str', minLength: 0, maxLength: 255, label: 'Prize 15 ', required: false},
{name:'prize15num', type:'int', minValue: 1, maxValue: 100, label: 'Prize 15 #', required: false}
];
//handlers
cb.onTip(function(tip) {
// track total tips
total_tipped += tip['amount'];
last_tip_username = tip['from_user'];
last_tip_amount = tip['amount'];
handleTip(tip['amount'],tip['from_user']);
cb.drawPanel();
});
cb.onDrawPanel(function(user) {
return {
'template': '3_rows_of_labels',
'row1_label': 'Board Count:',
'row1_value': '' + tipsRemaining() + ' #s / ' + prizesRemaining() + ' prizes',
'row2_label': 'Tip Count:',
'row2_value': '' + total_tipped + ' / ' + getTipCount(),
'row3_label': 'MVP Tipper:',
'row3_value': formatUsername(high_tip_username) + ' (' + high_tip_amount + ')'
};
});
cb.onMessage(function (msg) {
// user commands
if (msg['m'].indexOf(COMMAND_BOARD_STATUS) > -1) {
cb.log('cmd received: ' + COMMAND_BOARD_STATUS);
if (msg['has_tokens'] || msg['user'] == cb.room_slug || msg['is_mod']) {
drawBoard();
} else {
msg['m'] = msg['m'] + " (token keno: only blues can use this command)";
}
}
if (msg['m'].indexOf(COMMAND_PRIZES) > -1) {
cb.log('cmd received: ' + COMMAND_PRIZES);
var prizeText = drawPrizes();
if (msg['has_tokens'] || msg['user'] == cb.room_slug || msg['is_mod']) {
cb.chatNotice(prizeText);
} else {
cb.chatNotice(prizeText,msg['user']);
}
}
if (msg['user'] == high_tip_username) {
//msg['background'] = CONFIG_COLOR_FIRST_PLACE;
}
return msg;
});
cb.tipOptions(function(user) {
return;
});
function handleTip(tip,user) {
// track top tipper
trackTips(user,tip);
if (boardNumbers.indexOf(tip) > -1) {
drawNumberCalled(tip,user);
updateSubject();
cb.chatNotice(getAdvert());
} else {
if (cb.settings.multitip == 'yes') {
var next = getNextBestNumber(tip);
tip = tip - next;
var haveNext = false;
if (next > 0) haveNext = true;
while (boardNumbers.indexOf(next) > -1) {
drawNumberCalled(next,user);
next = getNextBestNumber(tip);
tip = tip - next;
}
if (haveNext) {
updateSubject();
cb.chatNotice(getAdvert());
}
}
}
}
//helper functions
function updateSubject() {
var newSubject = description + ' Uncover prizes by tipping the numbers on the board. Clear the board to reach goal! \nGoal is: [' + cb.settings.goal_description + ']\nType ' + COMMAND_BOARD_STATUS + ' to see the board. Type ' + COMMAND_PRIZES + ' to see available prizes.';
cb.log("Changing subject to: " + newSubject);
cb.changeRoomSubject(newSubject);
}
function getAdvert() {
var advert = 'Type '+COMMAND_BOARD_STATUS+' to see the board. Type '+COMMAND_PRIZES+' to see prizes remaining.';
if (cb.settings.multitip == 'yes') advert += ' Big tips clear multiple numbers!';
return advert;
}
function getTipCount() {
var count = 0;
for (var i=0;i<boardNumbers.length;i++) {
count += boardNumbers[i];
}
return count;
}
function formatUsername(val) {
if (!val || val=='undefined') {
return "--";
} else {
return val.substring(0, 12);
}
}
function trackTips(user,tip) {
if (user in userTipTotals) {
userTipTotals[user] = userTipTotals[user] + tip;
} else {
userTipTotals[user] = tip;
}
var usertips = userTipTotals[user];
if (usertips > high_tip_amount) {
high_tip_amount = usertips;
high_tip_username = user;
}
}
function drawNumberCalled(n,user) {
var out = '-- Number called [ '+n+' ]\n';
if (boardNumbers.indexOf(n) > -1) {
boardNumbers.splice(boardNumbers.indexOf(n),1);
if (n in boardPrizes) {
out += '********** WINNER!! - Prize won: ' + boardPrizes[n];
userPrizes.push({prize:boardPrizes[n],user:user});
delete boardPrizes[n];
} else {
out += '-------- No prize won, try again';
}
}
cb.chatNotice(out);
}
function drawBoard() {
var out = 'Token Board\n';
out += nl + '\n';
if (tipsRemaining() < 1) {
out += '*********** Board Cleared!!! ***********\nGoal met: ' + cb.settings.goal_description + '\n';
} else {
var mod = 10;
var col = 1;
if (cb.settings.boardnumbermax - cb.settings.boardnumbermin > 100) mod = 20;
for (var i=cb.settings.boardnumbermin; i <= cb.settings.boardnumbermax; i++) {
out += ' ';
if (boardNumbers.indexOf(i) > -1) out += pad(i,2);
else out += 'xx';
out += ' ';
if (col == mod) {
out += '\n';
col = 1;
} else {
col++;
}
}
}
if (out.substring(out.length-1) != '\n') out += '\n';
out += nl;
cb.chatNotice(out);
}
function drawPrizes(user) {
var out = nl + '\nPrizes on the board:\n';
for (key in boardPrizes) {
if (boardPrizes.hasOwnProperty(key)) out += ' ** ' + boardPrizes[key] + '\n';
}
out += 'Prizes won:\n';
for (var i=0; i < userPrizes.length; i++) {
out += ' ** ' + userPrizes[i].prize + ' [won by ' + userPrizes[i].user + ']\n';
}
out += nl;
return out;
}
function getNextBestNumber(tip) {
var num = 0;
for (var i=0;i<boardNumbers.length;i++) {
if (boardNumbers[i] <= tip) {
num = boardNumbers[i];
}
}
return num;
}
function pad(number, length) {
var str = '' + number;
while (str.length < length) {
str = '0' + str;
}
return str;
}
function tipsRemaining() {
return boardNumbers.length;
}
function prizesRemaining() {
var count = 0;
for (var k in boardPrizes) {
if (boardPrizes.hasOwnProperty(k)) {
count++;
}
}
return count;
}
/**
* Returns a random integer between min and max
*/
function getRandomInt (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function setupBoard() {
// need to load prizes
var temp = new Array(cb.settings.prize1,cb.settings.prize2,cb.settings.prize3,cb.settings.prize4,cb.settings.prize5,cb.settings.prize6,cb.settings.prize7,cb.settings.prize8,cb.settings.prize9,cb.settings.prize10,cb.settings.prize11,cb.settings.prize12,cb.settings.prize13,cb.settings.prize14,cb.settings.prize15);
var tempslots = new Array(cb.settings.prize1num,cb.settings.prize2num,cb.settings.prize3num,cb.settings.prize4num,cb.settings.prize5num,cb.settings.prize6num,cb.settings.prize7num,cb.settings.prize8num,cb.settings.prize9num,cb.settings.prize10num,cb.settings.prize11num,cb.settings.prize12num,cb.settings.prize13num,cb.settings.prize14num,cb.settings.prize15num);
for (var i = 0; i<temp.length; i++) {
if (temp[i] != '') {
for (var k = cb.settings.boardnumbermin-1; k<cb.settings.boardnumbermax; k++) {
if (tempslots[i] != '' && tempslots[i] >= cb.settings.boardnumbermin && tempslots[i] <= cb.settings.boardnumbermax) {
boardPrizes[tempslots[i]] = temp[i].replace(/[^a-zA-Z 0-9]+/g,'');
break;
} else {
if (tempslots[i] < cb.settings.boardnumbermin || tempslots[i] > cb.settings.boardnumbermax) cb.chatNotice('WARNING: Board num specified for a prize does not exist. Randomly placing...');
randomNum = getRandomInt(cb.settings.boardnumbermin,cb.settings.boardnumbermax);
if (!(randomNum in boardPrizes) && !(randomNum in tempslots)) {
boardPrizes[randomNum] = temp[i].replace(/[^a-zA-Z 0-9]+/g,'');
break;
}
}
}
}
}
// load the board
for (var j = cb.settings.boardnumbermin; j<=cb.settings.boardnumbermax; j++) {
boardNumbers.push(j);
}
}
function advert() {
cb.chatNotice('Token Keno Is ACTIVE! Tip a number on the board to play! Type '+COMMAND_BOARD_STATUS+' to see the board. Type '+COMMAND_PRIZES+' to see prizes remaining.');
cb.setTimeout(advert, (CONFIG_ADVERT_MINUTES * 60000));
}
function init() {
if (cb.settings.boardnumbermin <= cb.settings.boardnumbermax) {
setupBoard();
updateSubject();
drawBoard();
cb.drawPanel();
cb.setTimeout(advert, (CONFIG_ADVERT_MINUTES * 60000));
} else {
cb.chatNotice('ERROR: Min number can\'t be bigger than max, restart the app');
}
}
init();