Advertisement
Guest User

site.js

a guest
Apr 10th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var mysql = require('mysql');
  2. var log4js = require('log4js');
  3. var io = require('socket.io')(8000);
  4. var request = require('request');
  5. var fs = require('fs');
  6. var md5 = require('md5');
  7. var sha256 = require('sha256');
  8. var math = require('mathjs');
  9.  
  10. log4js.configure({
  11.     appenders: [
  12.         { type: 'console' },
  13.         { type: 'file', filename: 'logs/site.log' }
  14.     ]
  15. });
  16. var logger = log4js.getLogger();
  17.  
  18. var pool  = mysql.createPool({
  19.     connectionLimit : 10,
  20.     database: 'csgo',
  21.     host: 'localhost',
  22.     user: 'root',
  23.     password: 'Tomelloso123'
  24. });
  25.  
  26. process.on('uncaughtException', function (err) {
  27.  logger.trace('Strange error');
  28.  logger.debug(err);
  29. });
  30.  
  31. /* */
  32. var accept = 30;
  33. var wait = 10;
  34. var br = 3;
  35. var chat = 2;
  36. var chatb = 2000000;
  37. var maxbet = 5000000;
  38. var minbet = 1;
  39. var q1 = 2;
  40. var q2 = 14;
  41. var timer = -1;
  42. var users = {};
  43. var roll = 0;
  44. var currentBets = [];
  45. var historyRolls = [];
  46. var usersBr = {};
  47. var usersAmount = {};
  48. var currentSums = {
  49.     '0-0': 0,
  50.     '1-7': 0,
  51.     '8-14': 0
  52. };
  53. var currentRollid = 0;
  54. var pause = false;
  55. var hash = '';
  56. var last_message = {};
  57. /* */
  58.  
  59. load();
  60.  
  61. var prices;
  62. request('http://backpack.tf/api/IGetMarketPrices/v1/?key=56fce4a5c4404545131c8fcf&compress=1&appid=730', function(error, response, body) {
  63.     prices = JSON.parse(body);
  64.     if(prices.response.success == 0) {
  65.         logger.warn('Loaded fresh prices');
  66.         if(fs.existsSync(__dirname + '/prices.txt')){
  67.             prices = JSON.parse(fs.readFileSync(__dirname + '/prices.txt'));
  68.             logger.warn('Prices loaded from cache');
  69.         } else {
  70.             logger.error('No prices in cache');
  71.             process.exit(0);
  72.         }
  73.     } else {
  74.         fs.writeFileSync('prices.txt', body);
  75.         logger.trace('New prices loaded');
  76.     }
  77. });
  78.  
  79. updateHash();
  80. function updateHash() {
  81.     query('SELECT * FROM `hash` ORDER BY `id` DESC LIMIT 1', function(err, row) {
  82.         if(err) {
  83.             logger.error('Cant get the hash, stopping');
  84.             logger.debug(err);
  85.             process.exit(0);
  86.             return;
  87.         }
  88.         if(row.length == 0) {
  89.             logger.error('Wrong hash found, stopping');
  90.             process.exit(0);
  91.         } else {
  92.             if(hash != row[0].hash) logger.warn('Loaded hash'+row[0].hash);
  93.             hash = row[0].hash;
  94.         }
  95.     });
  96. }
  97.  
  98. io.on('connection', function(socket) {
  99.     var user = false;
  100.     socket.on('hash', function(hash) {
  101.         query('SELECT * FROM `users` WHERE `hash` = '+pool.escape(hash), function(err, row) {
  102.             if((err) || (!row.length)) return socket.disconnect();
  103.             user = row[0];
  104.             users[user.steamid] = {
  105.                 socket: socket.id,
  106.                 balance: parseInt(row[0].balance)
  107.             }
  108.             socket.emit('message', {
  109.                 accept: accept,
  110.                 balance: row[0].balance,
  111.                 br: br,
  112.                 chat: chat,
  113.                 chatb: chatb,
  114.                 count: timer-wait,
  115.                 icon: row[0].avatar,
  116.                 maxbet: maxbet,
  117.                 minbet: minbet,
  118.                 name: row[0].name,
  119.                 rank: row[0].rank,
  120.                 rolls: historyRolls,
  121.                 type: 'hello',
  122.                 user: row[0].steamid
  123.             });
  124.             socket.emit('message', {
  125.                 type: 'logins',
  126.                 count: Object.size(io.sockets.connected)
  127.             });
  128.             currentBets.forEach(function(itm) {
  129.                 socket.emit('message', {
  130.                     type: 'bet',
  131.                     bet: {
  132.                         amount: itm.amount,
  133.                         betid: itm.betid,
  134.                         icon: itm.icon,
  135.                         lower: itm.lower,
  136.                         name: itm.name,
  137.                         rollid: itm.rollid,
  138.                         upper: itm.upper,
  139.                         user: itm.user,
  140.                         won: null
  141.                     },
  142.                     sums: {
  143.                         0: currentSums['0-0'],
  144.                         1: currentSums['1-7'],
  145.                         2: currentSums['8-14'],
  146.                     }
  147.                 });
  148.             });
  149.         });
  150.     });
  151.     socket.on('mes', function(m) {
  152.         if(!user) return;
  153.         logger.debug(m);
  154.         if(m.type == "bet") return setBet(m, user, socket);
  155.         if(m.type == "balance") return getBalance(user, socket);
  156.         if(m.type == "chat") return ch(m, user, socket);
  157.         if(m.type == "plus") return plus(user, socket);
  158.     });
  159.     socket.on('disconnect', function() {
  160.         io.sockets.emit('message', {
  161.             type: 'logins',
  162.             count: Object.size(io.sockets.connected)
  163.         });
  164.         delete users[user.steamid];
  165.     })
  166. });
  167.  
  168. function plus(user, socket) {
  169.     query('SELECT * FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  170.         if(err) return;
  171.         if(time() > row[0].plus) {
  172.             query('UPDATE `users` SET `plus` = '+pool.escape(time()+10*60)+', `balance` = `balance` + 1 WHERE `steamid` = '+user.steamid);
  173.             socket.emit('message', {
  174.                 type: 'alert',
  175.                 alert: 'Confirmed'
  176.             });
  177.             getBalance(user, socket);
  178.         } else {
  179.             socket.emit('message', {
  180.                 type: 'alert',
  181.                 alert: 'You have '+(row[0].plus-time())+' to accept'
  182.             });
  183.         }
  184.     });
  185. }
  186.  
  187. function ch(m, user, socket) {
  188.     if(m.msg) {
  189.         if(last_message[user.steamid]+1 >= time()) {
  190.             console.log('Too fast');
  191.             return;
  192.         } else {
  193.             last_message[user.steamid] = time();
  194.         }
  195.         var res = null;
  196.         if (res = /^\/send ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  197.             logger.trace('We need to send coins from '+res[2]+' to '+res[1]);
  198.             query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  199.                 if((err) || (!row.length)) {
  200.                     logger.error('Failed to get the person in the database');
  201.                     logger.debug(err);
  202.                     socket.emit('message', {
  203.                         type: 'error',
  204.                         enable: false,
  205.                         error: 'Error: User not in DB.'
  206.                     });
  207.                     return;
  208.                 }
  209.                 if(row[0].balance < res[2]) {
  210.                     socket.emit('message', {
  211.                         type: 'error',
  212.                         enable: false,
  213.                         error: 'Error: Insufficient funds.'
  214.                     });
  215.                 } else if(res[2] <= 0) {
  216.                     socket.emit('message', {
  217.                         type: 'error',
  218.                         enable: false,
  219.                         error: 'Error: Amount must be greater than 0.'
  220.                     });
  221.                 } else {
  222.                     query('SELECT `name` FROM `users` WHERE `steamid` = '+pool.escape(res[1]), function(err2, row2) {
  223.                         if((err) || (!row.length)) {
  224.                             logger.error('Failed to get the STEAMID');
  225.                             logger.debug(err);
  226.                             socket.emit('message', {
  227.                                 type: 'error',
  228.                                 enable: false,
  229.                                 error: 'Error: Unknown receiver.'
  230.                             });
  231.                             return;
  232.                         }
  233.                         query('UPDATE `users` SET `balance` = `balance` - '+res[2]+' WHERE `steamid` = '+pool.escape(user.steamid));
  234.                         query('UPDATE `users` SET `balance` = `balance` + '+res[2]+' WHERE `steamid` = '+pool.escape(res[1]));
  235.                         query('INSERT INTO `transfers` SET `from1` = '+pool.escape(user.steamid)+', `to1` = '+pool.escape(res[1])+', `amount` = '+pool.escape(res[2])+', `time` = '+pool.escape(time()));
  236.                         socket.emit('message', {
  237.                             type: 'alert',
  238.                             alert: 'You sent '+res[2]+' coins to '+row2[0].name+'.'
  239.                         });
  240.                         getBalance(user, socket);
  241.                     });
  242.                 }
  243.             });
  244.         } else if (res = /^\/mute ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  245.             if(user.rank > 0) {
  246.                 var t = time();
  247.                 query('UPDATE `users` SET `mute` = '+pool.escape(parseInt(t)+parseInt(res[2]))+' WHERE `steamid` = '+pool.escape(res[1]));
  248.                 socket.emit('message', {
  249.                     type: 'alert',
  250.                     alert: 'You mute '+res[1]+' to '+res[2]
  251.                 });
  252.             }
  253.         } else {
  254.  
  255.             query('SELECT `mute` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  256.                 if(err) return;
  257.                 if(row[0].mute > time()) {
  258.                     socket.emit('message', {
  259.                         type: 'alert',
  260.                         alert: 'You are muted '+(row[0].mute-time())
  261.                     });
  262.                     return;
  263.                 }
  264.                 io.sockets.emit('message', {
  265.                     type: 'chat',
  266.                     msg: safe_tags_replace(m.msg),
  267.                     name: user.name,
  268.                     icon: user.avatar,
  269.                     user: user.steamid,
  270.                     rank: user.rank,
  271.                     lang: m.lang,
  272.                     hide: m.hide
  273.                 });
  274.             });
  275.         }
  276.     }
  277. }
  278.  
  279. function getBalance(user, socket) {
  280.     query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  281.         if((err) || (!row.length)) {
  282.             logger.error('Failed to load your balance');
  283.             logger.debug(err);
  284.             socket.emit('message', {
  285.                 type: 'error',
  286.                 enable: true,
  287.                 error: 'Error: You are not DB.'
  288.             });
  289.             return;
  290.         }
  291.         socket.emit('message', {
  292.             type: 'balance',
  293.             balance: row[0].balance
  294.         });
  295.         if(user.steamid) users[user.steamid].balance = parseInt(row[0].balance);
  296.     })
  297. }
  298.  
  299. function setBet(m, user, socket) {
  300.     //tutaj trzeba parsować w ten sposów -> m.amount = parseInt(m.amount);
  301.     if((usersBr[user.steamid] !== undefined) && (usersBr[user.steamid] == br)) {
  302.         socket.emit('message', {
  303.             type: 'error',
  304.             enable: true,
  305.             error: 'You\'ve already placed '+usersBr[user.steamid]+'/'+br+' bets this roll.'
  306.         });
  307.         return;
  308.     }
  309.     if((m.amount < minbet) || (m.amount > maxbet)) {
  310.         socket.emit('message', {
  311.             type: 'error',
  312.             enable: true,
  313.             error: 'Invalid bet amount.'
  314.  
  315.         });
  316.         return;
  317.     }
  318.     if(pause) {
  319.         socket.emit('message', {
  320.             type: 'error',
  321.             enable: false,
  322.             error: 'Betting for this round is closed.'
  323.         });
  324.         return;
  325.     }
  326.         if(m.upper - m.lower > 6){
  327.             logger.warn("User tried to place an invalid bid!! (Might be hacking)");
  328.             return;
  329.         } else {
  330.             if(m.lower != 0 && m.lower != 1 && m.lower != 8){
  331.                 logger.warn("User is trying some weird offset!! (Might be hacking)");
  332.                 return;
  333.             }
  334.             if(m.lower == 0){
  335.                 m.upper = 0;
  336.             } else {
  337.                 m.upper = m.lower + 6;
  338.             }
  339.         }
  340.     var start_time = new Date();
  341.     query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  342.         if((err) || (!row.length)) {
  343.             logger.error('Failed to find DB');
  344.             logger.debug(err);
  345.             socket.emit('message', {
  346.                 type: 'error',
  347.                 enable: true,
  348.                 error: 'You are not DB'
  349.             });
  350.             return;
  351.         }
  352.         if(row[0].balance >= m.amount) {
  353.             query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
  354.                 if(err2) {
  355.                     logger.error('Error in withdraw');
  356.                     logger.debug(err);
  357.                     socket.emit('message', {
  358.                         type: 'error',
  359.                         enable: true,
  360.                         error: 'You dont have enough points'
  361.                     });
  362.                     return;
  363.                 }
  364.                 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) {
  365.                     if(err3) {
  366.                         logger.error('Error in DB');
  367.                         logger.debug(err);
  368.                         return;
  369.                     }
  370.                     var end = new Date();
  371.                     if(usersBr[user.steamid] === undefined) {
  372.                         usersBr[user.steamid] = 1;
  373.                     } else {
  374.                         usersBr[user.steamid]++;
  375.                     }
  376.                     if(usersAmount[user.steamid] === undefined) {
  377.                         usersAmount[user.steamid] = {
  378.                             '0-0': 0,
  379.                             '1-7': 0,
  380.                             '8-14': 0
  381.                         };
  382.                     }
  383.                     usersAmount[user.steamid][m.lower+'-'+m.upper] += parseInt(m.amount);
  384.                     currentSums[m.lower+'-'+m.upper] += m.amount;
  385.                     socket.emit('message', {
  386.                         type: 'betconfirm',
  387.                         bet: {
  388.                             betid: row3.insertId,
  389.                             lower: m.lower,
  390.                             upper: m.upper,
  391.                             amount: usersAmount[user.steamid][m.lower+'-'+m.upper]
  392.                         },
  393.                         balance: row[0].balance-m.amount,
  394.                         mybr: usersBr[user.steamid],
  395.                         br: br,
  396.                         exec: (end.getTime()-start_time.getTime()).toFixed(3)
  397.                     });
  398.                     users[user.steamid].balance = row[0].balance-m.amount;
  399.                     io.sockets.emit('message', {
  400.                         type: 'bet',
  401.                         bet: {
  402.                             amount: usersAmount[user.steamid][m.lower+'-'+m.upper],
  403.                             betid: row3.insertId,
  404.                             icon: user.avatar,
  405.                             lower: m.lower,
  406.                             name: user.name,
  407.                             rollid: currentRollid,
  408.                             upper: m.upper,
  409.                             user: user.steamid,
  410.                             won: null
  411.                         },
  412.                         sums: {
  413.                             0: currentSums['0-0'],
  414.                             1: currentSums['1-7'],
  415.                             2: currentSums['8-14'],
  416.                         }
  417.                     });
  418.                     currentBets.push({
  419.                         amount: m.amount,
  420.                         betid: row3.insertId,
  421.                         icon: user.avatar,
  422.                         lower: m.lower,
  423.                         name: user.name,
  424.                         rollid: currentRollid,
  425.                         upper: m.upper,
  426.                         user: user.steamid,
  427.                     });
  428.                     logger.debug('Bet #'+row3.insertId+' Ammount: '+m.amount);
  429.                     checkTimer();
  430.                 })
  431.             });
  432.         } else {
  433.             socket.emit('message', {
  434.                 type: 'error',
  435.                 enable: true,
  436.                 error: 'You dont have any money'
  437.             });
  438.         }
  439.     });
  440. }
  441.  
  442. function checkTimer() {
  443.     if((currentBets.length > 0) && (timer == -1) && (!pause)) {
  444.         logger.trace('Timer starting');
  445.         timer = accept+wait;
  446.         timerID = setInterval(function() {
  447.             logger.trace('Timer: '+timer+' Site timer: '+(timer-wait));
  448.             if (timer == wait) {
  449.                 pause = true;
  450.                 logger.trace('Pause included');
  451.                 var inprog = getRandomInt(0, (currentBets.length/4).toFixed(0));
  452.                 io.sockets.emit('message', {
  453.                     type: 'preroll',
  454.                     totalbets: currentBets.length-inprog,
  455.                     inprog: inprog,
  456.                     sums: {
  457.                         0: currentSums['0-0'],
  458.                         1: currentSums['1-7'],
  459.                         2: currentSums['8-14'],
  460.                     }
  461.                 });
  462.             }
  463.             if (timer == wait-2) {
  464.                 logger.trace('Timer: ');
  465.                 toWin(); // Выбираем победителя
  466.             }
  467.             if(timer == 0) {
  468.                 logger.trace('Reset');
  469.                 timer = accept+wait;
  470.                 currentBets = [];
  471.                 historyRolls.push({id: currentRollid, roll: roll});
  472.                 if(historyRolls.length > 10) historyRolls.slice(1);
  473.                 usersBr = {}; // сколько пользователи внесли
  474.                 usersAmount = {}; // сколько пользователи внесли монеток
  475.                 currentSums = {
  476.                     '0-0': 0,
  477.                     '1-7': 0,
  478.                     '8-14': 0
  479.                 };
  480.                 currentRollid = currentRollid+1;
  481.                 pause = false;
  482.             }
  483.             timer--;
  484.         }, 1000);
  485.     }
  486. }
  487.  
  488. function toWin() {
  489.     var sh = sha256(hash+'-'+currentRollid);
  490.     roll = sh.substr(0, 8);
  491.     roll = parseInt(roll, 16);
  492.     roll = math.abs(roll) % 15;
  493.     logger.trace('Rolled '+roll);
  494.     var r = '';
  495.     var s = q1;
  496.     var wins = {
  497.         '0-0': 0,
  498.         '1-7': 0,
  499.         '8-14': 0
  500.     }
  501.     if(roll == 0) { r = '0-0'; s = q2; wins['0-0'] = currentSums['0-0']*s; }
  502.     if((roll > 0) && (roll < 8)) { r = '1-7'; wins['1-7'] = currentSums['1-7']*s; }
  503.     if((roll > 7) && (roll < 15)) { r = '8-14'; wins['8-14'] = currentSums['8-14']*s; }
  504.     logger.debug(currentBets);
  505.     logger.debug(usersBr);
  506.     logger.debug(usersAmount);
  507.     logger.debug(currentSums);
  508.     for(key in users) {
  509.         if(usersAmount[key] === undefined) {
  510.             var balance = null;
  511.             var won = 0;
  512.         } else {
  513.             var balance = parseInt(users[key].balance)+usersAmount[key][r]*s;
  514.             var won = usersAmount[key][r]*s;
  515.         }
  516.         if (io.sockets.connected[users[key].socket]) io.sockets.connected[users[key].socket].emit('message', {
  517.             balance: balance,
  518.             count: accept,
  519.             nets: [{
  520.                     lower: 0,
  521.                     samount: currentSums['0-0'],
  522.                     swon: wins['0-0'],
  523.                     upper: 0
  524.                 }, {
  525.                     lower: 1,
  526.                     samount: currentSums['1-7'],
  527.                     swon: wins['1-7'],
  528.                     upper: 7
  529.                 }, {
  530.                     lower: 8,
  531.                     samount: currentSums['8-14'],
  532.                     swon: wins['8-14'],
  533.                     upper: 14
  534.                 }
  535.             ],
  536.             roll: roll,
  537.             rollid: currentRollid+1,
  538.             type: "roll",
  539.             wait: wait-2,
  540.             wobble: getRandomArbitary(0, 1),
  541.             won: won
  542.         });
  543.     }
  544.     currentBets.forEach(function(itm) {
  545.         if((roll >= itm.lower) && (roll <= itm.upper)) {
  546.             logger.debug('Rate #'+itm.betid+' sum '+itm.amount+' win '+(itm.amount*s));
  547.             query('UPDATE `users` SET `balance` = `balance` + '+itm.amount*s+' WHERE `steamid` = '+pool.escape(itm.user));
  548.         }
  549.     });
  550.     query('UPDATE `rolls` SET `roll` = '+pool.escape(roll)+', `hash` = '+pool.escape(hash)+', `time` = '+pool.escape(time())+' WHERE `id` = '+pool.escape(currentRollid));
  551.     query('INSERT INTO `rolls` SET `roll` = -1');
  552.     updateHash();
  553. }
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563. /* */
  564. var tagsToReplace = {
  565.     '&': '&amp;',
  566.     '<': '&lt;',
  567.     '>': '&gt;'
  568. };
  569.  
  570. function replaceTag(tag) {
  571.     return tagsToReplace[tag] || tag;
  572. }
  573.  
  574. function safe_tags_replace(str) {
  575.     return str.replace(/[&<>]/g, replaceTag);
  576. }
  577. Object.size = function(obj) {
  578.     var size = 0,
  579.         key;
  580.     for (key in obj) {
  581.         if (obj.hasOwnProperty(key)) size++;
  582.     }
  583.     return size;
  584. };
  585. function getRandomInt(min, max) {
  586.     return Math.floor(Math.random() * (max - min + 1)) + min;
  587. }
  588. function getRandomArbitary(min, max) {
  589.     return Math.random() * (max - min) + min;
  590. }
  591.  
  592. function query(sql, callback) {
  593.     if (typeof callback === 'undefined') {
  594.         callback = function() {};
  595.     }
  596.     pool.getConnection(function(err, connection) {
  597.         if(err) return callback(err);
  598.         logger.info('DB Connection ID: '+connection.threadId);
  599.         connection.query(sql, function(err, rows) {
  600.             if(err) return callback(err);
  601.             connection.release();
  602.             return callback(null, rows);
  603.         });
  604.     });
  605. }
  606. function load() {
  607.     query('SET NAMES utf8');
  608.     query('SELECT `id` FROM `rolls` ORDER BY `id` DESC LIMIT 1', function(err, row) {
  609.         if((err) || (!row.length)) {
  610.             logger.error('Cant get number from the last game');
  611.             logger.debug(err);
  612.             process.exit(0);
  613.             return;
  614.         }
  615.         currentRollid = row[0].id;
  616.         logger.trace('Roll '+currentRollid);
  617.     });
  618.     loadHistory();
  619.     setTimeout(function() { io.listen(8080); }, 3000);
  620. }
  621. function loadHistory() {
  622.     query('SELECT * FROM `rolls` ORDER BY `id` LIMIT 10', function(err, row) {
  623.         if(err) {
  624.             logger.error('Cant load betting history');
  625.             logger.debug(err);
  626.             process.exit(0);
  627.         }
  628.         logger.trace('Sucesfully updated history');
  629.         row.forEach(function(itm) {
  630.             if(itm.roll != -1) historyRolls.push(itm);
  631.         });
  632.     });
  633. }
  634.  
  635. function time() {
  636.     return parseInt(new Date().getTime()/1000)
  637. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement