Advertisement
Guest User

Untitled

a guest
Apr 16th, 2019
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 41.96 KB | None | 0 0
  1. var express = require('express');
  2. var fs = require('fs');
  3. var app = express();
  4.  
  5. var crypto = require('crypto');
  6.  
  7. var config = require('./config');
  8.  
  9. var passport = require('passport');
  10. var CustomStrategy = require('passport-custom');
  11. var opAuth = require('opskins-oauth');
  12.  
  13. app.use(passport.initialize());
  14.  
  15. var options = {
  16. key: fs.readFileSync(__dirname + "/certs/cl.key"),
  17. cert: fs.readFileSync(__dirname + "/certs/cl.crt")
  18. };
  19.  
  20. var returnURL;
  21. if(config.website.ssl) returnURL = "https://" + config.website.domain + "/auth/login/user";
  22. else returnURL = "http://" + config.website.domain + "/auth/login/user";
  23.  
  24. let OpskinsAuth = new opAuth.init({
  25. name: config.website.name,
  26. returnURL: returnURL,
  27. apiKey: config.opskins.auth.apikey,
  28. scopes: 'identity',
  29. mobile: true
  30. });
  31.  
  32. var ExpressTrade = require('expresstrade');
  33.  
  34. var ET = new ExpressTrade({
  35. apikey: config.opskins.bot.apikey,
  36. twofactorsecret: config.opskins.bot.secret,
  37. pollInterval: 5000
  38. });
  39.  
  40. passport.use('custom', new CustomStrategy(function (req, done) {
  41. OpskinsAuth.authenticate(req, (err, user) => {
  42. if (err) {
  43. done(err);
  44. } else {
  45. done(null, user);
  46. }
  47. });
  48. }));
  49.  
  50. var server;
  51. if(config.website.ssl) server = require('https').createServer(options, app); // FOR SSL ONLY
  52. else server = require('http').createServer(app); // FOR NO - SSL ONLY
  53.  
  54. var io = require('socket.io')(server);
  55.  
  56. // vars
  57. var Offers = {};
  58. var CFs = {};
  59. var CFs_infos = {};
  60. var sockets = {};
  61. var _Jackpot = {
  62. round: 0,
  63. pot: 0,
  64. state: "NONE",
  65. hash: null,
  66. secret: null,
  67. winner_percentage: null,
  68. time_left: null,
  69. items: [],
  70. user_ids: 0,
  71. users_colors: {},
  72. users_values: {},
  73. users_chances: {},
  74. users: []
  75. };
  76. var JackpotColors = config.jackpot.colors;
  77. var chat_msg_ids = 0;
  78. var chat_history = [];
  79. var users_online = {};
  80. // vars
  81.  
  82.  
  83. var pool = null;
  84. var mysql = require('mysql');
  85. var connection = mysql.createConnection({
  86. host: config.database.host,
  87. user: config.database.user,
  88. password: config.database.pw,
  89. database: config.database.db
  90. });
  91. connection.connect(function(err) {
  92. if(err) throw err;
  93.  
  94. pool = connection;
  95. console.log('Successfully connected to database!');
  96.  
  97. init();
  98. });
  99.  
  100. function init() {
  101. getActiveCoinflips();
  102. createJackpotRound();
  103. }
  104.  
  105. var states = {};
  106.  
  107. app.set('view engine', 'ejs');
  108. app.use('/public', express.static(__dirname + "/public"));
  109.  
  110. app.get('/', function(req, res) {
  111. res.render('pages/home');
  112. });
  113.  
  114. app.get('/jackpot', function(req, res) {
  115. res.render('pages/jackpot');
  116. });
  117.  
  118. app.get('/fair', function(req, res) {
  119. res.render('pages/fair');
  120. });
  121.  
  122. app.get('/history', function(req, res) {
  123. res.render('pages/history');
  124. });
  125.  
  126. app.get('/auth/login', function (req, res) {
  127. OpskinsAuth.getFetchUrl(function(returnUri, state) {
  128. res.redirect(returnUri);
  129. states[state] = {};
  130. });
  131. });
  132.  
  133. app.get('/auth/login/user', passport.authenticate('custom', {
  134. failureRedirect: '/'
  135. }), function (req, res) {
  136. res.cookie('token', req.query.state);
  137. pool.query('SELECT id FROM users WHERE uid = ' + pool.escape(req.user.id), function(e,r) {
  138. if(e) throw e;
  139.  
  140. if(r.length == 0) {
  141. pool.query('INSERT INTO users SET uid = ' + pool.escape(req.user.id) + ', name = ' + pool.escape(req.user.username) + ', avatar = ' + pool.escape(req.user.avatar) + ', token = ' + pool.escape(req.query.state), function(e,r) {
  142.  
  143. });
  144. } else {
  145. pool.query('UPDATE users SET token = ' + pool.escape(req.query.state) + ' WHERE uid = ' + pool.escape(req.user.id), function(e,r) {
  146.  
  147. });
  148. }
  149. });
  150. res.redirect('/');
  151. });
  152.  
  153. var listenport = 80;
  154. if(config.website.ssl) listenport = 443;
  155.  
  156. server.listen(listenport, function() {
  157. console.log('Server is up and running on PORT :' + listenport + ' - SSL: ' + config.website.ssl + '!');
  158. });
  159.  
  160. // GLOBAL USER
  161. var Users = {};
  162. // GLOBAL USER
  163.  
  164. io.on('connection', function(socket) {
  165. var user = null;
  166.  
  167. socket.on('log', function(token) {
  168. pool.query('SELECT * FROM users WHERE token = ' + pool.escape(token), function(err, row) {
  169. if(err) throw err;
  170.  
  171. if(chat_history.length > 0) socket.emit('chat history', chat_history);
  172.  
  173. var ip = socket.request.connection.remoteAddress;
  174. if(!users_online.hasOwnProperty(ip)) users_online[ip] = 1;
  175. io.sockets.emit('users online', Object.keys(users_online).length);
  176.  
  177. if(row.length == 0) {
  178. for(var i in CFs) {
  179. CFs[i].timer = parseInt(CFs[i].time-time());
  180. }
  181.  
  182. socket.emit('jackpot', 'round', {
  183. round: _Jackpot.round,
  184. hash: _Jackpot.hash,
  185. users: _Jackpot.users,
  186. chances: _Jackpot.users_chances
  187. });
  188.  
  189. if(_Jackpot.time_left != null) socket.emit('jackpot', 'timer', {
  190. time: parseInt(_Jackpot.time_left-time())
  191. });
  192.  
  193. if(Object.keys(CFs).length > 0) socket.emit('coinflip', 'history', CFs);
  194.  
  195. sendCFStatistics(socket);
  196. } else {
  197. user = row[0];
  198. Users[user.uid] = row[0];
  199. sockets[user.uid] = socket.id;
  200. socket.emit('user info', user);
  201.  
  202. for(var i in CFs) {
  203. CFs[i].timer = parseInt(CFs[i].time-time());
  204. }
  205.  
  206. socket.emit('jackpot', 'round', {
  207. round: _Jackpot.round,
  208. hash: _Jackpot.hash,
  209. users: _Jackpot.users,
  210. chances: _Jackpot.users_chances
  211. });
  212.  
  213. if(_Jackpot.time_left != null) socket.emit('jackpot', 'timer', {
  214. time: parseInt(_Jackpot.time_left-time())
  215. });
  216.  
  217. if(Object.keys(CFs).length > 0) socket.emit('coinflip', 'history', CFs);
  218.  
  219. sendCFStatistics(socket);
  220. }
  221. });
  222. });
  223.  
  224. socket.on('user inventory', function() {
  225. if(!user) return;
  226.  
  227. getAllInventory(user.uid, function(err, items) {
  228. if(err) return;
  229. socket.emit('user inventory handler', items);
  230. });
  231. });
  232.  
  233. socket.on('coinflip', function(type, game) {
  234. if(type == "watch") watchCoinflipGame(game, socket);
  235. });
  236.  
  237. socket.on('get coinflip history', function() {
  238. getHistory('coinflip', socket);
  239. });
  240.  
  241. socket.on('get jackpot history', function() {
  242. getHistory('jackpot', socket);
  243. });
  244.  
  245. socket.on('set tradelink', function(td) {
  246. if(!user) return;
  247. setTradelink(user, td);
  248. });
  249.  
  250. socket.on('user message', function(message) {
  251. if(!user) return;
  252. sendMessage(user, message, socket);
  253. });
  254.  
  255. socket.on('send trade', function(items, type, info) {
  256. if(!user) return;
  257. if(user.tradelink == "") return socket.emit('no tradelink');
  258. sendTradeUser(user, items, type, info, socket);
  259. });
  260.  
  261. socket.on('disconnect', function() {
  262. var ip = socket.request.connection.remoteAddress;
  263. if(users_online.hasOwnProperty(ip)) delete users_online[ip];
  264.  
  265. io.sockets.emit('users online', Object.keys(users_online).length);
  266. });
  267.  
  268. socket.on('check fair', function(info) {
  269. var hash = info.hash;
  270. var secret = info.secret;
  271. var percentage = info.percentage;
  272.  
  273. var new_hash = encrypt(secret, percentage.toString());
  274. if(new_hash == hash) socket.emit('msg', 'The hash matches!', 'alert');
  275. else socket.emit('msg', 'The hash does not matches!', 'error');
  276. });
  277. });
  278.  
  279. passport.serializeUser(function(user, done) {
  280. done(null, user);
  281. });
  282.  
  283. passport.deserializeUser(function(user, done) {
  284. done(null, user);
  285. });
  286.  
  287. function time() {
  288. return parseInt(new Date().getTime()/1000);
  289. }
  290.  
  291.  
  292. function sendMessage(user, message, socket) {
  293. var msg = escapeHtml(message);
  294. var name = user.name;
  295. var avatar = user.avatar;
  296. var rank = user.rank;
  297. var level = parseInt(user.xp/1000); // EVERY $10 = LEVEL UP
  298.  
  299. if((msg.length < 2 || msg.length > 128) && user.rank != 100) return socket.emit('msg', 'The message is too short/long to be sent!', 'error');
  300. if(msg.startsWith('/')) {
  301. if(msg.startsWith('/clear') && ( user.rank == 100 || user.rank == 101) ) {
  302. chat_history = [];
  303.  
  304. io.sockets.emit('chat clear');
  305.  
  306. socket.emit('msg', 'Chat was successfully cleared!', 'alert');
  307. }
  308. return;
  309. }
  310.  
  311. chat_msg_ids++;
  312.  
  313. var props = {
  314. id: chat_msg_ids,
  315. uid: user.uid,
  316. level: level,
  317. name: name,
  318. avatar: avatar,
  319. rank: rank,
  320. msg: msg
  321. };
  322.  
  323. chat_history.push(props);
  324.  
  325. if(chat_history.length >= 31) chat_history.shift();
  326.  
  327. io.sockets.emit('user message', props);
  328. }
  329.  
  330.  
  331.  
  332. function sendTradeUser(user, items, type, info, socket) {
  333. if(type == "jackpot") {
  334.  
  335.  
  336. ET.IItem.GetItemsById({item_id: items.join(',')}, (err, resp) => {
  337. if(err) return socket.emit('msg', err.toString(), "error");
  338.  
  339. if(!resp.hasOwnProperty('response')) return socket.emit('msg', resp.message, 'error');
  340.  
  341. var checked_items = 0;
  342.  
  343. for(var i in items) {
  344. for(var z in resp.response.items) {
  345. if(items[i] == resp.response.items[z].id) checked_items++;
  346. }
  347. }
  348.  
  349. if(items.length != checked_items) return socket.emit('msg', 'Some items are not in your inventory!', 'error');
  350.  
  351. ET.ITrade.SendOffer({trade_url: user.tradelink, items_to_receive: items.join(','), expiration_time: config.jackpot.offer_expiration, message: 'WinSkins.fun - Jackpot join round #' + _Jackpot.round}, (err, res) => {
  352. if(err) return socket.emit('msg', err.toString(), "error");
  353.  
  354. if(!res.hasOwnProperty('response')) return socket.emit('msg', res.message, "error");
  355.  
  356. if(res.response.offer.state == 2) {
  357. Offers[res.response.offer.id] = {
  358. user: user.uid,
  359. type: 'jackpot'
  360. };
  361. }
  362.  
  363. socket.emit('user trade', res.response.offer.id);
  364. });
  365.  
  366. });
  367. } else if(type == "create") {
  368. var side = info;
  369.  
  370. ET.ITrade.SendOffer({trade_url: user.tradelink, items_to_receive: items.join(','), expiration_time: config.coinflip.offer_expiration, message: "WinSkins.fun - Coinflip create with side " + side}, (err, resp) => {
  371. if(err) return socket.emit('msg', err.toString(), "error");
  372.  
  373. if(!resp.hasOwnProperty('response')) return socket.emit('msg', resp.message, "error");
  374.  
  375. if(resp.response.offer.state == 2) {
  376. Offers[resp.response.offer.id] = {
  377. user: user.uid,
  378. type: 'create',
  379. side: side
  380. };
  381. }
  382.  
  383. socket.emit('user trade', resp.response.offer.id);
  384. });
  385. } else if(type == "join") {
  386. var game = info;
  387. var side = 1;
  388. if(CFs[game].cside == 1) side = 2;
  389.  
  390. if(CFs[game].puser > 0) return socket.emit('msg', 'You can\'t join, sorry!', 'error');
  391. if(CFs[game].cuser == user.uid && user.rank != 100) return socket.emit('msg', 'You can\'t jon your game!', 'error');
  392.  
  393. var min = parseFloat(parseFloat(CFs[game].cvalue*0.90).toFixed(2));
  394. var max = parseFloat(parseFloat(CFs[game].cvalue*1.10).toFixed(2));
  395.  
  396. ET.ITrade.GetUserInventory({uid: user.uid, app_id: 1}, (err, resp) => {
  397. if(err) return socket.emit('msg', err.toString(), 'error');
  398.  
  399. if(!resp.hasOwnProperty('response')) return socket.emit('msg', resp.message, "error");
  400.  
  401. var itemss = resp.response.items;
  402. var checked_items = [];
  403. var checked_value = 0;
  404.  
  405. for(var i in itemss) {
  406. for(var z in items) {
  407. if(itemss[i].id == items[z]) {
  408. var val = parseFloat(itemss[i].suggested_price_floor/100);
  409. checked_items.push({
  410. id: itemss[i].id,
  411. name: itemss[i].name,
  412. image: itemss[i].image["600px"],
  413. price: parseFloat(val).toFixed(2)
  414. });
  415. checked_value = parseFloat(checked_value) + parseFloat(itemss[i].suggested_price_floor/100);
  416. }
  417. }
  418. }
  419.  
  420. if(checked_items.length != items.length) return socket.emit('msg', 'Some items are not in your inventory!', 'error');
  421. if(checked_value < min || checked_value > max) return socket.emit('msg', 'You need to bet items between value: ' + min + ' and ' + max, 'error');
  422.  
  423. ET.ITrade.SendOffer({trade_url: user.tradelink, items_to_receive: items.join(','), expiration_time: config.coinflip.offer_expiration, message: "WinSkins.fun - Coinflip join #" + game + " with side " + side}, (err, res) => {
  424. if(err) return socket.emit('msg', err.toString(), 'error');
  425.  
  426. if(!res.hasOwnProperty('response')) return socket.emit('msg', res, "error");
  427.  
  428. CFs[game].puser = user.uid;
  429. CFs[game].pavatar = user.avatar;
  430. CFs[game].pname = user.name;
  431. CFs[game].pvalue = checked_value;
  432. CFs[game].pitems = checked_items;
  433. CFs[game].pside = side;
  434. CFs[game].state = 1;
  435. CFs[game].secret
  436. CFs[game].time = time()+120;
  437.  
  438. sendCFStatistics();
  439.  
  440. io.sockets.emit('coinflip', 'edit', CFs[game]);
  441.  
  442. if(res.response.offer.state == 2) {
  443. Offers[res.response.offer.id] = {
  444. user: user.uid,
  445. type: 'join',
  446. game: game,
  447. side: side
  448. };
  449. }
  450.  
  451. socket.emit('user trade', res.response.offer.id);
  452. });
  453. });
  454. }
  455. }
  456.  
  457. function getActiveCoinflips() {
  458. pool.query('SELECT * FROM cfs WHERE state = 0', function(er, ro) {
  459. if(er) throw er;
  460.  
  461. for(var i in ro) {
  462. var itm = ro[i];
  463.  
  464. var Items = [];
  465. var iteme = itm.citems.split('<||>');
  466. for(var z in iteme) {
  467. var zec = iteme[z].split('<|>');
  468. Items.push({
  469. id: zec[0],
  470. name: zec[1],
  471. image: zec[2],
  472. price: zec[3]
  473. });
  474. }
  475.  
  476.  
  477. Items.pop();
  478.  
  479. CFs[itm.id] = {
  480. id: itm.id,
  481. cuser: itm.cuser,
  482. cavatar: itm.cavatar,
  483. cname: itm.cname,
  484. cside: itm.cside,
  485. cvalue: itm.cvalue,
  486. citems: Items,
  487. hash: itm.hash,
  488. state: 0
  489. };
  490.  
  491. CFs_infos[itm.id] = {
  492. secret: itm.secret,
  493. percentage: itm.percentage
  494. };
  495. }
  496. });
  497. }
  498.  
  499. function watchCoinflipGame(game, socket) {
  500. if(!CFs.hasOwnProperty(game)) return socket.emit('msg', 'This game cannot be watched!', 'error');
  501.  
  502. CFs[game].timer = parseInt(CFs[game].time-time());
  503.  
  504. socket.emit('coinflip', 'to_watch', CFs[game]);
  505. }
  506.  
  507. ET.on('offerAccepted', function(off) {
  508. if(Offers.hasOwnProperty(off.id)) {
  509. var offer = Offers[off.id];
  510.  
  511. if(offer.type == "create") {
  512. var items = off.recipient.items;
  513. var value = 0;
  514.  
  515. var citems = [];
  516. var citemss = [];
  517. var db_citems = "";
  518.  
  519. for(var i in items) {
  520. var itm = items[i];
  521.  
  522. var item_price = 0;
  523.  
  524. value = parseFloat(value) + parseFloat(itm.suggested_price_floor/100);
  525. item_price = parseFloat(itm.suggested_price_floor/100);
  526.  
  527. citemss.push(itm.id);
  528.  
  529. db_citems += itm.id + "<|>" + itm.name + "<|>" + itm.image["600px"] + "<|>" + item_price + "<||>";
  530. citems.push({
  531. id: itm.id,
  532. name: itm.name,
  533. image: itm.image["600px"],
  534. price: item_price
  535. });
  536. }
  537.  
  538. var secret = makeSecret();
  539. var percentage = parseFloat(Math.random()*(99.99999-0.00001)+0.00001).toFixed(5);
  540. var hash = encrypt(secret, percentage.toString());
  541.  
  542. var side_won = null;
  543. if(percentage < 50.00) side_won = 1;
  544. else side_won = 2;
  545.  
  546. var query = `
  547. INSERT INTO cfs SET cuser = ?, cavatar = ?, cname = ?, cvalue = ?, cside = ?, hash = ?, secret = ?, percentage = ?, state = 0, side_won = ?, citems = ?, citemss = ?
  548. `;
  549.  
  550. pool.query(query, [offer.user, off.recipient.avatar, off.recipient.display_name, value, offer.side, hash, secret, percentage, side_won, db_citems, citemss.join(',')], function(e,r) {
  551. if(e) throw e;
  552.  
  553. if(encrypt(secret,percentage.toString()) == hash) console.log('New CF game created! Hash is verified!');
  554.  
  555. pool.query('UPDATE users SET xp = xp + ? WHERE uid = ?', [value*100, offer.user], function(err) {
  556. if(err) throw err;
  557. });
  558.  
  559. console.log('New game created!');
  560.  
  561. CFs[r.insertId] = {
  562. id: r.insertId,
  563. cuser: offer.user,
  564. cavatar: off.recipient.avatar,
  565. cname: off.recipient.display_name,
  566. cside: offer.side,
  567. cvalue: value,
  568. citems: citems,
  569. hash: hash,
  570. state: 0
  571. };
  572.  
  573. CFs_infos[r.insertId] = {
  574. secret: secret,
  575. percentage: percentage
  576. };
  577.  
  578. sendCFStatistics();
  579.  
  580. io.sockets.emit('coinflip', 'new', CFs[r.insertId]);
  581.  
  582. delete Offers[off.id];
  583. });
  584. } else if(offer.type == "join") {
  585. var query = `
  586. UPDATE cfs SET puser = ?, pavatar = ?, pname = ?, pvalue = ?, pitems = ?, pside = ?, state = 2, pitemss = ? WHERE id = ?
  587. `;
  588.  
  589. var ga = CFs[offer.game];
  590. var db_pitems = "";
  591. var pitemss = [];
  592.  
  593. for(var i in ga.pitems) {
  594. var itm = ga.pitems[i];
  595. db_pitems += itm.id + "<|>" + itm.name + "<|>" + itm.image + "<|>" + itm.price + "<||>";
  596. pitemss.push(itm.id);
  597. }
  598.  
  599. pool.query('SELECT side_won FROM cfs WHERE id = ' + pool.escape(ga.id), function(e, r) {
  600. if(e) throw e;
  601.  
  602. var side_won = r[0].side_won;
  603.  
  604. pool.query(query, [ga.puser, ga.pavatar, ga.pname, ga.pvalue, db_pitems, ga.pside, pitemss.join(','), ga.id], function(er, ro) {
  605. if(er) throw er;
  606.  
  607. var winner_uid = null;
  608. CFs[ga.id].side_won = side_won;
  609. CFs[ga.id].state = 2;
  610.  
  611. if(CFs[ga.id].cside == side_won) winner_uid = CFs[ga.id].cuser;
  612. else winner_uid = CFs[ga.id].puser;
  613.  
  614. CFs[ga.id].time = time()+10;
  615.  
  616. CFs[ga.id].secret = CFs_infos[ga.id].secret;
  617. CFs[ga.id].percentage = CFs_infos[ga.id].percentage;
  618.  
  619. pool.query('UPDATE users SET xp = xp + ? WHERE uid = ?', [ga.pvalue*100, offer.user], function(err) {
  620. if(err) throw err;
  621. });
  622.  
  623. io.sockets.emit('coinflip', 'edit', CFs[ga.id]);
  624.  
  625. setTimeout(function() {
  626. CFs[ga.id].state = 3;
  627. }, 5000);
  628.  
  629. setTimeout(function() {
  630.  
  631. hideGame(ga.id);
  632. sendWinningsCoinflip(ga.id, winner_uid);
  633. }, 13000);
  634. });
  635.  
  636. });
  637.  
  638. delete Offers[off.id];
  639. } else if(offer.type == "jackpot") {
  640. var Items = [];
  641. var value = 0;
  642.  
  643. for(var i in off.recipient.items) {
  644. var itm = off.recipient.items[i];
  645. var $image;
  646. if(!itm.image.hasOwnProperty("600px")) $image = itm.image;
  647. else $image = itm.image["600px"];
  648. Items.push({
  649. id: itm.id,
  650. name: itm.name,
  651. image: $image,
  652. price: itm.suggested_price_floor,
  653. color: itm.color
  654. });
  655. value = parseFloat(value) + parseFloat(parseFloat(itm.suggested_price_floor/100).toFixed(2))
  656. }
  657.  
  658. console.log('TRADE #' + off.id + ' accepted - jackpot');
  659.  
  660. pool.query('UPDATE users SET xp = xp + ? WHERE uid = ?', [value*100, offer.user], function(err) {
  661. if(err) throw err;
  662. });
  663.  
  664. delete Offers[off.id];
  665.  
  666. joinJackpotRound(offer.user, Items);
  667. }
  668. }
  669. });
  670.  
  671. ET.on('offerExpired', function(off) {
  672. if(Offers.hasOwnProperty(off.id)) {
  673. if(Offers[off.id].type == "join") {
  674. var game = Offers[off.id].game;
  675.  
  676. CFs[game].puser = "";
  677. CFs[game].pavatar = "";
  678. CFs[game].pname = "";
  679. CFs[game].pside = "";
  680. CFs[game].pitems = "";
  681. CFs[game].pvalue = "";
  682. CFs[game].state = 0;
  683.  
  684. sendCFStatistics();
  685.  
  686. io.sockets.emit('coinflip', 'edit', CFs[game]);
  687. }
  688. }
  689. });
  690.  
  691. ET.on('offerDeclined', function(off) {
  692. if(Offers.hasOwnProperty(off.id)) {
  693. if(Offers[off.id].type == "join") {
  694. var game = Offers[off.id].game;
  695.  
  696. CFs[game].puser = "";
  697. CFs[game].pavatar = "";
  698. CFs[game].pname = "";
  699. CFs[game].pside = "";
  700. CFs[game].pitems = "";
  701. CFs[game].pvalue = "";
  702. CFs[game].state = 0;
  703.  
  704. sendCFStatistics();
  705.  
  706. io.sockets.emit('coinflip', 'edit', CFs[game]);
  707. }
  708. }
  709. });
  710.  
  711. function hideGame(id) {
  712. setTimeout(function() {
  713. delete CFs[id];
  714.  
  715. io.sockets.emit('coinflip', 'remove', id);
  716.  
  717. sendCFStatistics();
  718. }, 60000);
  719. }
  720.  
  721. function sendWinningsCoinflip(id, uid) {
  722. pool.query('SELECT citemss, pitemss FROM cfs WHERE id = ' + pool.escape(id), function(e,r) {
  723. if(e) throw e;
  724.  
  725. pool.query('SELECT tradelink FROM users WHERE uid = ?', [uid], function(er, ro) {
  726. if(er) throw er;
  727.  
  728. var items_p1 = r[0].citemss.split(',');
  729. var items_p2 = r[0].pitemss.split(',');
  730. var all_items = items_p1.concat(items_p2);
  731.  
  732. var curr_commission = 0.00;
  733. var max_commission = parseFloat(parseFloat(config.coinflip.commission).toFixed(2));
  734.  
  735. var uncomissioned_items = all_items.sort(function(a,b) { return a.price-b.price; });
  736.  
  737. var pottts = 0;
  738.  
  739. for(var f in uncomissioned_items) {
  740. pottts = parseFloat(potts) + uncomissioned_items[f].price;
  741. }
  742.  
  743. for(var h in uncomissioned_items) {
  744. var itm = uncomissioned_items[h];
  745.  
  746. var $price = parseFloat(parseFloat(itm.price/100).toFixed(2));
  747. var com_percentage = parseFloat(parseFloat(100 - ((pottts-$price)/pottts) * 100).toFixed(2));
  748.  
  749. if(curr_commission+com_percentage < max_commission) {
  750. curr_commission = parseFloat(curr_commission) + com_percentage;
  751. uncomissioned_items[h].comission = 1;
  752. }
  753. }
  754.  
  755. var comissioned = 0;
  756. var items_to_send = [];
  757. for(var g in uncomissioned_items) {
  758. if(uncomissioned_items[g].comission == 1) comissioned = parseFloat(comissioned) + parseFloat(uncomissioned_items[g].price/100);
  759. if(uncomissioned_items[g].comission == 1) continue;
  760. items_to_send.push(uncomissioned_items[g].id);
  761. }
  762.  
  763. ET.ITrade.SendOffer({trade_url: ro[0].tradelink, items_to_send: items_to_send.join(','), expiration_time: 86400, message: 'WinSkins.fun - Winner coinflip game #' + id + ' - comission: ' + parseFloat(curr_commission).toFixed(2) + '% ($' + parseFloat(comissioned).toFixed(2) + ')'}, (err, resp) => {
  764. if(err) throw err;
  765.  
  766. if(!resp.hasOwnProperty('response')) return;
  767.  
  768. if(io.sockets.connected[sockets[uid]]) io.sockets.connected[sockets[uid]].emit('user winning trade', resp.response.offer.id);
  769. });
  770. });
  771. });
  772. }
  773.  
  774. function createJackpotRound() {
  775. if(_Jackpot.round == 0) {
  776. pool.query('SELECT * FROM jackpots WHERE state = 0', function(er, ro) {
  777. if(er) throw er;
  778. if(ro.length == 0) {
  779.  
  780. var hash;
  781. var secret = makeSecret();
  782. var percentage = parseFloat(Math.random()*(99.99999-0.00001)+0.00001).toFixed(5);
  783. hash = encrypt(secret, percentage.toString());
  784.  
  785. pool.query('INSERT INTO jackpots SET hash = ?, secret = ?, percentage = ?, state = 0', [hash, secret, percentage], function(err, row) {
  786. if(err) throw err;
  787.  
  788. _Jackpot.round = row.insertId;
  789. _Jackpot.hash = hash;
  790. _Jackpot.pot = 0;
  791. _Jackpot.items = [];
  792. _Jackpot.state = "WAITING";
  793. _Jackpot.secret = secret;
  794. _Jackpot.user_ids = 0;
  795. _Jackpot.users_colors = {};
  796. _Jackpot.users_values = {};
  797. _Jackpot.users_chances = {};
  798. _Jackpot.users = [];
  799. _Jackpot.time_left = null;
  800. _Jackpot.winner_percentage = percentage;
  801.  
  802. io.sockets.emit('jackpot', 'round', {
  803. round: _Jackpot.round,
  804. hash: _Jackpot.hash,
  805. users: [],
  806. chances: []
  807. });
  808.  
  809. });
  810.  
  811. } else {
  812. if(ro.length == 1) {
  813.  
  814. pool.query('SELECT * FROM jackpots WHERE state = 0 LIMIT 1', function(err, row) {
  815. if(err) throw err;
  816.  
  817. var jk = row[0];
  818. _Jackpot.round = jk.id;
  819. _Jackpot.hash = jk.hash;
  820. _Jackpot.pot = 0;
  821. _Jackpot.items = [];
  822. _Jackpot.state = "WAITING";
  823. _Jackpot.secret = jk.secret;
  824. _Jackpot.user_ids = 0;
  825. _Jackpot.users_colors = {};
  826. _Jackpot.users_values = {};
  827. _Jackpot.users_chances = {};
  828. _Jackpot.users = [];
  829. _Jackpot.time_left = null;
  830. _Jackpot.winner_percentage = jk.percentage;
  831.  
  832. io.sockets.emit('jackpot', 'round', {
  833. round: _Jackpot.round,
  834. hash: _Jackpot.hash,
  835. users: [],
  836. chances: []
  837. });
  838.  
  839. });
  840.  
  841.  
  842. } else {
  843. // IN CASE AN ERROR OCCURRS!!!
  844. pool.query('DELETE FROM jackpots WHERE state = 0', function(e) {
  845. if(e) throw e;
  846.  
  847. var hash;
  848. var secret = makeSecret();
  849. var percentage = parseFloat(Math.random()*(99.99999-0.00001)+0.00001).toFixed(5);
  850. hash = encrypt(secret, percentage.toString());
  851.  
  852. pool.query('INSERT INTO jackpots SET hash = ?, secret = ?, percentage = ?, state = 0', [hash, secret, percentage], function(err, row) {
  853. if(err) throw err;
  854.  
  855. _Jackpot.round = row.insertId;
  856. _Jackpot.hash = hash;
  857. _Jackpot.pot = 0;
  858. _Jackpot.items = [];
  859. _Jackpot.state = "WAITING";
  860. _Jackpot.secret = secret;
  861. _Jackpot.user_ids = 0;
  862. _Jackpot.users_colors = {};
  863. _Jackpot.users_values = {};
  864. _Jackpot.users_chances = {};
  865. _Jackpot.users = [];
  866. _Jackpot.time_left = null;
  867. _Jackpot.winner_percentage = percentage;
  868.  
  869. io.sockets.emit('jackpot', 'round', {
  870. round: _Jackpot.round,
  871. hash: _Jackpot.hash,
  872. users: [],
  873. chances: []
  874. });
  875. });
  876. });
  877. }
  878. }
  879. });
  880. } else {
  881. var hash;
  882. var secret = makeSecret();
  883. var percentage = parseFloat(Math.random()*(99.99999-0.00001)+0.00001).toFixed(5);
  884. hash = encrypt(secret, percentage.toString());
  885.  
  886. pool.query('INSERT INTO jackpots SET hash = ?, secret = ?, percentage = ?, state = 0', [hash, secret, percentage], function(err, row) {
  887. if(err) throw err;
  888.  
  889. _Jackpot.round = row.insertId;
  890. _Jackpot.hash = hash;
  891. _Jackpot.pot = 0;
  892. _Jackpot.items = [];
  893. _Jackpot.state = "WAITING";
  894. _Jackpot.secret = secret;
  895. _Jackpot.user_ids = 0;
  896. _Jackpot.users_colors = {};
  897. _Jackpot.users_values = {};
  898. _Jackpot.users_chances = {};
  899. _Jackpot.users = [];
  900. _Jackpot.time_left = null;
  901. _Jackpot.winner_percentage = percentage;
  902.  
  903. io.sockets.emit('jackpot', 'round', {
  904. round: _Jackpot.round,
  905. hash: _Jackpot.hash,
  906. users: [],
  907. chances: []
  908. });
  909.  
  910. });
  911. }
  912. }
  913.  
  914. function joinJackpotRound(user, items) {
  915. var socket = io.sockets.connected[sockets[user]];
  916.  
  917. if(_Jackpot.state == "NONE" || _Jackpot.state == "ENDED") {
  918. console.log(_Jackpot.state);
  919. if(socket) socket.emit('msg', 'Your trade is in queue, waiting...', 'alert');
  920. setTimeout(function() { joinJackpotRound(user, items); }, 5000);
  921. return;
  922. }
  923.  
  924. var user_value = 0;
  925. for(var i in items) {
  926. user_value += parseInt(items[i].price);
  927. _Jackpot.items.push({
  928. id: items[i].id,
  929. price: items[i].price
  930. });
  931. }
  932.  
  933. if(_Jackpot.users_values.hasOwnProperty(user)) {
  934. _Jackpot.users_values[user] = parseInt(_Jackpot.users_values[user]) + parseInt(user_value);
  935. } else {
  936. _Jackpot.users_values[user] = user_value;
  937. _Jackpot.users_colors[user] = JackpotColors[_Jackpot.user_ids];
  938. _Jackpot.user_ids++;
  939. }
  940.  
  941. var min_ticket;
  942. var max_ticket;
  943.  
  944. if(_Jackpot.users.length == 0) {
  945. min_ticket = _Jackpot.pot;
  946. max_ticket = parseInt(user_value-1);
  947. } else {
  948. min_ticket = _Jackpot.pot;
  949. max_ticket = parseInt(_Jackpot.pot+user_value-1);
  950. }
  951.  
  952. _Jackpot.pot += parseInt(user_value);
  953.  
  954. var player = {
  955. color: _Jackpot.users_colors[user],
  956. name: Users[user].name,
  957. avatar: Users[user].avatar,
  958. uid: user,
  959. amount: parseFloat(parseFloat(user_value/100).toFixed(2)),
  960. min_ticket: min_ticket,
  961. max_ticket: max_ticket,
  962. items: items
  963. };
  964.  
  965. _Jackpot.users.push(player);
  966.  
  967. for(var i in _Jackpot.users_values) {
  968. var value = _Jackpot.users_values[i];
  969. var chance = 100 - ((_Jackpot.pot-value)/_Jackpot.pot) * 100;
  970. _Jackpot.users_chances[i] = parseFloat(parseFloat(chance).toFixed(2));
  971. }
  972.  
  973. if(socket) socket.emit('msg', 'Your bet has been placed!', 'alert');
  974.  
  975. if((Object.keys(_Jackpot.users_colors).length === parseInt(config.jackpot.min_users)) && _Jackpot.time_left == null) {
  976. _Jackpot.state = 'WAITING2';
  977. _Jackpot.time_left = parseInt(time()+config.jackpot.seconds);
  978. io.sockets.emit('jackpot', 'timer', {
  979. time: parseInt(config.jackpot.seconds)
  980. });
  981.  
  982. var timer_one = parseInt(config.jackpot.timer_one);
  983. var timer_two = parseInt(config.jackpot.timer_two);
  984.  
  985. setTimeout(function() {
  986. _Jackpot.state = "ENDED";
  987. console.log(_Jackpot.state);
  988. setTimeout(function() {
  989. console.log('endJackpotGame()');
  990. endJackpotGame();
  991. }, timer_one*1000);
  992. }, timer_two*1000);
  993. }
  994.  
  995. io.sockets.emit('jackpot', 'join', {
  996. player: player,
  997. chances: _Jackpot.users_chances
  998. });
  999. }
  1000.  
  1001. function endJackpotGame() {
  1002. var winner_percentage = _Jackpot.winner_percentage;
  1003. var pot_value = _Jackpot.pot;
  1004.  
  1005. var winner_ticket = Math.round((winner_percentage/100) * pot_value);
  1006.  
  1007. console.log('Winner ticket', winner_ticket);
  1008.  
  1009. var users = _Jackpot.users;
  1010.  
  1011. var jackpot_iteme = "";
  1012. var jackpot_useri = "";
  1013. var jackpot_user_adaugat = {};
  1014.  
  1015. for(var x in _Jackpot.users) {
  1016. var pusers = _Jackpot.users[x];
  1017. var pusers_items = pusers.items;
  1018. for(var h in pusers_items) {
  1019. var puser_item = pusers_items[h];
  1020. jackpot_iteme += puser_item.id + '<|>' + puser_item.name + '<|>' + puser_item.image + '<|>' + puser_item.price + '<|>' + puser_item.color + '<||>';
  1021. if(!jackpot_user_adaugat.hasOwnProperty(pusers.uid)) {
  1022. jackpot_user_adaugat[pusers.uid] = 1;
  1023. jackpot_useri += pusers.name + "<|>" + pusers.avatar + "<||>";
  1024. }
  1025. }
  1026. }
  1027.  
  1028. for(var i in users) {
  1029. var min_ticket = users[i].min_ticket;
  1030. var max_ticket = users[i].max_ticket;
  1031.  
  1032. if(winner_ticket >= min_ticket && winner_ticket <= max_ticket) {
  1033. var deg = 360 - ((_Jackpot.pot-winner_ticket)/_Jackpot.pot) * 360;
  1034. var chance = _Jackpot.users_chances[users[i].uid];
  1035. var secret = _Jackpot.secret;
  1036.  
  1037. console.log('User gasit, winner:', users[i].name);
  1038.  
  1039. io.sockets.emit('jackpot', 'winner', {
  1040. deg: parseInt((360*3)+deg),
  1041. pot: pot_value,
  1042. chance: chance,
  1043. player: {
  1044. name: users[i].name
  1045. },
  1046. secret: secret,
  1047. winner_percentage: winner_percentage
  1048. });
  1049.  
  1050. var winner_total = 0;
  1051. for(var f in _Jackpot.users) {
  1052. if(_Jackpot.users[f].uid == users[i].uid) {
  1053. for(var s in _Jackpot.users[f].items) {
  1054. winner_total = winner_total + _Jackpot.users[f].items[s].price;
  1055. }
  1056. }
  1057. }
  1058.  
  1059. var jackpot_winner = pot_value + "<|>" + chance + "<|>" + users[i].name + "<|>" + users[i].avatar + '<|>' + parseFloat(winner_total/100).toFixed(2);
  1060.  
  1061. var user_tradelink = Users[users[i].uid].tradelink;
  1062.  
  1063. var curr_commission = 0.00;
  1064. var max_commission = parseFloat(parseFloat(config.jackpot.commission).toFixed(2));
  1065.  
  1066. var uncomissioned_items = _Jackpot.items.sort(function(a,b) { return a.price-b.price; });
  1067.  
  1068. var pottts = parseFloat(parseFloat(pot_value/100).toFixed(2));
  1069.  
  1070. for(var h in uncomissioned_items) {
  1071. var itm = uncomissioned_items[h];
  1072.  
  1073. var $price = parseFloat(parseFloat(itm.price/100).toFixed(2));
  1074. var com_percentage = parseFloat(parseFloat(100 - ((pottts-$price)/pottts) * 100).toFixed(2));
  1075.  
  1076. if(curr_commission+com_percentage < max_commission) {
  1077. curr_commission = parseFloat(curr_commission) + com_percentage;
  1078. uncomissioned_items[h].comission = 1;
  1079. }
  1080. }
  1081.  
  1082. var comissioned = 0;
  1083. var items_to_send = [];
  1084. for(var g in uncomissioned_items) {
  1085. if(uncomissioned_items[g].comission == 1) comissioned = parseFloat(comissioned) + parseFloat(uncomissioned_items[g].price/100);
  1086. if(uncomissioned_items[g].comission == 1) continue;
  1087. items_to_send.push(uncomissioned_items[g].id);
  1088. }
  1089.  
  1090. pool.query('UPDATE jackpots SET state = 1, items = ?, users = ?, winner = ? WHERE id = ?', [jackpot_iteme, jackpot_useri, jackpot_winner, _Jackpot.round], function(e,r) {
  1091. if(e) throw e;
  1092.  
  1093. setTimeout(function() {
  1094. ET.ITrade.SendOffer({trade_url: user_tradelink, items_to_send: items_to_send.join(','), expiration_time: 86400, message: 'WinSkins.fun - Jackpot won round #' + _Jackpot.round + ' - comission: ' + parseFloat(curr_commission).toFixed(2) + '% ($' + parseFloat(comissioned).toFixed(2) + ')'}, (err, res) => {
  1095. var sockett = io.sockets.connected[sockets[users[i].uid]];
  1096.  
  1097. if(err) {
  1098. if(sockett) sockett.emit('msg', err.toString(), "error");
  1099. return;
  1100. }
  1101.  
  1102. if(!res.hasOwnProperty('response')) {
  1103. if(sockett) sockett.emit('msg', res.message, "error");
  1104. return;
  1105. }
  1106.  
  1107. if(res.response.offer.state == 2) if(sockett) sockett.emit('user winning trade', res.response.offer.id);
  1108. });
  1109. createJackpotRound();
  1110. }, 8000);
  1111. });
  1112.  
  1113. break;
  1114. }
  1115. }
  1116. }
  1117.  
  1118. function getHistory(type, socket) {
  1119. if(type == "coinflip") {
  1120. pool.query('SELECT * FROM cfs WHERE state = 2 ORDER BY id DESC LIMIT 20', function(er, row) {
  1121. if(er) throw er;
  1122.  
  1123. socket.emit('coinflip history', row);
  1124. });
  1125. } else if(type == "jackpot") {
  1126. pool.query('SELECT * FROM jackpots WHERE state = 1 ORDER BY id DESC LIMIT 20', function(er, row) {
  1127. if(er) throw er;
  1128.  
  1129. socket.emit('jackpot history', row);
  1130. });
  1131. }
  1132. }
  1133.  
  1134. function getAllInventory(user, cb) {
  1135. var appids = {
  1136. 1: {
  1137. page: 1
  1138. },
  1139. 19: {
  1140. page: 1
  1141. },
  1142. 20: {
  1143. page: 1
  1144. },
  1145. 21: {
  1146. page: 1
  1147. },
  1148. 22: {
  1149. page: 1
  1150. },
  1151. 24: {
  1152. page: 1
  1153. }
  1154. };
  1155.  
  1156. var Items = [];
  1157.  
  1158. for(var i in appids) {
  1159. getInvs(i, appids[i].page);
  1160. }
  1161.  
  1162. function getInvs(appid, page) {
  1163. ET.ITrade.GetUserInventory({uid: user, app_id: appid, page: page}, (err, resp) => {
  1164. if(err) return cb(1, '');
  1165.  
  1166. for(var i in resp.response.items) {
  1167. Items.push(resp.response.items[i]);
  1168. }
  1169.  
  1170. if(resp.total_pages > resp.current_page) {
  1171. appids[appid].page++;
  1172. getInvs(appid, appids[appid].page);
  1173. } else doneProp();
  1174.  
  1175. });
  1176. }
  1177.  
  1178. var doneprops = 0;
  1179.  
  1180. function doneProp() {
  1181. doneprops++;
  1182. if(doneprops == 6) cb(0, Items);
  1183. }
  1184. }
  1185.  
  1186. function setTradelink(user, td) {
  1187. pool.query('UPDATE users SET tradelink = ? WHERE uid = ?', [td, user.uid], function(e,r) {
  1188. if(e) throw e;
  1189.  
  1190. user.tradelink = td;
  1191. });
  1192. }
  1193.  
  1194. function sendCFStatistics(socket) {
  1195. if(socket) {
  1196.  
  1197. var flips = 0;
  1198. var value = 0;
  1199.  
  1200. for(var i in CFs) {
  1201. flips++;
  1202. if(CFs[i].state == 0) value = parseFloat(value) + parseFloat(CFs[i].cvalue);
  1203. else value = parseFloat(value) + parseFloat(CFs[i].cvalue+CFs[i].pvalue);
  1204. }
  1205.  
  1206. socket.emit('cf statistics', flips, value);
  1207.  
  1208. } else {
  1209.  
  1210. var flips = 0;
  1211. var value = 0;
  1212.  
  1213. for(var i in CFs) {
  1214. flips++;
  1215. if(CFs[i].state == 0) value = parseFloat(value) + parseFloat(CFs[i].cvalue);
  1216. else value = parseFloat(value) + parseFloat(CFs[i].cvalue+CFs[i].pvalue);
  1217. }
  1218.  
  1219. io.sockets.emit('cf statistics', flips, value);
  1220.  
  1221. }
  1222. }
  1223.  
  1224. function encrypt(key, data) {
  1225. var cipher = crypto.createCipher('aes-256-cbc', key);
  1226. var crypted = cipher.update(data, 'utf-8', 'hex');
  1227. crypted += cipher.final('hex');
  1228.  
  1229. return crypted;
  1230. }
  1231.  
  1232. function makeSecret() {
  1233. var text = "";
  1234. var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  1235.  
  1236. for (var i = 0; i < 12; i++)
  1237. text += possible.charAt(Math.floor(Math.random() * possible.length));
  1238.  
  1239. return text;
  1240. }
  1241.  
  1242. function escapeHtml(unsafe) {
  1243. return unsafe
  1244. .replace(/&/g, "&amp;")
  1245. .replace(/</g, "&lt;")
  1246. .replace(/>/g, "&gt;")
  1247. .replace(/"/g, "&quot;")
  1248. .replace(/'/g, "&#039;");
  1249. }
  1250.  
  1251. process.on('uncaughtException', function (err) {
  1252. console.log(new Date() + ' [ERROR]');
  1253. console.log(err);
  1254. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement