Advertisement
Guest User

SITE.JS | ENGLISH VERSION

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