Advertisement
Sidwick

Untitled

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