Advertisement
Guest User

Untitled

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