Guest User

Untitled

a guest
Feb 13th, 2017
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.01 KB | None | 0 0
  1. var mysql = require('mysql');
  2. var log4js = require('log4js');
  3. var io = require('socket.io')(6712);
  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. var antiSpam = require('socket-anti-spam');
  10. var seedrandom = require('seedrandom');
  11. var crypto = require('crypto');
  12.  
  13. //BITSKINS
  14. var totp = require('notp').totp;
  15. var base32 = require('thirty-two');
  16.  
  17. var API_KEYBIT = '##YOURBITSKINSAPIKEY##';
  18. var bit_code = totp.gen(base32.decode('##BITSKINSECRETCODE##'));
  19.  
  20. log4js.configure({
  21. appenders: [
  22. { type: 'console' },
  23. { type: 'file', filename: 'logs/site_test.log' }
  24. ]
  25. });
  26. var logger = log4js.getLogger();
  27.  
  28. var database_params = {
  29. database: '',
  30. host: '',
  31. user: '',
  32. password: ''
  33. }
  34.  
  35. var pool = mysql.createPool({
  36. connectionLimit : 10,
  37. database:database_params.database,
  38. host: database_params.host,
  39. user: database_params.user,
  40. password: database_params.password
  41. });
  42.  
  43. process.on('uncaughtException', function (err) {
  44. logger.trace('Strange error');
  45. logger.debug(err);
  46. });
  47.  
  48. antiSpam.init({
  49. banTime: 30, // Ban time in minutes
  50. kickThreshold: 50, // User gets kicked after this many spam score
  51. kickTimesBeforeBan: 3, // User gets banned after this many kicks
  52. banning: true, // Uses temp IP banning after kickTimesBeforeBan
  53. heartBeatStale: 10, // Removes a heartbeat after this many seconds
  54. heartBeatCheck: 4, // Checks a heartbeat per this many seconds
  55. io: io, // Bind the socket.io variable
  56. });
  57.  
  58. /* */
  59. var avaialbleperbet = 1.6;
  60. var accept = 30;
  61. var wait = 10;
  62. var br = 2;
  63. var chat = 2;
  64. var chatb = 2000000;
  65. var maxbet = 5000000;
  66. var minbet = 1;
  67. var q1 = 2;
  68. var q2 = 14;
  69. var timer = -1;
  70. var users = {};
  71. var userssteamids = [];
  72. var roll = 0;
  73. var currentBets = [];
  74. var historyRolls = [];
  75. var usersBr = {};
  76. var usersAmount = {};
  77. var currentSums = {
  78. '0-0': 0,
  79. '1-7': 0,
  80. '8-14': 0
  81. };
  82. var currentRollid = 0;
  83. var pause = false;
  84. var hash = '';
  85. var dueal_tax = 1.9;
  86. var last_message = {};
  87. /* */
  88.  
  89. updateHash();
  90. load();
  91.  
  92. var prices;
  93.  
  94. function updateMarketPrices() {
  95. request('http://backpack.tf/api/IGetMarketPrices/v1/?key=58a0d59a0e2cad1fcd76e9be&compress=1&appid=730', function(error, response, body) {
  96. prices = JSON.parse(body);
  97. if(prices.response.success == 0) {
  98. logger.warn('Loaded fresh prices');
  99. if(fs.existsSync('/var/www/html/prices.txt')){
  100. prices = JSON.parse(fs.readFileSync('/var/www/html/prices.txt'));
  101. logger.warn('Prices loaded from cache');
  102. } else {
  103. logger.error('No prices in cache');
  104. process.exit(0);
  105. }
  106. } else {
  107. fs.writeFileSync('/var/www/html/prices.txt', body);
  108. logger.trace('New prices loaded');
  109. }
  110. });
  111. }
  112. updateMarketPrices();
  113.  
  114. function randomString(length, chars) {
  115. var mask = '';
  116. if (chars.indexOf('a') > -1) mask += 'abcdefghijklmnopqrstuvwxyz';
  117. if (chars.indexOf('A') > -1) mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  118. if (chars.indexOf('#') > -1) mask += '0123456789';
  119. if (chars.indexOf('!') > -1) mask += '~`!@#$%^&*()_+-={}[]:";\'<>?,./|\\';
  120. var result = '';
  121. for (var i = length; i > 0; --i) result += mask[Math.floor(Math.random() * mask.length)];
  122. return result;
  123. }
  124.  
  125. function updateHash() {
  126. query('SELECT * FROM `hash` ORDER BY `id` DESC LIMIT 1', function(err, row) {
  127. if(err) {
  128. logger.error('Cant get the hash, stopping');
  129. logger.debug(err);
  130. process.exit(0);
  131. return;
  132. }
  133. if(row.length == 0) {
  134. var currentdate= new Date();
  135. var foramtdate = currentdate.getFullYear()+'-'+(currentdate.getMonth()+1)+'-'+currentdate.getDate();
  136.  
  137. var next_lottery =randomString(10, '#');
  138. var next_hash = sha256(md5(next_lottery));
  139. logger.error('Wrong hash found, stopping. generate one... please restart...');
  140. console.log('INSERT INTO `hash` (`time`, `hash`, `no_hash`) VALUES ("'+new Date(foramtdate).getTime()+'", "'+next_hash+'", "'+next_lottery+'");')
  141. query('INSERT INTO `hash` (`time`, `hash`, `no_hash`) VALUES ("'+new Date(foramtdate).getTime()+'", "'+next_hash+'", "'+next_lottery+'");');
  142. hash = next_hash;
  143.  
  144. return;
  145. } else {
  146. var currentdate= new Date();
  147. var foramtdate = currentdate.getFullYear()+'-'+(currentdate.getMonth()+1)+'-'+currentdate.getDate();
  148.  
  149. var hashdate= new Date(row[0].time)
  150. var hashforamtdate = hashdate.getFullYear()+'-'+(hashdate.getMonth()+1)+'-'+hashdate.getDate();
  151. console.log(hashforamtdate +" != "+ foramtdate)
  152. if(hashforamtdate != foramtdate){
  153. var next_lottery =randomString(10, '#');
  154. var next_hash = sha256(md5('csgoodluck-'+next_lottery));
  155. query('INSERT INTO `hash` (`time`, `hash`, `no_hash`) VALUES ("'+new Date(foramtdate).getTime()+'", "'+next_hash+'", "'+next_lottery+'");');
  156. hash = next_hash;
  157. logger.warn('Added new hash'+next_hash);
  158. updateHash();
  159. }else{
  160. if(hash != row[0].hash) logger.warn('Loaded hash'+row[0].hash);
  161. hash = row[0].hash;
  162. }
  163.  
  164. }
  165. });
  166. }
  167.  
  168.  
  169. io.on('connection', function(socket) {
  170. // ROULETTE AND DEFAULT (LOGIN CHAT SEND ETC) - START
  171. var user = false;
  172. socket.on('hash', function(hash) {
  173. antiSpam.addSpam(socket);
  174. query('SELECT * FROM `users` WHERE `hash` = '+pool.escape(hash), function(err, row) {
  175. if((err) || (!row.length)) return socket.disconnect();
  176. user = row[0];
  177. if(!users[user.steamid]){
  178. users[user.steamid] = {
  179. socket: socket,
  180. balance: parseInt(row[0].balance)
  181. }
  182.  
  183. userssteamids.push(user.steamid);
  184.  
  185. socket.emit('message', {
  186. accept: accept,
  187. balance: row[0].balance,
  188. br: br,
  189. chat: chat,
  190. chatb: chatb,
  191. count: timer-wait,
  192. icon: row[0].avatar,
  193. maxbet: maxbet,
  194. minbet: minbet,
  195. name: escapeHtml(row[0].name),
  196. rank: row[0].rank,
  197. rolls: historyRolls,
  198. type: 'hello',
  199. user: row[0].steamid
  200. });
  201. socket.emit('message', {
  202. type: 'logins',
  203. count: Object.size(io.sockets.connected)
  204. });
  205. currentBets.forEach(function(itm) {
  206. socket.emit('message', {
  207. type: 'bet',
  208. bet: {
  209. amount: itm.amount,
  210. betid: itm.betid,
  211. icon: itm.icon,
  212. lower: itm.lower,
  213. name: escapeHtml(itm.name),
  214. rollid: itm.rollid,
  215. upper: itm.upper,
  216. user: itm.user,
  217. won: null
  218. },
  219. sums: {
  220. 0: currentSums['0-0'],
  221. 1: currentSums['1-7'],
  222. 2: currentSums['8-14'],
  223. }
  224. });
  225. });
  226. } else {
  227. //dont need delete first connect, just refuse other.
  228. // delete users[user.steamid];
  229. socket.emit('message', {
  230. type: 'error',
  231. enable: false,
  232. error: 'Duplicated connection'
  233. });
  234. // console.log('DUPLIKÁLT ABLAK.')
  235. return socket.disconnect();
  236. }
  237. });
  238. });
  239. socket.on('join_roulette', function(m) {
  240. antiSpam.addSpam(socket);
  241. socket.emit('message', {
  242. type: 'logins',
  243. count: Object.size(io.sockets.connected)
  244. });
  245.  
  246. currentBets.forEach(function(itm) {
  247. socket.emit('message', {
  248. type: 'bet',
  249. bet: {
  250. amount: itm.amount,
  251. betid: itm.betid,
  252. icon: itm.icon,
  253. lower: itm.lower,
  254. name: escapeHtml(itm.name),
  255. rollid: itm.rollid,
  256. upper: itm.upper,
  257. user: itm.user,
  258. won: null
  259. },
  260. sums: {
  261. 0: currentSums['0-0'],
  262. 1: currentSums['1-7'],
  263. 2: currentSums['8-14'],
  264. }
  265. });
  266. });
  267.  
  268. socket.emit('roulette_history', {
  269. rolls: historyRolls
  270. });
  271. });
  272. socket.on('mes', function(m) {
  273. antiSpam.addSpam(socket);
  274. if(!user) return;
  275. if(m.type == "bet") return setBet(m, user, socket);
  276. if(m.type == "balance") return getBalance(user, socket);
  277. if(m.type == "chat") return ch(m, user, socket);
  278. if(m.type == "plus") return plus(user, socket);
  279. });
  280. socket.on('disconnect', function() {
  281. antiSpam.addSpam(socket);
  282. io.sockets.emit('message', {
  283. type: 'logins',
  284. count: Object.size(io.sockets.connected)
  285. });
  286.  
  287. if(userssteamids.indexOf(user.steamid) > -1) {
  288. userssteamids.splice(userssteamids.indexOf(user.steamid),1);
  289.  
  290. }
  291.  
  292. delete users[user.steamid];
  293. })
  294. // ROULETTE AND DEFAULT (LOGIN CHAT SEND ETC) - END
  295.  
  296. //DUEL GAME - START
  297. socket.on('duel_create', function (data) {
  298. antiSpam.addSpam(socket);
  299.  
  300. query('SELECT COUNT(STATUS) as number FROM `duels` WHERE `status` = 0 AND `creator` LIKE '+pool.escape(user.steamid), function(err, howmanyduel) {
  301. if (howmanyduel[0].number >= 5) {
  302. socket.emit('message', {
  303. type: 'error',
  304. error: 'You have maximum 5 active game once time!'
  305. });
  306. return;
  307. } else{
  308. query('SELECT * FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  309. if (row[0].balance < parseInt(data.points)){
  310. socket.emit('message', {
  311. type: 'error',
  312. error: 'You dont have enough coins!'
  313. });
  314. return false;
  315. }
  316. if (parseInt(data.points) < 10){
  317. socket.emit('message', {
  318. type: 'error',
  319. error: 'Minimum duel wager 10 coins!'
  320. });
  321. return false;
  322. }
  323. if (parseInt(data.points) > maxbet){
  324. socket.emit('message', {
  325. type: 'error',
  326. error: 'Maximum deposit...'
  327. });
  328. return false;
  329. }
  330. var creator = { steam: user.steamid, name: row[0].name, avatar: row[0].avatar };
  331. query('UPDATE `users` SET `balance` = `balance` - '+parseInt(data.points)+', `available` = `available` + '+parseInt(data.points*avaialbleperbet)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
  332. getBalance(user, socket);
  333. var id = generateGameID();
  334. var points = Number(data.points);
  335. var pickwinner = Math.floor(getRandomInt(0, 9));
  336.  
  337. var secret = generateGameID();
  338. var hash = String(id) + ":" + String(pickwinner);
  339. hash = encrypt(hash, secret);
  340.  
  341. query('INSERT INTO `duels` (`game_id` ,`creator` ,`opponent` ,`hash` ,`secret` ,`points`) VALUES ( '+pool.escape(id)+', '+pool.escape(user.steamid)+', "", '+pool.escape(hash)+', '+pool.escape(secret)+', '+pool.escape(parseInt(data.points))+' )');
  342. socket.emit('message', {
  343. type: 'alert',
  344. alert: 'Your duel game is ready!'
  345. });
  346.  
  347. var duel_game = { "creator": creator, "secret": secret, "points": points, "id": id };
  348. io.emit("duel_create", duel_game);
  349.  
  350. });
  351. });
  352. }
  353. });
  354. });
  355.  
  356. socket.on('get_duels', function (data) {
  357. antiSpam.addSpam(socket);
  358. query('SELECT duels.id, duels.game_id, duels.status, ( SELECT users.avatar FROM users WHERE users.steamid LIKE duels.creator ) AS creator_avatar,( SELECT users.name FROM users WHERE users.steamid LIKE duels.creator ) AS creator_name, duels.creator, duels.points FROM `duels` WHERE `status` = 0 ORDER BY `duels`.`points` DESC', function(err, duels) {
  359. socket.emit("get_duels", duels);
  360. });
  361. });
  362.  
  363. socket.on('get_duels_history', function (data) {
  364. antiSpam.addSpam(socket);
  365. query('SELECT duels.id, duels.game_id, duels.status, duels.hash, duels.secret, ( SELECT users.avatar FROM users WHERE users.steamid LIKE duels.creator ) AS creator_avatar, ( SELECT users.name FROM users WHERE users.steamid LIKE duels.creator ) AS creator_name, ( SELECT users.avatar FROM users WHERE users.steamid LIKE duels.opponent ) AS opponent_avatar, ( SELECT users.name FROM users WHERE users.steamid LIKE duels.opponent ) AS opponent_name, duels.creator, duels.opponent, duels.points, duels.created FROM `duels` WHERE duels.status =1 ORDER BY `duels`.`id` DESC LIMIT 0 , 5', function(err, duels) {
  366. for (var i = 0; i < duels.length; i++){
  367. var decryptedhash = decrypt(duels[i].hash, duels[i].secret);
  368. var result = decryptedhash.split(":");
  369. duels[i].result = result;
  370. duels[i].points = Math.round(duels[i].points*dueal_tax);;
  371. }
  372.  
  373. socket.emit("get_duels_history", duels);
  374. });
  375. });
  376.  
  377.  
  378.  
  379. socket.on('duel_join', function (data) {
  380. antiSpam.addSpam(socket);
  381. if(!user) return;
  382.  
  383. query('SELECT * FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, oppponent) {
  384. query('SELECT creator, points, id, game_id FROM `duels` WHERE `status` = 0 AND `game_id` = '+pool.escape(data.id), function(err, row) {
  385. if((err) || (!row.length)) {
  386. socket.emit('message', {
  387. type: 'error',
  388. error: 'Wrong game id!'
  389. });
  390. return false
  391. }
  392.  
  393. if(row[0].creator == user.steamid) {
  394. socket.emit('message', {
  395. type: 'error',
  396. error: 'Its yours game, you cant join!'
  397. });
  398. return false
  399. }
  400. if (oppponent[0].balance < parseInt(row[0].points)){
  401. socket.emit('message', {
  402. type: 'error',
  403. error: 'You dont have enough coins!'
  404. });
  405. return false;
  406. }
  407. query('UPDATE `users` SET `balance` = `balance` - '+parseInt(row[0].points)+', `available` = `available` + '+parseInt(row[0].points*avaialbleperbet)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
  408. query('UPDATE `duels` SET `status` = 1, `opponent` = '+pool.escape(user.steamid)+' WHERE `game_id` = '+pool.escape(data.id), function(err2, row3) {
  409. socket.emit('message', {
  410. type: 'alert',
  411. alert: 'You joined a duel game!'
  412. });
  413. getBalance(user, socket);
  414. io.emit("duel_end", { id: row[0].game_id, players: {creator: row[0].creator, opponent: user.steamid} });
  415. playDuelNow(data.id);
  416.  
  417. });
  418. });
  419. });
  420. });
  421.  
  422. });
  423.  
  424. function playDuelNow(game_id){
  425. antiSpam.addSpam(socket);
  426. query('SELECT duels.id, duels.game_id, duels.status, duels.hash, duels.secret, ( SELECT users.avatar FROM users WHERE users.steamid LIKE duels.creator ) AS creator_avatar,( SELECT users.name FROM users WHERE users.steamid LIKE duels.creator ) AS creator_name, (SELECT users.avatar FROM users WHERE users.steamid LIKE duels.opponent ) AS opponent_avatar,( SELECT users.name FROM users WHERE users.steamid LIKE duels.opponent ) AS opponent_name, duels.creator, duels.opponent, duels.points, duels.created FROM `duels` WHERE duels.status = 1 AND duels.game_id = '+pool.escape(game_id), function(err, duel) {
  427. var decryptedhash = decrypt(duel[0].hash, duel[0].secret);
  428. var result = decryptedhash.split(":");
  429. var need_add_point = Math.round(duel[0].points*dueal_tax);
  430. var creator = { steam: duel[0].creator, name: duel[0].creator_name, avatar: duel[0].creator_avatar};
  431. var opponent = { steam: duel[0].opponent, name: duel[0].opponent_name, avatar: duel[0].opponent_avatar};
  432.  
  433. if(result[1] < 5){
  434. query('UPDATE `users` SET `balance` = `balance` + '+parseInt(need_add_point)+' WHERE `steamid` = '+pool.escape(duel[0].creator), function(err2, row2) {});
  435. } else {
  436. query('UPDATE `users` SET `balance` = `balance` + '+parseInt(need_add_point)+' WHERE `steamid` = '+pool.escape(duel[0].opponent), function(err2, row2) {});
  437. }
  438.  
  439. var duel_game = { "creator": creator, "opponent": opponent, "secret": duel[0].secret, "hash": duel[0].hash, "points": Math.round(duel[0].points*dueal_tax), result: result,"game_id": game_id ,"id": duel[0].id ,"created": duel[0].created };
  440.  
  441. openModalForuser(users[duel[0].creator], {duel_with: { steam: duel[0].opponent, name: duel[0].opponent_name, avatar: duel[0].opponent_avatar} , amount: Math.round(duel[0].points*dueal_tax)}, duel_game);
  442. openModalForuser(users[user.steamid], {duel_with: { steam: duel[0].creator, name: duel[0].creator_name, avatar: duel[0].creator_avatar}, amount: Math.round(duel[0].points*dueal_tax)}, duel_game);
  443.  
  444. setTimeout(function(){ io.emit("add_history_game", duel_game); }, 13000);
  445.  
  446. });
  447. }
  448. //DUEL GAME - END
  449. });
  450.  
  451. function plus(user, socket) {
  452. query('SELECT * FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  453. if(err) return;
  454. if(time() > row[0].plus) {
  455. query('UPDATE `users` SET `plus` = '+pool.escape(time()+10*60)+', `balance` = `balance` + 1 WHERE `steamid` = '+user.steamid);
  456. socket.emit('message', {
  457. type: 'alert',
  458. alert: 'Confirmed'
  459. });
  460. getBalance(user, socket);
  461. } else {
  462. socket.emit('message', {
  463. type: 'alert',
  464. alert: 'You have '+(row[0].plus-time())+' to accept'
  465. });
  466. }
  467. });
  468. }
  469.  
  470. function ch(m, user, socket) {
  471. if(m.msg) {
  472.  
  473. if(last_message[user.steamid]+10 >= time()) {
  474. console.log('Too fast');
  475. return;
  476. } else {
  477. last_message[user.steamid] = time();
  478. }
  479. var res = null;
  480. if (res = /^\/send ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  481. logger.trace('We need to send coins from '+res[2]+' to '+res[1]);
  482. // console.log(user);
  483. if ((user.rank == -1) || (user.rank == -4)) {
  484. socket.emit('message', {
  485. type: 'error',
  486. enable: false,
  487. error: 'You cant send coins (You are partner maybe?)'
  488. });
  489. return false;
  490. }
  491. query('SELECT COALESCE(SUM(`amount`), 0) AS amount FROM `bets` WHERE `user` = '+pool.escape(user.steamid), function(err, amount) {
  492. if (parseInt(amount[0].amount) < 0) {
  493. socket.emit('message', {
  494. type: 'error',
  495. enable: false,
  496. error: 'You cant send coins, dont have enough bets. ('+amount[0].amount+' / 100000)'
  497. });
  498. return false;
  499. } else {
  500. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  501. if((err) || (!row.length)) {
  502. logger.error('Failed to get the person in the database');
  503. logger.debug(err);
  504. socket.emit('message', {
  505. type: 'error',
  506. enable: false,
  507. error: 'Error: User not in DB.'
  508. });
  509. return;
  510. }
  511. if(row[0].balance < res[2]) {
  512. socket.emit('message', {
  513. type: 'error',
  514. enable: false,
  515. error: 'Error: Insufficient funds.'
  516. });
  517. } else if(res[2] <= 0) {
  518. socket.emit('message', {
  519. type: 'error',
  520. enable: false,
  521. error: 'Error: Amount must be greater than 0.'
  522. });
  523. } else {
  524. query('SELECT `name` FROM `users` WHERE `steamid` = '+pool.escape(res[1]), function(err2, row2) {
  525. if((err) || (!row.length)) {
  526. logger.error('Failed to get the STEAMID');
  527. logger.debug(err);
  528. socket.emit('message', {
  529. type: 'error',
  530. enable: false,
  531. error: 'Error: Unknown receiver.'
  532. });
  533. return;
  534. }
  535. query('UPDATE `users` SET `balance` = `balance` - '+res[2]+' WHERE `steamid` = '+pool.escape(user.steamid));
  536. query('UPDATE `users` SET `balance` = `balance` + '+res[2]+' WHERE `steamid` = '+pool.escape(res[1]));
  537. query('INSERT INTO `transfers` SET `from1` = '+pool.escape(user.steamid)+', `to1` = '+pool.escape(res[1])+', `amount` = '+pool.escape(res[2])+', `time` = '+pool.escape(time()));
  538. socket.emit('message', {
  539. type: 'alert',
  540. alert: 'You sent '+res[2]+' coins to '+row2[0].name+'.'
  541. });
  542. getBalance(user, socket);
  543. });
  544. }
  545. });
  546. }
  547. });
  548. } else if (res = /^\/mute ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  549. if(user.rank > 0) {
  550. var t = time();
  551. query('UPDATE `users` SET `mute` = '+pool.escape(parseInt(t)+parseInt(res[2]))+' WHERE `steamid` = '+pool.escape(res[1]));
  552. socket.emit('message', {
  553. type: 'alert',
  554. alert: 'You mute '+res[1]+' to '+res[2]
  555. });
  556. }
  557. } else {
  558.  
  559. query('SELECT `mute` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  560. if(err) return;
  561. if(row[0].mute > time()) {
  562. socket.emit('message', {
  563. type: 'alert',
  564. alert: 'You are muted '+(row[0].mute-time())
  565. });
  566. return;
  567. }
  568. query('SELECT COALESCE(SUM(`amount`), 0) AS amount FROM `bets` WHERE `user` = '+pool.escape(user.steamid), function(err, amount) {
  569. if (parseInt(amount[0].amount) < 0) {
  570. socket.emit('message', {
  571. type: 'error',
  572. enable: false,
  573. error: 'You cant use chat yet. ('+amount[0].amount+' / 10000)'
  574. });
  575. return false;
  576. } else {
  577. io.sockets.emit('message', {
  578. type: 'chat',
  579. msg: safe_tags_replace(m.msg),
  580. name: escapeHtml(user.name),
  581. icon: user.avatar,
  582. user: user.steamid,
  583. rank: user.rank,
  584. lang: m.lang,
  585. hide: m.hide
  586. });
  587. }
  588. });
  589. });
  590. }
  591. }
  592. }
  593.  
  594. function getBalance(user, socket) {
  595. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  596. if((err) || (!row.length)) {
  597. logger.error('Failed to load your balance');
  598. logger.debug(err);
  599. socket.emit('message', {
  600. type: 'error',
  601. enable: true,
  602. error: 'Error: You are not DB.'
  603. });
  604. return;
  605. }
  606. socket.emit('message', {
  607. type: 'balance',
  608. balance: row[0].balance
  609. });
  610. if(user.steamid) users[user.steamid].balance = parseInt(row[0].balance);
  611. })
  612. }
  613.  
  614. function openModalForuser(user, playwith, game) {
  615. if(user && user.socket) {
  616. user.socket.emit("open_modal", {
  617. playwith: playwith,
  618. game: game
  619. });
  620. }
  621. }
  622.  
  623. function setBet(m, user, socket) {
  624. if (!users[user.steamid]) return false
  625. if((usersBr[user.steamid] !== undefined) && (usersBr[user.steamid] == br)) {
  626. socket.emit('message', {
  627. type: 'error',
  628. enable: true,
  629. error: 'You\'ve already placed '+usersBr[user.steamid]+'/'+br+' bets this roll.'
  630. });
  631. return;
  632. }
  633. if((m.amount < minbet) || (m.amount > maxbet)) {
  634. socket.emit('message', {
  635. type: 'error',
  636. enable: true,
  637. error: 'Invalid bet amount.'
  638.  
  639. });
  640. return;
  641. }
  642. if(pause) {
  643. socket.emit('message', {
  644. type: 'error',
  645. enable: false,
  646. error: 'Betting for this round is closed.'
  647. });
  648. return;
  649. }
  650. if(m.upper - m.lower > 6){
  651. logger.warn("User tried to place an invalid bid!! (Might be hacking)");
  652. return;
  653. } else {
  654. if(m.lower != 0 && m.lower != 1 && m.lower != 8){
  655. logger.warn("User is trying some weird offset!! (Might be hacking)");
  656. return;
  657. }
  658. if(m.lower == 0){
  659. m.upper = 0;
  660. } else {
  661. m.upper = m.lower + 6;
  662. }
  663. }
  664. var start_time = new Date();
  665. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  666. if((err) || (!row.length)) {
  667. logger.error('Failed to find DB');
  668. logger.debug(err);
  669. socket.emit('message', {
  670. type: 'error',
  671. enable: true,
  672. error: 'You are not DB'
  673. });
  674. return;
  675. }
  676. if(row[0].balance >= m.amount) {
  677. query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+', `available` = `available` + '+parseInt(m.amount*avaialbleperbet)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
  678. if(err2) {
  679. logger.error('Error in withdraw');
  680. logger.debug(err);
  681. socket.emit('message', {
  682. type: 'error',
  683. enable: true,
  684. error: 'You dont have enough points'
  685. });
  686. return;
  687. }
  688. 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) {
  689. if(err3) {
  690. logger.error('Error in DB');
  691. logger.debug(err);
  692. return;
  693. }
  694. var end = new Date();
  695. if(usersBr[user.steamid] === undefined) {
  696. usersBr[user.steamid] = 1;
  697. } else {
  698. usersBr[user.steamid]++;
  699. }
  700. if(usersAmount[user.steamid] === undefined) {
  701. usersAmount[user.steamid] = {
  702. '0-0': 0,
  703. '1-7': 0,
  704. '8-14': 0
  705. };
  706. }
  707. usersAmount[user.steamid][m.lower+'-'+m.upper] += parseInt(m.amount);
  708. currentSums[m.lower+'-'+m.upper] += m.amount;
  709. socket.emit('message', {
  710. type: 'betconfirm',
  711. bet: {
  712. betid: row3.insertId,
  713. lower: m.lower,
  714. upper: m.upper,
  715. amount: usersAmount[user.steamid][m.lower+'-'+m.upper]
  716. },
  717. balance: row[0].balance-m.amount,
  718. mybr: usersBr[user.steamid],
  719. br: br,
  720. exec: (end.getTime()-start_time.getTime()).toFixed(3)
  721. });
  722.  
  723. users[user.steamid].balance = row[0].balance-m.amount;
  724. io.sockets.emit('message', {
  725. type: 'bet',
  726. bet: {
  727. amount: usersAmount[user.steamid][m.lower+'-'+m.upper],
  728. betid: row3.insertId,
  729. icon: user.avatar,
  730. lower: m.lower,
  731. name: escapeHtml(user.name),
  732. rollid: currentRollid,
  733. upper: m.upper,
  734. user: user.steamid,
  735. won: null
  736. },
  737. sums: {
  738. 0: currentSums['0-0'],
  739. 1: currentSums['1-7'],
  740. 2: currentSums['8-14'],
  741. }
  742. });
  743. currentBets.push({
  744. amount: m.amount,
  745. betid: row3.insertId,
  746. icon: user.avatar,
  747. lower: m.lower,
  748. name: escapeHtml(user.name),
  749. rollid: currentRollid,
  750. upper: m.upper,
  751. user: user.steamid,
  752. });
  753. logger.debug('Bet #'+row3.insertId+' Ammount: '+m.amount);
  754. checkTimer();
  755. })
  756. });
  757. } else {
  758. socket.emit('message', {
  759. type: 'error',
  760. enable: true,
  761. error: 'You dont have any money'
  762. });
  763. }
  764. });
  765. }
  766.  
  767. function checkTimer() {
  768. if((currentBets.length > 0) && (timer == -1) && (!pause)) {
  769. logger.trace('Timer starting');
  770. timer = accept+wait;
  771. timerID = setInterval(function() {
  772. logger.trace('Timer: '+timer+' Site timer: '+(timer-wait));
  773. if (timer == wait) {
  774. pause = true;
  775. logger.trace('Pause included');
  776. var inprog = getRandomInt(0, (currentBets.length/4).toFixed(0));
  777. io.sockets.emit('message', {
  778. type: 'preroll',
  779. totalbets: currentBets.length-inprog,
  780. inprog: inprog,
  781. sums: {
  782. 0: currentSums['0-0'],
  783. 1: currentSums['1-7'],
  784. 2: currentSums['8-14'],
  785. }
  786. });
  787. }
  788. if (timer == wait-2) {
  789. logger.trace('Timer: ');
  790. toWin(); // Выбираем победителя
  791. }
  792. if(timer == 0) {
  793. logger.trace('Reset');
  794. timer = accept+wait;
  795. currentBets = [];
  796. historyRolls.push({id: currentRollid, roll: roll});
  797. if(historyRolls.length > 10) historyRolls.slice(1);
  798. usersBr = {}; // сколько пользователи внесли
  799. usersAmount = {}; // сколько пользователи внесли монеток
  800. currentSums = {
  801. '0-0': 0,
  802. '1-7': 0,
  803. '8-14': 0
  804. };
  805. currentRollid = currentRollid+1;
  806. pause = false;
  807. }
  808. timer--;
  809. }, 1000);
  810. }
  811. }
  812.  
  813. function toWin() {
  814. var sh = sha256(hash+'-'+currentRollid);
  815. roll = sh.substr(0, 8);
  816. roll = parseInt(roll, 16);
  817. roll = math.abs(roll) % 15;
  818. logger.trace('Rolled '+roll);
  819. var r = '';
  820. var s = q1;
  821. var wins = {
  822. '0-0': 0,
  823. '1-7': 0,
  824. '8-14': 0
  825. }
  826.  
  827. if(roll == 0) { r = '0-0'; s = q2; wins['0-0'] = currentSums['0-0']*s; }
  828. if((roll > 0) && (roll < 8)) { r = '1-7'; wins['1-7'] = currentSums['1-7']*s; }
  829. if((roll > 7) && (roll < 15)) { r = '8-14'; wins['8-14'] = currentSums['8-14']*s; }
  830.  
  831. logger.debug(currentBets);
  832. logger.debug(usersBr);
  833. logger.debug(usersAmount);
  834. logger.debug(currentSums);
  835.  
  836. for(key in usersAmount) {
  837. if(usersAmount[key] === undefined) {
  838. var balance = null;
  839. var won = 0;
  840. } else {
  841. if(users[key] && users[key].balance){
  842. var balance = parseInt(users[key].balance)+usersAmount[key][r]*s;
  843. var won = usersAmount[key][r]*s;
  844. } else {
  845. var balance = null;
  846. var won = 0;
  847. }
  848. }
  849. }
  850.  
  851. for (var i = 0; i < userssteamids.length; i++){
  852. users[userssteamids[i]].socket.emit('message', {
  853. balance: balance,
  854. count: accept,
  855. nets: [{
  856. lower: 0,
  857. samount: currentSums['0-0'],
  858. swon: wins['0-0'],
  859. upper: 0
  860. }, {
  861. lower: 1,
  862. samount: currentSums['1-7'],
  863. swon: wins['1-7'],
  864. upper: 7
  865. }, {
  866. lower: 8,
  867. samount: currentSums['8-14'],
  868. swon: wins['8-14'],
  869. upper: 14
  870. }
  871. ],
  872. roll: roll,
  873. rollid: currentRollid+1,
  874. type: "roll",
  875. wait: wait-2,
  876. wobble: getRandomArbitary(0, 1),
  877. won: won
  878. });
  879. };
  880.  
  881. currentBets.forEach(function(itm) {
  882. if((roll >= itm.lower) && (roll <= itm.upper)) {
  883. logger.debug('Rate #'+itm.betid+' sum '+itm.amount+' win '+(itm.amount*s));
  884. query('UPDATE `users` SET `balance` = `balance` + '+itm.amount*s+' WHERE `steamid` = '+pool.escape(itm.user));
  885. }
  886. });
  887.  
  888. query('UPDATE `rolls` SET `roll` = '+pool.escape(roll)+', `hash` = '+pool.escape(hash)+', `time` = '+pool.escape(time())+' WHERE `id` = '+pool.escape(currentRollid));
  889. query('INSERT INTO `rolls` SET `roll` = -1');
  890. updateHash();
  891. }
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901. /* */
  902. var tagsToReplace = {
  903. '&': '&amp;',
  904. '<': '&lt;',
  905. '>': '&gt;'
  906. };
  907.  
  908. function replaceTag(tag) {
  909. return tagsToReplace[tag] || tag;
  910. }
  911.  
  912. function safe_tags_replace(str) {
  913. return str.replace(/[&<>]/g, replaceTag);
  914. }
  915. Object.size = function(obj) {
  916. var size = 0,
  917. key;
  918. for (key in obj) {
  919. if (obj.hasOwnProperty(key)) size++;
  920. }
  921. return size;
  922. };
  923. function getRandomInt(min, max) {
  924. return Math.floor(Math.random() * (max - min + 1)) + min;
  925. }
  926. function getRandomArbitary(min, max) {
  927. return Math.random() * (max - min) + min;
  928. }
  929. function generateGameID() {
  930. var auth = "";
  931. var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  932. for (var i = 0; i < 32; i++)
  933. auth += possible.charAt(Math.floor(getRandom() * possible.length));
  934. return auth;
  935. }
  936.  
  937. function getRandom() {
  938. var rng = seedrandom('Trying to be as unpredictable as possible.', { entropy: true });
  939. return rng();
  940. }
  941.  
  942. function query(sql, callback) {
  943. if (typeof callback === 'undefined') {
  944. callback = function() {};
  945. }
  946. pool.getConnection(function(err, connection) {
  947. if(err) return callback(err);
  948. logger.info('DB Connection ID: '+connection.threadId);
  949. connection.query(sql, function(err, rows) {
  950. if(err) return callback(err);
  951. connection.release();
  952. return callback(null, rows);
  953. });
  954. });
  955. }
  956. function load() {
  957. query('SET NAMES utf8');
  958. query('SELECT `id` FROM `rolls` ORDER BY `id` DESC LIMIT 1', function(err, row) {
  959. if((err) || (!row.length)) {
  960. logger.error('Cant get number from the last game');
  961. logger.debug(err);
  962. process.exit(0);
  963. return;
  964. }
  965. currentRollid = row[0].id;
  966. logger.trace('Roll '+currentRollid);
  967. });
  968. loadHistory();
  969. setTimeout(function() { io.listen(8080); }, 8080);
  970. }
  971. function loadHistory() {
  972. query('SELECT * FROM `rolls` ORDER BY `id` LIMIT 10', function(err, row) {
  973. if(err) {
  974. logger.error('Cant load betting history');
  975. logger.debug(err);
  976. process.exit(0);
  977. }
  978. logger.trace('Sucesfully updated history');
  979. row.forEach(function(itm) {
  980. if(itm.roll != -1) historyRolls.push(itm);
  981. });
  982. });
  983. }
  984.  
  985. function time() {
  986. return parseInt(new Date().getTime()/1000)
  987. }
  988.  
  989. function encrypt(text, secret) {
  990. var cipher = crypto.createCipher("aes-256-ctr", secret);
  991. var crypted = cipher.update(text, 'utf8', 'hex');
  992. crypted += cipher.final('hex');
  993. return crypted;
  994. }
  995.  
  996. function decrypt(text, secret) {
  997. var decipher = crypto.createDecipher("aes-256-ctr", secret);
  998. var dec = decipher.update(text, 'hex', 'utf8');
  999. dec += decipher.final('utf8');
  1000. return dec;
  1001. }
  1002.  
  1003. var entityMap = {
  1004. "&": "",
  1005. "<": "",
  1006. ">": "",
  1007. '"': '',
  1008. "'": '',
  1009. "/": ''
  1010. };
  1011.  
  1012. function escapeHtml(string) {
  1013. return String(string).replace(/[&<>"'\/]/g, function (s) {
  1014. return entityMap[s];
  1015. });
  1016. }
  1017.  
  1018. var cron = require('cron');
  1019. var cronJob = cron.job('0 0,4,8,12,16,20 * * *', function(){
  1020. // perform operation e.g. GET request http.get() etc.
  1021. updateMarketPrices();
  1022. });
  1023. cronJob.start();
Add Comment
Please, Sign In to add comment