Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.85 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: 'mydatabase',
  21. host: 'localhost',
  22. user: 'root',
  23. password: 'Mypassword'
  24. });
  25.  
  26. process.on('uncaughtException', function (err) {
  27. logger.trace('Strange error');
  28. logger.debug(err);
  29. });
  30.  
  31. /* */
  32. var accept = 20;
  33. var wait = 10;
  34. var br = 3;
  35. var chat = 2;
  36. var chatb = 999;
  37. var maxbet = 1000000;
  38. var minbet = 100;
  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('the url i have will go here(this all works)', 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 + '/var/www/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 + '/var/www/prices.txt')){
  74. prices = JSON.parse(fs.readFileSync(__dirname + '/var/www/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. });
  165. socket.on('disconnect', function() {
  166. io.sockets.emit('message', {
  167. type: 'logins',
  168. count: Object.size(io.sockets.connected)
  169. });
  170. delete users[user.steamid];
  171. })
  172. });
  173.  
  174. function ch(m, user, socket) {
  175. if(m.msg) {
  176. var res = null;
  177. if (res = /^\/send ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  178. logger.trace('problem with translating from russian'+res[2]+' user '+res[1]);
  179. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  180. if((err) || (!row.length)) {
  181. logger.error('Could not find user to send the coins');
  182. logger.debug(err);
  183. socket.emit('message', {
  184. type: 'error',
  185. enable: false,
  186. error: 'Error: You are not DB.'
  187. });
  188. return;
  189. }
  190. if(row[0].balance < res[2]) {
  191. socket.emit('message', {
  192. type: 'error',
  193. enable: false,
  194. error: 'Error: Insufficient funds.'
  195. });
  196. } else if(res[2] <= 0) {
  197. socket.emit('message', {
  198. type: 'error',
  199. enable: false,
  200. error: 'Error: Amount must be greater than 0.'
  201. });
  202. } else {
  203. query('SELECT `name` FROM `users` WHERE `steamid` = '+pool.escape(res[1]), function(err2, row2) {
  204. if((err) || (!row.length)) {
  205. logger.error('Could not get people to move');
  206. logger.debug(err);
  207. socket.emit('message', {
  208. type: 'error',
  209. enable: false,
  210. error: 'Error: Unknown receiver.'
  211. });
  212. return;
  213. }
  214. query('UPDATE `users` SET `balance` = `balance` - '+res[2]+' WHERE `steamid` = '+pool.escape(user.steamid));
  215. query('UPDATE `users` SET `balance` = `balance` + '+res[2]+' WHERE `steamid` = '+pool.escape(res[1]));
  216. query('INSERT INTO `transfers` SET `from1` = '+pool.escape(user.steamid)+', `to1` = '+pool.escape(res[1])+', `amount` = '+pool.escape(res[2])+', `time` = '+pool.escape(time()));
  217. socket.emit('message', {
  218. type: 'alert',
  219. alert: 'You sent '+res[2]+' coins to '+row2[0].name+'.'
  220. });
  221. getBalance(user, socket);
  222. });
  223. }
  224. });
  225. }else {
  226. query('SELECT SUM(`amount`) AS castor FROM `bets` WHERE `user` = '+pool.escape(user.steamid), function(err, row) {
  227. if((err) || (!row.length)) {
  228. logger.error('Failed to get the person to transfer');
  229. logger.debug(err);
  230. socket.emit('message', {
  231. type: 'error',
  232. enable: false,
  233. error: 'Error: Unknown receiver.'
  234. });
  235. return;
  236. }
  237. if(row[0].castor <= chatb) {
  238. socket.emit('message', {
  239. type: 'error',
  240. enable: false,
  241. error: 'Chat unlocks after 1,000 coins have been played. You need to play: '+pool.escape(row[0].castor-chatb + ' coins.')
  242. });
  243. } else if (res = /^\/mute ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  244. if(user.rank > 0) {
  245. var t = time();
  246. query('UPDATE `users` SET `mute` = '+pool.escape(parseInt(t)+parseInt(res[2]))+' WHERE `steamid` = '+pool.escape(res[1]));
  247. socket.emit('message', {
  248. type: 'alert',
  249. alert: 'You mute '+res[1]+' to '+res[2]
  250. });
  251. }
  252. } else {
  253. query('SELECT `mute` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  254. if(err) return;
  255. if(row[0].mute > time()) {
  256. socket.emit('message', {
  257. type: 'alert',
  258. alert: 'You muted '+(row[0].mute-time() + 's.')
  259. });
  260. return;
  261. } else if (res = /^\/ban ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  262. if(user.rank > 0) {
  263. var t = time();
  264. query('UPDATE `users` SET `ban` = 1 WHERE `steamid` = '+pool.escape(res[1]));
  265. socket.emit('message', {
  266. type: 'alert',
  267. alert: 'You ban '+res[1]+' '+res[2]
  268. });
  269. return;
  270. }
  271. }
  272. io.sockets.emit('message', {
  273. type: 'chat',
  274. msg: safe_tags_replace(m.msg),
  275. name: user.name,
  276. icon: user.avatar,
  277. user: user.steamid,
  278. rank: user.rank,
  279. lang: m.lang,
  280. hide: m.hide
  281. });
  282. });
  283. }
  284. });
  285. }
  286. }
  287. }
  288.  
  289. function getBalance(user, socket) {
  290. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  291. if((err) || (!row.length)) {
  292. logger.error('Could not get a person into balance');
  293. logger.debug(err);
  294. socket.emit('message', {
  295. type: 'error',
  296. enable: true,
  297. error: 'Error: You are not DB.'
  298. });
  299. return;
  300. }
  301. socket.emit('message', {
  302. type: 'balance',
  303. balance: row[0].balance
  304. });
  305. if(user.steamid) users[user.steamid].balance = parseInt(row[0].balance);
  306. })
  307. }
  308.  
  309. function setBet(m, user, socket) {
  310. if((usersBr[user.steamid] !== undefined) && (usersBr[user.steamid] == br)) {
  311. socket.emit('message', {
  312. type: 'error',
  313. enable: true,
  314. error: 'You\'ve already placed '+usersBr[user.steamid]+'/'+br+' bets this roll.'
  315. });
  316. return;
  317. }
  318. if((m.amount < minbet) || (m.amount > maxbet)) {
  319. socket.emit('message', {
  320. type: 'error',
  321. enable: true,
  322. error: 'Minimum bet: 100 coins, Maximum bet: 1,000,000 coins.'
  323. });
  324. return;
  325. }
  326. if(pause) {
  327. socket.emit('message', {
  328. type: 'error',
  329. enable: false,
  330. error: 'Betting for this round is closed.'
  331. });
  332. return;
  333. }
  334. var start_time = new Date();
  335. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  336. if((err) || (!row.length)) {
  337. logger.error('Could not get people to rate');
  338. logger.debug(err);
  339. socket.emit('message', {
  340. type: 'error',
  341. enable: true,
  342. error: 'You are not DB!'
  343. });
  344. return;
  345. }
  346. if(row[0].balance >= m.amount) {
  347. query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
  348. if(err2) {
  349. logger.error('There is not enough points.');
  350. logger.debug(err);
  351. socket.emit('message', {
  352. type: 'error',
  353. enable: true,
  354. error: 'You dont have enough points!'
  355. });
  356. return;
  357. }
  358. 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) {
  359. if(err3) {
  360. logger.error('Add error rate in the database');
  361. logger.debug(err);
  362. return;
  363. }
  364. var end = new Date();
  365. if(usersBr[user.steamid] === undefined) {
  366. usersBr[user.steamid] = 1;
  367. } else {
  368. usersBr[user.steamid]++;
  369. }
  370. if(usersAmount[user.steamid] === undefined) {
  371. usersAmount[user.steamid] = {
  372. '0-0': 0,
  373. '1-7': 0,
  374. '8-14': 0
  375. };
  376. }
  377. usersAmount[user.steamid][m.lower+'-'+m.upper] += parseInt(m.amount);
  378. currentSums[m.lower+'-'+m.upper] += m.amount;
  379. socket.emit('message', {
  380. type: 'betconfirm',
  381. bet: {
  382. betid: row3.insertId,
  383. lower: m.lower,
  384. upper: m.upper,
  385. amount: usersAmount[user.steamid][m.lower+'-'+m.upper]
  386. },
  387. balance: row[0].balance-m.amount,
  388. mybr: usersBr[user.steamid],
  389. br: br,
  390. exec: (end.getTime()-start_time.getTime()).toFixed(3)
  391. });
  392. users[user.steamid].balance = row[0].balance-m.amount;
  393. io.sockets.emit('message', {
  394. type: 'bet',
  395. bet: {
  396. amount: usersAmount[user.steamid][m.lower+'-'+m.upper],
  397. betid: row3.insertId,
  398. icon: user.avatar,
  399. lower: m.lower,
  400. name: user.name,
  401. rollid: currentRollid,
  402. upper: m.upper,
  403. user: user.steamid,
  404. won: null
  405. },
  406. sums: {
  407. 0: currentSums['0-0'],
  408. 1: currentSums['1-7'],
  409. 2: currentSums['8-14'],
  410. }
  411. });
  412. currentBets.push({
  413. amount: m.amount,
  414. betid: row3.insertId,
  415. icon: user.avatar,
  416. lower: m.lower,
  417. name: user.name,
  418. rollid: currentRollid,
  419. upper: m.upper,
  420. user: user.steamid,
  421. });
  422. logger.debug('Принял ставку #'+row3.insertId+' сумма '+m.amount);
  423. checkTimer();
  424. })
  425. });
  426. } else {
  427. socket.emit('message', {
  428. type: 'error',
  429. enable: true,
  430. error: 'You dont enough coins.'
  431. });
  432. }
  433. });
  434. }
  435.  
  436. function checkTimer() {
  437. if((currentBets.length > 0) && (timer == -1) && (!pause)) {
  438. logger.trace('Starts timer');
  439. timer = accept+wait;
  440. timerID = setInterval(function() {
  441. logger.trace('Timer: '+timer+' Site timer: '+(timer-wait));
  442. if (timer == wait) {
  443. pause = true;
  444. logger.trace('Pause is on');
  445. var inprog = getRandomInt(0, (currentBets.length/4).toFixed(0));
  446. io.sockets.emit('message', {
  447. type: 'preroll',
  448. totalbets: currentBets.length-inprog,
  449. inprog: inprog,
  450. sums: {
  451. 0: currentSums['0-0'],
  452. 1: currentSums['1-7'],
  453. 2: currentSums['8-14'],
  454. }
  455. });
  456. }
  457. if (timer == wait-2) {
  458. logger.trace('load timer');
  459. toWin(); // Choosing the winner
  460. }
  461. if(timer == 0) {
  462. logger.trace('Reset Tipo');
  463. timer = accept+wait;
  464. currentBets = [];
  465. historyRolls.push({id: currentRollid, roll: roll});
  466. if(historyRolls.length > 10) historyRolls.slice(1);
  467. usersBr = {}; // how many users have
  468. usersAmount = {}; // how many users have coins
  469. currentSums = {
  470. '0-0': 0,
  471. '1-7': 0,
  472. '8-14': 0
  473. };
  474. currentRollid = currentRollid+1;
  475. pause = false;
  476. }
  477. timer--;
  478. }, 1000);
  479. }
  480. }
  481.  
  482. function toWin() {
  483. var sh = sha256(hash+'-'+currentRollid);
  484. roll = sh.substr(0, 8);
  485. roll = parseInt(roll, 16);
  486. roll = math.abs(roll) % 15;
  487. logger.trace('Tipo dropped '+roll);
  488. var r = '';
  489. var s = q1;
  490. var wins = {
  491. '0-0': 0,
  492. '1-7': 0,
  493. '8-14': 0
  494. }
  495. if(roll == 0) { r = '0-0'; s = q2; wins['0-0'] = currentSums['0-0']*s; }
  496. if((roll > 0) && (roll < 8)) { r = '1-7'; wins['1-7'] = currentSums['1-7']*s; }
  497. if((roll > 7) && (roll < 15)) { r = '8-14'; wins['8-14'] = currentSums['8-14']*s; }
  498. logger.debug(currentBets);
  499. logger.debug(usersBr);
  500. logger.debug(usersAmount);
  501. logger.debug(currentSums);
  502. for(key in users) {
  503. if(usersAmount[key] === undefined) {
  504. var balance = null;
  505. var won = 0;
  506. } else {
  507. var balance = parseInt(users[key].balance)+usersAmount[key][r]*s;
  508. var won = usersAmount[key][r]*s;
  509. }
  510. if (io.sockets.connected[users[key].socket]) io.sockets.connected[users[key].socket].emit('message', {
  511. balance: balance,
  512. count: accept,
  513. nets: [{
  514. lower: 0,
  515. samount: currentSums['0-0'],
  516. swon: wins['0-0'],
  517. upper: 0
  518. }, {
  519. lower: 1,
  520. samount: currentSums['1-7'],
  521. swon: wins['1-7'],
  522. upper: 7
  523. }, {
  524. lower: 8,
  525. samount: currentSums['8-14'],
  526. swon: wins['8-14'],
  527. upper: 14
  528. }
  529. ],
  530. roll: roll,
  531. rollid: currentRollid+1,
  532. type: "roll",
  533. wait: wait-2,
  534. wobble: getRandomArbitary(0, 1),
  535. won: won
  536. });
  537. }
  538. currentBets.forEach(function(itm) {
  539. if((roll >= itm.lower) && (roll <= itm.upper)) {
  540. logger.debug('Rate #'+itm.betid+' sum '+itm.amount+' win '+(itm.amount*s));
  541. query('UPDATE `users` SET `balance` = `balance` + '+itm.amount*s+' WHERE `steamid` = '+pool.escape(itm.user));
  542. }
  543. });
  544. query('UPDATE `rolls` SET `roll` = '+pool.escape(roll)+', `hash` = '+pool.escape(hash)+', `time` = '+pool.escape(time())+' WHERE `id` = '+pool.escape(currentRollid));
  545. query('INSERT INTO `rolls` SET `roll` = -1');
  546. updateHash();
  547. }
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  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('Id connection with database: '+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('you could not get the number last game');
  605. logger.debug(err);
  606. process.exit(0);
  607. return;
  608. }
  609. currentRollid = row[0].id;
  610. logger.trace('the current number of rolling'+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('Failed to load the list of establishments');
  619. logger.debug(err);
  620. process.exit(0);
  621. }
  622. logger.trace('loaded the history of plants');
  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