Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var express = require('express');
- var fs = require('fs');
- var app = express();
- var crypto = require('crypto');
- var config = require('./config');
- var passport = require('passport');
- var CustomStrategy = require('passport-custom');
- var opAuth = require('opskins-oauth');
- app.use(passport.initialize());
- var options = {
- key: fs.readFileSync(__dirname + "/certs/cl.key"),
- cert: fs.readFileSync(__dirname + "/certs/cl.crt")
- };
- var returnURL;
- if(config.website.ssl) returnURL = "https://" + config.website.domain + "/auth/login/user";
- else returnURL = "http://" + config.website.domain + "/auth/login/user";
- let OpskinsAuth = new opAuth.init({
- name: config.website.name,
- returnURL: returnURL,
- apiKey: config.opskins.auth.apikey,
- scopes: 'identity',
- mobile: true
- });
- var ExpressTrade = require('expresstrade');
- var ET = new ExpressTrade({
- apikey: config.opskins.bot.apikey,
- twofactorsecret: config.opskins.bot.secret,
- pollInterval: 5000
- });
- passport.use('custom', new CustomStrategy(function (req, done) {
- OpskinsAuth.authenticate(req, (err, user) => {
- if (err) {
- done(err);
- } else {
- done(null, user);
- }
- });
- }));
- var server;
- if(config.website.ssl) server = require('https').createServer(options, app); // FOR SSL ONLY
- else server = require('http').createServer(app); // FOR NO - SSL ONLY
- var io = require('socket.io')(server);
- // vars
- var Offers = {};
- var CFs = {};
- var CFs_infos = {};
- var sockets = {};
- var _Jackpot = {
- round: 0,
- pot: 0,
- state: "NONE",
- hash: null,
- secret: null,
- winner_percentage: null,
- time_left: null,
- items: [],
- user_ids: 0,
- users_colors: {},
- users_values: {},
- users_chances: {},
- users: []
- };
- var JackpotColors = config.jackpot.colors;
- var chat_msg_ids = 0;
- var chat_history = [];
- var users_online = {};
- // vars
- var pool = null;
- var mysql = require('mysql');
- var connection = mysql.createConnection({
- host: config.database.host,
- user: config.database.user,
- password: config.database.pw,
- database: config.database.db
- });
- connection.connect(function(err) {
- if(err) throw err;
- pool = connection;
- console.log('Successfully connected to database!');
- init();
- });
- function init() {
- getActiveCoinflips();
- createJackpotRound();
- }
- var states = {};
- app.set('view engine', 'ejs');
- app.use('/public', express.static(__dirname + "/public"));
- app.get('/', function(req, res) {
- res.render('pages/home');
- });
- app.get('/jackpot', function(req, res) {
- res.render('pages/jackpot');
- });
- app.get('/fair', function(req, res) {
- res.render('pages/fair');
- });
- app.get('/history', function(req, res) {
- res.render('pages/history');
- });
- app.get('/auth/login', function (req, res) {
- OpskinsAuth.getFetchUrl(function(returnUri, state) {
- res.redirect(returnUri);
- states[state] = {};
- });
- });
- app.get('/auth/login/user', passport.authenticate('custom', {
- failureRedirect: '/'
- }), function (req, res) {
- res.cookie('token', req.query.state);
- pool.query('SELECT id FROM users WHERE uid = ' + pool.escape(req.user.id), function(e,r) {
- if(e) throw e;
- if(r.length == 0) {
- 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) {
- });
- } else {
- pool.query('UPDATE users SET token = ' + pool.escape(req.query.state) + ' WHERE uid = ' + pool.escape(req.user.id), function(e,r) {
- });
- }
- });
- res.redirect('/');
- });
- var listenport = 80;
- if(config.website.ssl) listenport = 443;
- server.listen(listenport, function() {
- console.log('Server is up and running on PORT :' + listenport + ' - SSL: ' + config.website.ssl + '!');
- });
- // GLOBAL USER
- var Users = {};
- // GLOBAL USER
- io.on('connection', function(socket) {
- var user = null;
- socket.on('log', function(token) {
- pool.query('SELECT * FROM users WHERE token = ' + pool.escape(token), function(err, row) {
- if(err) throw err;
- if(chat_history.length > 0) socket.emit('chat history', chat_history);
- var ip = socket.request.connection.remoteAddress;
- if(!users_online.hasOwnProperty(ip)) users_online[ip] = 1;
- io.sockets.emit('users online', Object.keys(users_online).length);
- if(row.length == 0) {
- for(var i in CFs) {
- CFs[i].timer = parseInt(CFs[i].time-time());
- }
- socket.emit('jackpot', 'round', {
- round: _Jackpot.round,
- hash: _Jackpot.hash,
- users: _Jackpot.users,
- chances: _Jackpot.users_chances
- });
- if(_Jackpot.time_left != null) socket.emit('jackpot', 'timer', {
- time: parseInt(_Jackpot.time_left-time())
- });
- if(Object.keys(CFs).length > 0) socket.emit('coinflip', 'history', CFs);
- sendCFStatistics(socket);
- } else {
- user = row[0];
- Users[user.uid] = row[0];
- sockets[user.uid] = socket.id;
- socket.emit('user info', user);
- for(var i in CFs) {
- CFs[i].timer = parseInt(CFs[i].time-time());
- }
- socket.emit('jackpot', 'round', {
- round: _Jackpot.round,
- hash: _Jackpot.hash,
- users: _Jackpot.users,
- chances: _Jackpot.users_chances
- });
- if(_Jackpot.time_left != null) socket.emit('jackpot', 'timer', {
- time: parseInt(_Jackpot.time_left-time())
- });
- if(Object.keys(CFs).length > 0) socket.emit('coinflip', 'history', CFs);
- sendCFStatistics(socket);
- }
- });
- });
- socket.on('user inventory', function() {
- if(!user) return;
- getAllInventory(user.uid, function(err, items) {
- if(err) return;
- socket.emit('user inventory handler', items);
- });
- });
- socket.on('coinflip', function(type, game) {
- if(type == "watch") watchCoinflipGame(game, socket);
- });
- socket.on('get coinflip history', function() {
- getHistory('coinflip', socket);
- });
- socket.on('get jackpot history', function() {
- getHistory('jackpot', socket);
- });
- socket.on('set tradelink', function(td) {
- if(!user) return;
- setTradelink(user, td);
- });
- socket.on('user message', function(message) {
- if(!user) return;
- sendMessage(user, message, socket);
- });
- socket.on('send trade', function(items, type, info) {
- if(!user) return;
- if(user.tradelink == "") return socket.emit('no tradelink');
- sendTradeUser(user, items, type, info, socket);
- });
- socket.on('disconnect', function() {
- var ip = socket.request.connection.remoteAddress;
- if(users_online.hasOwnProperty(ip)) delete users_online[ip];
- io.sockets.emit('users online', Object.keys(users_online).length);
- });
- socket.on('check fair', function(info) {
- var hash = info.hash;
- var secret = info.secret;
- var percentage = info.percentage;
- var new_hash = encrypt(secret, percentage.toString());
- if(new_hash == hash) socket.emit('msg', 'The hash matches!', 'alert');
- else socket.emit('msg', 'The hash does not matches!', 'error');
- });
- });
- passport.serializeUser(function(user, done) {
- done(null, user);
- });
- passport.deserializeUser(function(user, done) {
- done(null, user);
- });
- function time() {
- return parseInt(new Date().getTime()/1000);
- }
- function sendMessage(user, message, socket) {
- var msg = escapeHtml(message);
- var name = user.name;
- var avatar = user.avatar;
- var rank = user.rank;
- var level = parseInt(user.xp/1000); // EVERY $10 = LEVEL UP
- if((msg.length < 2 || msg.length > 128) && user.rank != 100) return socket.emit('msg', 'The message is too short/long to be sent!', 'error');
- if(msg.startsWith('/')) {
- if(msg.startsWith('/clear') && ( user.rank == 100 || user.rank == 101) ) {
- chat_history = [];
- io.sockets.emit('chat clear');
- socket.emit('msg', 'Chat was successfully cleared!', 'alert');
- }
- return;
- }
- chat_msg_ids++;
- var props = {
- id: chat_msg_ids,
- uid: user.uid,
- level: level,
- name: name,
- avatar: avatar,
- rank: rank,
- msg: msg
- };
- chat_history.push(props);
- if(chat_history.length >= 31) chat_history.shift();
- io.sockets.emit('user message', props);
- }
- function sendTradeUser(user, items, type, info, socket) {
- if(type == "jackpot") {
- ET.IItem.GetItemsById({item_id: items.join(',')}, (err, resp) => {
- if(err) return socket.emit('msg', err.toString(), "error");
- if(!resp.hasOwnProperty('response')) return socket.emit('msg', resp.message, 'error');
- var checked_items = 0;
- for(var i in items) {
- for(var z in resp.response.items) {
- if(items[i] == resp.response.items[z].id) checked_items++;
- }
- }
- if(items.length != checked_items) return socket.emit('msg', 'Some items are not in your inventory!', 'error');
- 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) => {
- if(err) return socket.emit('msg', err.toString(), "error");
- if(!res.hasOwnProperty('response')) return socket.emit('msg', res.message, "error");
- if(res.response.offer.state == 2) {
- Offers[res.response.offer.id] = {
- user: user.uid,
- type: 'jackpot'
- };
- }
- socket.emit('user trade', res.response.offer.id);
- });
- });
- } else if(type == "create") {
- var side = info;
- 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) => {
- if(err) return socket.emit('msg', err.toString(), "error");
- if(!resp.hasOwnProperty('response')) return socket.emit('msg', resp.message, "error");
- if(resp.response.offer.state == 2) {
- Offers[resp.response.offer.id] = {
- user: user.uid,
- type: 'create',
- side: side
- };
- }
- socket.emit('user trade', resp.response.offer.id);
- });
- } else if(type == "join") {
- var game = info;
- var side = 1;
- if(CFs[game].cside == 1) side = 2;
- if(CFs[game].puser > 0) return socket.emit('msg', 'You can\'t join, sorry!', 'error');
- if(CFs[game].cuser == user.uid && user.rank != 100) return socket.emit('msg', 'You can\'t jon your game!', 'error');
- var min = parseFloat(parseFloat(CFs[game].cvalue*0.90).toFixed(2));
- var max = parseFloat(parseFloat(CFs[game].cvalue*1.10).toFixed(2));
- ET.ITrade.GetUserInventory({uid: user.uid, app_id: 1}, (err, resp) => {
- if(err) return socket.emit('msg', err.toString(), 'error');
- if(!resp.hasOwnProperty('response')) return socket.emit('msg', resp.message, "error");
- var itemss = resp.response.items;
- var checked_items = [];
- var checked_value = 0;
- for(var i in itemss) {
- for(var z in items) {
- if(itemss[i].id == items[z]) {
- var val = parseFloat(itemss[i].suggested_price_floor/100);
- checked_items.push({
- id: itemss[i].id,
- name: itemss[i].name,
- image: itemss[i].image["600px"],
- price: parseFloat(val).toFixed(2)
- });
- checked_value = parseFloat(checked_value) + parseFloat(itemss[i].suggested_price_floor/100);
- }
- }
- }
- if(checked_items.length != items.length) return socket.emit('msg', 'Some items are not in your inventory!', 'error');
- if(checked_value < min || checked_value > max) return socket.emit('msg', 'You need to bet items between value: ' + min + ' and ' + max, 'error');
- 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) => {
- if(err) return socket.emit('msg', err.toString(), 'error');
- if(!res.hasOwnProperty('response')) return socket.emit('msg', res, "error");
- CFs[game].puser = user.uid;
- CFs[game].pavatar = user.avatar;
- CFs[game].pname = user.name;
- CFs[game].pvalue = checked_value;
- CFs[game].pitems = checked_items;
- CFs[game].pside = side;
- CFs[game].state = 1;
- CFs[game].secret
- CFs[game].time = time()+120;
- sendCFStatistics();
- io.sockets.emit('coinflip', 'edit', CFs[game]);
- if(res.response.offer.state == 2) {
- Offers[res.response.offer.id] = {
- user: user.uid,
- type: 'join',
- game: game,
- side: side
- };
- }
- socket.emit('user trade', res.response.offer.id);
- });
- });
- }
- }
- function getActiveCoinflips() {
- pool.query('SELECT * FROM cfs WHERE state = 0', function(er, ro) {
- if(er) throw er;
- for(var i in ro) {
- var itm = ro[i];
- var Items = [];
- var iteme = itm.citems.split('<||>');
- for(var z in iteme) {
- var zec = iteme[z].split('<|>');
- Items.push({
- id: zec[0],
- name: zec[1],
- image: zec[2],
- price: zec[3]
- });
- }
- Items.pop();
- CFs[itm.id] = {
- id: itm.id,
- cuser: itm.cuser,
- cavatar: itm.cavatar,
- cname: itm.cname,
- cside: itm.cside,
- cvalue: itm.cvalue,
- citems: Items,
- hash: itm.hash,
- state: 0
- };
- CFs_infos[itm.id] = {
- secret: itm.secret,
- percentage: itm.percentage
- };
- }
- });
- }
- function watchCoinflipGame(game, socket) {
- if(!CFs.hasOwnProperty(game)) return socket.emit('msg', 'This game cannot be watched!', 'error');
- CFs[game].timer = parseInt(CFs[game].time-time());
- socket.emit('coinflip', 'to_watch', CFs[game]);
- }
- ET.on('offerAccepted', function(off) {
- if(Offers.hasOwnProperty(off.id)) {
- var offer = Offers[off.id];
- if(offer.type == "create") {
- var items = off.recipient.items;
- var value = 0;
- var citems = [];
- var citemss = [];
- var db_citems = "";
- for(var i in items) {
- var itm = items[i];
- var item_price = 0;
- value = parseFloat(value) + parseFloat(itm.suggested_price_floor/100);
- item_price = parseFloat(itm.suggested_price_floor/100);
- citemss.push(itm.id);
- db_citems += itm.id + "<|>" + itm.name + "<|>" + itm.image["600px"] + "<|>" + item_price + "<||>";
- citems.push({
- id: itm.id,
- name: itm.name,
- image: itm.image["600px"],
- price: item_price
- });
- }
- var secret = makeSecret();
- var percentage = parseFloat(Math.random()*(99.99999-0.00001)+0.00001).toFixed(5);
- var hash = encrypt(secret, percentage.toString());
- var side_won = null;
- if(percentage < 50.00) side_won = 1;
- else side_won = 2;
- var query = `
- INSERT INTO cfs SET cuser = ?, cavatar = ?, cname = ?, cvalue = ?, cside = ?, hash = ?, secret = ?, percentage = ?, state = 0, side_won = ?, citems = ?, citemss = ?
- `;
- 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) {
- if(e) throw e;
- if(encrypt(secret,percentage.toString()) == hash) console.log('New CF game created! Hash is verified!');
- pool.query('UPDATE users SET xp = xp + ? WHERE uid = ?', [value*100, offer.user], function(err) {
- if(err) throw err;
- });
- console.log('New game created!');
- CFs[r.insertId] = {
- id: r.insertId,
- cuser: offer.user,
- cavatar: off.recipient.avatar,
- cname: off.recipient.display_name,
- cside: offer.side,
- cvalue: value,
- citems: citems,
- hash: hash,
- state: 0
- };
- CFs_infos[r.insertId] = {
- secret: secret,
- percentage: percentage
- };
- sendCFStatistics();
- io.sockets.emit('coinflip', 'new', CFs[r.insertId]);
- delete Offers[off.id];
- });
- } else if(offer.type == "join") {
- var query = `
- UPDATE cfs SET puser = ?, pavatar = ?, pname = ?, pvalue = ?, pitems = ?, pside = ?, state = 2, pitemss = ? WHERE id = ?
- `;
- var ga = CFs[offer.game];
- var db_pitems = "";
- var pitemss = [];
- for(var i in ga.pitems) {
- var itm = ga.pitems[i];
- db_pitems += itm.id + "<|>" + itm.name + "<|>" + itm.image + "<|>" + itm.price + "<||>";
- pitemss.push(itm.id);
- }
- pool.query('SELECT side_won FROM cfs WHERE id = ' + pool.escape(ga.id), function(e, r) {
- if(e) throw e;
- var side_won = r[0].side_won;
- pool.query(query, [ga.puser, ga.pavatar, ga.pname, ga.pvalue, db_pitems, ga.pside, pitemss.join(','), ga.id], function(er, ro) {
- if(er) throw er;
- var winner_uid = null;
- CFs[ga.id].side_won = side_won;
- CFs[ga.id].state = 2;
- if(CFs[ga.id].cside == side_won) winner_uid = CFs[ga.id].cuser;
- else winner_uid = CFs[ga.id].puser;
- CFs[ga.id].time = time()+10;
- CFs[ga.id].secret = CFs_infos[ga.id].secret;
- CFs[ga.id].percentage = CFs_infos[ga.id].percentage;
- pool.query('UPDATE users SET xp = xp + ? WHERE uid = ?', [ga.pvalue*100, offer.user], function(err) {
- if(err) throw err;
- });
- io.sockets.emit('coinflip', 'edit', CFs[ga.id]);
- setTimeout(function() {
- CFs[ga.id].state = 3;
- }, 5000);
- setTimeout(function() {
- hideGame(ga.id);
- sendWinningsCoinflip(ga.id, winner_uid);
- }, 13000);
- });
- });
- delete Offers[off.id];
- } else if(offer.type == "jackpot") {
- var Items = [];
- var value = 0;
- for(var i in off.recipient.items) {
- var itm = off.recipient.items[i];
- var $image;
- if(!itm.image.hasOwnProperty("600px")) $image = itm.image;
- else $image = itm.image["600px"];
- Items.push({
- id: itm.id,
- name: itm.name,
- image: $image,
- price: itm.suggested_price_floor,
- color: itm.color
- });
- value = parseFloat(value) + parseFloat(parseFloat(itm.suggested_price_floor/100).toFixed(2))
- }
- console.log('TRADE #' + off.id + ' accepted - jackpot');
- pool.query('UPDATE users SET xp = xp + ? WHERE uid = ?', [value*100, offer.user], function(err) {
- if(err) throw err;
- });
- delete Offers[off.id];
- joinJackpotRound(offer.user, Items);
- }
- }
- });
- ET.on('offerExpired', function(off) {
- if(Offers.hasOwnProperty(off.id)) {
- if(Offers[off.id].type == "join") {
- var game = Offers[off.id].game;
- CFs[game].puser = "";
- CFs[game].pavatar = "";
- CFs[game].pname = "";
- CFs[game].pside = "";
- CFs[game].pitems = "";
- CFs[game].pvalue = "";
- CFs[game].state = 0;
- sendCFStatistics();
- io.sockets.emit('coinflip', 'edit', CFs[game]);
- }
- }
- });
- ET.on('offerDeclined', function(off) {
- if(Offers.hasOwnProperty(off.id)) {
- if(Offers[off.id].type == "join") {
- var game = Offers[off.id].game;
- CFs[game].puser = "";
- CFs[game].pavatar = "";
- CFs[game].pname = "";
- CFs[game].pside = "";
- CFs[game].pitems = "";
- CFs[game].pvalue = "";
- CFs[game].state = 0;
- sendCFStatistics();
- io.sockets.emit('coinflip', 'edit', CFs[game]);
- }
- }
- });
- function hideGame(id) {
- setTimeout(function() {
- delete CFs[id];
- io.sockets.emit('coinflip', 'remove', id);
- sendCFStatistics();
- }, 60000);
- }
- function sendWinningsCoinflip(id, uid) {
- pool.query('SELECT citemss, pitemss FROM cfs WHERE id = ' + pool.escape(id), function(e,r) {
- if(e) throw e;
- pool.query('SELECT tradelink FROM users WHERE uid = ?', [uid], function(er, ro) {
- if(er) throw er;
- var items_p1 = r[0].citemss.split(',');
- var items_p2 = r[0].pitemss.split(',');
- var all_items = items_p1.concat(items_p2);
- var curr_commission = 0.00;
- var max_commission = parseFloat(parseFloat(config.coinflip.commission).toFixed(2));
- var uncomissioned_items = all_items.sort(function(a,b) { return a.price-b.price; });
- var pottts = 0;
- for(var f in uncomissioned_items) {
- pottts = parseFloat(potts) + uncomissioned_items[f].price;
- }
- for(var h in uncomissioned_items) {
- var itm = uncomissioned_items[h];
- var $price = parseFloat(parseFloat(itm.price/100).toFixed(2));
- var com_percentage = parseFloat(parseFloat(100 - ((pottts-$price)/pottts) * 100).toFixed(2));
- if(curr_commission+com_percentage < max_commission) {
- curr_commission = parseFloat(curr_commission) + com_percentage;
- uncomissioned_items[h].comission = 1;
- }
- }
- var comissioned = 0;
- var items_to_send = [];
- for(var g in uncomissioned_items) {
- if(uncomissioned_items[g].comission == 1) comissioned = parseFloat(comissioned) + parseFloat(uncomissioned_items[g].price/100);
- if(uncomissioned_items[g].comission == 1) continue;
- items_to_send.push(uncomissioned_items[g].id);
- }
- 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) => {
- if(err) throw err;
- if(!resp.hasOwnProperty('response')) return;
- if(io.sockets.connected[sockets[uid]]) io.sockets.connected[sockets[uid]].emit('user winning trade', resp.response.offer.id);
- });
- });
- });
- }
- function createJackpotRound() {
- if(_Jackpot.round == 0) {
- pool.query('SELECT * FROM jackpots WHERE state = 0', function(er, ro) {
- if(er) throw er;
- if(ro.length == 0) {
- var hash;
- var secret = makeSecret();
- var percentage = parseFloat(Math.random()*(99.99999-0.00001)+0.00001).toFixed(5);
- hash = encrypt(secret, percentage.toString());
- pool.query('INSERT INTO jackpots SET hash = ?, secret = ?, percentage = ?, state = 0', [hash, secret, percentage], function(err, row) {
- if(err) throw err;
- _Jackpot.round = row.insertId;
- _Jackpot.hash = hash;
- _Jackpot.pot = 0;
- _Jackpot.items = [];
- _Jackpot.state = "WAITING";
- _Jackpot.secret = secret;
- _Jackpot.user_ids = 0;
- _Jackpot.users_colors = {};
- _Jackpot.users_values = {};
- _Jackpot.users_chances = {};
- _Jackpot.users = [];
- _Jackpot.time_left = null;
- _Jackpot.winner_percentage = percentage;
- io.sockets.emit('jackpot', 'round', {
- round: _Jackpot.round,
- hash: _Jackpot.hash,
- users: [],
- chances: []
- });
- });
- } else {
- if(ro.length == 1) {
- pool.query('SELECT * FROM jackpots WHERE state = 0 LIMIT 1', function(err, row) {
- if(err) throw err;
- var jk = row[0];
- _Jackpot.round = jk.id;
- _Jackpot.hash = jk.hash;
- _Jackpot.pot = 0;
- _Jackpot.items = [];
- _Jackpot.state = "WAITING";
- _Jackpot.secret = jk.secret;
- _Jackpot.user_ids = 0;
- _Jackpot.users_colors = {};
- _Jackpot.users_values = {};
- _Jackpot.users_chances = {};
- _Jackpot.users = [];
- _Jackpot.time_left = null;
- _Jackpot.winner_percentage = jk.percentage;
- io.sockets.emit('jackpot', 'round', {
- round: _Jackpot.round,
- hash: _Jackpot.hash,
- users: [],
- chances: []
- });
- });
- } else {
- // IN CASE AN ERROR OCCURRS!!!
- pool.query('DELETE FROM jackpots WHERE state = 0', function(e) {
- if(e) throw e;
- var hash;
- var secret = makeSecret();
- var percentage = parseFloat(Math.random()*(99.99999-0.00001)+0.00001).toFixed(5);
- hash = encrypt(secret, percentage.toString());
- pool.query('INSERT INTO jackpots SET hash = ?, secret = ?, percentage = ?, state = 0', [hash, secret, percentage], function(err, row) {
- if(err) throw err;
- _Jackpot.round = row.insertId;
- _Jackpot.hash = hash;
- _Jackpot.pot = 0;
- _Jackpot.items = [];
- _Jackpot.state = "WAITING";
- _Jackpot.secret = secret;
- _Jackpot.user_ids = 0;
- _Jackpot.users_colors = {};
- _Jackpot.users_values = {};
- _Jackpot.users_chances = {};
- _Jackpot.users = [];
- _Jackpot.time_left = null;
- _Jackpot.winner_percentage = percentage;
- io.sockets.emit('jackpot', 'round', {
- round: _Jackpot.round,
- hash: _Jackpot.hash,
- users: [],
- chances: []
- });
- });
- });
- }
- }
- });
- } else {
- var hash;
- var secret = makeSecret();
- var percentage = parseFloat(Math.random()*(99.99999-0.00001)+0.00001).toFixed(5);
- hash = encrypt(secret, percentage.toString());
- pool.query('INSERT INTO jackpots SET hash = ?, secret = ?, percentage = ?, state = 0', [hash, secret, percentage], function(err, row) {
- if(err) throw err;
- _Jackpot.round = row.insertId;
- _Jackpot.hash = hash;
- _Jackpot.pot = 0;
- _Jackpot.items = [];
- _Jackpot.state = "WAITING";
- _Jackpot.secret = secret;
- _Jackpot.user_ids = 0;
- _Jackpot.users_colors = {};
- _Jackpot.users_values = {};
- _Jackpot.users_chances = {};
- _Jackpot.users = [];
- _Jackpot.time_left = null;
- _Jackpot.winner_percentage = percentage;
- io.sockets.emit('jackpot', 'round', {
- round: _Jackpot.round,
- hash: _Jackpot.hash,
- users: [],
- chances: []
- });
- });
- }
- }
- function joinJackpotRound(user, items) {
- var socket = io.sockets.connected[sockets[user]];
- if(_Jackpot.state == "NONE" || _Jackpot.state == "ENDED") {
- console.log(_Jackpot.state);
- if(socket) socket.emit('msg', 'Your trade is in queue, waiting...', 'alert');
- setTimeout(function() { joinJackpotRound(user, items); }, 5000);
- return;
- }
- var user_value = 0;
- for(var i in items) {
- user_value += parseInt(items[i].price);
- _Jackpot.items.push({
- id: items[i].id,
- price: items[i].price
- });
- }
- if(_Jackpot.users_values.hasOwnProperty(user)) {
- _Jackpot.users_values[user] = parseInt(_Jackpot.users_values[user]) + parseInt(user_value);
- } else {
- _Jackpot.users_values[user] = user_value;
- _Jackpot.users_colors[user] = JackpotColors[_Jackpot.user_ids];
- _Jackpot.user_ids++;
- }
- var min_ticket;
- var max_ticket;
- if(_Jackpot.users.length == 0) {
- min_ticket = _Jackpot.pot;
- max_ticket = parseInt(user_value-1);
- } else {
- min_ticket = _Jackpot.pot;
- max_ticket = parseInt(_Jackpot.pot+user_value-1);
- }
- _Jackpot.pot += parseInt(user_value);
- var player = {
- color: _Jackpot.users_colors[user],
- name: Users[user].name,
- avatar: Users[user].avatar,
- uid: user,
- amount: parseFloat(parseFloat(user_value/100).toFixed(2)),
- min_ticket: min_ticket,
- max_ticket: max_ticket,
- items: items
- };
- _Jackpot.users.push(player);
- for(var i in _Jackpot.users_values) {
- var value = _Jackpot.users_values[i];
- var chance = 100 - ((_Jackpot.pot-value)/_Jackpot.pot) * 100;
- _Jackpot.users_chances[i] = parseFloat(parseFloat(chance).toFixed(2));
- }
- if(socket) socket.emit('msg', 'Your bet has been placed!', 'alert');
- if((Object.keys(_Jackpot.users_colors).length === parseInt(config.jackpot.min_users)) && _Jackpot.time_left == null) {
- _Jackpot.state = 'WAITING2';
- _Jackpot.time_left = parseInt(time()+config.jackpot.seconds);
- io.sockets.emit('jackpot', 'timer', {
- time: parseInt(config.jackpot.seconds)
- });
- var timer_one = parseInt(config.jackpot.timer_one);
- var timer_two = parseInt(config.jackpot.timer_two);
- setTimeout(function() {
- _Jackpot.state = "ENDED";
- console.log(_Jackpot.state);
- setTimeout(function() {
- console.log('endJackpotGame()');
- endJackpotGame();
- }, timer_one*1000);
- }, timer_two*1000);
- }
- io.sockets.emit('jackpot', 'join', {
- player: player,
- chances: _Jackpot.users_chances
- });
- }
- function endJackpotGame() {
- var winner_percentage = _Jackpot.winner_percentage;
- var pot_value = _Jackpot.pot;
- var winner_ticket = Math.round((winner_percentage/100) * pot_value);
- console.log('Winner ticket', winner_ticket);
- var users = _Jackpot.users;
- var jackpot_iteme = "";
- var jackpot_useri = "";
- var jackpot_user_adaugat = {};
- for(var x in _Jackpot.users) {
- var pusers = _Jackpot.users[x];
- var pusers_items = pusers.items;
- for(var h in pusers_items) {
- var puser_item = pusers_items[h];
- jackpot_iteme += puser_item.id + '<|>' + puser_item.name + '<|>' + puser_item.image + '<|>' + puser_item.price + '<|>' + puser_item.color + '<||>';
- if(!jackpot_user_adaugat.hasOwnProperty(pusers.uid)) {
- jackpot_user_adaugat[pusers.uid] = 1;
- jackpot_useri += pusers.name + "<|>" + pusers.avatar + "<||>";
- }
- }
- }
- for(var i in users) {
- var min_ticket = users[i].min_ticket;
- var max_ticket = users[i].max_ticket;
- if(winner_ticket >= min_ticket && winner_ticket <= max_ticket) {
- var deg = 360 - ((_Jackpot.pot-winner_ticket)/_Jackpot.pot) * 360;
- var chance = _Jackpot.users_chances[users[i].uid];
- var secret = _Jackpot.secret;
- console.log('User gasit, winner:', users[i].name);
- io.sockets.emit('jackpot', 'winner', {
- deg: parseInt((360*3)+deg),
- pot: pot_value,
- chance: chance,
- player: {
- name: users[i].name
- },
- secret: secret,
- winner_percentage: winner_percentage
- });
- var winner_total = 0;
- for(var f in _Jackpot.users) {
- if(_Jackpot.users[f].uid == users[i].uid) {
- for(var s in _Jackpot.users[f].items) {
- winner_total = winner_total + _Jackpot.users[f].items[s].price;
- }
- }
- }
- var jackpot_winner = pot_value + "<|>" + chance + "<|>" + users[i].name + "<|>" + users[i].avatar + '<|>' + parseFloat(winner_total/100).toFixed(2);
- var user_tradelink = Users[users[i].uid].tradelink;
- var curr_commission = 0.00;
- var max_commission = parseFloat(parseFloat(config.jackpot.commission).toFixed(2));
- var uncomissioned_items = _Jackpot.items.sort(function(a,b) { return a.price-b.price; });
- var pottts = parseFloat(parseFloat(pot_value/100).toFixed(2));
- for(var h in uncomissioned_items) {
- var itm = uncomissioned_items[h];
- var $price = parseFloat(parseFloat(itm.price/100).toFixed(2));
- var com_percentage = parseFloat(parseFloat(100 - ((pottts-$price)/pottts) * 100).toFixed(2));
- if(curr_commission+com_percentage < max_commission) {
- curr_commission = parseFloat(curr_commission) + com_percentage;
- uncomissioned_items[h].comission = 1;
- }
- }
- var comissioned = 0;
- var items_to_send = [];
- for(var g in uncomissioned_items) {
- if(uncomissioned_items[g].comission == 1) comissioned = parseFloat(comissioned) + parseFloat(uncomissioned_items[g].price/100);
- if(uncomissioned_items[g].comission == 1) continue;
- items_to_send.push(uncomissioned_items[g].id);
- }
- pool.query('UPDATE jackpots SET state = 1, items = ?, users = ?, winner = ? WHERE id = ?', [jackpot_iteme, jackpot_useri, jackpot_winner, _Jackpot.round], function(e,r) {
- if(e) throw e;
- setTimeout(function() {
- 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) => {
- var sockett = io.sockets.connected[sockets[users[i].uid]];
- if(err) {
- if(sockett) sockett.emit('msg', err.toString(), "error");
- return;
- }
- if(!res.hasOwnProperty('response')) {
- if(sockett) sockett.emit('msg', res.message, "error");
- return;
- }
- if(res.response.offer.state == 2) if(sockett) sockett.emit('user winning trade', res.response.offer.id);
- });
- createJackpotRound();
- }, 8000);
- });
- break;
- }
- }
- }
- function getHistory(type, socket) {
- if(type == "coinflip") {
- pool.query('SELECT * FROM cfs WHERE state = 2 ORDER BY id DESC LIMIT 20', function(er, row) {
- if(er) throw er;
- socket.emit('coinflip history', row);
- });
- } else if(type == "jackpot") {
- pool.query('SELECT * FROM jackpots WHERE state = 1 ORDER BY id DESC LIMIT 20', function(er, row) {
- if(er) throw er;
- socket.emit('jackpot history', row);
- });
- }
- }
- function getAllInventory(user, cb) {
- var appids = {
- 1: {
- page: 1
- },
- 19: {
- page: 1
- },
- 20: {
- page: 1
- },
- 21: {
- page: 1
- },
- 22: {
- page: 1
- },
- 24: {
- page: 1
- }
- };
- var Items = [];
- for(var i in appids) {
- getInvs(i, appids[i].page);
- }
- function getInvs(appid, page) {
- ET.ITrade.GetUserInventory({uid: user, app_id: appid, page: page}, (err, resp) => {
- if(err) return cb(1, '');
- for(var i in resp.response.items) {
- Items.push(resp.response.items[i]);
- }
- if(resp.total_pages > resp.current_page) {
- appids[appid].page++;
- getInvs(appid, appids[appid].page);
- } else doneProp();
- });
- }
- var doneprops = 0;
- function doneProp() {
- doneprops++;
- if(doneprops == 6) cb(0, Items);
- }
- }
- function setTradelink(user, td) {
- pool.query('UPDATE users SET tradelink = ? WHERE uid = ?', [td, user.uid], function(e,r) {
- if(e) throw e;
- user.tradelink = td;
- });
- }
- function sendCFStatistics(socket) {
- if(socket) {
- var flips = 0;
- var value = 0;
- for(var i in CFs) {
- flips++;
- if(CFs[i].state == 0) value = parseFloat(value) + parseFloat(CFs[i].cvalue);
- else value = parseFloat(value) + parseFloat(CFs[i].cvalue+CFs[i].pvalue);
- }
- socket.emit('cf statistics', flips, value);
- } else {
- var flips = 0;
- var value = 0;
- for(var i in CFs) {
- flips++;
- if(CFs[i].state == 0) value = parseFloat(value) + parseFloat(CFs[i].cvalue);
- else value = parseFloat(value) + parseFloat(CFs[i].cvalue+CFs[i].pvalue);
- }
- io.sockets.emit('cf statistics', flips, value);
- }
- }
- function encrypt(key, data) {
- var cipher = crypto.createCipher('aes-256-cbc', key);
- var crypted = cipher.update(data, 'utf-8', 'hex');
- crypted += cipher.final('hex');
- return crypted;
- }
- function makeSecret() {
- var text = "";
- var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for (var i = 0; i < 12; i++)
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- return text;
- }
- function escapeHtml(unsafe) {
- return unsafe
- .replace(/&/g, "&")
- .replace(/</g, "<")
- .replace(/>/g, ">")
- .replace(/"/g, """)
- .replace(/'/g, "'");
- }
- process.on('uncaughtException', function (err) {
- console.log(new Date() + ' [ERROR]');
- console.log(err);
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement