· 8 years ago · Mar 14, 2018, 08:50 PM
1var mysql = require('mysql');
2var log4js = require('log4js');
3var io = require('socket.io')(8080);
4var request = require('request');
5var fs = require('fs');
6var md5 = require('md5');
7var sha256 = require('sha256');
8var math = require('mathjs');
9var config = require('./config.json');
10var logger = log4js.getLogger();
11var crypto = require('crypto');
12
13updateLog();
14function updateLog() {
15 logger.debug('New log...');
16
17 log4js.configure({
18 appenders: {
19 out:{ type: 'console' },
20 app:{ type: 'file', filename: 'logs/site/site_'+time()+'.log' }
21 },
22 categories: {
23 default: { appenders: [ 'out', 'app' ], level: 'all' }
24 }
25 });
26 setTimeout(function(){
27 updateLog();
28 }, 24 * 3600 * 1000);
29}
30
31var pool = mysql.createPool({
32 database: config.database["database"],
33 host: config.database["host"],
34 user: config.database["user"],
35 password: config.database["password"]
36});
37
38
39process.on('uncaughtException', function (err) {
40 logger.trace('Strange error');
41 logger.debug(err);
42});
43
44
45
46//FOR ALL GAMES
47var canPlayersBet = 1;
48var amountGiveaway = 1000;
49
50var maxbet = config.optionsSite["maxbet"];
51var minbet = config.optionsSite["minbet"];
52
53var needLevelToSendCoins = config.optionsSite["needLevelToSendCoins"]; //For send coins
54var delayLoadPrices = config.optionsSite["delayLoadPrices"] //in Hours
55var xpPerLevel = config.optionsSite["xpPerLevel"];
56
57var groupId = config.optionsSite["groupId"];
58var coinGroupR = config.optionsSite["coinGroupR"];
59var coinNameR = config.optionsSite["coinNameR"];
60var coinCodeR = config.optionsSite["coinCodeR"];
61var coinFriendR = config.optionsSite["coinFriendR"];
62var AppID = config.optionsSite["AppID"];
63var ApiKey = config.optionsSite["ApiKey"];
64
65var nameForGame = config.optionsSite["nameForGame"];
66var nameSite = config.optionsSite["nameSite"];
67
68var timeGiveaway = config.optionsSite["timeGiveaway"]; //hours
69
70var timeJPot = config.optionsSite["timeJPot"]; //time wait round
71
72var timerRoulette = config.optionsSite["timerRoulette"]; //seconds
73
74var maxCoinflips = config.optionsSite["maxCoinflips"]; //per user
75
76var waitStartingCrash = config.optionsSite["waitStartingCrash"]; //seconds
77
78/* Bot Section*/
79var TimesForBotsToBet = 20;
80var CurrentTimesForBotsToBet = 0;
81var IntervalBetuireBoti;
82var IntervalulLaBoti = 1;
83var IntervalDeBetuireBoti = IntervalulLaBoti*5000;
84var BotsStarted = 0;
85
86
87var TimeOfBotsCHHH = 60;
88var TimeOfBotsChatting = TimeOfBotsCHHH*1000;
89
90var BotBetName;
91var BotBetAvatar;
92
93
94/* CONNECT TO SOCKET */
95io.on('connection', function(socket) {
96 var user = false;
97 socket.on('hash', function(hash) {
98 query('SELECT `steamid`, `rank`, `balance`, `name`, `avatar`, `banPlay` FROM `users` WHERE `hash` = '+pool.escape(hash), function(err, row) {
99 if((err) || (!row.length)){
100 return socket.disconnect();
101 }else{
102 user = row[0];
103 users[user.steamid] = {
104 socket: socket.id,
105 balance: parseInt(user.balance)
106 }
107 socket.join(user.steamid);
108 timesFlooding[user.steamid] = 0;
109
110 //100 ROLLS ROULETTE
111 socket.emit('message', {
112 type: '100rolls',
113 rolls: historyRolls100
114 });
115
116
117 //FIRST DATES
118 var sendRHash;
119 if(roundedHash == null) {
120 sendRHash = '0';
121 }else {
122 sendRHash = roundedHash;
123 }
124
125 socket.emit('message', {
126 type: 'hello',
127 count: timer-wait,
128 maxbet: maxbet,
129 minbet: minbet,
130 roundedHash: sendRHash,
131 rolls: historyRolls,
132 balance: user.balance,
133 rank: user.rank,
134 user: user.steamid
135 });
136
137 //ROULETTE
138 if(currentBets.length > 0){
139 currentBets.forEach(function(itm) {
140 socket.emit('message', {
141 type: 'bet',
142 bet: {
143 amount: itm.amount,
144 betid: itm.betid,
145 icon: itm.icon,
146 lower: itm.lower,
147 upper: itm.upper,
148 name: itm.name,
149 user: itm.user,
150 level: itm.level,
151 won: null
152 },
153 sums: {
154 0: currentSums['0-0'],
155 1: currentSums['1-7'],
156 2: currentSums['8-14']
157 }
158 });
159 });
160 }
161
162 //MESSAGES
163 if(msgChatHist.length > 0){
164 msgChatHist.forEach(function(itm) {
165 socket.emit('message', {
166 type: 'chat',
167 msg: itm.msg,
168 name: itm.name,
169 icon: itm.icon,
170 user: itm.user,
171 rank: itm.rank,
172 lang: itm.lang,
173 hide: itm.hide,
174 level: itm.level,
175 id: itm.id,
176 time: itm.time
177 });
178 });
179 }
180
181 //USERS ONLINE
182 io.sockets.emit('message', {
183 type: 'logins',
184 count: Object.size(io.sockets.connected)
185 });
186
187 //CRASH
188 if(crashState == 'STARTED'){
189 socket.emit('message', {
190 type: 'startedCrash',
191 elapsed: new Date().getTime() - startCrashTime
192 });
193
194 if(betsCrash.length > 0){
195 betsCrash.forEach(function(bet){
196 socket.emit('message', {
197 type: 'crbet',
198 bet: {
199 id: bet.id,
200 amount: bet.amount,
201 icon: bet.icon,
202 name: bet.name,
203 level: bet.level
204 }
205 });
206
207 if(usersCrash[bet.user] !== undefined){
208 if(usersCrash[bet.user]['cashedOut'] == true) {
209 io.sockets.emit('message', {
210 type: 'betCrashWin',
211 id: bet.id,
212 cashout: usersCrash[bet.user]['autoCashout'],
213 profit: usersCrash[bet.user]['profit']
214 });
215 }
216 }
217 });
218 }
219 } else if(crashState == 'ENDED'){
220 socket.emit('message', {
221 type: 'crashed',
222 number: crashAt,
223 time: endedCrashTime
224 });
225 }
226
227 if(usersCrash[user.steamid] !== undefined){
228 var win = usersCrash[user.steamid]['amount'] + usersCrash[user.steamid]['profit'];
229 socket.emit('message', {
230 type: 'btnCrashWin',
231 amount: win
232 });
233 }
234
235
236 //MINES
237 if(gamesMines[user.steamid] !== undefined && !gamesMines[user.steamid]['lose'] && !gamesMines[user.steamid]['cashout'] && gamesMines[user.steamid]['bombsWin'].length > 0){
238 var xSum = 0;
239 gamesMines[user.steamid]['bombsWin'].forEach(function(itm) {
240 socket.emit('message', {
241 type: 'getBomb',
242 mtype: 'win',
243 buttons: itm,
244 stake: gamesMines[user.steamid]['amountWin'],
245 next: gamesMines[user.steamid]['sums'][gamesMines[user.steamid]['bombsWin'].length],
246 amount: gamesMines[user.steamid]['sums'][xSum],
247 new: false
248 });
249 xSum++;
250 });
251 }
252
253
254 //GIVEAWAY
255 if(usersEntered.length > 0){
256 usersEntered.forEach(function(itm) {
257 socket.emit('message', {
258 type: 'joinGiveaway',
259 player: {
260 avatar: itm.avatar,
261 steamid: itm.user,
262 name: itm.name
263 }
264 });
265 });
266 }
267
268 socket.emit('message', {
269 type: 'timerGiveaway',
270 mod: 'timer',
271 time: timerGAWAY,
272 last: lastWinnerGiveaway
273 });
274 socket.emit('message', {
275 type: 'amountGiveaway',
276 amount: amountGiveaway
277 });
278
279 //JACKPOT
280 if((usersJPot[user.steamid] !== undefined) && (usersJPot[user.steamid] >= 1)) {
281 var change = parseFloat(100 * amountJPot[user.steamid] / totalJPot).toFixed(2);
282
283 socket.emit('message', {
284 type: 'addChangeJPot',
285 change: change
286 });
287 }
288 if(betsJPot.length > 0){
289 betsJPot.forEach(function(itm){
290 socket.emit('message', {
291 type: 'addBetJPot',
292 bet: {
293 user: itm.user,
294 avatar: itm.avatar,
295 name: itm.name,
296 amount: itm.amount,
297 tick1: itm.tick1,
298 tick2: itm.tick2
299 },
300 total: totalJPot
301 });
302 });
303 }
304
305 socket.emit('message', {
306 type: 'lastWinnerJP',
307 last: lastWinnerJP
308 });
309 }
310 });
311 });
312 socket.on('mes', function(m) {
313 if(!user) return;
314
315 if(users[user.steamid] === undefined) return;
316
317 if(canPlayersBet == 0){
318 socket.emit('message', {
319 type: 'error',
320 enable: false,
321 error: 'Error: The server are now offline. Please try again later!'
322 });
323 return;
324 }
325
326 if(user.banPlay == 1){
327 socket.emit('message', {
328 type: 'error',
329 enable: false,
330 error: 'Error: You are banned to playing!'
331 });
332 return;
333 }
334
335 logger.debug(user.name+" ("+user.steamid+")");
336 logger.debug(m);
337
338 if(user.rank != 100){ //OWNER
339 if(last_message[user.steamid] + 1 >= time()) {
340 timesFlooding[user.steamid] += 1;
341 if (timesFlooding[user.steamid] == 3) {
342 delete timesFlooding[user.steamid];
343 logger.debug('<< New Flood from '+user.steamid+' >>');
344 socket.emit('message', {
345 type: 'error',
346 enable: false,
347 error: 'Disconnected!'
348 });
349 return socket.disconnect();
350 }
351 socket.emit('message', {
352 type: 'error',
353 enable: false,
354 error: 'Too fast!'
355 });
356 return;
357 } else {
358 last_message[user.steamid] = time();
359 }
360 }
361
362
363 if(m.type == "verifyAcc") return verifyAcc(user, socket);
364
365 if(m.type == "availableR") return availableR(m, user, socket);
366 if(m.type == "groupR") return groupR(m, user, socket);
367 if(m.type == "nameR") return nameR(m, user, socket);
368 if(m.type == "codeR") return codeR(m, user, socket);
369 if(m.type == "bonusR") return bonusR(m, user, socket);
370 if(m.type == "createR") return createR(m, user, socket);
371
372 if(m.type == "createBonus") return createBonus(m, user, socket);
373
374 if(m.type == "tradeurl") return saveTradelink(m, user, socket);
375
376 if(m.type == "joinJackpot") return joinJackpot(m, user, socket);
377
378 if(m.type == "joinInG") return joinInGiveaway(user, socket);
379
380 if(m.type == "mines") {
381 if(m.mtype == 'play') {
382 return playMines(m, user, socket);
383 }else if(m.mtype == 'cashout') {
384 return cashoutMines(user, socket);
385 }else if(m.mtype == 'getBomb') {
386 return getBombMines(m, user, socket);
387 }
388 }
389
390 if(m.type == "crbet") {
391 if(m.mtype == 'joinCrash') {
392 return crashBet(m, user, socket);
393 }else if(m.mtype == 'withdraw') {
394 return crashCashout(m, user, socket);
395 }
396 }
397
398 if(m.type == "bet") return setBet(m, user, socket);
399
400 if(m.type == "getMsg") return getMsg(user, socket);
401 if(m.type == "balance") return getBalance(user.steamid, socket);
402 if(m.type == "chat") return ch(m, user, socket);
403 if(m.type == "plus") return plus(user, socket);
404
405 if(m.type == "createcfgame") return createCFGame(m, user, socket);
406 if(m.type == "joincfgame") return joinCFGame(m, user, socket);
407 if(m.type == "watchcfgame") return watchCFGame(m, user, socket);
408 });
409
410 socket.on('disconnect', function() {
411 io.sockets.emit('message', {
412 type: 'logins',
413 count: Object.size(io.sockets.connected)
414 });
415
416 delete users[user.steamid];
417 socket.leave(user.steamid);
418 });
419});
420
421/* END CONNECT TO SOCKET */
422/* CHAT */
423var msgChatHist = [];
424var msgCurently = 0;
425var last_message = {};
426var timesFlooding = {};
427
428function getMsg(user, socket){
429 socket.emit('message', {
430 type: 'chatEmpty'
431 });
432 if(msgChatHist.length > 0){
433 msgChatHist.forEach(function(itm) {
434 socket.emit('message', {
435 type: 'chat',
436 msg: itm.msg,
437 name: itm.name,
438 icon: itm.icon,
439 user: itm.user,
440 rank: itm.rank,
441 lang: itm.lang,
442 hide: itm.hide,
443 level: itm.level,
444 id: itm.id,
445 time: itm.time
446 });
447 });
448 }
449}
450function ch(m, user, socket) {
451 if(m.msg) {
452 query('SELECT `bets`, `balance`, `rank`, `mute` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
453 if((err) || (!row.length)) {
454 logger.error('Failed to get the person in the database');
455 logger.debug(err);
456 socket.emit('message', {
457 type: 'error',
458 enable: false,
459 error: 'Error: User not in DB!'
460 });
461 return;
462 }
463
464 var n = parseFloat(row[0].bets % Math.pow(10, 3));
465 var xx = ((parseInt((row[0].bets - n)/xpPerLevel))*xpPerLevel);
466 var levelA = xx/xpPerLevel;
467
468 var res = null;
469 if (res = /^\/send ([0-9]*) ([0-9]*)/.exec(m.msg)) {
470 logger.trace('We need to send coins from '+res[2]+' to '+res[1]);
471
472 if(res[1] == user.steamid){
473 socket.emit('message', {
474 type: 'error',
475 enable: false,
476 error: 'Error: You can\'t send coins to yourself!'
477 });
478 return;
479 }
480 if(levelA < needLevelToSendCoins){
481 socket.emit('message', {
482 type: 'error',
483 enable: false,
484 error: 'Error: You need to have level '+needLevelToSendCoins+' to send coins!'
485 });
486 return;
487 }
488 if(row[0].rank == 8 || row[0].rank == 5) {
489 // YOUTUBER OR STREAMER
490 socket.emit('message', {
491 type: 'error',
492 enable: false,
493 error: 'Error: You dont have permission to send coins because you have test coins!'
494 });
495 return;
496 }
497 if(row[0].balance < res[2]) {
498 socket.emit('message', {
499 type: 'error',
500 enable: false,
501 error: 'Error: Insufficient funds!'
502 });
503 return;
504 }
505 if(res[2] < minbet || res[2] > maxbet) {
506 socket.emit('message', {
507 type: 'error',
508 enable: false,
509 error: 'Error: Invalid bet amount ['+minbet+'-'+maxbet+']!'
510 });
511 return;
512 }
513 query('SELECT `name` FROM `users` WHERE `steamid` = '+pool.escape(res[1]), function(err2, row2) {
514 if((err2) || (!row2.length)) {
515 logger.error('Failed to get the STEAMID');
516 logger.debug(err2);
517 socket.emit('message', {
518 type: 'error',
519 enable: false,
520 error: 'Error: Unknown receiver!'
521 });
522 return;
523 }
524 query('UPDATE `users` SET `balance` = `balance` - '+res[2]+' WHERE `steamid` = '+pool.escape(user.steamid));
525 query('UPDATE `users` SET `balance` = `balance` + '+res[2]+' WHERE `steamid` = '+pool.escape(res[1]));
526 query('INSERT INTO `transfers` SET `from1` = '+pool.escape(user.steamid)+', `to1` = '+pool.escape(res[1])+', `amount` = '+pool.escape(res[2])+', `time` = '+pool.escape(time()));
527 socket.emit('message', {
528 type: 'alert',
529 alert: 'You sent '+res[2]+' coins to '+row2[0].name+'.'
530 });
531 getBalance(user.steamid, socket);
532
533 io.sockets.in(res[1]).emit('message', {
534 type: 'refBalanceSend',
535 amount: res[2]
536 });
537 io.sockets.in(res[1]).emit('message', {
538 type: 'alert',
539 alert: 'You received '+res[2]+' coins from '+user.name+'!'
540 });
541 });
542 } else if (res = /^\/ban ([0-9]*) ([a-zA-Z0-9]*)/.exec(m.msg)) {
543 if(user.rank == 1 || user.rank == 100) { //ADMIN && OWNER
544 query('UPDATE `users` SET `banPlay` = 1, `reasonBanPlay` = '+pool.escape(res[2])+' WHERE `steamid` = '+pool.escape(res[1]));
545 socket.emit('message', {
546 type: 'alert',
547 alert: user.name+' banned '+res[1]+' for '+res[2]+'!'
548 });
549 io.sockets.in(res[1]).emit('message', {
550 type: 'alert',
551 alert: 'You have banned for '+res[2]+'!'
552 });
553 io.sockets.in(res[1]).emit('message', {
554 type: 'refreshPage'
555 });
556 }
557 } else if (res = /^\/mute ([0-9]*) ([0-9]*)/.exec(m.msg)) {
558 if(user.rank == 1 || user.rank == 2 || user.rank == 100){ //ADMIN && OWNER && MODERATOR
559 var t = time();
560 query('UPDATE `users` SET `mute` = '+parseInt(time() + res[2])+' WHERE `steamid` = '+pool.escape(res[1]));
561 socket.emit('message', {
562 type: 'alert',
563 alert: 'You mute '+res[1]+' to '+res[2]
564 });
565
566 io.sockets.in(res[1]).emit('message', {
567 type: 'alert',
568 alert: 'You have muted for '+res[2]+' seconds!'
569 });
570 }
571 //CHAT
572 } else if (res = /^\/deletemsg ([0-9]*)/.exec(m.msg)) {
573 if(user.rank == 1 || user.rank == 2 || user.rank == 100){ //ADMIN && OWNER && MODERATOR
574 if(res[1] && res[1] <= msgCurently){
575 delete msgChatHist[res[1]];
576 socket.emit('message', {
577 type: 'alert',
578 alert: 'Message deleted!'
579 });
580 io.sockets.emit('message', {
581 type: 'deleteMsg',
582 id: res[1]
583 });
584 }else{
585 socket.emit('message', {
586 type: 'error',
587 enable: false,
588 error: 'Error: You are inserted an incorrect id!'
589 });
590 return;
591 }
592 }
593 } else if (res = /^\/clearchat/.exec(m.msg)) {
594 if(user.rank == 1 || user.rank == 2 || user.rank == 100){ //ADMIN && OWNER && MODERATOR
595 if(msgCurently > 0){
596 msgChatHist = [];
597 socket.emit('message', {
598 type: 'alert',
599 alert: 'Chat cleared!'
600 });
601 io.sockets.emit('message', {
602 type: 'deleteAllMsg',
603 rank: user.rank
604 });
605 msgCurently = 0;
606 }else{
607 socket.emit('message', {
608 type: 'error',
609 enable: false,
610 error: 'Error: There are no messages!'
611 });
612 return;
613 }
614 }
615 //GIVEAWAY
616 } else if (res = /^\/close/.exec(m.msg)) {
617 if(user.rank == 100){ //OWNER
618 io.sockets.emit('message', {
619 type: 'refreshPage'
620 });
621 io.sockets.emit('message', {
622 type: 'cashoutMines'
623 });
624 return;
625 }
626 } else if (res = /^\/pickwinner/.exec(m.msg)) {
627 if(user.rank == 1 || user.rank == 100){ //ADMIN && OWNER
628 timerGAWAY = 0;
629 socket.emit('message', {
630 type: 'alert',
631 alert: 'Giveaway picking'
632 });
633 }
634 } else if (res = /^\/amountg ([0-9.]*)/.exec(m.msg)) {
635 if(user.rank == 1 || user.rank == 100){ //ADMIN && OWNER
636 if(res[1] > 0){
637 amountGiveaway = res[1];
638 io.sockets.emit('message', {
639 type: 'amountGiveaway',
640 amount: amountGiveaway
641 });
642 socket.emit('message', {
643 type: 'alert',
644 alert: 'Amount giveaway setted to '+amountGiveaway
645 });
646 }else{
647 socket.emit('message', {
648 type: 'error',
649 enable: false,
650 error: 'Error: Amount need be > 0!'
651 });
652 return;
653 }
654 }
655 //CRASH
656 } else if (res = /^\/nextcrash ([0-9.]*)/.exec(m.msg)) {
657 if(user.rank == 1 || user.rank == 100){ //ADMIN && OWNER
658 riggedMode = true;
659 riggedValue = parseInt(res[1]*100);
660
661 socket.emit('message', {
662 type: 'alert',
663 alert: 'Next crash set: '+(riggedValue/100).toFixed(2)+'x [Good luck !]'
664 });
665 }
666 } else if (res = /^\/crashnow/.exec(m.msg)) {
667 if(user.rank == 1 || user.rank == 100){ //ADMIN && OWNER
668 if(crashState == 'STARTED') {
669 crashAt = pointCrash * 100;
670
671 socket.emit('message', {
672 type: 'alert',
673 alert: 'Crashed now, successfully!'
674 });
675 }else {
676 socket.emit('message', {
677 type: 'error',
678 error: 'Error: The game needs to be started!'
679 });
680 return;
681 }
682 }
683 //BETS FOR ALL
684 } else if (res = /^\/stopbets/.exec(m.msg)) {
685 if(user.rank == 1 || user.rank == 100){ //ADMIN && OWNER
686 canPlayersBet = 0;
687 io.sockets.emit('message', {
688 type: 'alert',
689 alert: 'The bets are now offline'
690 });
691 }
692 } else if (res = /^\/startbots/.exec(m.msg)) {
693 if(user.rank == 100){
694 if(BotsStarted == 1) {
695 socket.emit('message', {
696 type: 'bots',
697 msg: 'Error: The bots are already started!'
698 });
699 }else {
700 BotsStarted = 1;
701 IntervalulLaBoti = 1;
702 addBots();
703 }
704 }
705 } else if (res = /^\/stopbots/.exec(m.msg)) {
706 if(user.rank == 100){
707 BotsStarted = 1;
708 IntervalulLaBoti = 1;
709 addBots();
710 if(BotsStarted == 0) {
711 socket.emit('message', {
712 type: 'bots',
713 msg: 'Error: The bots are already stopped!'
714 });
715 }else {
716 BotsStarted = 0;
717 clearInterval(IntervalBetuireBoti);
718 }
719 }
720 } else if (res = /^\/addbots ([0-9_\-.]*)/.exec(m.msg)) {
721 if(user.rank == 100){
722 if(BotsStarted != 1) {
723 BotsStarted = 1;
724 IntervalulLaBoti = res[1];
725 addBots();
726 socket.emit('message', {
727 type: 'alert',
728 alert: 'You started automaticaly betting bots. [Time for every bet of bot: '+IntervalulLaBoti+' seconds]'
729 });
730 }else {
731 socket.emit('message', {
732 type: 'alert',
733 alert: 'The bots are already started!'
734 });
735 }
736 }
737 } else if (res = /^\/stopbots/.exec(m.msg)) {
738 if(user.rank == 100){
739 if(BotsStarted == 1) {
740 BotsStarted = 0;
741 clearInterval(IntervalBetuireBoti);
742 socket.emit('message', {
743 type: 'alert',
744 alert: 'You stopped bots!'
745 });
746 }else {
747 socket.emit('message', {
748 type: 'alert',
749 alert: 'The bots are already stopped!'
750 });
751 }
752 }
753 }else if (res = /^\/startbotschat/.exec(m.msg)) {
754 if(user.rank == 100){
755 if(BotsStarted == 1) {
756 ChatsBots();
757 socket.emit('message', {
758 type: 'alert',
759 alert: 'You started chat of bots!'
760 });
761 }else {
762 socket.emit('message', {
763 type: 'alert',
764 alert: 'The bots are offline, first start bots by typing: /addbots <seconds>!'
765 });
766 }
767 }
768 }else if (res = /^\/stopbotschat/.exec(m.msg)) {
769 if(user.rank == 100){
770 if(BotsStarted == 1) {
771 clearInterval(IntervalChatBotii);
772 socket.emit('message', {
773 type: 'alert',
774 alert: 'You stopped chat of bots!'
775 });
776 }else {
777 socket.emit('message', {
778 type: 'alert',
779 alert: 'The bots are offline, first start bots by typing: /addbots <seconds>!'
780 });
781 }
782 }
783 } else if (res = /^\/startbets/.exec(m.msg)) {
784 if(user.rank == 1 || user.rank == 100){ //ADMIN && OWNER
785 canPlayersBet = 1;
786 io.sockets.emit('message', {
787 type: 'alert',
788 alert: 'The bets are now online.'
789 });
790 }
791 //MESSAGE
792 } else if (res = /(?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?|?)/.exec(m.msg)) {
793
794 socket.emit('message', {
795 type: 'alert',
796 alert: 'Only English on chat!'
797 });
798 } else if (res = /(scam|SCAM|S C A M|s c a m|s.c.a.m|s c a m)/.exec(m.msg)) {
799
800 socket.emit('message', {
801 type: 'alert',
802 alert: 'We have trusted site, if you try write one more time, you will be mutted'
803 });
804
805 //MESSAGE
806 } else {
807 if(row[0].mute > time()) {
808 socket.emit('message', {
809 type: 'alert',
810 alert: 'You are muted for '+parseInt((row[0].mute-time())/3600)+' hours'
811 });
812 return;
813 }
814
815 var timeMsgH = new Date().getHours();
816 if(timeMsgH < 10) timeMsgH = '0'.concat(timeMsgH);
817 var timeMsgM = new Date().getMinutes();
818 if(timeMsgM < 10) timeMsgM = '0'.concat(timeMsgM);
819 var timeMsg = timeMsgH+":"+timeMsgM;
820
821 io.sockets.emit('message', {
822 type: 'chat',
823 msg: safe_tags_replace(m.msg),
824 name: user.name,
825 icon: user.avatar,
826 user: user.steamid,
827 rank: user.rank,
828 lang: m.lang,
829 hide: m.hide,
830 level: levelA,
831 id: msgCurently,
832 time: timeMsg
833 });
834
835 if(msgChatHist.length > 30){
836 msgChatHist.shift();
837 }
838
839 msgChatHist.push({
840 msg: safe_tags_replace(m.msg),
841 name: user.name,
842 icon: user.avatar,
843 user: user.steamid,
844 rank: user.rank,
845 lang: m.lang,
846 hide: m.hide,
847 level: levelA,
848 id: msgCurently,
849 time: timeMsg
850 });
851 msgCurently++;
852 }
853 });
854 }
855}
856/* END CHAT */
857/* REFRESH BALANCE */
858function getBalance(steamid, socket) {
859 query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(steamid), function(err, row) {
860 if((err) || (!row.length)) {
861 logger.error('Failed to load your balance');
862 logger.debug(err);
863 socket.emit('message', {
864 type: 'error',
865 enable: false,
866 error: 'Error: You are not DB!'
867 });
868 return;
869 }
870 socket.emit('message', {
871 type: 'balance',
872 balance: row[0].balance
873 });
874 users[steamid].balance = parseInt(row[0].balance);
875 });
876}
877/* END REFRESH BALANCE */
878/* TRADE LINK */
879function saveTradelink(m, user, socket){
880 if(!m.url){
881 socket.emit('message', {
882 type: 'error',
883 mtype: 'tradeLink',
884 enable: true,
885 error: 'Error: Tradelink cannot be empty!'
886 });
887 return;
888 }
889
890 if(m.url.includes('https://steamcommunity.com/tradeoffer/new/?partner=') == false || m.url.includes('&token=') == false){
891 socket.emit('message', {
892 type: 'error',
893 mtype: 'tradeLink',
894 enable: true,
895 error: 'Error: Tradelink is invalid!'
896 });
897 return;
898 }
899
900 query('UPDATE `users` SET `tradeLink` = '+pool.escape(m.url)+' WHERE `steamid`='+pool.escape(user.steamid), function(err, row) {
901 if(err) {
902 logger.error(err);
903 return;
904 }
905 });
906
907 socket.emit('message', {
908 type: 'alert',
909 alert: 'Tradelink saved!'
910 });
911}
912/* END TRADE LINK */
913/* REWARDS */
914
915function availableR(m, user, socket){
916 request('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=926A7D90AE95AF66BE01CF96CD6C647D&steamid='+user.steamid+'&format=json', function(err1, response1) {
917 if(err1) {
918 logger.error(err1);
919 return;
920 }
921
922 var csgo = false;
923 var res = JSON.parse(response1.body);
924 var games = res.response.games;
925
926 if(games !== undefined){
927 games.forEach(function(game){
928 if(game.appid == AppID) csgo = true;
929 });
930 }
931
932 if(!csgo){
933 socket.emit('message', {
934 type: 'error',
935 mtype: 'rewards',
936 ptype: m.type,
937 enable: true,
938 error: 'Error: You dont have '+nameForGame+'!'
939 });
940 return;
941 }
942
943 query('SELECT `code` FROM `codes` WHERE `user` = '+pool.escape(user.steamid), function(err2, code){
944 if(err2){
945 socket.emit('message', {
946 type: 'error',
947 mtype: 'rewards',
948 ptype: m.type,
949 enable: true,
950 error: 'Error: You don\'t have a code to collect the coins!'
951 });
952 return;
953 }
954
955 query('SELECT `referrals` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err3, coins){
956 if(err3) {
957 logger.error(err3);
958 return;
959 }
960
961 if(coins[0].referrals == 0){
962 socket.emit('message', {
963 type: 'error',
964 mtype: 'rewards',
965 ptype: m.type,
966 enable: true,
967 error: 'Error: You do not have a coin to collect!'
968 });
969 return;
970 }
971
972 if(coins[0].referrals > 0){
973 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(coins[0].referrals)+', `referrals` = 0 WHERE `steamid`='+pool.escape(user.steamid), function(err4, row) {
974 if(err4) {
975 logger.error(err4);
976 return;
977 }
978
979 getBalance(user.steamid, socket);
980 socket.emit('message', {
981 type: 'alert',
982 alert: 'You collected '+coins[0].referrals+' coins!'
983 });
984
985 socket.emit('message', {
986 type: 'refRewards'
987 });
988 });
989 return;
990 }
991 });
992 });
993 });
994}
995
996function groupR(m, user, socket){
997 query('SELECT `groupR` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err1, row1){
998 if(err1) {
999 logger.error(err1);
1000 return;
1001 }
1002
1003 if(parseInt(row1[0].nameR)){
1004 socket.emit('message', {
1005 type: 'error',
1006 mtype: 'rewards',
1007 ptype: m.type,
1008 enable: true,
1009 error: 'Error: You already collect the reward!'
1010 });
1011 return;
1012 }
1013
1014 request('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key='+ApiKey+'&steamid='+user.steamid+'&format=json', function(err2, response2) {
1015 if(err2) {
1016 logger.error(err2);
1017 return;
1018 }
1019
1020 var csgo = false;
1021 var res = JSON.parse(response2.body);
1022 var games = res.response.games;
1023
1024 if(games !== undefined){
1025 games.forEach(function(game){
1026 if(game.appid == AppID) csgo = true;
1027 });
1028 }
1029
1030 if(!csgo){
1031 socket.emit('message', {
1032 type: 'error',
1033 mtype: 'rewards',
1034 ptype: m.type,
1035 enable: true,
1036 error: 'Error: You dont have '+nameForGame+'!'
1037 });
1038 return;
1039 }
1040
1041 request('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+ApiKey+'&steamids='+user.steamid, function(err3, response3) {
1042 if(err3) {
1043 logger.error(err3);
1044 return;
1045 }
1046
1047 var res = JSON.parse(response3.body);
1048 var idGroup = res.response.players[0].primaryclanid;
1049
1050 if(idGroup != groupId){
1051 socket.emit('message', {
1052 type: 'error',
1053 mtype: 'rewards',
1054 ptype: m.type,
1055 enable: true,
1056 error: 'Error: Please join to '+nameSite+' Group and set primary group!'
1057 });
1058 return;
1059 }
1060
1061 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(coinGroupR)+', `groupR` = 1 WHERE `steamid`='+pool.escape(user.steamid), function(err4, row4) {
1062 if(err4) {
1063 logger.error(err4);
1064 return;
1065 }
1066
1067 getBalance(user.steamid, socket);
1068 socket.emit('message', {
1069 type: 'alert',
1070 alert: 'You claimed '+coinGroupR+' coins!'
1071 });
1072
1073 socket.emit('message', {
1074 type: 'refRewards'
1075 });
1076 });
1077 });
1078 });
1079 });
1080}
1081
1082function nameR(m, user, socket){
1083 query('SELECT `nameR` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err1, row1){
1084 if(err1) {
1085 logger.error(err1);
1086 return;
1087 }
1088
1089 if(parseInt(row1[0].nameR)){
1090 socket.emit('message', {
1091 type: 'error',
1092 mtype: 'rewards',
1093 ptype: m.type,
1094 enable: true,
1095 error: 'Error: You already collect the reward!'
1096 });
1097 return;
1098 }
1099
1100 request('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key='+ApiKey+'&steamid='+user.steamid+'&format=json', function(err2, response2) {
1101 if(err2) {
1102 logger.error(err2);
1103 return;
1104 }
1105
1106 var csgo = false;
1107 var res = JSON.parse(response2.body);
1108 var games = res.response.games;
1109
1110 if(games !== undefined){
1111 games.forEach(function(game){
1112 if(game.appid == AppID) csgo = true;
1113 });
1114 }
1115
1116 if(!csgo){
1117 socket.emit('message', {
1118 type: 'error',
1119 mtype: 'rewards',
1120 ptype: m.type,
1121 enable: true,
1122 error: 'Error: You dont have '+nameForGame+'!'
1123 });
1124 return;
1125 }
1126
1127 request('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+ApiKey+'&steamids='+user.steamid, function(err3, response3) {
1128 if(err3) {
1129 logger.error(err3);
1130 return;
1131 }
1132
1133 var res = JSON.parse(response3.body);
1134 var name = res.response.players[0].personaname;
1135
1136 if(!/CSGODamascus.com/.exec(name)) {
1137 socket.emit('message', {
1138 type: 'error',
1139 mtype: 'rewards',
1140 ptype: m.type,
1141 enable: true,
1142 error: 'Error: Please add '+nameSite+' to your Steam name!'
1143 });
1144 return;
1145 }
1146
1147 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(coinNameR)+', `nameR` = 1 WHERE `steamid`='+pool.escape(user.steamid), function(err4, row4) {
1148 if(err4) {
1149 logger.error(err4);
1150 return;
1151 }
1152
1153 getBalance(user.steamid, socket);
1154 socket.emit('message', {
1155 type: 'alert',
1156 alert: 'You claimed '+coinNameR+' coins!'
1157 });
1158
1159 socket.emit('message', {
1160 type: 'refRewards'
1161 });
1162 });
1163 });
1164 });
1165 });
1166}
1167
1168function codeR(m, user, socket){
1169 query('SELECT `codeR` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err1, row1){
1170 if(err1) {
1171 logger.error(err1);
1172 return;
1173 }
1174
1175 if(parseInt(row1[0].codeR)){
1176 socket.emit('message', {
1177 type: 'error',
1178 mtype: 'rewards',
1179 ptype: m.type,
1180 enable: true,
1181 error: 'Error: You already collect the reward!'
1182 });
1183 return;
1184 }
1185
1186 request('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key='+ApiKey+'&steamid='+user.steamid+'&format=json', function(err2, response) {
1187 if(err2) {
1188 logger.error(err2);
1189 return;
1190 }
1191
1192 var csgo = false;
1193 var res = JSON.parse(response.body);
1194 var games = res.response.games;
1195
1196 if(games !== undefined){
1197 games.forEach(function(game){
1198 if(game.appid == AppID) csgo = true;
1199 });
1200 }
1201
1202 if(!csgo){
1203 socket.emit('message', {
1204 type: 'error',
1205 mtype: 'rewards',
1206 ptype: m.type,
1207 enable: true,
1208 error: 'Error: You dont have '+nameForGame+'!'
1209 });
1210 return;
1211 }
1212
1213 query('SELECT `user` FROM `codes` WHERE `code` = '+pool.escape(m.code), function(err3, row3){
1214 if(!row3[0]){
1215 socket.emit('message', {
1216 type: 'error',
1217 mtype: 'rewards',
1218 ptype: m.type,
1219 enable: true,
1220 error: 'Error: Code not found!'
1221 });
1222 return;
1223 }
1224
1225 if(row3[0].user == user.steamid){
1226 socket.emit('message', {
1227 type: 'error',
1228 mtype: 'rewards',
1229 ptype: m.type,
1230 enable: true,
1231 error: 'Error: This is you referal code!'
1232 });
1233 return;
1234 }
1235
1236 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(coinCodeR)+', `codeR` = '+pool.escape(row3[0].user)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err4, row4) {
1237 if(err4) {
1238 logger.error(err4);
1239 return;
1240 }
1241
1242 getBalance(user.steamid, socket);
1243 socket.emit('message', {
1244 type: 'alert',
1245 alert: 'You claimed '+coinCodeR+' coins!'
1246 });
1247
1248 socket.emit('message', {
1249 type: 'refRewards'
1250 });
1251 });
1252
1253 query('UPDATE `users` SET `referrals` = `referrals` + '+parseInt(coinFriendR)+' WHERE `steamid` = '+pool.escape(row3[0].user), function(err5, row5) {
1254 if(err5) {
1255 logger.error(err5);
1256 return;
1257 }
1258 });
1259 });
1260 });
1261 });
1262}
1263
1264function bonusR(m, user, socket){
1265 query('SELECT * FROM `bonus` WHERE `steamid` = '+pool.escape(user.steamid), function(err1, row1){
1266 if(err1) {
1267 logger.error(err1);
1268 return;
1269 }
1270
1271 if(row1[0]){
1272 socket.emit('message', {
1273 type: 'error',
1274 mtype: 'rewards',
1275 ptype: m.type,
1276 enable: true,
1277 error: 'Error: You already claimed the bonus code!'
1278 });
1279 return;
1280 }
1281
1282 query('SELECT `max_useds`, `useds`, `amount` FROM `bonus` WHERE `code` = '+pool.escape(m.code), function(err2, row2){
1283 if(!row2[0]){
1284 socket.emit('message', {
1285 type: 'error',
1286 mtype: 'rewards',
1287 ptype: m.type,
1288 enable: true,
1289 error: 'Error: This code is invalid!'
1290 });
1291 return;
1292 }
1293
1294 if(row2[0].useds >= row2[0].max_useds){
1295 socket.emit('message', {
1296 type: 'error',
1297 mtype: 'rewards',
1298 ptype: m.type,
1299 enable: true,
1300 error: 'Error: The code is already maximum used!'
1301 });
1302 return;
1303 }
1304
1305 request('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key='+ApiKey+'&steamid='+user.steamid+'&format=json', function(err3, response3) {
1306 if(err3) {
1307 logger.error(err3);
1308 return;
1309 }
1310
1311 var csgo = false;
1312 var res = JSON.parse(response3.body);
1313 var games = res.response.games;
1314
1315 if(games !== undefined){
1316 games.forEach(function(game){
1317 if(game.appid == AppID) csgo = true;
1318 });
1319 }
1320
1321 if(!csgo){
1322 socket.emit('message', {
1323 type: 'error',
1324 mtype: 'rewards',
1325 ptype: m.type,
1326 enable: true,
1327 error: 'Error: You dont have '+nameForGame+'!'
1328 });
1329 return;
1330 }
1331
1332 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(row2[0].amount)+' WHERE `steamid`='+pool.escape(user.steamid), function(err4, row4) {
1333 if(err4) {
1334 logger.error(err4);
1335 return;
1336 }
1337
1338 getBalance(user.steamid, socket);
1339 socket.emit('message', {
1340 type: 'alert',
1341 alert: 'You claimed '+parseInt(row2[0].amount)+' coins!'
1342 });
1343
1344 socket.emit('message', {
1345 type: 'refRewards'
1346 });
1347 });
1348
1349 query('INSERT INTO `bonus` SET `steamid` = '+pool.escape(user.steamid), function(err5, row5) {
1350 if(err5) {
1351 logger.error(err5);
1352 return;
1353 }
1354 });
1355
1356 query('UPDATE `bonus` SET `useds` = `useds` + 1 WHERE `code` = '+pool.escape(m.code), function(err6, row6) {
1357 if(err6) {
1358 logger.error(err6);
1359 return;
1360 }
1361 });
1362 });
1363 });
1364 });
1365}
1366
1367function createR(m, user, socket){
1368 request('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key='+ApiKey+'&steamid='+user.steamid+'&format=json', function(err1, response) {
1369 if(err1) {
1370 logger.error(err1);
1371 return;
1372 }
1373
1374 var csgo = false;
1375 var res = JSON.parse(response.body);
1376 var games = res.response.games;
1377
1378 if(games !== undefined){
1379 games.forEach(function(game){
1380 if(game.appid == AppID) csgo = true;
1381 });
1382 }
1383
1384 if(!csgo){
1385 socket.emit('message', {
1386 type: 'error',
1387 mtype: 'rewards',
1388 ptype: m.type,
1389 enable: true,
1390 error: 'Error: You dont have '+nameForGame+'!'
1391 });
1392 return;
1393 }
1394
1395 query('SELECT `user` FROM `codes` WHERE `code` = '+pool.escape(m.code), function(err2, row2){
1396 if(row2[0]){
1397 socket.emit('message', {
1398 type: 'error',
1399 mtype: 'rewards',
1400 ptype: m.type,
1401 enable: true,
1402 error: 'Error: This code is already used!'
1403 });
1404 return;
1405 }
1406
1407 if(!row2[0]){
1408 query('SELECT * FROM `codes` WHERE `user` = '+pool.escape(user.steamid), function(err3, row3){
1409 if(row3[0]){
1410 query('UPDATE `codes` SET `code` = '+pool.escape(m.code)+' WHERE `user`='+pool.escape(user.steamid), function(err4, row4) {
1411 if(err4) {
1412 logger.error(err4);
1413 return;
1414 }
1415
1416 socket.emit('message', {
1417 type: 'alert',
1418 alert: 'Code updated!'
1419 });
1420
1421 socket.emit('message', {
1422 type: 'refRewards'
1423 });
1424 });
1425 return;
1426 }
1427
1428 if(!row3[0]){
1429 query('INSERT INTO `codes` SET `user` = '+pool.escape(user.steamid)+', `code` = '+pool.escape(m.code), function(err4, row4) {
1430 if(err4) {
1431 logger.error(err4);
1432 return;
1433 }
1434
1435 socket.emit('message', {
1436 type: 'alert',
1437 alert: 'Code created!'
1438 });
1439 });
1440 return;
1441 }
1442 });
1443 }
1444 });
1445 });
1446}
1447
1448function createBonus(m, user, socket){
1449 if(user.rank != 1 && user.rank != 2 && user.rank != 100){
1450 socket.emit('message', {
1451 type: 'error',
1452 enable: false,
1453 error: 'Error: You don\'t have permission to use that!'
1454 });
1455 return;
1456 }
1457
1458 if(!(/(^[0-9]*$)/.exec(m.amount))){
1459 socket.emit('message', {
1460 type: 'error',
1461 enable: false,
1462 error: 'Error: Invalid amount!'
1463 });
1464 return;
1465 }
1466
1467 if(!(/(^[0-9]*$)/.exec(m.maxuseds))){
1468 socket.emit('message', {
1469 type: 'error',
1470 enable: false,
1471 error: 'Error: Invalid maximum users!'
1472 });
1473 return;
1474 }
1475
1476 if(!(/(^[a-zA-Z0-9]*$)/.exec(m.code))){
1477 socket.emit('message', {
1478 type: 'error',
1479 enable: false,
1480 error: 'Error: Invalid code!'
1481 });
1482 return;
1483 }
1484
1485 query('SELECT * FROM `bonus` WHERE `code` = '+pool.escape(m.code), function(err1, row1){
1486 if(row1.length != 0){
1487 socket.emit('message', {
1488 type: 'error',
1489 enable: false,
1490 error: 'Error: Code already exists!'
1491 });
1492 return;
1493 }
1494
1495 query('TRUNCATE table `bonus`', function(){
1496 query('INSERT INTO `bonus` SET `code` = '+pool.escape(m.code)+', `amount` = '+parseInt(m.amount)+', `max_useds` = '+parseInt(m.maxuseds)+', `useds` = 0', function(err2, row2){
1497 if(err2){
1498 logger.error(err2);
1499 return;
1500 }
1501
1502 socket.emit('message', {
1503 type: 'alert',
1504 alert: 'Code created!'
1505 });
1506 });
1507 });
1508 });
1509}
1510/* END REWARDS */
1511/* VERIFY ACC */
1512function verifyAcc(user, socket){
1513 request('http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key='+ApiKey+'&steamid='+user.steamid+'&format=json', function(err1, response) {
1514 if(err1) {
1515 logger.error(err1);
1516 return;
1517 }
1518
1519 var csgo = false;
1520 var res = JSON.parse(response.body);
1521 var games = res.response.games;
1522
1523 if(games !== undefined){
1524 games.forEach(function(game){
1525 if(game.appid == AppID) csgo = true;
1526 });
1527 }
1528
1529 if(!csgo){
1530 socket.emit('message', {
1531 type: 'error',
1532 mtype: 'account',
1533 enable: true,
1534 error: 'Error: You dont have '+nameForGame+'!'
1535 });
1536 return;
1537 }
1538
1539 query('SELECT `verified` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2){
1540 if(row2[0].verified == 1){
1541 socket.emit('message', {
1542 type: 'error',
1543 mtype: 'account',
1544 enable: true,
1545 error: 'Error: Your account is already verified!'
1546 });
1547 return;
1548 }
1549
1550 query('UPDATE `users` SET `verified` = 1 WHERE `steamid` = '+pool.escape(user.steamid), function(err3, row3) {
1551 if(err3) {
1552 logger.error(err3);
1553 return;
1554 }
1555
1556 socket.emit('message', {
1557 type: 'alert',
1558 alert: 'Account successfully verified!'
1559 });
1560
1561 socket.emit('message', {
1562 type: 'refAccount'
1563 });
1564 });
1565 });
1566 });
1567}
1568/* END VERIFY ACC */
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580/* -------------- GAMES --------------*/
1581
1582
1583
1584
1585
1586/* CRASH */
1587var usersCrash = {};
1588var betsCrash = [];
1589
1590var riggedMode = false;
1591var riggedValue;
1592
1593var crashState = 'ENDED';
1594
1595var crashAt = 0;
1596var pointCrash = 0;
1597
1598var hashCodeCrash = '';
1599var secretCodeCrash = '';
1600var lotteryCodeCrash = '';
1601
1602var timerIntCrash;
1603var startCrashTime = 0;
1604var endedCrashTime = 0;
1605
1606hashCrash();
1607
1608function crashBet(m, user, socket) {
1609 if(usersCrash[user.steamid] !== undefined && usersCrash[user.steamid]['play']) {
1610 socket.emit('message', {
1611 type: 'error',
1612 mtype: 'crash',
1613 enable: true,
1614 error: 'Error: You have already joined the crash!'
1615 });
1616 return;
1617 }
1618 if(m.autoCash <= 100 && m.autoCash != 0) {
1619 socket.emit('message', {
1620 type: 'error',
1621 mtype: 'crash',
1622 enable: true,
1623 error: 'Error: Cashout needs to be more than 1.00x!'
1624 });
1625 return;
1626 }
1627 if(!(/(^[0-9.]*$)/.exec(m.autoCash))){
1628 socket.emit('message', {
1629 type: 'error',
1630 mtype: 'crash',
1631 enable: true,
1632 error: 'Error: Cashout needs to be more than 1.00x!'
1633 });
1634 logger.warn(user.steamid+' try to cheating to CRASH CASHOUT_AMOUNT');
1635 return;
1636 }
1637 if((m.amount < minbet) || (m.amount > maxbet)) {
1638 socket.emit('message', {
1639 type: 'error',
1640 mtype: 'crash',
1641 enable: true,
1642 error: 'Error: Invalid bet amount ['+minbet+'-'+maxbet+']!'
1643 });
1644 return;
1645 }
1646 if(/(a|b|c|d|e|f|g|h|j|i|k|l|m|n|o|p|q|r|s|t|v|u|w|x|y|z)/.exec(m.amount)) {
1647 socket.emit('message', {
1648 type: 'error',
1649 mtype: 'crash',
1650 enable: true,
1651 error: 'Error: Invalid bet amount!'
1652
1653 });
1654 logger.warn(user.steamid+' try to cheating to CRASH BET_AMOUNT');
1655 return;
1656 }
1657 if(crashState != 'STARTING') {
1658 socket.emit('message', {
1659 type: 'error',
1660 mtype: 'crash',
1661 enable: true,
1662 error: 'Error: The game have been already started!'
1663 });
1664 return;
1665 }
1666 var start_time = new Date();
1667 query('SELECT `balance`, `countDeposits`, `bets` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
1668 if((err) || (!row.length)) {
1669 logger.error('Failed to find DB');
1670 logger.debug(err);
1671 socket.emit('message', {
1672 type: 'error',
1673 mtype: 'crash',
1674 enable: true,
1675 error: 'Error: You are not DB!'
1676 });
1677 return;
1678 }
1679
1680 var n = parseFloat(row[0].bets % Math.pow(10, 3));
1681 var xx = ((parseInt((row[0].bets - n)/xpPerLevel))*xpPerLevel);
1682 var levelA = xx/xpPerLevel;
1683
1684 if(row[0].balance >= m.amount) {
1685 query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
1686 if(err2) {
1687 logger.error('Error in withdraw');
1688 logger.debug(err);
1689 socket.emit('message', {
1690 type: 'error',
1691 mtype: 'crash',
1692 enable: true,
1693 error: 'Error: You dont have enough points!'
1694 });
1695 return;
1696 }
1697
1698 if(row[0].countDeposits >= 1) query('UPDATE `users` SET `available` = `available` + '+parseInt(m.amount / 3)+' WHERE `steamid` = '+pool.escape(user.steamid));
1699 if(row[0].countDeposits >= 0) query('UPDATE `users` SET `bets` = `bets` + '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid));
1700
1701 query('INSERT INTO `crbets` SET `user` = '+pool.escape(user.steamid)+', `amount` = '+pool.escape(m.amount)+', `autoCashout` = '+pool.escape((m.autoCash != 0) ? m.autoCash : 'infinity'), function(err3, row3) {
1702 if(err3) {
1703 logger.error('Error in DB');
1704 logger.debug(err);
1705 return;
1706 }
1707 var end = new Date();
1708
1709 if(usersCrash[user.steamid] === undefined) {
1710 usersCrash[user.steamid] = {
1711 'play': true,
1712 'id': row3.insertId,
1713 'amount': m.amount,
1714 'autoCashout': m.autoCash,
1715 'infinityCashout': false,
1716 'cashedOut': false,
1717 'profit': 0
1718 };
1719 }
1720
1721 if(m.autoCash == 0) usersCrash[user.steamid]['infinityCashout'] = true;
1722
1723 socket.emit('message', {
1724 type: 'crbetconfirm',
1725 bet: {
1726 id: row3.insertId,
1727 amount: m.amount,
1728 autoCashout: m.autoCash
1729 },
1730 exec: (end.getTime()-start_time.getTime()).toFixed(3)
1731 });
1732
1733 io.sockets.emit('message', {
1734 type: 'crbet',
1735 bet: {
1736 id: row3.insertId,
1737 amount: m.amount,
1738 icon: user.avatar,
1739 name: user.name,
1740 level: levelA
1741 }
1742 });
1743
1744 betsCrash.push({
1745 id: row3.insertId,
1746 amount: m.amount,
1747 autoCashout: m.autoCash,
1748 icon: user.avatar,
1749 name: user.name,
1750 user: user.steamid,
1751 level: levelA
1752 });
1753
1754 logger.debug('Crash bet confirmed #'+row3.insertId+' | Amount: '+m.amount+' | AutoCashout: '+m.autoCash+' | User: '+pool.escape(user.steamid));
1755
1756 getBalance(user.steamid, socket);
1757 });
1758 });
1759 } else {
1760 socket.emit('message', {
1761 type: 'error',
1762 mtype: 'crash',
1763 enable: true,
1764 error: 'Error: You dont have any money!'
1765 });
1766 }
1767 });
1768}
1769
1770function crashCashout(m, user, socket) {
1771 var crashPoint = pointCrash;
1772 if(crashState != 'STARTED') {
1773 socket.emit('message', {
1774 type: 'error',
1775 error: 'Error: The game is ended!'
1776 });
1777 return;
1778 }
1779
1780 if(crashPoint <= 1.00) {
1781 socket.emit('message', {
1782 type: 'error',
1783 error: 'Error: Invalid crash!'
1784 });
1785 return;
1786 }
1787
1788 if(usersCrash[user.steamid]['cashedOut'] == false) {
1789 var win = parseInt(usersCrash[user.steamid]['amount'] * parseFloat(crashPoint).toFixed(2));
1790
1791 io.sockets.emit('message', {
1792 type: 'betCrashWin',
1793 id: usersCrash[user.steamid]['id'],
1794 cashout: (parseFloat(crashPoint).toFixed(2)),
1795 profit: parseInt(win - usersCrash[user.steamid]['amount'])
1796 });
1797
1798 usersCrash[user.steamid]['cashedOut'] = true;
1799 usersCrash[user.steamid]['autoCashout'] = parseFloat(crashPoint).toFixed(2);
1800 usersCrash[user.steamid]['profit'] = parseInt(win - usersCrash[user.steamid]['amount']);
1801
1802 socket.emit('message', {
1803 type: 'btnCrashWin',
1804 amount: win
1805 });
1806
1807 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(win)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err){
1808 query('UPDATE `crbets` SET `autoCashout` = '+parseFloat(crashPoint).toFixed(2)+', `cashedOut` = 1 WHERE `id` = '+pool.escape(usersCrash[user.steamid]['id']));
1809
1810 logger.debug('[CASHOUT] UPDATED BALANCE OF '+user.steamid+' WITH + '+parseInt(win - usersCrash[user.steamid]['amount'])+' [CASHOUT: '+parseFloat(crashPoint).toFixed(2)+'x]');
1811 getBalance(user.steamid, socket);
1812 });
1813 }else {
1814 socket.emit('message', {
1815 type: 'error',
1816 error: 'Error: You have already cashed out!'
1817 });
1818 }
1819}
1820
1821
1822function hashCrash() {
1823 crashState = 'STARTING';
1824 logger.debug('Starting crash!');
1825
1826 io.sockets.emit('message', {
1827 type: 'resetCrash'
1828 });
1829
1830 var startTimeCrash = waitStartingCrash;
1831 var timerWaintingCrash = setInterval(function(){
1832 if(startTimeCrash <= 0.01){
1833 clearInterval(timerWaintingCrash);
1834 }else{
1835 io.sockets.emit('message', {
1836 type: 'startingCrash',
1837 time: ((startTimeCrash).toFixed(1))
1838 });
1839 startTimeCrash -= 0.1;
1840 }
1841 },100);
1842
1843 if(!riggedMode) {
1844 var genGameHash = function(serverSeed) {
1845 return crypto.createHash('sha256').update(serverSeed).digest('hex');
1846 };
1847 var serverSeed = makeCode();
1848
1849 hashCodeCrash = genGameHash(serverSeed);
1850 secretCodeCrash = serverSeed;
1851 lotteryCodeCrash = time();
1852
1853 var crashPointFromHash = function(serverSeed) {
1854 var hash = crypto.createHmac('sha256', serverSeed).digest('hex');
1855 var divisible = function divisible(hash, mod) {
1856 var val = 0;
1857 var o = hash.length % 4;
1858 for (var i = o > 0 ? o - 4 : 0; i < hash.length; i += 4) {
1859 val = ((val << 16) + parseInt(hash.substring(i, i+4), 16)) % mod;
1860 }
1861 return val === 0;
1862 };
1863 var INSTANT_CRASH_PERCENTAGE = 5;
1864 if (divisible(hash, 100 / parseInt(INSTANT_CRASH_PERCENTAGE, 10)))
1865 return 100;
1866 var h = parseInt(hash.slice(0,52/4),16);
1867 var e = Math.pow(2,52);
1868 return Math.floor((100 * e - h) / (e - h));
1869 };
1870
1871 crashAt = crashPointFromHash(serverSeed);
1872
1873 logger.debug('New crash: with crashPoint: ' + (crashAt / 100).toFixed(2) +'x');
1874 }else if(riggedMode) {
1875 crashAt = riggedValue;
1876
1877 riggedMode = false;
1878 riggedValue = 0;
1879
1880 logger.debug('Crash seted: with crashPoint: ' + (crashAt / 100).toFixed(2) +'x');
1881 }
1882
1883 setTimeout(function() {
1884 startCrash();
1885 }, (waitStartingCrash + 1) * 1000);
1886}
1887
1888function startCrash(){
1889 crashState = 'STARTED';
1890
1891 startCrashTime = new Date().getTime();
1892
1893 io.sockets.emit('message', {
1894 type: 'startedCrash',
1895 elapsed: new Date().getTime() - startCrashTime
1896 });
1897
1898 function calcCrash1(ms) {
1899 var gamePayout = Math.floor(100 * calcCrash2(ms)) / 100;
1900 return gamePayout;
1901 }
1902
1903 function calcCrash2(ms) {
1904 var r = 0.00006;
1905 return Math.pow(Math.E, r * ms);
1906 }
1907
1908 timerIntCrash = setInterval(function(){
1909 pointCrash = calcCrash1(new Date().getTime() - startCrashTime);
1910 checkCrash();
1911 },100);
1912}
1913
1914function checkCrash(){
1915 var point = pointCrash * 100;
1916
1917 if(betsCrash.length > 0){
1918 betsCrash.forEach(function(bet){
1919 if(usersCrash[bet.user]['cashedOut'] == false) {
1920 var win = parseInt(usersCrash[bet.user]['amount'] * parseFloat(point / 100).toFixed(2));
1921 io.sockets.emit('message', {
1922 type: 'btnCrashCashout',
1923 amount: win
1924 });
1925 }
1926 });
1927 }
1928
1929 if(point >= crashAt){
1930 endedCrashTime = new Date().getTime() - startCrashTime;
1931
1932 crashState = 'ENDED';
1933
1934 io.sockets.emit('message', {
1935 type: 'crashed',
1936 number: crashAt,
1937 time: endedCrashTime
1938 });
1939
1940 if(betsCrash.length > 0){
1941 betsCrash.forEach(function(bet){
1942 if(usersCrash[bet.user]['cashedOut'] == false) {
1943 io.sockets.emit('message', {
1944 type: 'betCrashLose',
1945 id: bet.id
1946 });
1947 }
1948 });
1949 }
1950
1951 usersCrash = {};
1952 betsCrash = [];
1953
1954 query('INSERT INTO `crash` SET `crashAt` = '+parseFloat(crashAt / 100).toFixed(2)+', `lottery` = '+pool.escape(lotteryCodeCrash)+', `secret` = '+pool.escape(secretCodeCrash)+', `hash` = '+pool.escape(hashCodeCrash));
1955
1956 setTimeout(function() {
1957 hashCrash();
1958 }, 5000);
1959
1960 clearInterval(timerIntCrash);
1961
1962 logger.debug('Crash creshed at '+parseFloat(crashAt / 100).toFixed(2)+'x');
1963 }else{
1964 //CHECK AUTOCRASH
1965 if(betsCrash.length > 0){
1966 betsCrash.forEach(function(itm) {
1967 if(usersCrash[itm.user]['cashedOut'] == false) {
1968 if(usersCrash[itm.user]['infinityCashout'] == false){
1969 if(usersCrash[itm.user]['autoCashout'] <= point){
1970 var win = parseInt(usersCrash[itm.user]['amount'] * parseFloat(usersCrash[itm.user]['autoCashout'] / 100).toFixed(2));
1971
1972 io.sockets.emit('message', {
1973 type: 'betCrashWin',
1974 id: itm.id,
1975 cashout: (parseFloat(usersCrash[itm.user]['autoCashout'] / 100).toFixed(2)),
1976 profit: parseInt(win - usersCrash[itm.user]['amount'])
1977 });
1978
1979 io.sockets.in(itm.user).emit('message', {
1980 type: 'btnCrashWin',
1981 amount: win
1982 });
1983
1984 usersCrash[itm.user]['cashedOut'] = true;
1985 usersCrash[itm.user]['profit'] = parseInt(win - usersCrash[itm.user]['amount']);
1986
1987 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(win)+' WHERE `steamid` = '+pool.escape(itm.user), function(err){
1988 if(err) {
1989 logger.error(err);
1990 return;
1991 }
1992
1993 query('UPDATE `crbets` SET `autoCashout` = '+parseFloat(usersCrash[itm.user]['autoCashout'] / 100).toFixed(2)+', `cashedOut` = 1 WHERE `id` = '+pool.escape(usersCrash[itm.user]['id']));
1994
1995 logger.debug('[CASHOUT] UPDATED BALANCE OF '+itm.user+' WITH + '+(win - usersCrash[itm.user]['amount'])+' [CASHOUT: '+(usersCrash[itm.user]['autoCashout'] / 100)+'x]');
1996 getBalance(itm.user, io.sockets.in(itm.user));
1997 });
1998 }
1999 }
2000 }
2001 });
2002 }
2003 }
2004}
2005/* END CRASH */
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016/* JACKPOT */
2017var usersJPot = {};
2018var amountJPot = {};
2019var betsJPot = [];
2020var totalJPot = 0;
2021var btJPot = 5;
2022var currentlyTick = 0;
2023
2024var widthJPot = 100; //do not modify
2025var stageJPot = 'WAIT';
2026
2027var jackpotId = 0;
2028var lastWinnerJP = {name: 'None', steamid: 0, avatar: 'http://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb.jpg', chance: 0, coins: 0};
2029
2030function getAvatarsWin(avatar, bets, tickets){
2031 var array = [];
2032 var totalAvatars = 100;
2033
2034 for(var i = 0; i < totalAvatars; i++){
2035 var randomAvatar = getRandomInt(1, tickets);
2036
2037 var avatarA;
2038
2039 if(bets.length > 0){
2040 bets.forEach(function(itm){
2041 if((randomAvatar >= itm.tick1) && (randomAvatar <= itm.tick2)){
2042 avatarA = itm.avatar;
2043 }
2044 });
2045 }
2046
2047 array.push(avatarA);
2048 }
2049 array[95] = avatar;
2050
2051 return array;
2052}
2053
2054function joinJackpot(m, user, socket){
2055 if(stageJPot == 'PICKING') {
2056 socket.emit('message', {
2057 type: 'error',
2058 mtype: 'jackpot',
2059 enable: true,
2060 error: 'Error: Wait for preparing a new round!'
2061 });
2062 return;
2063 }
2064
2065 if((usersJPot[user.steamid] !== undefined) && (usersJPot[user.steamid] == btJPot)) {
2066 socket.emit('message', {
2067 type: 'error',
2068 mtype: 'jackpot',
2069 enable: true,
2070 error: 'Error: You\'ve already entered in this jackpot for '+btJPot+' times!'
2071 });
2072 return;
2073 }
2074
2075 if((m.amount < minbet) || (m.amount > maxbet)) {
2076 socket.emit('message', {
2077 type: 'error',
2078 mtype: 'jackpot',
2079 enable: true,
2080 error: 'Error: Invalid bet amount ['+minbet+'-'+maxbet+']!'
2081 });
2082 return;
2083 }
2084
2085 if(/(a|b|c|d|e|f|g|h|j|i|k|l|m|n|o|p|q|r|s|t|v|u|w|x|y|z)/.exec(m.amount)) {
2086 socket.emit('message', {
2087 type: 'error',
2088 mtype: 'jackpot',
2089 enable: true,
2090 error: 'Error: Invalid bet amount!'
2091 });
2092 logger.warn(user.steamid+' try to cheating to JACKPOT BET_AMOUNT');
2093 return;
2094 }
2095
2096 var start_time = new Date();
2097 query('SELECT `balance`, `countDeposits` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
2098 if((err) || (!row.length)) {
2099 logger.error('Failed to find DB');
2100 logger.debug(err);
2101 socket.emit('message', {
2102 type: 'error',
2103 mtype: 'jackpot',
2104 enable: true,
2105 error: 'Error: You are not DB!'
2106 });
2107 return;
2108 }
2109
2110 if(row[0].balance >= m.amount) {
2111 query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
2112 if(err2) {
2113 logger.error('Error in withdraw');
2114 logger.debug(err2);
2115 socket.emit('message', {
2116 type: 'error',
2117 mtype: 'jackpot',
2118 enable: true,
2119 error: 'Error: You dont have enough points!'
2120 });
2121 return;
2122 }
2123
2124 if(row[0].countDeposits >= 1) query('UPDATE `users` SET `available` = `available` + '+parseInt(m.amount / 3)+' WHERE `steamid` = '+pool.escape(user.steamid));
2125 if(row[0].countDeposits >= 0) query('UPDATE `users` SET `bets` = `bets` + '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid));
2126
2127 if(usersJPot[user.steamid] === undefined){
2128 usersJPot[user.steamid] = 1;
2129 amountJPot[user.steamid] = m.amount;
2130 }else{
2131 usersJPot[user.steamid]++;
2132 amountJPot[user.steamid] += m.amount;
2133 }
2134
2135 totalJPot+=m.amount;
2136
2137 betsJPot.push({
2138 user: user.steamid,
2139 avatar: user.avatar,
2140 name: user.name,
2141 amount: m.amount,
2142 tick1: (currentlyTick + 1),
2143 tick2: (parseInt(m.amount / 10) + currentlyTick)
2144 });
2145
2146 if(betsJPot.length > 0){
2147 betsJPot.forEach(function(itm){
2148 var change = parseFloat(100 * amountJPot[itm.user] / totalJPot).toFixed(2);
2149
2150 io.sockets.in(itm.user).emit('message', {
2151 type: 'addChangeJPot',
2152 change: change
2153 });
2154 });
2155 }
2156
2157 socket.emit('message', {
2158 type: 'betConfJPot',
2159 amount: m.amount,
2160 br: usersJPot[user.steamid],
2161 tbr: btJPot
2162 });
2163
2164 io.sockets.emit('message', {
2165 type: 'addBetJPot',
2166 bet: {
2167 user: user.steamid,
2168 avatar: user.avatar,
2169 name: user.name,
2170 amount: m.amount,
2171 tick1: (currentlyTick + 1),
2172 tick2: (parseInt(m.amount / 10) + currentlyTick)
2173 },
2174 total: totalJPot
2175 });
2176
2177 currentlyTick = currentlyTick + parseInt(m.amount / 10);
2178 startJPot();
2179
2180 logger.debug('Jackpot Bet confirmed Amount: '+m.amount+' | User: '+pool.escape(user.steamid));
2181
2182 getBalance(user.steamid, socket);
2183 });
2184 } else {
2185 socket.emit('message', {
2186 type: 'error',
2187 mtype: 'jackpot',
2188 enable: true,
2189 error: 'Error: You dont have any money!'
2190 });
2191 }
2192 });
2193}
2194
2195var minusWJPot = (widthJPot/timeJPot).toFixed(2);
2196
2197function startJPot(){
2198 if(betsJPot.length >= 2 && Object.keys(usersJPot).length > 1){
2199 if(stageJPot == 'WAIT'){
2200 stageJPot = 'STARTED';
2201 var timerJPot = timeJPot;
2202
2203 var intJPot = setInterval(function(){
2204 if(timerJPot >= 0){
2205 io.sockets.emit('message', {
2206 type: 'setTimesJPot',
2207 text: timerJPot+'s',
2208 start: true,
2209 width: widthJPot
2210 });
2211
2212 widthJPot -= minusWJPot;
2213 timerJPot--;
2214 }else{
2215 clearInterval(intJPot);
2216 stageJPot = 'PICKING';
2217
2218 io.sockets.emit('message', {
2219 type: 'setTimesJPot',
2220 text: 'Picking winner!',
2221 start: false
2222 });
2223
2224 setTimeout(function(){
2225 pickingWinnerJPot();
2226 },4000);
2227 }
2228 }, 1000);
2229 }
2230 }
2231}
2232
2233function pickingWinnerJPot(){
2234 var nameWinner;
2235 var steamidWinner;
2236 var avatarWinner;
2237
2238 var winnerTick = getRandomInt(1, currentlyTick);
2239
2240 if(betsJPot.length > 0){
2241 betsJPot.forEach(function(itm){
2242 if((winnerTick >= itm.tick1) && (winnerTick <= itm.tick2)){
2243 nameWinner = itm.name;
2244 steamidWinner = itm.user;
2245 avatarWinner = itm.avatar;
2246 }
2247 });
2248 }
2249
2250 var arrayAvatars = getAvatarsWin(avatarWinner, betsJPot, currentlyTick);
2251
2252 io.sockets.emit('message', {
2253 type: 'rollJackpot',
2254 avatars: arrayAvatars
2255 });
2256
2257 setTimeout(function(){
2258 io.sockets.emit('message', {
2259 type: 'setTimesJPot',
2260 text: 'The winner is '+nameWinner+' ('+steamidWinner+') | Ticket: '+winnerTick+'!',
2261 start: false
2262 });
2263
2264 query('UPDATE `users` SET `balance`=`balance`+'+parseInt(totalJPot)+' WHERE `steamid`='+pool.escape(steamidWinner));
2265 getBalance(steamidWinner, io.sockets.in(steamidWinner));
2266
2267 //ARRAY TOTAL PLAYERS, AMOUNTS AND TICKETS
2268 var arrayPlayers = [];
2269 var arrayAmounts = [];
2270 var arrayTickets = [];
2271
2272 if(betsJPot.length > 0){
2273 betsJPot.forEach(function(itm){
2274 arrayPlayers.push(itm.user);
2275 arrayAmounts.push(itm.amount);
2276 arrayTickets.push(itm.tick1+'-'+itm.tick2);
2277 });
2278 }
2279
2280 arrayPlayers = arrayPlayers.join('/');
2281 arrayAmounts = arrayAmounts.join('/');
2282 arrayTickets = arrayTickets.join('/');
2283
2284 var chanceWin = parseFloat(100 * amountJPot[steamidWinner] / totalJPot).toFixed(2);
2285
2286 //ADD HISTORY JACKPOT
2287 query('INSERT INTO `jackpot` SET `winner` = '+pool.escape(steamidWinner)+', `ticketwinner` = '+pool.escape(winnerTick)+', `chance` = '+pool.escape(chanceWin)+', `players` = '+pool.escape(arrayPlayers)+', `amounts` = '+pool.escape(arrayAmounts)+', `tickets` = '+pool.escape(arrayTickets)+', `hash` = '+pool.escape(getHash("JACKPOT", jackpotId))+', `amount` = '+pool.escape(totalJPot), function(err3, row3) {
2288 if(err3) {
2289 logger.error('Error in DB');
2290 logger.debug(err);
2291 return;
2292 }
2293
2294 jackpotId = row3.insertId + 1;
2295 });
2296
2297 io.sockets.in(steamidWinner).emit('message', {
2298 type: 'alert',
2299 alert: 'You won '+totalJPot+' at this jackpot with ticket '+winnerTick+'! Hash: '+terminatingHash
2300 });
2301
2302 setTimeout(function(){
2303 lastWinnerJP = {steamid: steamidWinner, name: nameWinner, avatar: avatarWinner, chance: chanceWin, coins: totalJPot};
2304
2305 stageJPot = 'WAIT';
2306 widthJPot = 100;
2307
2308 usersJPot = {};
2309 amountJPot = {};
2310 betsJPot = [];
2311 totalJPot = 0;
2312 currentlyTick = 0;
2313
2314 io.sockets.emit('message', {
2315 type: 'resetJPot'
2316 });
2317 io.sockets.emit('message', {
2318 type: 'setTimesJPot',
2319 text: 'Waiting for players...',
2320 start: false
2321 });
2322 io.sockets.emit('message', {
2323 type: 'lastWinnerJP',
2324 last: lastWinnerJP
2325 });
2326 },5000);
2327 },10300);
2328}
2329/* END JACKPOT */
2330
2331
2332
2333
2334
2335
2336
2337
2338/* GIVEAWAY */
2339var userJoin = {};
2340var usersEntered = [];
2341var giveawayState = 1;
2342var lastWinnerGiveaway = {steamid: 0, name: 'None', avatar: 'http://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb.jpg'};
2343var timerGAWAY;
2344startGiveaway();
2345
2346function startGiveaway() {
2347 userJoin = {};
2348 usersEntered = [];
2349
2350 giveawayState = 0;
2351 logger.trace('Starting Giveaway');
2352 timerGAWAY = timeGiveaway * 3600;
2353
2354 io.sockets.emit('message', {
2355 type: 'timerGiveaway',
2356 mod: 'timer',
2357 time: timerGAWAY,
2358 last: lastWinnerGiveaway
2359 });
2360
2361 var timerGA = setInterval(function() {
2362 if (timerGAWAY == -2) {
2363 clearInterval(timerGA);
2364
2365 giveawayState = 1;
2366 logger.trace('Pick Winner');
2367 io.sockets.emit('message', {
2368 type: 'timerGiveaway',
2369 mod: 'else',
2370 subiect: 'Picking Winner'
2371 });
2372
2373 if(usersEntered.length > 0){
2374 getWinnerGiveaway();
2375 }else{
2376 io.sockets.emit('message', {
2377 type: 'timerGiveaway',
2378 mod: 'else',
2379 subiect: 'No players entered in giveaway'
2380 });
2381 setTimeout(function() {
2382 startGiveaway();
2383 }, 3000);
2384 }
2385 }
2386 timerGAWAY--;
2387 }, 1000);
2388}
2389function getWinnerGiveaway(){
2390 var array = usersEntered[Math.floor(Math.random() * usersEntered.length)];
2391 var nameWinner = array['name'];
2392 var steamidWinner = array['user'];
2393 var avatarWinner = array['avatar'];
2394
2395 setTimeout(function() {
2396 logger.trace('The Winner Giveaway is '+nameWinner+' ('+steamidWinner+')');
2397 lastWinnerGiveaway = {steamid: steamidWinner, name: nameWinner, avatar: avatarWinner};
2398 query('UPDATE `users` SET `balance`=`balance` + '+parseInt(amountGiveaway)+' WHERE `steamid` = '+pool.escape(steamidWinner));
2399
2400 getBalance(steamidWinner, io.sockets.in(steamidWinner));
2401
2402 io.sockets.emit('message', {
2403 type: 'timerGiveaway',
2404 mod: 'winner',
2405 subiect: {
2406 name: nameWinner,
2407 user: steamidWinner
2408 }
2409 });
2410 query('INSERT INTO `giveaway` SET `winner` = '+pool.escape(steamidWinner)+', `name` = '+pool.escape(nameWinner)+', `hash` = '+pool.escape(getHash("GIVEAWAY", time()+nameWinner))+', `amount` = '+pool.escape(amountGiveaway), function(err3, row3) {
2411 if(err3) {
2412 logger.error('Error in DB');
2413 logger.debug(err);
2414 return;
2415 }
2416 });
2417 setTimeout(function() {
2418 io.sockets.emit('message', {
2419 type: 'removeQGiveaway'
2420 });
2421 startGiveaway();
2422 }, 7000);
2423 }, 3000);
2424}
2425function joinInGiveaway(user, socket) {
2426 if(giveawayState == 1) {
2427 socket.emit('message', {
2428 type: 'error',
2429 enable: true,
2430 error: 'Error: Wait for starting giweaway!'
2431 });
2432 return;
2433 }
2434 if((userJoin[user.steamid] !== undefined) && (userJoin[user.steamid] == 1)) {
2435 socket.emit('message', {
2436 type: 'error',
2437 enable: true,
2438 error: 'Error: You have already joined in giveawey!'
2439 });
2440 return;
2441 }
2442 if(userJoin[user.steamid] === undefined) {
2443 userJoin[user.steamid] = 1;
2444 }
2445 io.sockets.emit('message', {
2446 type: 'joinGiveaway',
2447 player: {
2448 avatar: user.avatar,
2449 steamid: user.steamid,
2450 name: user.name
2451 }
2452 });
2453 usersEntered.push({
2454 avatar: user.avatar,
2455 name: user.name,
2456 user: user.steamid
2457 });
2458 logger.debug('Join In Giveaway confirmed user: '+pool.escape(user.steamid));
2459}
2460/* END GIVEAWAY */
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471/* MINESWEEPER */
2472var usersMines = {};
2473var gamesMines = {};
2474
2475function playMines(m, user, socket){
2476 if((usersMines[user.steamid] !== undefined) && (usersMines[user.steamid] == 1)) {
2477 socket.emit('message', {
2478 type: 'error',
2479 mtype: 'mines',
2480 btype: 'play',
2481 enable: true,
2482 error: 'Error: You\'ve already started a game!'
2483 });
2484 return;
2485 }
2486
2487 if((m.amount < minbet) || (m.amount > maxbet)) {
2488 socket.emit('message', {
2489 type: 'error',
2490 mtype: 'mines',
2491 btype: 'play',
2492 enable: true,
2493 error: 'Error: Invalid bet amount ['+minbet+'-'+maxbet+']!'
2494 });
2495 return;
2496 }
2497
2498 if(m.bombs < 1 || m.bombs > 24) {
2499 socket.emit('message', {
2500 type: 'error',
2501 mtype: 'mines',
2502 btype: 'play',
2503 enable: true,
2504 error: 'Error: Invalid bombs amount [1-24]!'
2505 });
2506 logger.warn(user.steamid+' try to cheating to MINESWEEPER BOMBS_AMOUNT_1');
2507 return;
2508 }
2509
2510 if(/(a|b|c|d|e|f|g|h|j|i|k|l|m|n|o|p|q|r|s|t|v|u|w|x|y|z)/.exec(m.amount)) {
2511 socket.emit('message', {
2512 type: 'error',
2513 mtype: 'mines',
2514 btype: 'play',
2515 enable: true,
2516 error: 'Error: Invalid bet amount!'
2517 });
2518 logger.warn(user.steamid+' try to cheating to MINESWEEPER BET_AMOUNT');
2519 return;
2520 }
2521
2522 if(/(a|b|c|d|e|f|g|h|j|i|k|l|m|n|o|p|q|r|s|t|v|u|w|x|y|z)/.exec(m.bombs)) {
2523 socket.emit('message', {
2524 type: 'error',
2525 mtype: 'mines',
2526 btype: 'play',
2527 enable: true,
2528 error: 'Error: Invalid bombs amount!'
2529 });
2530 logger.warn(user.steamid+' try to cheating to MINESWEEPER BOMBS_AMOUNT_2');
2531 return;
2532 }
2533
2534 var start_time = new Date();
2535 query('SELECT `balance`, `countDeposits` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
2536 if((err) || (!row.length)) {
2537 logger.error('Failed to find DB');
2538 logger.debug(err);
2539 socket.emit('message', {
2540 type: 'error',
2541 mtype: 'mines',
2542 btype: 'play',
2543 enable: true,
2544 error: 'Error: You are not DB!'
2545 });
2546 return;
2547 }
2548
2549 if(row[0].balance >= m.amount) {
2550 query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
2551 if(err2) {
2552 logger.error('Error in withdraw');
2553 logger.debug(err2);
2554 socket.emit('message', {
2555 type: 'error',
2556 mtype: 'mines',
2557 btype: 'play',
2558 enable: true,
2559 error: 'Error: You dont have enough points!'
2560 });
2561 return;
2562 }
2563
2564 if(row[0].countDeposits >= 1) query('UPDATE `users` SET `available` = `available` + '+parseInt(m.amount / 3)+' WHERE `steamid` = '+pool.escape(user.steamid));
2565 if(row[0].countDeposits >= 0) query('UPDATE `users` SET `bets` = `bets` + '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid));
2566
2567 query('INSERT INTO `minesbets` SET `user` = '+pool.escape(user.steamid)+', `amount` = '+pool.escape(m.amount)+', `amountBombs` = '+pool.escape(m.bombs), function(err3, row3) {
2568 if(err3) {
2569 logger.error('Error in DB');
2570 logger.debug(err);
2571 return;
2572 }
2573
2574 usersMines[user.steamid] = 1;
2575
2576 gamesMines[user.steamid] = {
2577 bombs: m.bombs,
2578 amount: m.amount,
2579 amountWin: m.amount,
2580 bombsWin: [],
2581 sums: getArraySums(parseInt((m.amount * m.bombs) / (25 - m.bombs)), (25 - m.bombs)),
2582 bombsLose: getArrayBombs(m.bombs),
2583 cashout: false,
2584 lose: false,
2585 id: row3.insertId
2586 };
2587
2588 if (gamesMines[user.steamid]['sums'][0] > 100000) {
2589 gamesMines[user.steamid]['amountWin'] = 0;
2590 socket.emit('message', {
2591 type: 'newMines',
2592 stake: '0',
2593 next: '0',
2594 });
2595 }
2596
2597 socket.emit('message', {
2598 type: 'newMines',
2599 stake: gamesMines[user.steamid]['amountWin'],
2600 next: gamesMines[user.steamid]['sums'][0],
2601 });
2602
2603 logger.debug('Mines Bet confirmed #'+row3.insertId+' | Amount: '+m.amount+' | Bombs: '+m.bombs+' | User: '+pool.escape(user.steamid));
2604
2605 getBalance(user.steamid, socket);
2606 });
2607 });
2608 } else {
2609 socket.emit('message', {
2610 type: 'error',
2611 mtype: 'mines',
2612 btype: 'play',
2613 enable: true,
2614 error: 'Error: You dont have any money!'
2615 });
2616 }
2617 });
2618}
2619
2620function cashoutMines(user, socket){
2621 if(gamesMines[user.steamid]['cashout']){
2622 socket.emit('message', {
2623 type: 'error',
2624 mtype: 'mines',
2625 btype: 'cashout',
2626 enable: true,
2627 error: 'Error: The already cashout!'
2628 });
2629 return;
2630 }
2631
2632 if(gamesMines[user.steamid]['lose']){
2633 socket.emit('message', {
2634 type: 'error',
2635 mtype: 'mines',
2636 btype: 'cashout',
2637 enable: true,
2638 error: 'Error: The game is already ended!'
2639 });
2640 return;
2641 }
2642
2643 if(gamesMines[user.steamid]['bombsWin'].length == 0){
2644 socket.emit('message', {
2645 type: 'error',
2646 mtype: 'mines',
2647 btype: 'cashout',
2648 enable: true,
2649 error: 'Error: You need to play one time to withdraw your winnings!'
2650 });
2651 return;
2652 }
2653
2654 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(gamesMines[user.steamid]['amountWin'])+' WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
2655 if(err) {
2656 logger.error('Error in withdraw');
2657 logger.debug(err);
2658 socket.emit('message', {
2659 type: 'error',
2660 mtype: 'mines',
2661 btype: 'cashout',
2662 enable: true,
2663 error: 'Error: You dont have enough points!'
2664 });
2665 return;
2666 }
2667
2668 socket.emit('message', {
2669 type: 'cashoutMines'
2670 });
2671
2672 socket.emit('message', {
2673 type: 'getBomb',
2674 mtype: 'lose',
2675 buttons: gamesMines[user.steamid]['bombsLose']
2676 });
2677
2678 query('UPDATE `minesbets` SET `bombsWin` = '+pool.escape(gamesMines[user.steamid]['bombsWin'].join('/'))+', `bombsLose` ='+pool.escape(gamesMines[user.steamid]['bombsLose'].join('/'))+', `enable` = 1, `win` = '+parseInt(gamesMines[user.steamid]['amountWin'])+', `hash` = '+pool.escape(getHash("MINESWEEPER", gamesMines[user.steamid]['id']))+' WHERE `id` = '+pool.escape(gamesMines[user.steamid]['id']));
2679
2680 usersMines[user.steamid] = 0;
2681 gamesMines[user.steamid]['cashout'] = true;
2682 gamesMines[user.steamid]['amountWin'] = 0;
2683
2684 getBalance(user.steamid, socket);
2685 });
2686
2687 io.sockets.emit('message', {
2688 type: 'refMines'
2689 });
2690}
2691
2692function getBombMines(m, user, socket){
2693 if((usersMines[user.steamid] == undefined) || (usersMines[user.steamid] == 0)) {
2694 socket.emit('message', {
2695 type: 'error',
2696 mtype: 'mines',
2697 btype: 'bombs',
2698 bomb: m.bomb,
2699 enable: true,
2700 error: 'Error: The game is not started!'
2701 });
2702 return;
2703 }
2704
2705 if(gamesMines[user.steamid]['lose']){
2706 socket.emit('message', {
2707 type: 'error',
2708 mtype: 'mines',
2709 btype: 'bombs',
2710 bomb: m.bomb,
2711 enable: true,
2712 error: 'Error: The game is ended!'
2713 });
2714 return;
2715 }
2716
2717 if(/(a|b|c|d|e|f|g|h|j|i|k|l|m|n|o|p|q|r|s|t|v|u|w|x|y|z)/.exec(m.bomb)) {
2718 socket.emit('message', {
2719 type: 'error',
2720 mtype: 'mines',
2721 btype: 'bombs',
2722 bomb: m.bomb,
2723 enable: true,
2724 error: 'Error: Invalid bomb!'
2725 });
2726 logger.warn(user.steamid+' try to cheating to MINESWEEPER PRESBOMB_1');
2727 return;
2728 }
2729
2730 if(m.bomb < 1 || m.bomb > 25) {
2731 logger.warn(user.steamid+' try to cheating to MINESWEEPER PRESBOMB_2');
2732 return;
2733 }
2734
2735 for(var x = 0; x <= gamesMines[user.steamid]['bombsWin'].length; x++){
2736 if(gamesMines[user.steamid]['bombsWin'][x] == m.bomb){
2737 socket.emit('message', {
2738 type: 'error',
2739 mtype: 'mines',
2740 btype: 'bombs',
2741 bomb: m.bomb,
2742 enable: true,
2743 error: 'Error: You already pressed this button!'
2744 });
2745 return;
2746 }
2747 }
2748
2749 var bombWin = false;
2750 for(var y = 0; y <= gamesMines[user.steamid]['bombsLose'].length; y++){
2751 if(gamesMines[user.steamid]['bombsLose'][y] == m.bomb) bombWin = true;
2752 }
2753 var sumWin = gamesMines[user.steamid]['sums'][gamesMines[user.steamid]['bombsWin'].length];
2754
2755 if(bombWin){
2756 gamesMines[user.steamid]['lose'] = true;
2757 gamesMines[user.steamid]['amountWin'] = 0;
2758 usersMines[user.steamid] = 0;
2759 socket.emit('message', {
2760 type: 'getBomb',
2761 mtype: 'lose',
2762 buttons: gamesMines[user.steamid]['bombsLose']
2763 });
2764
2765 var crypto = require('crypto');
2766 var serverSeed = 'MINES'+gamesMines[user.steamid]['id'];
2767 var genGameHash = function(serverSeed) {
2768 return crypto.createHash('sha256').update(serverSeed).digest('hex');
2769 };
2770 var terminatingHash = genGameHash(serverSeed);
2771
2772 query('UPDATE `minesbets` SET `bombDefuse` = '+m.bomb+', `bombsWin` = '+pool.escape(gamesMines[user.steamid]['bombsWin'].join('/'))+', `bombsLose` ='+pool.escape(gamesMines[user.steamid]['bombsLose'].join('/'))+', `enable` = 1, `hash` = '+pool.escape(terminatingHash)+' WHERE `id` = '+pool.escape(gamesMines[user.steamid]['id']));
2773
2774 io.sockets.emit('message', {
2775 type: 'refMines'
2776 });
2777 }else{
2778 gamesMines[user.steamid]['bombsWin'].push(m.bomb);
2779 gamesMines[user.steamid]['amountWin'] += sumWin
2780 socket.emit('message', {
2781 type: 'getBomb',
2782 mtype: 'win',
2783 buttons: m.bomb,
2784 stake: gamesMines[user.steamid]['amountWin'],
2785 next: gamesMines[user.steamid]['sums'][gamesMines[user.steamid]['bombsWin'].length],
2786 amount: sumWin,
2787 new: true
2788 });
2789 }
2790}
2791
2792function getArraySums(sum, bombs){
2793 var array = [];
2794 var cSums = 0
2795 while(cSums < bombs){
2796 array.push(sum);
2797 cSums++;
2798 }
2799
2800 var xSum = parseInt(sum / array.length);
2801
2802 for(var i = 0; i < array.length; i++){
2803 if(i <= parseInt(array.length / 2)){
2804 array[i] -= (xSum * (parseInt(array.length / 2) - i));
2805 }else{
2806 array[i] += (xSum * (i - parseInt(array.length / 2)));
2807 }
2808 }
2809 return array;
2810}
2811
2812function getArrayBombs(bombs){
2813 var totalBombs = bombs
2814 var cBomb = 0;
2815 var array = [];
2816 while(cBomb < totalBombs){
2817 array.push(getNRRR());
2818 cBomb++;
2819 }
2820 function getNRRR(){
2821 var nr = getRandomInt(1, 25);
2822 var i;
2823 for(i = 0;i <= array.length;i++){
2824 if(array[i] == nr) return getNRRR();
2825 }
2826 return nr;
2827 }
2828 return array;
2829}
2830/* END MINESWEEPER */
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843/* ROULETTE */
2844var accept = timerRoulette + 1; //WAIT TIME
2845var wait = 10; //ROLLING TIME
2846var br = 3;
2847var q1 = 2;
2848var q2 = 14;
2849var timer = -1;
2850var users = {};
2851var roll = 0;
2852var currentBets = [];
2853var historyRolls = [];
2854var historyRolls100 = [];
2855var usersBr = {};
2856var usersAmount = {};
2857var currentSums = {
2858 '0-0': 0,
2859 '1-7': 0,
2860 '8-14': 0
2861};
2862var roundedHash = null;
2863var currentRollid = 0;
2864var pause = false;
2865var hash = '';
2866var countRLogs = 0;
2867var sh = '';
2868
2869loadHistory();
2870checkTimer();
2871
2872function setBet(m, user, socket) {
2873 var betColor;
2874
2875 if((usersBr[user.steamid] !== undefined) && (usersBr[user.steamid] == br)) {
2876 socket.emit('message', {
2877 type: 'error',
2878 mtype: 'roulette',
2879 enable: true,
2880 error: 'Error: You\'ve already placed '+usersBr[user.steamid]+'/'+br+' bets this roll!'
2881 });
2882 return;
2883 }
2884
2885 if((m.amount < minbet) || (m.amount > maxbet)) {
2886 socket.emit('message', {
2887 type: 'error',
2888 mtype: 'roulette',
2889 enable: true,
2890 error: 'Error: Invalid bet amount ['+minbet+'-'+maxbet+']!'
2891 });
2892 return;
2893 }
2894
2895 if(m.lower == 1 && m.upper == 7) {
2896 betColor = 'red';
2897 }else if(m.lower == 8 && m.upper == 14) {
2898 betColor = 'black'
2899 }else if(m.lower == 0 && m.upper == 0) {
2900 betColor = 'green';
2901 }else {
2902 logger.warn(user.steamid+' try to cheating to ROULETTE COLOR');
2903 return;
2904 }
2905
2906 if(/(a|b|c|d|e|f|g|h|j|i|k|l|m|n|o|p|q|r|s|t|v|u|w|x|y|z)/.exec(m.amount)) {
2907 socket.emit('message', {
2908 type: 'error',
2909 mtype: 'roulette',
2910 enable: true,
2911 error: 'Error: Invalid bet amount!'
2912 });
2913 logger.warn(user.steamid+' try to cheating to ROULETTE BET_AMOUNT');
2914 return;
2915 }
2916
2917 if(pause) {
2918 socket.emit('message', {
2919 type: 'error',
2920 enable: false,
2921 error: 'Error: Betting for this round is closed!'
2922 });
2923 return;
2924 }
2925
2926 var start_time = new Date();
2927 query('SELECT `balance`, `countDeposits`, `bets` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
2928 if((err) || (!row.length)) {
2929 logger.error('Failed to find DB');
2930 logger.debug(err);
2931 socket.emit('message', {
2932 type: 'error',
2933 mtype: 'roulette',
2934 enable: true,
2935 error: 'Error: You are not DB!'
2936 });
2937 return;
2938 }
2939
2940 var n = parseFloat(row[0].bets % Math.pow(10, 3));
2941 var xx = ((parseInt((row[0].bets - n)/xpPerLevel))*xpPerLevel);
2942 var levelA = xx/xpPerLevel;
2943
2944 if(row[0].balance >= m.amount) {
2945 query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
2946 if(err2) {
2947 logger.error('Error in withdraw');
2948 logger.debug(err2);
2949 socket.emit('message', {
2950 type: 'error',
2951 mtype: 'roulette',
2952 enable: true,
2953 error: 'Error: You dont have enough points!'
2954 });
2955 return;
2956 }
2957
2958 if(row[0].countDeposits >= 1) query('UPDATE `users` SET `available` = `available` + '+parseInt(m.amount / 3)+' WHERE `steamid` = '+pool.escape(user.steamid));
2959 if(row[0].countDeposits >= 0) query('UPDATE `users` SET `bets` = `bets` + '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid));
2960
2961 query('INSERT INTO `bets` SET `user` = '+pool.escape(user.steamid)+', `amount` = '+pool.escape(m.amount)+', `lower` = '+pool.escape(m.lower)+', `upper` = '+pool.escape(m.upper), function(err3, row3) {
2962 if(err3) {
2963 logger.error('Error in DB');
2964 logger.debug(err3);
2965 return;
2966 }
2967 var end = new Date();
2968 if(usersBr[user.steamid] === undefined) {
2969 usersBr[user.steamid] = 1;
2970 } else {
2971 usersBr[user.steamid]++;
2972 }
2973 if(usersAmount[user.steamid] === undefined) {
2974 usersAmount[user.steamid] = {
2975 '0-0': 0,
2976 '1-7': 0,
2977 '8-14': 0
2978 };
2979 }
2980 usersAmount[user.steamid][m.lower+'-'+m.upper] += parseInt(m.amount);
2981 currentSums[m.lower+'-'+m.upper] += m.amount;
2982 socket.emit('message', {
2983 type: 'betconfirm',
2984 bet: {
2985 betid: row3.insertId,
2986 lower: m.lower,
2987 upper: m.upper,
2988 amount: usersAmount[user.steamid][m.lower+'-'+m.upper]
2989 },
2990 mybr: usersBr[user.steamid],
2991 br: br,
2992 exec: (end.getTime()-start_time.getTime()).toFixed(3)
2993 });
2994 users[user.steamid].balance = row[0].balance-m.amount;
2995 io.sockets.emit('message', {
2996 type: 'bet',
2997 bet: {
2998 level: levelA,
2999 amount: m.amount,
3000 betid: row3.insertId,
3001 icon: user.avatar,
3002 lower: m.lower,
3003 name: user.name,
3004 upper: m.upper,
3005 user: user.steamid,
3006 won: null
3007 },
3008 sums: {
3009 0: currentSums['0-0'],
3010 1: currentSums['1-7'],
3011 2: currentSums['8-14']
3012 }
3013 });
3014 currentBets.push({
3015 amount: m.amount,
3016 betid: row3.insertId,
3017 icon: user.avatar,
3018 lower: m.lower,
3019 upper: m.upper,
3020 name: user.name,
3021 user: user.steamid,
3022 level: levelA
3023 });
3024
3025 logger.debug('Bet #'+row3.insertId+' with amount: '+m.amount);
3026
3027 getBalance(user.steamid, socket);
3028 });
3029 });
3030 } else {
3031 socket.emit('message', {
3032 type: 'error',
3033 mtype: 'roulette',
3034 enable: true,
3035 error: 'Error: You dont have any money!'
3036 });
3037 }
3038 });
3039}
3040function checkTimer() {
3041 if((timer == -1) && (!pause)) {
3042 logger.trace('Starting roulette');
3043 timer = accept+wait;
3044
3045 sh = sha256('CSGOWitch69' + time() + '-' + Math.floor(Math.random() * (690 - 1 + 1)) + 1);
3046 roundedHash = sh;
3047
3048 timerID = setInterval(function() {
3049 if((timer-wait)%5 == 0 && timer-wait >= 0) {
3050 logger.trace('Timer roulette: '+(timer-wait)+'!');
3051 }
3052
3053 if(timer-wait >= 0){
3054 io.sockets.emit('message', {
3055 type: 'timeRoulette',
3056 time: timer-wait
3057 });
3058 }
3059
3060 if (timer == wait) {
3061 pause = true;
3062 logger.trace('Rolling roulette!');
3063
3064
3065 }
3066
3067 if (timer == wait-2) {
3068 toWin();
3069 }
3070
3071 if(timer == 0) {
3072 logger.trace('New round to roullete!');
3073
3074 sh = sha256('CSGOWitch69' + time() + '-' + Math.floor(Math.random() * (690 - 1 + 1)) + 1);
3075 roundedHash = sh;
3076
3077 io.sockets.emit('message', {
3078 type: 'roundedHash',
3079 roundedHash: roundedHash
3080 });
3081
3082 historyRolls.push({id: currentRollid, roll: roll});
3083 if(historyRolls.length > 10) historyRolls.slice(1);
3084
3085 historyRolls100.push(roll);
3086 if(historyRolls100.length > 100) historyRolls100.shift();
3087
3088 io.sockets.emit('message', {
3089 type: '100rolls',
3090 rolls: historyRolls100
3091 });
3092
3093 timer = accept+wait;
3094 currentBets = [];
3095 usersBr = {};
3096 usersAmount = {};
3097 currentSums = {
3098 '0-0': 0,
3099 '1-7': 0,
3100 '8-14': 0
3101 };
3102 pause = false;
3103 }
3104 timer--;
3105 }, 1000);
3106 }
3107}
3108
3109function toWin() {
3110 var lottery = time();
3111 var secret = makeCode();
3112
3113 roll = getRoll(sh, secret, lottery);
3114
3115 logger.trace('[Roulette] --> Round hash: ' + sh + ', Lottery: ' + lottery + ', Secret: ' + secret + ', Rolling: ' + roll);
3116
3117 io.sockets.emit('message', {
3118 type: 'roundedSecret',
3119 roundedSecret: secret
3120 });
3121
3122 query('INSERT INTO `rolls` SET `roll` = '+pool.escape(roll)+', `hash` = '+pool.escape(sh)+', `secret` = '+pool.escape(secret)+', `lottery` = '+pool.escape(lottery), function(err, row){
3123 currentRollid = row.insertId;
3124
3125 var r = '';
3126 var s = 0;
3127 var wins = {
3128 '0-0': 0,
3129 '1-7': 0,
3130 '8-14': 0
3131 };
3132 if(roll == 0) {
3133 r = '0-0';
3134 s = q2;
3135 wins['0-0'] = currentSums['0-0']*s;
3136 }
3137 if((roll > 0) && (roll < 8)) {
3138 r = '1-7';
3139 s = q1;
3140 wins['1-7'] = currentSums['1-7']*s;
3141 }
3142 if((roll > 7) && (roll < 15)) {
3143 r = '8-14';
3144 s = q1;
3145 wins['8-14'] = currentSums['8-14']*s;
3146 }
3147
3148 for(key in users) {
3149 if(usersAmount[key] === undefined) {
3150 var balance = null;
3151 var won = 0;
3152 } else {
3153 var balance = parseInt(users[key].balance)+usersAmount[key][r]*s;
3154 var won = usersAmount[key][r]*s;
3155 }
3156 if (io.sockets.connected[users[key].socket]) {
3157 io.sockets.connected[users[key].socket].emit('message', {
3158 balance: balance,
3159 nets: [{
3160 lower: 0,
3161 samount: currentSums['0-0'],
3162 swon: wins['0-0'],
3163 upper: 0
3164 }, {
3165 lower: 1,
3166 samount: currentSums['1-7'],
3167 swon: wins['1-7'],
3168 upper: 7
3169 }, {
3170 lower: 8,
3171 samount: currentSums['8-14'],
3172 swon: wins['8-14'],
3173 upper: 14
3174 }
3175 ],
3176 roll: roll,
3177 rollid: currentRollid,
3178 type: "roll",
3179 wait: wait-2,
3180 won: won
3181 });
3182 }
3183 }
3184 if(currentBets.length > 0){
3185 currentBets.forEach(function(itm) {
3186 if((roll >= itm.lower) && (roll <= itm.upper)) {
3187 logger.debug('Bet id #'+itm.betid+' amount '+itm.amount+' win '+(itm.amount*s)+'(x'+s+');');
3188 query('UPDATE `users` SET `balance` = `balance` + '+itm.amount*s+' WHERE `steamid` = '+pool.escape(itm.user));
3189 users[itm.user].balance += itm.amount*s;
3190 }
3191 });
3192 }
3193 });
3194}
3195
3196function loadHistory() {
3197 query('SELECT * FROM `rolls` ORDER BY `id` DESC LIMIT 10', function(err, row) {
3198 if(err) {
3199 logger.error('Cant load betting history - 10 bets');
3200 logger.debug(err);
3201 }
3202 logger.trace('Sucesfully updated history');
3203 for(var i = row.length - 1; i >= 0; i--){
3204 historyRolls.push(row[i]);
3205 }
3206 });
3207 query('SELECT * FROM `rolls` ORDER BY `id` DESC LIMIT 100', function(err, row) {
3208 if(err) {
3209 logger.error('Cant load betting history - 100 bets');
3210 logger.debug(err);
3211 }
3212 for(var i = row.length - 1; i >= 0; i--){
3213 historyRolls100.push(row[i].roll);
3214 }
3215 });
3216}
3217/* END ROULETTE */
3218
3219
3220
3221
3222/* BOTS*/
3223
3224
3225function addBots() {
3226 IntervalBetuireBoti = setInterval(function () {
3227 if(CurrentTimesForBotsToBet != TimesForBotsToBet) {
3228 setBetBots();
3229 setBetBots();
3230 CurrentTimesForBotsToBet;
3231 }
3232 }, IntervalDeBetuireBoti);
3233}
3234
3235function ChatsBots() {
3236 IntervalChatBotii = setInterval(function () {
3237 addChatBots();
3238 addChatBots();
3239 }, TimeOfBotsChatting);
3240}
3241
3242function addChatBots() {
3243 var botID = Math.floor(Math.random() * (20 - 1 + 1)) + 1;
3244
3245 var Messages = ["Hello, dudes! All in green.", "Fuck this website, I lost all!", "omfggggg...", "that was almost dudeeee", "no way, I am giving up!", "Hello? I will win.", "ezzz", "idinahuij", "kurwa site dah", "omgggg", "scam site reported i lost allz my coins", "omfgg, who is the owner. iwant items back...", "I can predict all!!", "Red now!!!", "Blackkkkk", "black 9/2", "izi pizi green", "nooooooo", "fuckkk my life", "Moderator ban me pls, I hate this website", "omfggg, are you idiot!?!","what the fuck|?!!", "ggez I am god!!", " No problem my friend."];
3246
3247 pickBot(botID);
3248
3249 var STEAMID = 1337+botID;
3250 var RandomMessage = Math.floor(Math.random() * (Messages.length - 1 + 1)) + 1;
3251
3252 io.sockets.emit('message', {
3253 type: 'chat',
3254 msg: Messages[RandomMessage],
3255 name: BotBetName,
3256 icon: BotBetAvatar,
3257 user: '',
3258 rank: '0',
3259 verify: '0',
3260 lang: '1',
3261 hide: '1'
3262 });
3263}
3264
3265function pickBot(botID){
3266 if(botID == 1) {
3267 BotBetName = "AlexCRZ";
3268 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/13/13641a9fc24377a85b18f0b0d56e04cdb75a1715.jpg";
3269 }else if(botID == 2) {
3270 BotBetName = "mARIO";
3271 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/6f/6fc1b305a307efc12fc6a2f9b18c1fd4510b5684.jpg";
3272 }else if(botID == 3) {
3273 BotBetName = "KennyS"
3274 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/ad/ad4729c5155426dbda96603113c2b35770f8ed48.jpg";
3275 }else if(botID == 4) {
3276 BotBetName = "FigarooOS";
3277 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/8e/8ec6eb5e66ee0b1bca7eed597bc1ad73f9c499fb.jpg";
3278 }else if(botID == 5) {
3279 BotBetName = "Afanasi";
3280 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/a6/a6c5e3e856d4b8313a6ea19d4c7771da68d7abda.jpg";
3281 }else if(botID == 6) {
3282 BotBetName = "AnomaliCR";
3283 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/34/345a94183ba1f34903b5df7fe26156af0002f754.jpg";
3284 }else if(botID == 7) {
3285 BotBetName = "CZArina";
3286 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/3c/3c75462f4636237febefa17eceda3d9a8a90389d.jpg";
3287 }else if(botID == 8) {
3288 BotBetName = "Egorr";
3289 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/75/75a3407bcdc1ddf3075afc5b6b462b15e7dada1a.jpg";
3290 }else if(botID == 9) {
3291 BotBetName = "Fabii";
3292 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/be/be7f486e6b6c793c52e4b8b6d931a4446e40d71f.jpg";
3293 }else if(botID == 10) {
3294 BotBetName = "Isidor";
3295 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/f7/f72df2f71afb5c78340bc8866654e5068f322058.jpg";
3296 }else if(botID == 11) {
3297 BotBetName = "Parse";
3298 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/9c/9c40f22a8e697192d26b3cd87fad97007a58f345.jpg";
3299 }else if(botID == 12) {
3300 BotBetName = "Kiska";
3301 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/6d/6dc7e194419cc4445e569c343036d0c676832de7.jpg";
3302 }else if(botID == 13) {
3303 BotBetName = "Lila";
3304 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/09/099eb9d4f33acaf7da0cc36f395cc076f6a44070.jpg";
3305 }else if(botID == 14) {
3306 BotBetName = "Ionutz";
3307 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb.jpg";
3308 }else if(botID == 15) {
3309 BotBetName = "Hacki";
3310 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/07/07afc9a0d3746804964eba6043245e68299476c5.jpg";
3311 }else if(botID == 16) {
3312 BotBetName = "Killer";
3313 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/35/3558f1dc05717b57b43eca40cfa963407c6705eb.jpg";
3314 }else if(botID == 17) {
3315 BotBetName = "Milfanos";
3316 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/01/0136e6775252a869ba6da0f9c4eec09fad46760f.jpg";
3317 }else if(botID == 18) {
3318 BotBetName = "PicardoSX";
3319 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/10/10ac70b49140bdd4471f806bdc092f47d87aa109.jpg";
3320 }else if(botID == 19) {
3321 BotBetName = "Mauritzo";
3322 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/cb/cbd22949661f9aa88afe60b7603b0faf02725135.jpg";
3323 }else if(botID == 20) {
3324 BotBetName = "FindNextTab";
3325 BotBetAvatar = "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/07/07afc9a0d3746804964eba6043245e68299476c5.jpg";
3326 }else {
3327 return;
3328 }
3329}
3330
3331function setBetBots() {
3332 var RandomBot = Math.floor(Math.random() * (20 - 1 + 1)) + 1;
3333
3334 addBetBot(RandomBot);
3335}
3336
3337function addBetBot(botID) {
3338 var BotUser = 1337+botID;
3339
3340 var UsedBots = [];
3341
3342 pickBot(botID);
3343
3344 var amount = Math.floor(Math.random() * (1450 - 250 + 1)) + 250;
3345 var BotLevel = Math.floor(Math.random() * (15 - 0 + 1)) + 0;
3346
3347 var lower;
3348 var upper;
3349
3350 var RandomBet = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
3351
3352 if(RandomBet == 1) {
3353 lower = 0;
3354 upper = 0;
3355 }else if(RandomBet == 2) {
3356 lower = 1;
3357 upper = 7;
3358 }else if(RandomBet == 3){
3359 lower = 8;
3360 upper = 14;
3361 }
3362
3363 if(timer-wait <= 5) {
3364 logger.debug('Bot did not bet!!');
3365 }else {
3366 if(usersBr[BotUser] === undefined) {
3367 usersBr[BotUser] = 1;
3368 } else {
3369 usersBr[BotUser]++;
3370 }
3371 if(usersAmount[BotUser] === undefined) {
3372 usersAmount[BotUser] = {
3373 '0-0': 0,
3374 '1-7': 0,
3375 '8-14': 0
3376 };
3377 }
3378 usersAmount[BotUser][lower+'-'+upper] += parseInt(amount);
3379 currentSums[lower+'-'+upper] += amount;
3380 io.sockets.emit('message', {
3381 type: 'bet',
3382 bet: {
3383 amount: usersAmount[BotUser][lower+'-'+upper],
3384 level: BotLevel,
3385 icon: BotBetAvatar,
3386 lower: lower,
3387 name: BotBetName,
3388 rollid: currentRollid,
3389 upper: upper,
3390 user: BotUser,
3391 won: null
3392 },
3393 sums: {
3394 0: currentSums['0-0'],
3395 1: currentSums['1-7'],
3396 2: currentSums['8-14']
3397 }
3398 });
3399 currentBets.push({
3400 amount: amount,
3401 level: levelA,
3402 icon: BotLevel,
3403 lower: lower,
3404 name: BotBetName,
3405 rollid: currentRollid,
3406 upper: upper,
3407 user: BotUser,
3408 });
3409 checkTimer();
3410 }
3411}
3412
3413
3414/* COINFLIP */
3415function createCFGame(m, user, socket) {
3416 var selectedCoin = m.selectedCoin;
3417 var betAmount = parseInt(m.amount);
3418
3419 if((betAmount < minbet) || (betAmount > maxbet)) {
3420 socket.emit('message', {
3421 type: 'error',
3422 mtype: 'roulette',
3423 enable: true,
3424 error: 'Error: Invalid bet amount ['+minbet+'-'+maxbet+']!'
3425 });
3426 return;
3427 }
3428
3429 if(/(a|b|c|d|e|f|g|h|j|i|k|l|m|n|o|p|q|r|s|t|v|u|w|x|y|z)/.exec(betAmount)) {
3430 socket.emit('message', {
3431 type: 'error',
3432 mtype: 'roulette',
3433 enable: true,
3434 error: 'Error: Invalid bet amount!'
3435 });
3436 logger.warn(user.steamid+' try to cheating to COINFLIP BET_AMOUNT');
3437 return;
3438 }
3439
3440 if(selectedCoin != 't' && selectedCoin != 'ct'){
3441 socket.emit('message', {
3442 type: 'error',
3443 mtype: 'coinflip',
3444 btype: 'create',
3445 enable: true,
3446 error: 'Error: Invalid coin!'
3447 });
3448 logger.warn(user.steamid+' try to cheating to COINFLIP COIN_TIPE');
3449 return;
3450 }
3451
3452 query('SELECT COUNT(*) AS `total` FROM `coinflip` WHERE `p1_steamid`='+pool.escape(user.steamid)+' AND `result` = 0', function(err, row) {
3453 if(err) {
3454 logger.error('ERROR');
3455 logger.error(err);
3456 }
3457 query('SELECT `balance`, `countDeposits` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(e, rr) {
3458 if(e) return;
3459 if(betAmount > rr[0].balance) {
3460 socket.emit('message', {
3461 type: 'error',
3462 mtype: 'coinflip',
3463 btype: 'create',
3464 enable: true,
3465 error: 'Error: You do not have enough coins to create the game!'
3466 });
3467 return;
3468 } else {
3469 if(row[0].total >= maxCoinflips) {
3470 socket.emit('message', {
3471 type: 'error',
3472 mtype: 'coinflip',
3473 btype: 'create',
3474 enable: true,
3475 error: 'Error: You can create just '+maxCoinflips+' game!'
3476 });
3477 } else {
3478 query('UPDATE `users` SET `balance` = `balance` - '+parseInt(betAmount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(errr){
3479 if(errr) return;
3480
3481 if(rr[0].countDeposits >= 1) query('UPDATE `users` SET `available` = `available` + '+parseInt(m.amount / 3)+' WHERE `steamid` = '+pool.escape(user.steamid));
3482 if(rr[0].countDeposits >= 0) query('UPDATE `users` SET `bets` = `bets` + '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid));
3483
3484 var castigator = Math.floor(Math.random() * (2 - 1 + 1)) + 1;
3485 if(castigator == '1') {
3486 WinnerC = 'ct';
3487 }else if(castigator == '2') {
3488 WinnerC = 't';
3489 }
3490
3491 query('INSERT INTO `coinflip` SET `p1_steamid` = '+pool.escape(user.steamid)+', `p1_name` = '+pool.escape(user.name)+', `p1_pick` = '+pool.escape(selectedCoin)+', `amount` = '+parseInt(betAmount)+', `won_pick` = '+pool.escape(WinnerC)+', `hash` = '+pool.escape(getHash("COINFLIP", getRandomInt(1,2)+WinnerC+time()))+', `time` = '+pool.escape(time()));
3492
3493 io.sockets.emit('message', {
3494 type: 'refCoinflip'
3495 });
3496
3497 getBalance(user.steamid, socket);
3498 });
3499 }
3500 }
3501 });
3502 });
3503}
3504
3505
3506function watchCFGame(m, user, socket) {
3507 var NumberID = m.gamenr;
3508
3509 if(NumberID < 0) {
3510 socket.emit('message', {
3511 type: 'error',
3512 error: 'Error: Invalid id game!'
3513 });
3514 logger.warn(user.steamid+' try to cheating to COINFLIP ID_GAME_WATCH');
3515 return;
3516 }
3517
3518 query('SELECT `p1_pick`, `p2_pick`, `p1_name`, `p2_name`, `p1_steamid`, `p2_steamid`, `won_pick`, `result` FROM `coinflip` WHERE `id` = '+pool.escape(NumberID), function(err, row) {
3519 if(err) {
3520 socket.emit('message', {
3521 type: 'error',
3522 error: 'Error: Invalid id game!'
3523 });
3524 logger.warn(user.steamid+' try to cheating to COINFLIP ID_GAME_WATCH');
3525 return;
3526 }
3527
3528 var Result = row[0].result;
3529
3530 query('SELECT `avatar` FROM `users` WHERE `steamid` = '+pool.escape(row[0].p1_steamid), function(err2, row2){
3531 if(err2) return;
3532 var AvatarP1 = row2[0].avatar;
3533 if(Result == 0){
3534 var PickP1 = row[0].p1_pick;
3535 var NameP1 = row[0].p1_name;
3536 var SteamP1 = row[0].p1_steamid;
3537 var Won_pick = row[0].won_pick;
3538 socket.emit('message', {
3539 type: 'watchcfgame',
3540 GameID: NumberID,
3541 pickp1: PickP1,
3542 namep1: NameP1,
3543 steamp1: SteamP1,
3544 avatarp1: AvatarP1,
3545 wonpick: Won_pick
3546 });
3547 }else if(Result == 1){
3548 query('SELECT `avatar` FROM `users` WHERE `steamid` = '+pool.escape(row[0].p2_steamid), function(err3, row3){
3549 if(err3) return;
3550
3551 socket.emit('message', {
3552 type: 'finishCoinflip',
3553 flip: row[0].won_pick,
3554 numeplayer1: row[0].p1_name,
3555 steamidplayer1: row[0].p1_steamid,
3556 choiceplayer1: row[0].p1_pick,
3557 avatarplayer1: AvatarP1,
3558 numeplayer2: row[0].p2_name,
3559 steamidplayer2: row[0].p2_steamid,
3560 choiceplayer2: row[0].p2_pick,
3561 avatarplayer2: row3[0].avatar
3562 });
3563 });
3564 }
3565 });
3566 });
3567}
3568
3569
3570function joinCFGame(m, user, socket) {
3571 var NumberGame = m.gamenr;
3572
3573 if(NumberGame < 0) {
3574 socket.emit('message', {
3575 type: 'error',
3576 error: 'Error: Invalid id game!'
3577 });
3578 logger.warn(user.steamid+' try to cheating to COINFLIP ID_GAME_CREATE');
3579 return;
3580 }
3581
3582 query('SELECT `result`,`id`,`p1_pick`,`amount`, `p1_steamid`, `p1_name` FROM `coinflip` WHERE `id` = '+pool.escape(NumberGame), function(err, row) {
3583 if(err || !row[0]) {
3584 socket.emit('message', {
3585 type: 'error',
3586 error: 'Error: Invalid id game!'
3587 });
3588 logger.warn(user.steamid+' try to cheating to COINFLIP ID_GAME_CREATE');
3589 return;
3590 }
3591
3592 if(row[0].p1_pick == 'ct'){
3593 var pickedP2Coin = 't';
3594 } else if(row[0].p1_pick == 't'){
3595 var pickedP2Coin = 'ct';
3596 }
3597
3598 if(row[0].result != 0) {
3599 socket.emit('message', {
3600 type: 'error',
3601 error: 'Error: This game are already flipping!'
3602 });
3603 return;
3604 }
3605
3606 if(user.steamid == row[0].p1_steamid) {
3607 socket.emit('message', {
3608 type: 'error',
3609 error: 'Error: You cannot join your game!'
3610 });
3611 return;
3612 }
3613
3614 query('SELECT `balance`, `totalDeposits` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(e, rr) {
3615 if(e) return;
3616 if(rr[0].balance < row[0].amount) {
3617 socket.emit('message', {
3618 type: 'error',
3619 error: 'Error: You do not have enough coins to join the game!'
3620 });
3621 return;
3622 }else if(row[0].amount <= rr[0].balance) {
3623 query('UPDATE `users` SET `balance` = `balance` - '+parseInt(row[0].amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(errr){
3624 if(err) return;
3625
3626 if(rr[0].countDeposits >= 1) query('UPDATE `users` SET `available` = `available` + '+parseInt(m.amount / 3)+' WHERE `steamid` = '+pool.escape(user.steamid));
3627 if(rr[0].countDeposits >= 0) query('UPDATE `users` SET `bets` = `bets` + '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid));
3628
3629 query('UPDATE `coinflip` SET `result` = 1 WHERE `id` = '+row[0].id);
3630 query('UPDATE `coinflip` SET `p2_steamid` = '+pool.escape(user.steamid)+', `p2_name` = '+pool.escape(user.name)+', `p2_pick` = '+pool.escape(pickedP2Coin)+' WHERE `id`='+row[0].id);
3631
3632 query('SELECT `won_pick`, `id` FROM `coinflip` WHERE `id` = '+pool.escape(row[0].id), function(err2, row2) {
3633 if(err2) return;
3634
3635 io.sockets.emit('message', {
3636 type: 'refCoinflip'
3637 });
3638
3639 getBalance(user.steamid, socket);
3640
3641 setTimeout(function() {
3642 if(row2[0].won_pick == row[0].p1_pick) {
3643 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(1.95*row[0].amount)+' WHERE `steamid` = '+pool.escape(row[0].p1_steamid));
3644 setTimeout(function() {
3645 io.sockets.in(row[0].p1_steamid).emit('message', {
3646 type: 'alert',
3647 alert: 'You won the coinflip game #'+row[0].id+' | Coins won: '+parseInt(1.95*row[0].amount)+'!'
3648 });
3649 io.sockets.in(user.steamid).emit('message', {
3650 type: 'error',
3651 error: 'You lost the coinflip game #'+row[0].id+' | Coins lost: '+parseInt(row[0].amount)+'!'
3652 });
3653
3654 getBalance(user.steamid, socket);
3655
3656 io.sockets.emit('message', {
3657 type: 'refCoinflip'
3658 });
3659 query('UPDATE `coinflip` SET `result` = 2 WHERE `id`='+row[0].id);
3660 }, 4000);
3661 }else if(row2[0].won_pick != row[0].p1_pick) {
3662 query('UPDATE `users` SET `balance` = `balance` + '+parseInt(1.95*row[0].amount)+' WHERE `steamid` = '+pool.escape(user.steamid));
3663 setTimeout(function() {
3664 io.sockets.in(row[0].p1_steamid).emit('message', {
3665 type: 'error',
3666 error: 'You lost the coinflip game #'+row[0].id+' | Coins lost: '+parseInt(row[0].amount)+'!'
3667 });
3668 io.sockets.in(user.steamid).emit('message', {
3669 type: 'alert',
3670 alert: 'You won the coinflip game #'+row[0].id+' | Coins won: '+parseInt(1.95*row[0].amount)+'!'
3671 });
3672
3673 getBalance(user.steamid, socket);
3674
3675 io.sockets.emit('message', {
3676 type: 'refCoinflip'
3677 });
3678 query('UPDATE `coinflip` SET `result`=2 WHERE `id`='+row[0].id);
3679 }, 4000);
3680 }
3681 query('SELECT `avatar` FROM `users` WHERE `steamid` = '+pool.escape(row[0].p1_steamid), function(err3, row3) {
3682 if(err3) return;
3683 query('SELECT `avatar` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err4, row4) {
3684 io.sockets.in(row[0].p1_steamid).emit('message', {
3685 type: 'finishCoinflip',
3686 flip: row2[0].won_pick,
3687 numeplayer1: row[0].p1_name,
3688 steamidplayer1: row[0].p1_steamid,
3689 choiceplayer1: row[0].p1_pick,
3690 avatarplayer1: row3[0].avatar,
3691 numeplayer2: user.name,
3692 steamidplayer2: user.steamid,
3693 choiceplayer2: pickedP2Coin,
3694 avatarplayer2: row4[0].avatar
3695 });
3696 io.sockets.in(user.steamid).emit('message', {
3697 type: 'finishCoinflip',
3698 flip: row2[0].won_pick,
3699 numeplayer1: row[0].p1_name,
3700 steamidplayer1: row[0].p1_steamid,
3701 choiceplayer1: row[0].p1_pick,
3702 avatarplayer1: row3[0].avatar,
3703 numeplayer2: user.name,
3704 steamidplayer2: user.steamid,
3705 choiceplayer2: pickedP2Coin,
3706 avatarplayer2: row4[0].avatar
3707 });
3708 //SEND WATCH TO PLAYER
3709 io.sockets.emit('message', {
3710 type: 'watchcfgameShow',
3711 GameID: row2[0].id,
3712 flip: row2[0].won_pick,
3713 numeplayer2: user.name,
3714 steamidplayer2: user.steamid,
3715 choiceplayer2: pickedP2Coin,
3716 avatarplayer2: row4[0].avatar
3717 });
3718 });
3719 });
3720 }, 1500);
3721 });
3722 });
3723 }
3724 });
3725 });
3726}
3727/* END COINFLIP */
3728
3729
3730
3731
3732
3733/* ElSE */
3734var tagsToReplace = {
3735 '&': '&',
3736 '<': '<',
3737 '>': '>'
3738};
3739
3740function replaceTag(tag) {
3741 return tagsToReplace[tag] || tag;
3742}
3743
3744function safe_tags_replace(str) {
3745 return str.replace(/[&<>]/g, replaceTag);
3746}
3747Object.size = function(obj) {
3748 var size = 0,
3749 key;
3750 for (key in obj) {
3751 if (obj.hasOwnProperty(key)) size++;
3752 }
3753 return size;
3754};
3755function getRandomInt(min, max) {
3756 return Math.floor(Math.random() * (max - min + 1)) + min;
3757}
3758function getRandomArbitary(min, max) {
3759 return Math.random() * (max - min) + min;
3760}
3761function query(sql, callback) {
3762 if (typeof callback === 'undefined') {
3763 callback = function() {};
3764 }
3765 pool.getConnection(function(err, connection) {
3766 if(err) return callback(err);
3767 //logger.info('DB Connection ID: '+connection.threadId);
3768 connection.query(sql, function(err, rows) {
3769 if(err) return callback(err);
3770 connection.release();
3771 return callback(null, rows);
3772 });
3773 });
3774}
3775
3776function getHash(a,b){
3777 var crypto = require('crypto');
3778 var serverSeed = a+b;
3779 var genGameHash = function(serverSeed) {
3780 return crypto.createHash('sha256').update(serverSeed).digest('hex');
3781 };
3782 return terminatingHash = genGameHash(serverSeed);
3783}
3784
3785/**/
3786function getRoll(hash, secret, lottery){
3787 var rolled = sha256(hash+'-'+secret+'-'+lottery);
3788 rolled = hexdec(rolled.substr(0, 8)) % 15;
3789 return rolled;
3790}
3791
3792function makeCode() {
3793 var text = "";
3794 var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
3795
3796 for(var i=0; i < 12; i++)
3797 text += possible.charAt(Math.floor(Math.random() * possible.length));
3798
3799 return text;
3800}
3801
3802function hexdec(hexString) {
3803 hexString = (hexString + '').replace(/[^a-f0-9]/gi, '')
3804 return parseInt(hexString, 16)
3805}
3806/**/
3807
3808function time() {
3809 return parseInt(new Date().getTime()/1000);
3810}