Advertisement
god_gw

Untitled

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