Advertisement
Guest User

Untitled

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