Advertisement
god_gw

Untitled

May 14th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.67 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: 'xxxxx',
  21. host: 'localhost',
  22. user: 'xxxxx',
  23. password: 'xxxx'
  24. });
  25.  
  26. process.on('uncaughtException', function (err) {
  27. logger.trace('Какая-то странная ошибка');
  28. logger.debug(err);
  29. });
  30.  
  31. /* */
  32. var accept = 45; // Od ilu gra
  33. var wait = 10; // opóźnienie między rolkami
  34. var br = 3; // Maksymalna liczba zakładów na mecz
  35. var chat = 2; // opóźnienie chatu
  36. var chatb = 2000000; // ilość zakładów aby pisać na chacie
  37. var maxbet = 5000000; // Maksymalny zkład
  38. var minbet = 50; // Minimalna stawka
  39. var q1 = 2; // mnożenie
  40. var q2 = 14; // mnożenie zera
  41. var timer = -1; // regulator czasowy
  42. var users = {}; // użytkowników
  43. var roll = 0; // что сейчас выпало
  44. var currentBets = []; // Obecne stawki
  45. var historyRolls = []; // Historia gier
  46. var usersBr = {}; // ilu użytkowników
  47. var usersAmount = {}; // ilu użytkowników ma monety
  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 = ''; // has
  56. /* */
  57.  
  58. load();
  59.  
  60. var prices;
  61. request('http://backpack.tf/api/IGetMarketPrices/v1/?key=56fce4a5c4404545131c8fcf&compress=1&appid=730', function(error, response, body) {
  62. prices = JSON.parse(body);
  63. if(prices.response.success == 0) {
  64. logger.warn('Nie mogło pobrać ceny. Skorzystaj z cache');
  65. if(fs.existsSync(__dirname + '/prices.txt')){
  66. prices = JSON.parse(fs.readFileSync(__dirname + '/prices.txt'));
  67. logger.warn('Ceny ładowane są z cache');
  68. } else {
  69. logger.error('Nie znaleziono pliku z cenami');
  70. process.exit(0);
  71. }
  72. } else {
  73. fs.writeFileSync('prices.txt', body);
  74. logger.trace('załadowano nowe ceny');
  75. }
  76. });
  77.  
  78. updateHash();
  79. function updateHash() {
  80. query('SELECT * FROM `hash` ORDER BY `id` DESC LIMIT 1', function(err, row) {
  81. if(err) {
  82. logger.error('Не смогли получить хэш, мы офф');
  83. logger.debug(err);
  84. process.exit(0);
  85. return;
  86. }
  87. if(row.length == 0) {
  88. logger.error('Хэш не найден, мы офф');
  89. process.exit(0);
  90. } else {
  91. if(hash != row[0].hash) logger.warn('ładowanie nowego hashu '+row[0].hash);
  92. hash = row[0].hash;
  93. }
  94. });
  95. }
  96.  
  97. io.on('connection', function(socket) {
  98. var user = false;
  99. socket.on('hash', function(hash) {
  100. query('SELECT * FROM `users` WHERE `hash` = '+pool.escape(hash), function(err, row) {
  101. if((err) || (!row.length)) return socket.disconnect();
  102. user = row[0];
  103. users[user.steamid] = {
  104. socket: socket.id,
  105. balance: parseInt(row[0].balance)
  106. }
  107. socket.emit('message', {
  108. accept: accept,
  109. balance: row[0].balance,
  110. br: br,
  111. chat: chat,
  112. chatb: chatb,
  113. count: timer-wait,
  114. icon: row[0].avatar,
  115. maxbet: maxbet,
  116. minbet: minbet,
  117. name: row[0].name,
  118. rank: row[0].rank,
  119. rolls: historyRolls,
  120. type: 'hello',
  121. user: row[0].steamid
  122. });
  123. socket.emit('message', {
  124. type: 'logins',
  125. count: Object.size(io.sockets.connected)
  126. });
  127. currentBets.forEach(function(itm) {
  128. socket.emit('message', {
  129. type: 'bet',
  130. bet: {
  131. amount: itm.amount,
  132. betid: itm.betid,
  133. icon: itm.icon,
  134. lower: itm.lower,
  135. name: itm.name,
  136. rollid: itm.rollid,
  137. upper: itm.upper,
  138. user: itm.user,
  139. won: null
  140. },
  141. sums: {
  142. 0: currentSums['0-0'],
  143. 1: currentSums['1-7'],
  144. 2: currentSums['8-14'],
  145. }
  146. });
  147. });
  148. });
  149. });
  150. socket.on('mes', function(m) {
  151. if(!user) return;
  152. logger.debug(m);
  153. if(m.type == "bet") return setBet(m, user, socket);
  154. if(m.type == "balance") return getBalance(user, socket);
  155. if(m.type == "chat") return ch(m, user, socket);
  156. });
  157. socket.on('disconnect', function() {
  158. io.sockets.emit('message', {
  159. type: 'logins',
  160. count: Object.size(io.sockets.connected)
  161. });
  162. delete users[user.steamid];
  163. })
  164. });
  165.  
  166. function ch(m, user, socket) {
  167. if(m.msg) {
  168. var res = null;
  169. if (res = /^\/send ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  170. logger.trace('Тут надо передать коины '+res[2]+' пользователю '+res[1]);
  171. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  172. if((err) || (!row.length)) {
  173. logger.error('Ошибка получения человека для передачи');
  174. logger.debug(err);
  175. socket.emit('message', {
  176. type: 'error',
  177. enable: false,
  178. error: 'Error: You are not DB.'
  179. });
  180. return;
  181. }
  182. if(row[0].balance < res[2]) {
  183. socket.emit('message', {
  184. type: 'error',
  185. enable: false,
  186. error: 'Error: Insufficient funds.'
  187. });
  188. } else if(res[2] <= 0) {
  189. socket.emit('message', {
  190. type: 'error',
  191. enable: false,
  192. error: 'Error: Amount must be greater than 0.'
  193. });
  194. } else {
  195. query('SELECT `name` FROM `users` WHERE `steamid` = '+pool.escape(res[1]), function(err2, row2) {
  196. if((err) || (!row.length)) {
  197. logger.error('Ошибка получения человека для передачи');
  198. logger.debug(err);
  199. socket.emit('message', {
  200. type: 'error',
  201. enable: false,
  202. error: 'Error: Unknown receiver.'
  203. });
  204. return;
  205. }
  206. query('UPDATE `users` SET `balance` = `balance` - '+res[2]+' WHERE `steamid` = '+pool.escape(user.steamid));
  207. query('UPDATE `users` SET `balance` = `balance` + '+res[2]+' WHERE `steamid` = '+pool.escape(res[1]));
  208. query('INSERT INTO `transfers` SET `from1` = '+pool.escape(user.steamid)+', `to1` = '+pool.escape(res[1])+', `amount` = '+pool.escape(res[2])+', `time` = '+pool.escape(time()));
  209. socket.emit('message', {
  210. type: 'alert',
  211. alert: 'You sent '+res[2]+' coins to '+row2[0].name+'.'
  212. });
  213. getBalance(user, socket);
  214. });
  215. }
  216. });
  217. } else if (res = /^\/mute ([0-9]*) ([0-9]*)/.exec(m.msg)) {
  218. if(user.rank > 0) {
  219. var t = time();
  220. query('UPDATE `users` SET `mute` = '+pool.escape(parseInt(t)+parseInt(res[2]))+' WHERE `steamid` = '+pool.escape(res[1]));
  221. socket.emit('message', {
  222. type: 'alert',
  223. alert: 'You mute '+res[1]+' to '+res[2]
  224. });
  225. }
  226. } else {
  227. query('SELECT `mute` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  228. if(err) return;
  229. if(row[0].mute > time()) {
  230. socket.emit('message', {
  231. type: 'alert',
  232. alert: 'You muted '+(row[0].mute-time())
  233. });
  234. return;
  235. }
  236. io.sockets.emit('message', {
  237. type: 'chat',
  238. msg: safe_tags_replace(m.msg),
  239. name: user.name,
  240. icon: user.avatar,
  241. user: user.steamid,
  242. rank: user.rank,
  243. lang: m.lang,
  244. hide: m.hide
  245. });
  246. });
  247. }
  248. }
  249. }
  250.  
  251. function getBalance(user, socket) {
  252. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  253. if((err) || (!row.length)) {
  254. logger.error('Ошибка получения человека для баланса');
  255. logger.debug(err);
  256. socket.emit('message', {
  257. type: 'error',
  258. enable: true,
  259. error: 'Error: You are not DB.'
  260. });
  261. return;
  262. }
  263. socket.emit('message', {
  264. type: 'balance',
  265. balance: row[0].balance
  266. });
  267. if(user.steamid) users[user.steamid].balance = parseInt(row[0].balance);
  268. })
  269. }
  270.  
  271. function setBet(m, user, socket) {
  272. if((usersBr[user.steamid] !== undefined) && (usersBr[user.steamid] == br)) {
  273. socket.emit('message', {
  274. type: 'error',
  275. enable: true,
  276. error: 'You\'ve already placed '+usersBr[user.steamid]+'/'+br+' bets this roll.'
  277. });
  278. return;
  279. }
  280. if((m.amount < minbet) || (m.amount > maxbet)) {
  281. socket.emit('message', {
  282. type: 'error',
  283. enable: true,
  284. error: 'Invalid bet amount.'
  285. });
  286. return;
  287. }
  288. if(pause) {
  289. socket.emit('message', {
  290. type: 'error',
  291. enable: false,
  292. error: 'Betting for this round is closed.'
  293. });
  294. return;
  295. }
  296. var start_time = new Date();
  297. query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err, row) {
  298. if((err) || (!row.length)) {
  299. logger.error('Ошибка получения человека для ставки');
  300. logger.debug(err);
  301. socket.emit('message', {
  302. type: 'error',
  303. enable: true,
  304. error: 'You are not DB'
  305. });
  306. return;
  307. }
  308. if(row[0].balance >= m.amount) {
  309. query('UPDATE `users` SET `balance` = `balance` - '+parseInt(m.amount)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
  310. if(err2) {
  311. logger.error('Ошибка снятия денег у человека');
  312. logger.debug(err);
  313. socket.emit('message', {
  314. type: 'error',
  315. enable: true,
  316. error: 'You dont have enough points'
  317. });
  318. return;
  319. }
  320. 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) {
  321. if(err3) {
  322. logger.error('Ошибка добавления ставки в БД');
  323. logger.debug(err);
  324. return;
  325. }
  326. var end = new Date();
  327. if(usersBr[user.steamid] === undefined) {
  328. usersBr[user.steamid] = 1;
  329. } else {
  330. usersBr[user.steamid]++;
  331. }
  332. if(usersAmount[user.steamid] === undefined) {
  333. usersAmount[user.steamid] = {
  334. '0-0': 0,
  335. '1-7': 0,
  336. '8-14': 0
  337. };
  338. }
  339. usersAmount[user.steamid][m.lower+'-'+m.upper] += parseInt(m.amount);
  340. currentSums[m.lower+'-'+m.upper] += m.amount;
  341. socket.emit('message', {
  342. type: 'betconfirm',
  343. bet: {
  344. betid: row3.insertId,
  345. lower: m.lower,
  346. upper: m.upper,
  347. amount: usersAmount[user.steamid][m.lower+'-'+m.upper]
  348. },
  349. balance: row[0].balance-m.amount,
  350. mybr: usersBr[user.steamid],
  351. br: br,
  352. exec: (end.getTime()-start_time.getTime()).toFixed(3)
  353. });
  354. users[user.steamid].balance = row[0].balance-m.amount;
  355. io.sockets.emit('message', {
  356. type: 'bet',
  357. bet: {
  358. amount: usersAmount[user.steamid][m.lower+'-'+m.upper],
  359. betid: row3.insertId,
  360. icon: user.avatar,
  361. lower: m.lower,
  362. name: user.name,
  363. rollid: currentRollid,
  364. upper: m.upper,
  365. user: user.steamid,
  366. won: null
  367. },
  368. sums: {
  369. 0: currentSums['0-0'],
  370. 1: currentSums['1-7'],
  371. 2: currentSums['8-14'],
  372. }
  373. });
  374. currentBets.push({
  375. amount: m.amount,
  376. betid: row3.insertId,
  377. icon: user.avatar,
  378. lower: m.lower,
  379. name: user.name,
  380. rollid: currentRollid,
  381. upper: m.upper,
  382. user: user.steamid,
  383. });
  384. logger.debug('Принял ставку #'+row3.insertId+' сумма '+m.amount);
  385. checkTimer();
  386. })
  387. });
  388. } else {
  389. socket.emit('message', {
  390. type: 'error',
  391. enable: true,
  392. error: 'You dont any money'
  393. });
  394. }
  395. });
  396. }
  397.  
  398. function checkTimer() {
  399. if((currentBets.length > 0) && (timer == -1) && (!pause)) {
  400. logger.trace('Запускаю таймер');
  401. timer = accept+wait;
  402. timerID = setInterval(function() {
  403. logger.trace('Timer: '+timer+' Site timer: '+(timer-wait));
  404. if (timer == wait) {
  405. pause = true;
  406. logger.trace('Пауза включена');
  407. var inprog = getRandomInt(0, (currentBets.length/4).toFixed(0));
  408. io.sockets.emit('message', {
  409. type: 'preroll',
  410. totalbets: currentBets.length-inprog,
  411. inprog: inprog,
  412. sums: {
  413. 0: currentSums['0-0'],
  414. 1: currentSums['1-7'],
  415. 2: currentSums['8-14'],
  416. }
  417. });
  418. }
  419. if (timer == wait-2) {
  420. logger.trace('Таймер сработал');
  421. toWin(); // Выбираем победителя
  422. }
  423. if(timer == 0) {
  424. logger.trace('Типо обнуление');
  425. timer = accept+wait;
  426. currentBets = [];
  427. historyRolls.push({id: currentRollid, roll: roll});
  428. if(historyRolls.length > 10) historyRolls.slice(1);
  429. usersBr = {}; // сколько пользователи внесли
  430. usersAmount = {}; // сколько пользователи внесли монеток
  431. currentSums = {
  432. '0-0': 0,
  433. '1-7': 0,
  434. '8-14': 0
  435. };
  436. currentRollid = currentRollid+1;
  437. pause = false;
  438. }
  439. timer--;
  440. }, 1000);
  441. }
  442. }
  443.  
  444. function toWin() {
  445. var sh = sha256(hash+'-'+currentRollid);
  446. roll = sh.substr(0, 8);
  447. roll = parseInt(roll, 16);
  448. roll = math.abs(roll) % 15;
  449. logger.trace('Типо выпало '+roll);
  450. var r = '';
  451. var s = q1;
  452. var wins = {
  453. '0-0': 0,
  454. '1-7': 0,
  455. '8-14': 0
  456. }
  457. if(roll == 0) { r = '0-0'; s = q2; wins['0-0'] = currentSums['0-0']*s; }
  458. if((roll > 0) && (roll < 8)) { r = '1-7'; wins['1-7'] = currentSums['1-7']*s; }
  459. if((roll > 7) && (roll < 15)) { r = '8-14'; wins['8-14'] = currentSums['8-14']*s; }
  460. logger.debug(currentBets);
  461. logger.debug(usersBr);
  462. logger.debug(usersAmount);
  463. logger.debug(currentSums);
  464. for(key in users) {
  465. if(usersAmount[key] === undefined) {
  466. var balance = null;
  467. var won = 0;
  468. } else {
  469. var balance = parseInt(users[key].balance)+usersAmount[key][r]*s;
  470. var won = usersAmount[key][r]*s;
  471. }
  472. if (io.sockets.connected[users[key].socket]) io.sockets.connected[users[key].socket].emit('message', {
  473. balance: balance,
  474. count: accept,
  475. nets: [{
  476. lower: 0,
  477. samount: currentSums['0-0'],
  478. swon: wins['0-0'],
  479. upper: 0
  480. }, {
  481. lower: 1,
  482. samount: currentSums['1-7'],
  483. swon: wins['1-7'],
  484. upper: 7
  485. }, {
  486. lower: 8,
  487. samount: currentSums['8-14'],
  488. swon: wins['8-14'],
  489. upper: 14
  490. }
  491. ],
  492. roll: roll,
  493. rollid: currentRollid+1,
  494. type: "roll",
  495. wait: wait-2,
  496. wobble: getRandomArbitary(0, 1),
  497. won: won
  498. });
  499. }
  500. currentBets.forEach(function(itm) {
  501. if((roll >= itm.lower) && (roll <= itm.upper)) {
  502. logger.debug('Ставка #'+itm.betid+' сумма '+itm.amount+' выигрыш '+(itm.amount*s));
  503. query('UPDATE `users` SET `balance` = `balance` + '+itm.amount*s+' WHERE `steamid` = '+pool.escape(itm.user));
  504. }
  505. });
  506. query('UPDATE `rolls` SET `roll` = '+pool.escape(roll)+', `hash` = '+pool.escape(hash)+', `time` = '+pool.escape(time())+' WHERE `id` = '+pool.escape(currentRollid));
  507. query('INSERT INTO `rolls` SET `roll` = -1');
  508. updateHash();
  509. }
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519. /* */
  520. var tagsToReplace = {
  521. '&': '&amp;',
  522. '<': '&lt;',
  523. '>': '&gt;'
  524. };
  525.  
  526. function replaceTag(tag) {
  527. return tagsToReplace[tag] || tag;
  528. }
  529.  
  530. function safe_tags_replace(str) {
  531. return str.replace(/[&<>]/g, replaceTag);
  532. }
  533. Object.size = function(obj) {
  534. var size = 0,
  535. key;
  536. for (key in obj) {
  537. if (obj.hasOwnProperty(key)) size++;
  538. }
  539. return size;
  540. };
  541. function getRandomInt(min, max) {
  542. return Math.floor(Math.random() * (max - min + 1)) + min;
  543. }
  544. function getRandomArbitary(min, max) {
  545. return Math.random() * (max - min) + min;
  546. }
  547.  
  548. function query(sql, callback) {
  549. if (typeof callback === 'undefined') {
  550. callback = function() {};
  551. }
  552. pool.getConnection(function(err, connection) {
  553. if(err) return callback(err);
  554. logger.info('Identyfikator połączenia z bazą danych: '+connection.threadId);
  555. connection.query(sql, function(err, rows) {
  556. if(err) return callback(err);
  557. connection.release();
  558. return callback(null, rows);
  559. });
  560. });
  561. }
  562. function load() {
  563. query('SET NAMES utf8');
  564. query('SELECT `id` FROM `rolls` ORDER BY `id` DESC LIMIT 1', function(err, row) {
  565. if((err) || (!row.length)) {
  566. logger.error('Не смогли получить номер последней игры');
  567. logger.debug(err);
  568. process.exit(0);
  569. return;
  570. }
  571. currentRollid = row[0].id;
  572. logger.trace('aktualny numer rolowania'+currentRollid);
  573. });
  574. loadHistory();
  575. setTimeout(function() { io.listen(8080); }, 3000);
  576. }
  577. function loadHistory() {
  578. query('SELECT * FROM `rolls` ORDER BY `id` LIMIT 10', function(err, row) {
  579. if(err) {
  580. logger.error('Nie udało się załadować listy zakładów');
  581. logger.debug(err);
  582. process.exit(0);
  583. }
  584. logger.trace('udało się załadować historię zakładów');
  585. row.forEach(function(itm) {
  586. if(itm.roll != -1) historyRolls.push(itm);
  587. });
  588. });
  589. }
  590.  
  591. function time() {
  592. return parseInt(new Date().getTime()/1000)
  593. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement