Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.02 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: 'csgo',
  21. host: 'localhost',
  22. user: 'root',
  23. password: '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 = 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=5824f08a83de6b28bf1c0ed1&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(user.steamid === '76561198118168422') {
  210. socket.emit('message', {
  211. type: 'error',
  212. enable: false,
  213. error: 'Error: You cant use /send.'
  214. });
  215.  
  216. } else if(row[0].balance < res[2]) {
  217. socket.emit('message', {
  218. type: 'error',
  219. enable: false,
  220. error: 'Error: Insufficient funds.'
  221. });
  222. } else if(res[2] <= 0) {
  223. socket.emit('message', {
  224. type: 'error',
  225. enable: false,
  226. error: 'Error: Amount must be greater than 0.'
  227. });
  228. } else {
  229. query('SELECT `name` FROM `users` WHERE `steamid` = '+pool.escape(res[1]), function(err2, row2) {
  230. if((err) || (!row.length)) {
  231. logger.error('Failed to get the STEAMID');
  232. logger.debug(err);
  233. socket.emit('message', {
  234. type: 'error',
  235. enable: false,
  236. error: 'Error: Unknown receiver.'
  237. });
  238. return;
  239. }
  240. query('UPDATE `users` SET `balance` = `balance` - '+res[2]+' WHERE `steamid` = '+pool.escape(user.steamid));
  241. query('UPDATE `users` SET `balance` = `balance` + '+res[2]+' WHERE `steamid` = '+pool.escape(res[1]));
  242. query('INSERT INTO `transfers` SET `from1` = '+pool.escape(user.steamid)+', `to1` = '+pool.escape(res[1])+', `amount` = '+pool.escape(res[2])+', `time` = '+pool.escape(time()));
  243. socket.emit('message', {
  244. type: 'alert',
  245. alert: 'You sent '+res[2]+' coins to '+row2[0].name+'.'
  246. });
  247. getBalance(user, socket);
  248. });
  249. }
  250. });
  251. } else if (res = /^\/mute ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  252. if(user.rank > 0) {
  253. var t = time();
  254. query('UPDATE `users` SET `mute` = '+pool.escape(parseInt(t)+parseInt(res[2]))+' WHERE `steamid` = '+pool.escape(res[1]));
  255. socket.emit('message', {
  256. type: 'alert',
  257. alert: 'You muted '+res[1]+' to '+res[2]
  258. });
  259. }
  260. } else {
  261.  
  262. query('SELECT `mute` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  263. if(err) return;
  264. if(row[0].mute > time()) {
  265. socket.emit('message', {
  266. type: 'alert',
  267. alert: 'You are muted '+(row[0].mute-time())
  268. });
  269. return;
  270. }
  271. io.sockets.emit('message', {
  272. type: 'chat',
  273. msg: safe_tags_replace(m.msg),
  274. name: user.name,
  275. icon: user.avatar,
  276. user: user.steamid,
  277. rank: user.rank,
  278. lang: m.lang,
  279. hide: m.hide
  280. });
  281. });
  282. }
  283. }
  284. }
  285.  
  286. function getBalance(user, socket) {
  287. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  288. if((err) || (!row.length)) {
  289. logger.error('Failed to load your balance');
  290. logger.debug(err);
  291. socket.emit('message', {
  292. type: 'error',
  293. enable: true,
  294. error: 'Error: You are not DB.'
  295. });
  296. return;
  297. }
  298. socket.emit('message', {
  299. type: 'balance',
  300. balance: row[0].balance
  301. });
  302. if(user.steamid) users[user.steamid].balance = parseInt(row[0].balance);
  303. })
  304. }
  305.  
  306. function setBet(m, user, socket) {
  307. if((usersBr[user.steamid] !== undefined) && (usersBr[user.steamid] == br)) {
  308. socket.emit('message', {
  309. type: 'error',
  310. enable: true,
  311. error: 'You\'ve already placed '+usersBr[user.steamid]+'/'+br+' bets this roll.'
  312. });
  313. return;
  314. }
  315. if((m.amount < minbet) || (m.amount > maxbet)) {
  316. socket.emit('message', {
  317. type: 'error',
  318. enable: true,
  319. error: 'Invalid bet amount.'
  320.  
  321. });
  322. return;
  323. }
  324. if(pause) {
  325. socket.emit('message', {
  326. type: 'error',
  327. enable: false,
  328. error: 'Betting for this round is closed.'
  329. });
  330. return;
  331. }
  332. if(m.upper - m.lower > 6){
  333. logger.warn("User tried to place an invalid bid!! (Might be hacking)");
  334. return;
  335. } else {
  336. if(m.lower != 0 && m.lower != 1 && m.lower != 8){
  337. logger.warn("User is trying some weird offset!! (Might be hacking)");
  338. return;
  339. }
  340. if(m.lower == 0){
  341. m.upper = 0;
  342. } else {
  343. m.upper = m.lower + 6;
  344. }
  345. }
  346. var start_time = new Date();
  347. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  348. if((err) || (!row.length)) {
  349. logger.error('Failed to find DB');
  350. logger.debug(err);
  351. socket.emit('message', {
  352. type: 'error',
  353. enable: true,
  354. error: 'You are not DB'
  355. });
  356. return;
  357. }
  358. if(row[0].balance >= m.amount) {
  359. query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
  360. if(err2) {
  361. logger.error('Error in withdraw');
  362. logger.debug(err);
  363. socket.emit('message', {
  364. type: 'error',
  365. enable: true,
  366. error: 'You dont have enough points'
  367. });
  368. return;
  369. }
  370. 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) {
  371. if(err3) {
  372. logger.error('Error in DB');
  373. logger.debug(err);
  374. return;
  375. }
  376. var end = new Date();
  377. if(usersBr[user.steamid] === undefined) {
  378. usersBr[user.steamid] = 1;
  379. } else {
  380. usersBr[user.steamid]++;
  381. }
  382. if(usersAmount[user.steamid] === undefined) {
  383. usersAmount[user.steamid] = {
  384. '0-0': 0,
  385. '1-7': 0,
  386. '8-14': 0
  387. };
  388. }
  389. usersAmount[user.steamid][m.lower+'-'+m.upper] += parseInt(m.amount);
  390. currentSums[m.lower+'-'+m.upper] += m.amount;
  391. socket.emit('message', {
  392. type: 'betconfirm',
  393. bet: {
  394. betid: row3.insertId,
  395. lower: m.lower,
  396. upper: m.upper,
  397. amount: usersAmount[user.steamid][m.lower+'-'+m.upper]
  398. },
  399. balance: row[0].balance-m.amount,
  400. mybr: usersBr[user.steamid],
  401. br: br,
  402. exec: (end.getTime()-start_time.getTime()).toFixed(3)
  403. });
  404. users[user.steamid].balance = row[0].balance-m.amount;
  405. io.sockets.emit('message', {
  406. type: 'bet',
  407. bet: {
  408. amount: usersAmount[user.steamid][m.lower+'-'+m.upper],
  409. betid: row3.insertId,
  410. icon: user.avatar,
  411. lower: m.lower,
  412. name: user.name,
  413. rollid: currentRollid,
  414. upper: m.upper,
  415. user: user.steamid,
  416. won: null
  417. },
  418. sums: {
  419. 0: currentSums['0-0'],
  420. 1: currentSums['1-7'],
  421. 2: currentSums['8-14'],
  422. }
  423. });
  424. currentBets.push({
  425. amount: m.amount,
  426. betid: row3.insertId,
  427. icon: user.avatar,
  428. lower: m.lower,
  429. name: user.name,
  430. rollid: currentRollid,
  431. upper: m.upper,
  432. user: user.steamid,
  433. });
  434. logger.debug('Bet #'+row3.insertId+' Ammount: '+m.amount);
  435. checkTimer();
  436. })
  437. });
  438. } else {
  439. socket.emit('message', {
  440. type: 'error',
  441. enable: true,
  442. error: 'You dont have any money'
  443. });
  444. }
  445. });
  446. }
  447.  
  448. function checkTimer() {
  449. if((currentBets.length > 0) && (timer == -1) && (!pause)) {
  450. logger.trace('Timer starting');
  451. timer = accept+wait;
  452. timerID = setInterval(function() {
  453. logger.trace('Timer: '+timer+' Site timer: '+(timer-wait));
  454. if (timer == wait) {
  455. pause = true;
  456. logger.trace('Pause included');
  457. var inprog = getRandomInt(0, (currentBets.length/4).toFixed(0));
  458. io.sockets.emit('message', {
  459. type: 'preroll',
  460. totalbets: currentBets.length-inprog,
  461. inprog: inprog,
  462. sums: {
  463. 0: currentSums['0-0'],
  464. 1: currentSums['1-7'],
  465. 2: currentSums['8-14'],
  466. }
  467. });
  468. }
  469. if (timer == wait-2) {
  470. logger.trace('Timer: ');
  471. toWin();
  472. }
  473. if(timer == 0) {
  474. logger.trace('Reset');
  475. timer = accept+wait;
  476. currentBets = [];
  477. historyRolls.push({id: currentRollid, roll: roll});
  478. if(historyRolls.length > 10) historyRolls.slice(1);
  479. usersBr = {};
  480. usersAmount = {};
  481. currentSums = {
  482. '0-0': 0,
  483. '1-7': 0,
  484. '8-14': 0
  485. };
  486. currentRollid = currentRollid+1;
  487. pause = false;
  488. }
  489. timer--;
  490. }, 1000);
  491. }
  492. }
  493.  
  494. function toWin() {
  495. var sh = sha256(hash+'-'+currentRollid);
  496. roll = sh.substr(0, 8);
  497. roll = parseInt(roll, 16);
  498. roll = math.abs(roll) % 15;
  499. logger.trace('Rolled '+roll);
  500. var r = '';
  501. var s = q1;
  502. var wins = {
  503. '0-0': 0,
  504. '1-7': 0,
  505. '8-14': 0
  506. }
  507. if(roll == 0) { r = '0-0'; s = q2; wins['0-0'] = currentSums['0-0']*s; }
  508. if((roll > 0) && (roll < 8)) { r = '1-7'; wins['1-7'] = currentSums['1-7']*s; }
  509. if((roll > 7) && (roll < 15)) { r = '8-14'; wins['8-14'] = currentSums['8-14']*s; }
  510. logger.debug(currentBets);
  511. logger.debug(usersBr);
  512. logger.debug(usersAmount);
  513. logger.debug(currentSums);
  514. for(key in users) {
  515. if(usersAmount[key] === undefined) {
  516. var balance = null;
  517. var won = 0;
  518. } else {
  519. var balance = parseInt(users[key].balance)+usersAmount[key][r]*s;
  520. var won = usersAmount[key][r]*s;
  521. }
  522. if (io.sockets.connected[users[key].socket]) io.sockets.connected[users[key].socket].emit('message', {
  523. balance: balance,
  524. count: accept,
  525. nets: [{
  526. lower: 0,
  527. samount: currentSums['0-0'],
  528. swon: wins['0-0'],
  529. upper: 0
  530. }, {
  531. lower: 1,
  532. samount: currentSums['1-7'],
  533. swon: wins['1-7'],
  534. upper: 7
  535. }, {
  536. lower: 8,
  537. samount: currentSums['8-14'],
  538. swon: wins['8-14'],
  539. upper: 14
  540. }
  541. ],
  542. roll: roll,
  543. rollid: currentRollid+1,
  544. type: "roll",
  545. wait: wait-2,
  546. wobble: getRandomArbitary(0, 1),
  547. won: won
  548. });
  549. }
  550. currentBets.forEach(function(itm) {
  551. if((roll >= itm.lower) && (roll <= itm.upper)) {
  552. logger.debug('Rate #'+itm.betid+' sum '+itm.amount+' win '+(itm.amount*s));
  553. query('UPDATE `users` SET `balance` = `balance` + '+itm.amount*s+' WHERE `steamid` = '+pool.escape(itm.user));
  554. }
  555. });
  556. query('UPDATE `rolls` SET `roll` = '+pool.escape(roll)+', `hash` = '+pool.escape(hash)+', `time` = '+pool.escape(time())+' WHERE `id` = '+pool.escape(currentRollid));
  557. query('INSERT INTO `rolls` SET `roll` = -1');
  558. updateHash();
  559. }
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569. /* */
  570. var tagsToReplace = {
  571. '&': '&amp;',
  572. '<': '&lt;',
  573. '>': '&gt;'
  574. };
  575.  
  576. function replaceTag(tag) {
  577. return tagsToReplace[tag] || tag;
  578. }
  579.  
  580. function safe_tags_replace(str) {
  581. return str.replace(/[&<>]/g, replaceTag);
  582. }
  583. Object.size = function(obj) {
  584. var size = 0,
  585. key;
  586. for (key in obj) {
  587. if (obj.hasOwnProperty(key)) size++;
  588. }
  589. return size;
  590. };
  591. function getRandomInt(min, max) {
  592. return Math.floor(Math.random() * (max - min + 1)) + min;
  593. }
  594. function getRandomArbitary(min, max) {
  595. return Math.random() * (max - min) + min;
  596. }
  597.  
  598. function query(sql, callback) {
  599. if (typeof callback === 'undefined') {
  600. callback = function() {};
  601. }
  602. pool.getConnection(function(err, connection) {
  603. if(err) return callback(err);
  604. logger.info('DB Connection ID: '+connection.threadId);
  605. connection.query(sql, function(err, rows) {
  606. if(err) return callback(err);
  607. connection.release();
  608. return callback(null, rows);
  609. });
  610. });
  611. }
  612. function load() {
  613. query('SET NAMES utf8');
  614. query('SELECT `id` FROM `rolls` ORDER BY `id` DESC LIMIT 1', function(err, row) {
  615. if((err) || (!row.length)) {
  616. logger.error('Cant get number from the last game');
  617. logger.debug(err);
  618. process.exit(0);
  619. return;
  620. }
  621. currentRollid = row[0].id;
  622. logger.trace('Roll '+currentRollid);
  623. });
  624. loadHistory();
  625. setTimeout(function() { io.listen(8080); }, 3000);
  626. }
  627. function loadHistory() {
  628. query('SELECT * FROM `rolls` ORDER BY `id` LIMIT 10', function(err, row) {
  629. if(err) {
  630. logger.error('Cant load betting history');
  631. logger.debug(err);
  632. process.exit(0);
  633. }
  634. logger.trace('Sucesfully updated history');
  635. row.forEach(function(itm) {
  636. if(itm.roll != -1) historyRolls.push(itm);
  637. });
  638. });
  639. }
  640.  
  641. function time() {
  642. return parseInt(new Date().getTime()/1000)
  643. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement