Advertisement
Tretlenz

mogobot

Feb 26th, 2018
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 86.74 KB | None | 0 0
  1. var config = require('./steambot.config.js');
  2. var helper = require('./helper.js');
  3. var fs = require('fs');
  4. var crypto = require('crypto');
  5. var request = require("request");
  6.  
  7. var curs = config.curs;
  8.  
  9. if(fs.existsSync('items.txt')) {
  10.     var items = fs.readFileSync('items.txt');
  11.     items = JSON.parse(items);
  12.     var td = Math.round(new Date().getTime()/1000.0)-items.response.current_time;
  13.     if(td > 86400) {
  14.         request('http://backpack.tf/api/IGetMarketPrices/v1/?key='+config.backey+'&compress=1&appid='+config.gameType+'', function(error, response, body) {
  15.             fs.writeFileSync('items.txt', body);
  16.             items = JSON.parse(body);
  17.             if(items.response.success == 0) throw "Cant load items price";
  18.         });
  19.     }
  20. } else {
  21.             request('http://backpack.tf/api/IGetMarketPrices/v1/?key='+config.backey+'&compress=1&appid='+config.gameType+'', function(error, response, body) {
  22.         fs.writeFileSync('items.txt', body);
  23.         items = JSON.parse(body);
  24.         if(items.response.success == 0) throw "Cant load items price";
  25.     });
  26. }
  27.  
  28. function getItemPrice(itemname) {
  29.     if(typeof items['response']['items'][itemname] == 'undefined') return 0;
  30.     return parseFloat(items['response']['items'][itemname]['value']);
  31. }
  32.  
  33.  
  34. var hash = require('crypto').createHash('sha1');
  35. hash.update(Math.random().toString());
  36. hash = hash.digest('hex');
  37. var device_id = 'android:' + hash;
  38.  
  39. var logOnOptions           = config.logOnOptions;
  40. var ssfn                   = config.ssfn;
  41. var authCode               = config.authCode; //if u dont have ssfn file
  42. var g_Steamid              = config.steamid;
  43. var g_Device_ID            = device_id;
  44. var g_Indentity_Secret     = config.identitySecret;
  45. var g_Shared_Secret        = config.sharedSecret;
  46.  
  47. //using ssfn
  48. try {
  49.     logOnOptions.sha_sentryfile = getSHA1(fs.readFileSync(g_ssfn));
  50. } catch (e) {
  51.     if (authCode !== '') {
  52.         logOnOptions.auth_code = authCode;
  53.     }
  54. }
  55. function getSHA1(bytes) {
  56.     var shasum = crypto.createHash('sha1');
  57.     shasum.end(bytes);
  58.     return shasum.read();
  59. }
  60.  
  61.  
  62. //steam setup
  63. var Steam = require('steam');
  64. var steam = new Steam.SteamClient();
  65. var SteamTradeOffers = require('steam-tradeoffers');
  66. var offers = new SteamTradeOffers();
  67. var steamUser = new Steam.SteamUser(steam);
  68. var SteamTotp = require('steam-totp');
  69. var steamFriends = new Steam.SteamFriends(steam);
  70. var SteamWebLogOn = require('steam-weblogon');
  71. var steamWebLogOn = new SteamWebLogOn(steam, steamUser);
  72. var SteamConf = require('steamcommunity-mobile-confirmations');
  73. var getSteamAPIKey = require('steam-web-api-key');
  74. var steamuserinfo = require('steam-userinfo');
  75. var steamConf;
  76. var confirmTimer;
  77. steam.connect();
  78.  
  79. //steam login
  80. logOnOptions['two_factor_code'] = SteamTotp.generateAuthCode(g_Shared_Secret);
  81. steam.on('connected', function() {steamUser.logOn(logOnOptions);});
  82.  
  83. steam.on('logOnResponse', function(result) {
  84.     if (result.eresult === Steam.EResult.OK) {
  85.         console.log('Logged in!');
  86.         reWebLogOn(steam);
  87.         steamFriends.setPersonaState(Steam.EPersonaState.Online);
  88.     } console.log("result.eresult: " + result.eresult);
  89. });
  90.  
  91. var checkingOffers = [],
  92.     WebSession = false,
  93.     globalSession;
  94.  
  95. function reWebLogOn(steam, callback) {
  96.     steamWebLogOn.webLogOn(function(webSessionID, newCookie){
  97.         console.log('webLogOn and webSessionID ok');
  98.         steamConf = new SteamConf(
  99.         {
  100.             steamid:         g_Steamid,
  101.             identity_secret: g_Indentity_Secret,
  102.             device_id:       g_Device_ID,
  103.             webCookie:       newCookie,
  104.         });
  105.         getSteamAPIKey({
  106.             sessionID: webSessionID,
  107.             webCookie: newCookie
  108.         }, function(err, APIKey) {
  109.                 offers.setup({
  110.                     sessionID: webSessionID,
  111.                     webCookie: newCookie,
  112.                     APIKey: APIKey
  113.                 }, function(err){
  114.                     WebSession = true;
  115.                     globalSession = webSessionID;
  116.                     console.log('Setup Offers!');
  117.                     console.log('Bot ON');
  118.                 });
  119.  
  120.         });
  121.         //confirmTimer = setInterval(function(){confirmTrade();}, 5000);
  122.  
  123.     });  
  124. }
  125.  
  126. //trade confirmations
  127. function confirmTrade(){
  128.     steamConf.FetchConfirmations(function (err, confs){
  129.    
  130.         if (err){
  131.             console.log('confirmTrade(): ' + err);
  132.             return false;
  133.         }
  134.        
  135.         console.log('confirmTrade() received ' + confs.length + ' confirmations');
  136.        
  137.         if ( ! confs.length){
  138.             return false;
  139.         }
  140.        
  141.         steamConf.AcceptConfirmation(confs[0], function (err, result){
  142.        
  143.             if (err){
  144.                 console.log('confirmTrade(): ' + err);
  145.                 return false;
  146.             }
  147.             clearInterval(confirmTimer);
  148.             console.log('confirmTrade(): ' + result);
  149.             return true;
  150.         });
  151.     });
  152. }
  153. /* ESCROW original fix by DfyZ1337 */
  154.  
  155.  
  156.  
  157.  
  158. var io = require('socket.io').listen(config.port || 8304);
  159. var http = require('http');
  160. var MongoClient = require('mongodb').MongoClient;
  161. var xss = require('xss');
  162. var userListDB, gcDB, gameDB, authDB;
  163. var currentGame = 0;
  164. var acceptedTradeOffers = []; // just for testing reasons
  165. var currentGameOffers = [];
  166. var players = [];
  167. var currentGameItems = [];
  168. var playersCounter = 0;
  169. var winnerid = 0;
  170. var winningitem = []
  171. var roundnum = Math.random();
  172. var roundhash = crypto.createHash('md5').update(roundnum.toString()).digest('hex');
  173.  
  174. var timer = 0;
  175. var timerID;
  176. var g_Totalcost = 0;
  177. var g_ItemName = [];
  178. var g_Pause = false;
  179. var g_Peers = [];
  180. var g_Mongoconnected = false;
  181. var g_LastWinner = 0;
  182. var playersUnique = {},
  183.     playersUniqueOrder = [],
  184.     itemsCounters = {};
  185. var g_MinDeposite = config.minDeposite; // минимальная ставка в рублях
  186. var g_BigGamePre = false;
  187. var g_BigGame = true;
  188. var g_BigGameTimer = 0;
  189. var currentSessionId = '';
  190. var Q = require('q');
  191. Array.prototype.exterminate = function (value) {
  192.     this.splice(this.indexOf(value), 1);
  193. }
  194. function Wipe(winner, data) {
  195. helper.msg('Wipe function started');
  196. var lastGC = currentGame;
  197. var mMoney = Math.round(g_Totalcost * 100) / 100;
  198. var lastItems = [];
  199. if (g_ItemName.length !== currentGameItems.length) {
  200. currentGameItems.forEach(function(item,i) {
  201. var pos = g_ItemName.indexOf(item.itemname);
  202. if (pos > -1) {
  203. g_ItemName.splice(pos,1);
  204. lastItems.push(item);      
  205. return;
  206. }
  207. });
  208. }
  209. if (lastItems.length == 0) {
  210. lastItems = currentGameItems;
  211. }
  212. //Отправляем строку NAME выиграл приз размером MONEY
  213. helper.msg('Prepared items to history');
  214. // send
  215. if (typeof data !== 'undefined') {
  216.         helper.msg('Starting to send all "end-game"');
  217.  
  218.         io.emit('end-game', {
  219.             name: data.response.players[0].personaname,
  220.             money: mMoney,
  221.             ava: data.response.players[0].avatarfull,
  222.             chance: playersUnique[winner].chance,
  223.             roundnum: roundnum,
  224.             item: winningitem
  225.         });
  226.        
  227.         g_LastWinner = {
  228.             name: data.response.players[0].personaname,
  229.             money: mMoney,
  230.             ava: data.response.players[0].avatarfull
  231.         };
  232.         if (g_BigGame) {
  233.             var gameType = 'big';
  234.             g_BigGame = false;
  235.             updateLastBigGame();
  236.         } else {
  237.             var gameType = 'simple';
  238.         }
  239.         helper.msg('Starting updating history');
  240.         try {
  241.             updateGameHistory(lastGC, lastItems, data.response.players[0].avatarfull, data.response.players[0].personaname, mMoney, playersUnique[winner].chance, lastItems, winner, gameType);
  242.         } catch (err) {
  243.             helper.log('Error writing history to db', 122, err);
  244.         }
  245.     } else {
  246.         helper.msg('Starting to send all "end-game-empty"');
  247.  
  248.         io.emit('end-game-empty');
  249.     }
  250.  
  251.     // Обновляем записи в БД
  252.     helper.msg('Trying to update total win counter');
  253.     updateTotalWin(g_Totalcost);
  254.     helper.msg('Trying to update max win counter');
  255.     updateMaxWin(g_Totalcost);
  256.     helper.msg('Trying to update today max win counter');
  257.     updateTodayMaxWin(g_Totalcost);
  258.  
  259.     currentGame++;
  260.     helper.msg('Trying to update game counter');
  261.     updateGameCounter(); // Обновляем счетчик игр в БД
  262.    
  263.     players = [];
  264.     currentGameItems = [];
  265.     playersCounter = 0;
  266.     playersUnique = {};
  267.     playersUniqueOrder = [];
  268.     winnerid = 0;
  269.     currentGameOffers = [];
  270.  
  271.     timer = 0;
  272.  
  273.     g_Totalcost = 0;
  274.     g_ItemName = [];
  275.     itemsCounters = {};
  276.  
  277.     helper.msg('All globals cleared, next is setTimeout 20');
  278.    
  279.     setTimeout(function(){
  280.         // Обновляем запись на сайте (Станет: Текущая игра: gamecounter. Банк: 0)
  281.         helper.msg('Send all game number, jackpot 0');
  282. roundnum = Math.random();
  283.         roundhash = crypto.createHash('md5').update(roundnum.toString()).digest('hex');
  284.        
  285.         io.emit('2', {
  286.             gamenumber: currentGame,
  287.             jackpot: 0,
  288.             hash: roundhash
  289.         })
  290.  
  291.         // Send info about game
  292.         helper.msg('Starting to send informers for each socket');
  293.  
  294.         sendInformersToAll(); // @TODO!!!
  295.  
  296.         helper.msg('Send all "start-game"');
  297.         getLastBigGame(function(time) {
  298.             if (time) {
  299.                 var date = new Date();
  300.                 var diff = (date.getTime() - time)/1000;
  301.                 var timetosend = config.bigGameDelay - diff;
  302.                 if (timetosend <= config.gameDuration && timetosend > 0) {
  303.                     io.emit('start-game', {type : 'simple', totalCount : config.simpleGameItemsCount});
  304.                     io.emit('big-game-check', {status: 'next-game', time: timetosend, totalCount : config.simpleGameItemsCount});
  305.                 } else if (timetosend <= 0) {
  306.                     io.emit('start-game', {type : 'big', totalCount : config.bigGameItemsCount});
  307.                     io.emit('big-game-check', {status: 'in-progress', time: 0, totalCount : config.bigGameItemsCount});
  308.                     g_BigGame = true;
  309.                 } else {
  310.                     io.emit('start-game', {type : 'simple', totalCount : config.simpleGameItemsCount});
  311.                     //updateLastBigGame();
  312.                     //var timetosend = config.bigGameDelay;
  313.                     io.emit('big-game-check', {status: 'not-started', time: timetosend, totalCount : config.simpleGameItemsCount});
  314.                 }
  315.             } else {
  316.                 io.emit('start-game', {type : 'simple'});
  317.                 updateLastBigGame();
  318.                 var timetosend = config.bigGameDelay;
  319.                 io.emit('big-game-check', {status: 'not-started', time: timetosend, totalCount : config.simpleGameItemsCount});
  320.             }
  321.         });
  322.  
  323.         g_Pause = false;
  324.         gameDB.find({name: 'history', type: config.gameTypeName}).limit(20).sort({game : -1}).toArray(function(err, list){
  325.             if (err) {
  326.                 helper.log('Error loading history from DB: ', 253, err);
  327.             } else {
  328.                 var history = {},
  329.                     historyOrder = [];
  330.                 if (typeof config.commissionHistory !== 'undefined' && config.commissionHistory == 0) {
  331.                     var showWithCommission = 0;
  332.                 } else {
  333.                     var showWithCommission = 1;
  334.                 }
  335.                 for(var i = 0; i <= list.length-1; i++) {
  336.                     history['game' + list[i].game] = list[i];
  337.                     historyOrder.push('game' + list[i].game);
  338.                 }
  339.                 io.emit('history', {
  340.                     history: history,
  341.                     commission: showWithCommission,
  342.                     historyOrder : historyOrder
  343.                 });
  344.             }
  345.         });
  346.         getTop(io, config.gameTypeName);
  347.  
  348.     }, 20000);
  349.  
  350.    
  351.     helper.msg('wiped');
  352. }
  353.  
  354. function sendCurrency(socket) {
  355.    
  356.     if (typeof config.currency == 'undefined' || config.currency == 0) {
  357.         var value = 'usd';
  358.     } else {
  359.         var value = 'rur';
  360.     }
  361.  
  362.     socket.emit('currency', value);
  363. }
  364.  
  365. io.sockets.on('connection', function (socket){
  366.     // add to clients list
  367.     g_Peers.push(socket);
  368.     //updateLastBigGame(); just for test
  369.     // set up currency
  370.     sendCurrency(socket);
  371.  
  372.     // sending current timer for big game
  373.     if (!g_BigGame) {
  374.         getLastBigGame(function(time) {
  375.             if (time) {
  376.                 var date = new Date();
  377.                 var diff = (date.getTime() - time)/1000;
  378.                 var timetosend = config.bigGameDelay - diff;
  379.                 if (timetosend <= config.gameDuration) {
  380.                     io.emit('big-game-check', {status: 'next-game', time: timetosend, type: config.gameType, totalCount : config.simpleGameItemsCount});
  381.                 } else {
  382.                     io.emit('big-game-check', {status: 'not-started', time: timetosend, totalCount : config.simpleGameItemsCount});
  383.                 }
  384.             } else {
  385.                 updateLastBigGame();
  386.                 var timetosend = config.bigGameDelay;
  387.                 io.emit('big-game-check', {status: 'not-started', time: timetosend, totalCount : config.simpleGameItemsCount});
  388.             }
  389.         });
  390.     } else {
  391.         io.emit('big-game-check', {status: 'in-progress', time: 0, totalCount : config.bigGameItemsCount});
  392.     }
  393.    
  394.     // emit informers to ALL
  395.     io.emit('informers', { inf1 : g_Peers.length });
  396.    
  397.     socket.on('disconnect', function(socket){
  398.         // delete from clients list
  399.         g_Peers.exterminate(socket);
  400.  
  401.         // update count
  402.         io.emit('informers', { inf1 : g_Peers.length });
  403.     });
  404.     // resend all items to new client
  405.     socket.on('0', function(data){
  406.         currentGameItems.forEach(function(I){
  407.             socket.emit('0', I);
  408.         });
  409.  
  410.         // Посылаем номер игры и банк
  411.         socket.emit('2', {
  412.             gamenumber: currentGame,
  413.             jackpot: Math.round(g_Totalcost),
  414.             hash: roundhash
  415.         });
  416.        
  417.         // ниже
  418.         sendInformers(socket);
  419.        
  420.         // send current unique players
  421.         socket.emit('playersUnique', {
  422.             list : playersUnique,
  423.             order : playersUniqueOrder
  424.         })
  425.     });
  426.    
  427.    
  428.    
  429.  
  430.    
  431.        
  432.        
  433.        
  434.  
  435.     // set trade-link
  436.     socket.on('1', function(data){
  437.         if(data.steamId.length > 20) {
  438.             authDB.find({token: data.steamId}).toArray(function (error, list) {
  439.                 if(list.length > 0) {
  440.                     data.steamId = list[0].userid;
  441.                     console.log(data);
  442.                     updateTradeLink(data.steamId, data.link);
  443.                 }
  444.             });
  445.         }
  446.     });
  447.  
  448.     // history
  449.     socket.on('2', function(data){
  450.         gameDB.find({name: 'history', type: config.gameTypeName}).limit(20).sort({game : -1}).toArray(function(err, list){
  451.             if (err) {
  452.                 helper.log('Error loading history from DB: ', 253, err);
  453.             } else {
  454.                 var history = {},
  455.                     historyOrder = [];
  456.                 if (typeof config.commissionHistory !== 'undefined' && config.commissionHistory == 0) {
  457.                     var showWithCommission = 0;
  458.                 } else {
  459.                     var showWithCommission = 1;
  460.                 }
  461.                 for(var i = 0; i <= list.length-1; i++) {
  462.                     history['game' + list[i].game] = list[i];
  463.                     historyOrder.push('game' + list[i].game);
  464.                 }
  465.                
  466.                 socket.emit('history', {
  467.                     history: history,
  468.                     commission: showWithCommission,
  469.                     historyOrder : historyOrder
  470.                 });
  471.             }
  472.         });
  473.     });
  474.  
  475.     // top
  476.     socket.on('top', function(data){
  477.         getTop(socket, config.gameTypeName);
  478.     });
  479.  
  480.     // get trade-link
  481.     socket.on('trade-link', function(data){
  482.         if(data.steamId.length > 20) {
  483.             authDB.find({token: data.steamId}).toArray(function (error, list) {
  484.                 if(list.length > 0) {
  485.                     data.steamId = list[0].userid;
  486.                     userListDB.find({'steamid':data.steamId, 'type' : 'trade-link'}).toArray(function(err, list) {
  487.                         socket.emit('trade-link', { list : list });
  488.                     });
  489.                 }
  490.             });
  491.         }
  492.     });
  493.  
  494.     // players
  495.     socket.on('players', function(data){
  496.         getPlayers(socket);
  497.     });
  498.  
  499.     // items
  500.     socket.on('items', function(data){
  501.         getItems(socket);
  502.     });
  503.  
  504. socket.on('load-inventory', function(data){
  505.         if(data.steamid.length > 10) {
  506.             authDB.find({token: data.steamid}).toArray(function (error, list) {
  507.                 if(list.length > 0) {
  508.                     data.steamid = list[0].userid;
  509.                     loadMyInventoryToFront(socket, data.steamid);
  510.                 }
  511.             });
  512.         }
  513.     });
  514.  
  515.     // profile
  516.     socket.on('profile', function(data){
  517.         if(data.steamid.length > 10) {
  518.             authDB.find({token: data.steamid}).toArray(function (error, list) {
  519.                 if(list.length > 0) {
  520.                     data.steamid = list[0].userid;
  521.                     getProfileStats(socket, data.steamid);
  522.                 }
  523.             });
  524.         }
  525.     });
  526. });
  527.  
  528. function sendInformers(socket) {
  529.     getInformersData(function(error, informers){
  530.         if (error) {
  531.             helper.log('Error send Informers', 5, error);
  532.             return;
  533.         }
  534.  
  535.         // send informers
  536.         if (informers.length > 0) {
  537.             informers.forEach(function(inf){
  538.                 socket.emit(inf.type, inf);
  539.             });
  540.         }
  541.     });
  542.  
  543.     // SEND TODAY
  544.     sendTodayCounter(socket, 'player', 'inf3');
  545.     sendTodayCounter(socket, 'history', 'inf7');
  546.     sendTodayCounter(socket, 'items', 'inf8');
  547.     sendTodayCounter(socket, 'MRTODAY', 'inf10');
  548.     sendTodayCounter(socket, 'today-win', 'inf11');
  549. }
  550.  
  551. function sendInformersToAll(){
  552.     getInformersData(function(error, informers){
  553.         // send informers
  554.         if (informers.length > 0) {
  555.             informers.forEach(function(inf){
  556.                 io.emit(inf.type, inf);
  557.             });
  558.         }
  559.     });
  560.  
  561.     // SEND TODAY
  562.     sendTodayCounter('ALL', 'player', 'inf3');
  563.     sendTodayCounter('ALL', 'history', 'inf7');
  564.     sendTodayCounter('ALL', 'items', 'inf8');
  565.     sendTodayCounter('ALL', 'MRTODAY', 'inf10');
  566.     sendTodayCounter('ALL', 'today-win', 'inf11');
  567. }
  568.  
  569. function getInformersData(callback) {
  570.     var promises = [];
  571.  
  572.     // total players
  573.     var totalPlayersDefer = Q.defer();
  574.     try {
  575.         // Достаем из БД кол-во уникальных игроков
  576.         gameDB.find({name: 'player'}).toArray(function(error, list2) {
  577.             // error
  578.             if (error) {
  579.                 return totalPlayersDefer.reject(error);
  580.             }
  581.  
  582.             totalPlayersDefer.resolve({
  583.                 type: 'informers',
  584.                 inf9: list2.length
  585.             });
  586.         });
  587.  
  588.     } catch (error) {
  589.         helper.log('Mongodb error', 320, error);
  590.         totalPlayersDefer.reject(error);
  591.     }
  592.     promises.push(totalPlayersDefer.promise);
  593.  
  594.     // max jackpot
  595.     var maxJackpotDefer = Q.defer();
  596.     try {
  597.         gameDB.find({name: 'MR'}).toArray(function(error, list) {
  598.             // error
  599.             if (error) {
  600.                 return maxJackpotDefer.reject(error);
  601.             }
  602.  
  603.             // get data
  604.             var mr = 0;
  605.             if (list.length > 0) {
  606.                 mr = list[0].MR;
  607.             }
  608.            
  609.             maxJackpotDefer.resolve({
  610.                 type: 'informers',
  611.                 inf4: mr
  612.             });
  613.         });
  614.  
  615.     } catch (error) {
  616.         helper.log('Mongodb error', 320, error);
  617.         maxJackpotDefer.reject(error);
  618.     }
  619.     promises.push(maxJackpotDefer.promise);
  620.  
  621.     // last winner
  622.     var lastWinnerDefer = Q.defer();
  623.     try {
  624.         gameDB.find({ name : 'history' }).sort({ game : -1 }).limit(1).toArray(function(error, list){
  625.             // error
  626.             if (error) {
  627.                 return lastWinnerDefer.reject(error);
  628.             }
  629.  
  630.             // get data
  631.            
  632.             var win_steam_id = 0;
  633.             if (list[0] !== undefined) {
  634.                 g_LastWinner = {
  635.                     name: list[0].winnername,
  636.                     money: list[0].winnermoney,
  637.                     ava: list[0].winnerimg,
  638.                     chance: list[0].winnerchance
  639.                 };
  640.                
  641.              for(var i in list[0].allItems){
  642.      if(list[0].allItems[i].user == g_LastWinner.name){
  643.       win_steam_id = list[0].allItems[i].steamid;
  644.       break;
  645.      }
  646.     }
  647.    }
  648.            
  649.            
  650.                io.emit('wints', {steamid: win_steam_id});  
  651.            
  652.             lastWinnerDefer.resolve({
  653.                 type: 'last-winner',
  654.                 name: g_LastWinner.name,
  655.                 ava: g_LastWinner.ava,
  656.                 money: g_LastWinner.money,
  657.                 chance: g_LastWinner.chance,
  658.     steamid : win_steam_id
  659.             });
  660.         });
  661.  
  662.     } catch (error) {
  663.         helper.log('Mongodb error', 320, error);
  664.         lastWinnerDefer.reject(error);
  665.     }
  666.     promises.push(lastWinnerDefer.promise);
  667.  
  668.     var totalPlayersCount = Q.defer();
  669.     try {
  670.         userListDB.find({ name : 'player' }).count(function(err, count) {
  671.             // error
  672.             if (err) {
  673.                 return totalPlayersCount.reject(err);
  674.             }
  675.  
  676.             totalPlayersCount.resolve({
  677.                 type: 'all-players-count',
  678.                 count: count
  679.             });
  680.         });
  681.     } catch(error) {
  682.         helper.log('Mongodb error', 320, error);
  683.         totalPlayersCount.reject(error);
  684.     }
  685.  
  686.     promises.push(totalPlayersCount.promise);
  687.  
  688.     Q.all(promises).spread(function(obj1, obj2, obj3, obj4) {
  689.         var counters = [
  690.             { type: 'informers', inf5: config.minDeposite },
  691.             { type: 'informers', inf6: config.usersItemsLimit }
  692.         ];
  693.  
  694.         Array.prototype.slice.call(arguments).forEach(function(arg) {
  695.             counters.push(arg);
  696.         });
  697.  
  698.         callback(false, counters);
  699.  
  700.     }, function(error) {
  701.         callback(error);
  702.     });
  703. }
  704.  
  705. function getTop(socket, type) {
  706.     gameDB.aggregate(
  707.         [
  708.             {"$match":{"name":"history", "type":type}},
  709.             {"$group":{"_id":{"steamid":"$steamid"}, "total":{"$sum":"$winnermoney"}, "count":{"$sum":1}, "winnername":{"$last" : "$winnername"}, "winnerimg":{"$last" : "$winnerimg"}}},
  710.             { "$sort" : { total : -1 } },
  711.             {"$limit" : config.toplimit}
  712.         ]
  713.     ).toArray(function(err, list) {
  714.     if (!err && list.length > 0) {
  715.             var promises = [];
  716.             var j = 1;
  717.             var k = 0;
  718.             list.forEach(function(l, i) {
  719.                 if (k == 3) {
  720.                     j++;
  721.                 }
  722.                 list[i].rank = j;
  723.                 var deferred = Q.defer();
  724.                 promises.push(deferred.promise);
  725.  
  726.                 userListDB.find({steamid:l._id.steamid, name:'player'}).toArray(function(err, player) {
  727.                     if (!err && typeof player[0].count !== "undefined") {
  728.                         list[i].attempts = player[0].count;
  729.                     } else {
  730.                         list[i].attempts = 0;
  731.                     }
  732.  
  733.                     deferred.resolve();                
  734.                 });
  735.                 k++;
  736.             });
  737.  
  738.             Q.all(promises).spread(
  739.                 function() {
  740.                     socket.emit('top', { list : list });
  741.                 },
  742.                 function(error) {
  743.                     helper.log('Some Q error', 611);
  744.                 }
  745.             );
  746.  
  747.         }
  748.        
  749.     });
  750. };
  751.  
  752. MongoClient.connect('mongodb://127.0.0.1:27017', function (err, db) { // Подключаемся к БД
  753.     if (err) {
  754.         helper.log('Mongodb connection error', 425, err);
  755.         return 0;
  756.     }
  757.  
  758.     // записываем ссылки на таблицы (коллекции) в глобальные переменные
  759.     userListDB = db.collection('users');
  760.     gameDB = db.collection('gamedb');
  761.         authDB = db.collection('auth');
  762.     g_Mongoconnected = true;
  763.     helper.msg('mongo connected');
  764.    
  765.     gameDB.find({name: 'counter'}).toArray(function (error, list) { // Достаем значение текущей игры
  766.         if(list.length == 0) {  // Если его нет, записываем в БД 0
  767.             currentGame=0;
  768.             gameDB.insert({name: 'counter', counter: 0}, {w:1}, function(err) {if(err) console.log('Error <1>');});
  769.         } else {
  770.             currentGame = list[0].counter;
  771.         }
  772.     });
  773. });
  774.  
  775. // Ниже - функции обновления данных в БД
  776.  
  777. function existUser (user, callback) {
  778.     if(!g_Mongoconnected)
  779.         return 0;
  780.  
  781.     userListDB.find({steamid: user}).toArray(function (error, list) {
  782.         callback (list.length !== 0);
  783.     });
  784. }
  785.  
  786. function updateTotalPlayers(sid){
  787.     if(!g_Mongoconnected) {
  788.         return 0;
  789.     }
  790.     // update current field
  791.     var date = new Date();
  792.     gameDB.update({
  793.         steamid: sid,
  794.         name: 'player'
  795.     }, {
  796.         steamid: sid,
  797.         name: 'player',
  798.         date: date.getTime()
  799.     }, {
  800.         upsert: true
  801.     });
  802.         // }
  803.     // });
  804. }
  805.  
  806. function updateTradeLink(sid, link) {
  807.     if(!g_Mongoconnected)
  808.         return 0;
  809.        
  810.     existUser(sid, function(exist){
  811.         if(exist) {
  812.             userListDB.update({steamid: sid}, {steamid: sid, tradelink: link, type : 'trade-link'});
  813.         } else {
  814.             userListDB.insert({steamid: sid, tradelink: link, type : 'trade-link'}, {w:1}, function(err) {
  815.                 if(err) {
  816.                     helper.log('Error inserting tradelink', 485, err);
  817.                 }
  818.             });
  819.         }
  820.     });
  821. }
  822.  
  823. function updateTotalWin(money) {
  824.     if(!g_Mongoconnected)
  825.         return 0;
  826.        
  827.     gameDB.find({name: 'TR'}).toArray(function(error, list){
  828.         if(list.length === 0) // нет записи о выигрыше
  829.             gameDB.insert({name: 'TR', TR: money}, {w: 1}, function(err) {
  830.                 if(err) {
  831.                     helper.log('Error inserting total win (1)', 499, err);
  832.                 } else {
  833.                     helper.msg('Successfully updated TotalWin');
  834.                 }
  835.             });
  836.         else {
  837.             var tr = list[0].TR;
  838.             tr += money;
  839.             gameDB.update({name: 'TR'}, {name: 'TR', TR: tr}, function(err) {
  840.                 if(err) {
  841.                     helper.log('Error inserting total win (2)', 507, err);
  842.                 } else {
  843.                     helper.msg('Successfully updated TotalWin');
  844.                 }
  845.             });
  846.         }
  847.     });
  848. }
  849.  
  850. function updateMaxWin(money) {
  851.     if(!g_Mongoconnected) {
  852.         return 0;
  853.     }
  854.        
  855.     gameDB.find({name: 'MR'}).toArray(function(error, list){
  856.         if(list.length === 0) // нет записи о выигрыше
  857.             gameDB.insert({name: 'MR', MR: money}, {w: 1}, function(err) {
  858.                 if(err) {
  859.                     helper.log('Error inserting max win (1)', 523, err);
  860.                 } else {
  861.                     helper.msg('Successfully updated max win');
  862.                 }
  863.             });
  864.         else {
  865.             var tr = list[0].MR;
  866.             if(money > tr || !tr)
  867.                 tr = money;
  868.             gameDB.update({name: 'MR'}, {name: 'MR', MR: tr}, function(err) {
  869.                 if(err) {
  870.                     helper.log('Error inserting max win (2)', 532, err);
  871.                 } else {
  872.                     helper.msg('Successfully updated max win');
  873.                 }
  874.             });
  875.         }
  876.     });
  877. }
  878.  
  879. function updateTodayMaxWin(money) {
  880.     if(!g_Mongoconnected) {
  881.         return 0;
  882.     }
  883.     var date = new Date();
  884.     gameDB.find({name: 'MRTODAY'}).toArray(function(error, list){
  885.         if(list.length === 0) // нет записи о выигрыше
  886.             gameDB.insert({name: 'MRTODAY', MR: money, date: date.getTime()}, {w: 1}, function(err) {
  887.                 if(err) {
  888.                     helper.log('Error inserting max win today(1)', 500, err);
  889.                 }
  890.             });
  891.         else {
  892.             var tr = list[0].MR;
  893.             var today = helper.getToday().getTime();
  894.            
  895.             if (list[0].date - today >= 86400000) {
  896.                 gameDB.update({name: 'MRTODAY'}, {name: 'MRTODAY', MR: money, date: date.getTime()}, function(err) {
  897.                     if(err) {
  898.                         helper.log('Error inserting max win (2)', 558, err);
  899.                     } else {
  900.                         helper.msg('Successfully updated today max win');
  901.                     }
  902.  
  903.                 });
  904.             } else {
  905.                 if(parseFloat(money) > parseFloat(tr)) {
  906.                     tr = money;
  907.                 }
  908.                 gameDB.update({name: 'MRTODAY'}, {name: 'MRTODAY', MR: tr, date: date.getTime()}, function(err) {
  909.                     if(err) {
  910.                         helper.log('Error inserting max win (2)', 567, err);
  911.                     } else {
  912.                         helper.msg('Successfully updated today max win');
  913.                     }
  914.                 });
  915.             }
  916.            
  917.         }
  918.     });
  919.  
  920. }
  921.  
  922. function updateGameCounter(){
  923.     if(!g_Mongoconnected)
  924.         return 0;
  925.        
  926.     gameDB.update({name: 'counter'}, {name: 'counter', counter: currentGame}, function(err) {
  927.         if(err) {
  928.             helper.log('Error updating game counter', 583, err);
  929.         } else {
  930.             helper.msg('Successfully updated game counter');
  931.         }
  932.     });
  933. }
  934.  
  935. function getPlayers(socket) {
  936.     socket.emit('players', { list : players });
  937. };
  938.  
  939. function getItems(socket) {
  940.     socket.emit('items', { list : currentGameItems });
  941. };
  942.  
  943. function updateGameHistory(gamecounter, i, img, name, money, chance, allItems, winner, gameType){
  944.     if(!g_Mongoconnected)
  945.         return 0;
  946.     var date = new Date();
  947.     gameDB.insert({
  948.         name: 'history',
  949.         game: gamecounter,
  950.         items: i,
  951.         winnerimg: img,
  952.         winnername: name,
  953.         winnermoney: money,
  954.         winnerchance: chance.toFixed(2),
  955.         date: date.getTime(),
  956.         allItems: allItems,
  957.         steamid: winner,
  958.         hash: roundhash,
  959.         roundnum: roundnum,
  960.         type: config.gameTypeName,
  961.         gameType: gameType
  962.     }, {w: 1}, function(err) {
  963.         if(err) {
  964.             helper.log("Error updating game history", 624, err);
  965.         } else {
  966.             helper.msg("Successfully updated history table");
  967.         }
  968.     });
  969. }
  970.  
  971. steam.on('sentry', function(data) {
  972.     require('fs').writeFileSync(sentryFile, data);
  973. });
  974.  
  975. // Если пришел новый трейд
  976. steamUser.on('tradeOffers', function(number) {
  977.     if (g_Pause) {
  978.         return;
  979.     }
  980.     var retryCnt = 1;
  981.  
  982.     if (number > 0) {
  983.         helper.msg('New offers: '+number);
  984.  
  985.         function getOffers() {
  986.             offers.getOffers({
  987.                 get_received_offers: 1,
  988.                 active_only: 1/*,
  989.                 time_historical_cutoff: Math.round(Date.now() / 1000)*/
  990.             }, onGetOffers);
  991.         }
  992.  
  993.         function onGetOffers(error, body) {
  994.             if (error) {
  995.                 if (retryCnt >= 0) {
  996.                     getOffers();
  997.                     retryCnt--;
  998.                 }
  999.  
  1000.                 helper.log('Error getting offers', 692, error);
  1001.             }
  1002.  
  1003.             // Проверки на наличие трейда
  1004.             if(body) {
  1005.                 if (body.response.trade_offers_received){
  1006.  
  1007.                     body.response.trade_offers_received.forEach(function(offer) {
  1008.                         //if offer is already accepted
  1009.                         if (acceptedTradeOffers.indexOf(offer.tradeofferid) >= 0) {
  1010.                             currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1011.                             return;
  1012.                         }
  1013.  
  1014.                         // active
  1015.                         if (offer.trade_offer_state == 2){
  1016.                             helper.log('Current game offers', 716, currentGameOffers);
  1017.                             currentGameOffers.push(offer.tradeofferid);
  1018.                             userListDB.find({'steamid':offer.steamid_other}).toArray(function(err, list) {
  1019.                                 if (error) {
  1020.                                     io.emit('notradelink', {steamid: offer.steamid_other})
  1021.                                     helper.msg('Declined - no tradelink, offer #' + offer.tradeofferid);
  1022.                                     offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1023.                                         currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1024.                                     });
  1025.                                 } else if (list.length == 0) {
  1026.                                     offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1027.                                         io.emit('notradelink', {steamid: offer.steamid_other})
  1028.                                         helper.msg('Declined - no tradelink, offer #' + offer.tradeofferid);
  1029.                                         currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1030.                                     });
  1031.                                 } else {
  1032.  
  1033.                                     // Бот не принимает предметы, пока разыгрывает предыдущие
  1034.                                     if (g_Pause){
  1035.                                         helper.msg('Offer declined because of pause');
  1036.                                         offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1037.                                             currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1038.                                         });
  1039.                                         //steamFriends.sendMessage(offer.steamid_other, 'Sorry. Bot is on pause :C', Steam.EChatEntryType.ChatMsg);
  1040.                                
  1041.                                     // Если нас пытаются обмануть, отклоняем трейд
  1042.                                     } else if(offer.items_to_give) {
  1043.                                         if (offer.steamid_other != config.admin) {
  1044.                                             helper.msg('Offer declined (2)');
  1045.  
  1046.                                             offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1047.                                                 currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1048.                                             });
  1049.                                          } else {
  1050.                                             currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1051.                                             offers.acceptOffer({tradeOfferId: offer.tradeofferid});
  1052.                                             helper.msg('accepted trade offer from admin: '+offer.tradeofferid);
  1053.                                             return;
  1054.                                          }
  1055.                                         //steamFriends.sendMessage(offer.steamid_other, 'You cannot take my items', Steam.EChatEntryType.ChatMsg);
  1056.                                
  1057.                                     // Если нам не передают предметы, отклоняем трейд
  1058.                                     } else if(!offer.items_to_receive) {
  1059.                                         offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1060.                                             currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1061.                                         });
  1062.                                         helper.msg('Offer declined <empty items to receive>');
  1063.                                         //steamFriends.sendMessage(offer.steamid_other, 'Empty trade offer', Steam.EChatEntryType.ChatMsg);
  1064.                                    
  1065.                                     // all right
  1066.                                     } else {
  1067.                                         if (g_Pause) {
  1068.                                             helper.msg('Offer declined because of pause');
  1069.                                             offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1070.                                                 currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1071.                                             });
  1072.                                         }
  1073.                                         var itemIds = [];
  1074.                                        
  1075.                                         // Записываем ИД предметов в массив
  1076.                                         // Проверяем, что это именно КС:ГО предметы (appid cs:go = config.gameType)
  1077.                                         for(var i = 0; i < 100; i++) {
  1078.                                             if (!offer.items_to_receive[i]) {
  1079.                                                 continue;
  1080.                                             }
  1081.                                        
  1082.                                             tempItem = offer.items_to_receive[i];
  1083.                                             // console.log('Receive item ID: ' + offer.items_to_receive[i].assetid +' class id: '+ offer.items_to_receive[i].classid);
  1084.                                            
  1085.                                             if (offer.items_to_receive[i].appid != config.gameType){
  1086.                                                 helper.msg('not a CSGO item');
  1087.                                                 offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1088.                                                     currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1089.                                                 });
  1090.                                                 //steamFriends.sendMessage(offer.steamid_other, 'You can place only CS:GO items', Steam.EChatEntryType.ChatMsg);
  1091.                                                 break;
  1092.                                             }
  1093.  
  1094.                                             itemIds.push(tempItem.assetid);
  1095.                                         }      
  1096.                                        
  1097.                                         // check if item count is lower than limit in config
  1098.                                         if (typeof itemsCounters[offer.steamid_other] == 'undefined') {
  1099.                                             itemsCounters[offer.steamid_other] = 0;
  1100.                                         }
  1101.  
  1102.                                         if (itemsCounters[offer.steamid_other] + offer.items_to_receive.length > config.usersItemsLimit) {
  1103.                                             io.emit('maxitem', {steamid: offer.steamid_other})
  1104.                                             offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1105.                                                 currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1106.                                             });
  1107.                                             helper.msg('Declined: one user items limit exceeded.');
  1108.                                             return;
  1109.                                         }
  1110.                                         helper.msg('Sending api request...');
  1111.                                         //Запрашиваем данные о пользователе, чтобы достать ник и аватар
  1112.                                         var req_retry = 5;
  1113.                                         var GetPlayerSummaries = function() {
  1114.                                             var _req = http.request({
  1115.                                                 host: 'api.steampowered.com',
  1116.                                                 path: '/ISteamUser/GetPlayerSummaries/v0002/?key='+config.apiKey+'&steamids='+offer.steamid_other
  1117.                                             }, function(response) {
  1118.                                                 var str = '';
  1119.                                                
  1120.                                                 response.on('data', function (chunk) {
  1121.                                                     str += chunk;
  1122.                                                 });
  1123.                                                
  1124.                                                 response.on('end', function() {
  1125.                                                     helper.msg('Received api request!');
  1126.                                                
  1127.                                                     var data = JSON.parse(str),
  1128.                                                         retries = 10;
  1129.                                                
  1130.                                                     var loadPartnerInventory = function() {
  1131.                                                         retries--;
  1132.  
  1133.                                                         // Загружаем инвентарь партнера
  1134.                                                         // Сравниваем ИД предметов в его инвентаре и ИД посланных предметов
  1135.                                                         // Чтобы найти имя предметов и записать в массив
  1136.                                                         offers.loadPartnerInventory({partnerSteamId: offer.steamid_other, appId: config.gameType, contextId: 2}, function(err, items) {
  1137.                                                             if(err != null) {
  1138.                                                                 helper.msg('Error loading inventory '+offer.steamid_other);
  1139.                                                                 if (err.message.indexOf('401') > -1 && retries >= 0) {
  1140.                                                                     reWebLogOn(steam, function() {
  1141.                                                                         helper.msg(err.message + ': Retry ' + offer.tradeofferid + ', step: ' + retries);
  1142.                                                                         loadPartnerInventory();
  1143.                                                                     });
  1144.                                                                 } else {
  1145.                                                                     helper.msg(err.message + ': Retry ' + offer.tradeofferid + ', step: ' + retries);
  1146.                                                                    
  1147.                                                                     if (retries == 0) {
  1148.                                                                         helper.msg('Offer ' + offer.tradeofferid + ' declined.');
  1149.                                                                         offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1150.                                                                             currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1151.                                                                         });
  1152.                                                                     } else {
  1153.                                                                         loadPartnerInventory();
  1154.                                                                     }
  1155.                                                                 }
  1156.                                                             } else {
  1157.                                                                 // Принимаем трейд
  1158.                                                                 helper.msg('Next function is acceptOffer! - ' + offer.steamid_other + ' - ' + offer.tradeofferid);
  1159.                                                                 if (g_Pause) {
  1160.                                                                     offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1161.                                                                         currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1162.                                                                     });
  1163.                                                                     return;
  1164.                                                                 }
  1165.                                                                 var checkItems = [];
  1166.                                                                 var len = items.length;
  1167.                                                                 for(var i = 0; i < itemIds.length; i++) {
  1168.                                                                     for(var j = 0; j < items.length; j++) {
  1169.                                                                         if (itemIds[i] == items[j].id){
  1170.                                                                             //console.log('Pushed: ' + items[j].name);
  1171.                                                                        
  1172.                                                                             var colorObj = helper.getColor(items[j]);
  1173.                                                                             checkItems.push({
  1174.        
  1175.                                                                                 user: data.response.players[0].personaname,
  1176.                                                                                 ava: data.response.players[0].avatarfull,
  1177.                                                                                 itemname: items[j].market_name,
  1178.                                                                                 image: items[j].icon_url,
  1179.                                                                                 color: colorObj.color,
  1180.                                                                                 background_color: colorObj.background_color,
  1181.                                                                                 market_hash_name: items[j].market_hash_name,
  1182.                                                                                 steamid: offer.steamid_other,
  1183.                                                                                 tradeofferid : offer.tradeofferid
  1184.                                                                             }
  1185.                                                                                
  1186.                                                                            
  1187.                                                                            
  1188.                                                                             );
  1189.                                                                                
  1190.  
  1191.                                                                         }
  1192.                                                                     }
  1193.                                                                 }
  1194.  
  1195.                                                                 if (g_BigGame) {
  1196.                                                                     var checkCount = config.bigGameItemsCount;
  1197.                                                                 } else {
  1198.                                                                     var checkCount = config.simpleGameItemsCount;
  1199.                                                                 }
  1200.  
  1201.                                                                 if (currentGameItems.length + checkItems.length > checkCount) {
  1202.                                                                     offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1203.                                                                         currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1204.                                                                     });
  1205.                                                                 }
  1206.                                                                
  1207.  
  1208.                                                                 checkMinDeposite(checkItems, offer.tradeofferid)
  1209.                                                                     .then(function(response) {
  1210.                                                                         if (g_Pause) {
  1211.                                                                             offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1212.                                                                                 currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1213.                                                                             });
  1214.                                                                             return;
  1215.                                                                         }
  1216.                                                                         response.summ = parseFloat(response.summ);
  1217.                                                                         if (typeof config.minDeposite !== 'undefined') {
  1218.                                                                             var check = parseFloat(config.minDeposite);
  1219.                                                                             if (response.summ > check) {
  1220.                                                                                 io.emit('acceptoffer', {steamid: offer.steamid_other})
  1221.                                                                                 helper.msg('Принимаем трейд id - ' + offer.steamid_other);
  1222.                                                                                 helper.msg('Greater than min deposite - ' + offer.tradeofferid);
  1223.                                                                                 try {
  1224.                                                                                 offers.getTradeHoldDuration({tradeOfferId : offer.tradeofferid}, function(err, responsse){
  1225.                                                                                             var escrow = false;
  1226.                                                                                             if (!responsse || (responsse && typeof responsse.their === 'undefined') || responsse.their != 0){
  1227.                                                                                                 offers.declineOffer({tradeOfferId: offer.tradeofferid});
  1228.                                                                                                 console.log('Защита от Hold Trade by DfyZ1337');
  1229.                                                                                                 escrow = true;
  1230.                                                                                                 return;
  1231.                                                                                             }
  1232.                                                                                            
  1233.                                                                                             if(!escrow){
  1234.                                                                                                 offers.acceptOffer({tradeOfferId: offer.tradeofferid}, function(err, log) {
  1235.                                                                                                     if (err) {
  1236.                                                                                                         helper.log('Error accepting trade offer ' + offer.tradeofferid, 891, err);
  1237.                                                                                                         offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1238.                                                                                                             currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1239.                                                                                                         });    
  1240.                                                                                                         return;
  1241.                                                                                                     }
  1242.                                                                                        
  1243.                                                                                        
  1244.                                                                                                 itemsCounters[offer.steamid_other] += offer.items_to_receive.length;
  1245.                                                                                                 // Обновляем счетчик уникальных игроков в БД
  1246.                                                                                                 updateTotalPlayers(offer.steamid_other);
  1247.                                                                                                 var itemsWithPrices = response.items;
  1248.                                                                                                 itemsWithPrices.forEach(function(itemWithPrice, index) {
  1249.                                                                                                     g_ItemName.push(itemWithPrice.market_hash_name);
  1250.                                                                                                     // players array
  1251.                                                                                                     players.push({
  1252.                                                                                                         steamid: itemWithPrice.steamid,
  1253.                                                                                                         min: g_Totalcost,
  1254.                                                                                                         max: g_Totalcost+itemWithPrice.price,
  1255.                                                                                                         nick: itemWithPrice.user,
  1256.                                                                                                         ava: itemWithPrice.ava,
  1257.                                                                                                         item: itemWithPrice.itemname,
  1258.                                                                                                         color: itemWithPrice.background_color,
  1259.                                                                                                         image: itemWithPrice.image
  1260.                                                                                                     });
  1261.                                                                                                     // Банк. Сумма цен всех предметов
  1262.                                                                                                     g_Totalcost += itemWithPrice.price;
  1263.                                                                                                     // Рассчитываем шанс победы для игрока
  1264.                                                                                                     var winchance = 0;
  1265.                                                                                                     var sumdep = 0;
  1266.                                                                                                     var summoney = 0;
  1267.                                                                                                     players.forEach(function(I){
  1268.                                                                                                         if (I.steamid == itemWithPrice.steamid) {
  1269.                                                                                                             sumdep++;
  1270.                                                                                                             var diff = I.max-I.min;
  1271.                                                                                                             summoney += diff;
  1272.                                                                                                         }
  1273.                                                                                                     });
  1274.                                                                                                     // winchance for CURRENT item
  1275.                                                                                                     if (g_Totalcost !== 0 ) {
  1276.                                                                                                         winchance = summoney / g_Totalcost*100;
  1277.                                                                                                     }
  1278.                                                                                                     // Параметры для отправки на сайт
  1279.                                                                                                     var op = {
  1280.                                                                                                         type: 0,
  1281.                                                                                                         user: xss(itemWithPrice.user),
  1282.                                                                                                         ava: itemWithPrice.ava,
  1283.                                                                                                         itemname: itemWithPrice.itemname,
  1284.                                                                                                         image: itemWithPrice.image,
  1285.                                                                                                         color: itemWithPrice.color,
  1286.                                                                                                         background_color: itemWithPrice.background_color,
  1287.                                                                                                         cost: itemWithPrice.price,
  1288.                                                                                                         steamid: itemWithPrice.steamid,
  1289.                                                                                                         itemcounter: sumdep,
  1290.                                                                                                         chance: winchance,
  1291.                                                                                                         money: summoney,
  1292.                                                                                                         jackpot: g_Totalcost,
  1293.                                                                                                         offerid: offer.tradeofferid,
  1294.                                                                                                         sitename: config.sitename
  1295.                                                                                                     };
  1296.                                                                                                     // Массив с предметами текущей игры
  1297.                                                                                                     currentGameItems.push(op);
  1298.                                                                                                    
  1299.                                                                                                     // Посылаем на сайт новый предмет
  1300.                                                                                                     io.emit('0', op);
  1301.                                                                                                    
  1302.                                                                                                     // Посылаем обновление текста (Игра номер ... Банк ...)
  1303.                                                                                                     io.emit('2', {
  1304.                                                                                                         gamenumber: currentGame,
  1305.                                                                                                         jackpot: Math.round(g_Totalcost * 100) / 100,
  1306.                                                                                                             hash: roundhash
  1307.                                                                                                     });
  1308.  
  1309.                                                                                                     // Считаем уникальных игроков
  1310.                                                                                                     playersUnique = {};
  1311.                                                                                                     currentGameItems.forEach(function(item, index){
  1312.                                                                                                         if (playersUnique[item.steamid] === undefined) {
  1313.                                                                                                             playersUnique[item.steamid] = {
  1314.                                                                                                                 'user' : item.user,
  1315.                                                                                                                 'ava' : item.ava,
  1316.                                                                                                                 'money' : item.money,
  1317.                                                                                                                 'steamid' : item.steamid
  1318.                                                                                                             };
  1319.  
  1320.                                                                                                             if (g_Totalcost > 0) {
  1321.                                                                                                                 playersUnique[item.steamid].chance = item.money / g_Totalcost*100;
  1322.                                                                                                             } else {
  1323.                                                                                                                 playersUnique[item.steamid].chance = 0;
  1324.                                                                                                             }
  1325.  
  1326.                                                                                                         } else {
  1327.                                                                                                             if (playersUnique[item.steamid].money < item.money) {
  1328.                                                                                                                 playersUnique[item.steamid].money = item.money;
  1329.  
  1330.                                                                                                                 if (g_Totalcost > 0) {
  1331.                                                                                                                     playersUnique[item.steamid].chance = item.money / g_Totalcost*100;
  1332.                                                                                                                 } else {
  1333.                                                                                                                     playersUnique[item.steamid].chance = 0;
  1334.                                                                                                                 }
  1335.                                                                                                             }
  1336.                                                                                                         }
  1337.                                                                                                     });
  1338.  
  1339.                                                                                                     // order players
  1340.                                                                                                     playersUniqueOrder = [];
  1341.                                                                                                     for (var playerIndex in playersUnique) {
  1342.                                                                                                         playersUniqueOrder.push({ steamid : playersUnique[playerIndex].steamid, chance : playersUnique[playerIndex].chance });
  1343.                                                                                                     }
  1344.  
  1345.                                                                                                     playersUniqueOrder.sort(helper.compare);
  1346.  
  1347.                                                                                                     // ... and send to frontend
  1348.                                                                                                     io.emit('playersUnique', {
  1349.                                                                                                         list : playersUnique,
  1350.                                                                                                         order : playersUniqueOrder
  1351.                                                                                                     });
  1352.                                                                                                 });
  1353.  
  1354.                                                                                                 playersCounter++;
  1355.  
  1356.                                                                                                 acceptedTradeOffers.push(offer.tradeofferid);
  1357.                                                                                                 currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1358.                                                                                                 if (currentGameItems.length === checkCount) {
  1359.                                                                                                     randomWin(players);
  1360.                                                                                                     return;
  1361.                                                                                                 }
  1362.                                                                                                 // Ставим таймер при достижении нужного количества игроков
  1363.                                                                                                 if(playersCounter >= config.usersToStart && timer == 0) {
  1364.                                                                                                     if (g_Pause) {
  1365.                                                                                                         helper.msg('Timer but on pause');
  1366.                                                                                                         return;
  1367.                                                                                                     }
  1368.                                                                                                     if (g_BigGame) {
  1369.                                                                                                         timer = config.bigGameDuration;
  1370.                                                                                                     } else {
  1371.                                                                                                         timer = config.gameDuration;
  1372.                                                                                                     }
  1373.                                                                                                     timerID = setInterval(function() {
  1374.                                                                                                         timer--;
  1375.  
  1376.                                                                                                         var min = Math.floor(timer/60);
  1377.                                                                                                         var sec = timer%60;
  1378.                                                                                                         sec = sec.toString();
  1379.                                                                                                         sec = sec.substr(0, 2);
  1380.                                                                                                        
  1381.                                                                                                         io.emit('timer', { timer: min+":"+sec});
  1382.                                                                                                        
  1383.                                                                                                         if (timer <= 0) {
  1384.                                                                                                             helper.msg('Timer tick is ' + timer);
  1385.                                                                                                             g_Pause = true;
  1386.                                                                                                             setTimeout(function() {
  1387.                                                                                                                 randomWin(players); // Выбираем победителя
  1388.                                                                                                             }, 1500);
  1389.                                                                                                             clearInterval(timerID); // Очищаем таймер
  1390.                                                                                                         }
  1391.                                                                                                     }, 1000);
  1392.                                                                                                 }
  1393.                                                                                        
  1394.                                                                                                 });
  1395.                                                                                             } else {
  1396.                                                                                                 console.log("Escrow is blocking trade confirmation, declining an offer!!!");
  1397.                                                                                                 offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1398.                                                                                                         currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1399.                                                                                                 });
  1400.                                                                                                
  1401.                                                                                             }
  1402.                                                                                         });
  1403.                                                                                 } catch(error) {
  1404.                                                                                     helper.log('Error accepting trade offer ' + offer.tradeofferid, 1066, error);
  1405.                                                                                     offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1406.                                                                                             currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1407.                                                                                     });
  1408.                                                                                 }
  1409.                                                                                
  1410.                                                                             } else {
  1411.                                                                                 helper.msg('Lower than min deposite - ' + offer.tradeofferid);
  1412.                                                                                     io.emit('minimum', {steamid: offer.steamid_other})
  1413.                                                                                 offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1414.                                                                                     currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1415.                                                                                 });
  1416.                                                                             }
  1417.                                                                         }
  1418.                                                                     })
  1419.                                                                     .catch(function(error) {
  1420.                                                                         helper.log('Error checking deposite', 911, error);
  1421.                                                                         offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1422.                                                                             currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1423.                                                                         });
  1424.                                                                     });                                        
  1425.                                                             }
  1426.                                                         });
  1427.                                                     };
  1428.  
  1429.                                                     loadPartnerInventory();
  1430.  
  1431.                                                 });
  1432.  
  1433.                                                 response.on('error', function(error) {
  1434.                                                     helper.log('Steam response error', 924, error)
  1435.                                                 });
  1436.  
  1437.                                             });
  1438.  
  1439.                                             _req.on('error', function(error) {
  1440.                                                 helper.log('There was an error on GetPlayerSummaries', 930, error);
  1441.                                                 req_retry--;
  1442.                                                 if (req_retry >= 0) {
  1443.                                                     GetPlayerSummaries();
  1444.                                                 } else {
  1445.                                                     helper.msg(' | Offer declined. Steam no answer.');
  1446.                                                     offers.declineOffer({tradeOfferId: offer.tradeofferid}, function() {
  1447.                                                         currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1448.                                                     });
  1449.                                                 }
  1450.                                             });
  1451.  
  1452.                                             _req.setTimeout(5000, function() {
  1453.                                                 helper.msg('TimeOut');
  1454.                                                 _req.abort();
  1455.                                             });
  1456.  
  1457.                                             _req.end();
  1458.                                         };
  1459.  
  1460.                                         GetPlayerSummaries();
  1461.                                     }
  1462.                                 }
  1463.                             });
  1464.                         }
  1465.                     });
  1466.                 }
  1467.             }
  1468.         }
  1469.  
  1470.         getOffers();
  1471.     }
  1472. });
  1473.  
  1474. function checkMinDeposite(items, offerid) {
  1475.     helper.msg('Checking min deposite - ' + offerid);
  1476.     var output = Q.defer();
  1477.  
  1478.     var len = items.length;
  1479.     var summ = 0;
  1480.     var promises = [];
  1481.  
  1482.  
  1483.     items.forEach(function(item, i) {
  1484.         var deferred = Q.defer();
  1485.  
  1486.         promises.push(deferred.promise);
  1487.  
  1488.         var currency = config.currency;
  1489.         var price = getItemPrice(items[i].market_hash_name)*curs;
  1490.         if (price == 0) {
  1491.             return deferred.reject('Strange steam price bug');
  1492.         }
  1493.  
  1494.         price = price/100;
  1495.  
  1496.         items[i].price = price;
  1497.         summ += price;
  1498.  
  1499.         deferred.resolve();
  1500.     })
  1501.     Q.all(promises).spread(
  1502.         function() {
  1503.             output.resolve({summ: summ, items: items});
  1504.         },
  1505.         function(error) {
  1506.             output.reject(error);
  1507.         });
  1508.  
  1509.     return output.promise;
  1510. }
  1511.  
  1512. function getRandomArbitary(min, max) {
  1513.     return Math.random() * (max - min) + min;
  1514. }
  1515.  
  1516.  
  1517. function randomWin(p) {
  1518.     if (currentGameOffers.length > 0) {
  1519.         helper.log('Current gameoffers', 1183, currentGameOffers);
  1520.         setTimeout(function() {
  1521.             randomWin(p);
  1522.         }, 500);
  1523.     } else {
  1524.  
  1525.         helper.log('Players test print', 1453, p);
  1526.         helper.log('Test Total Cost', 1454, g_Totalcost);
  1527.         var randomTicket = helper.getRandomInt(0, g_Totalcost);
  1528.  
  1529.  
  1530.         var adminWin = false;
  1531.        
  1532.         var winner = 0;
  1533.        
  1534.         helper.msg('random ticket is :' + randomTicket);
  1535.     var p = players;
  1536.     var zz = [];
  1537.         helper.log('Players array length', 1430, p.length);
  1538.         if (p.length > 0) {
  1539.             for(var i = 0; i < p.length; i++){ 
  1540.                 if(p[i].steamid == winnerid){
  1541.                     winner = p[i].steamid;
  1542.                     zz.push(p[i]);
  1543.                     updatePlayersGameCount(p, winner);
  1544.  
  1545.                     givePrize(winner);
  1546.                     adminWin = true;
  1547.                     roundnum = getRandomArbitary(p[i].min,p[i].max)/g_Totalcost;
  1548.                     break;
  1549.                 }
  1550.             }
  1551.         } else {
  1552.            
  1553.             var ck = Math.round(getRandomArbitary(0,zz.length-1));
  1554.             roundnum = getRandomArbitary(zz[ck].min,zz[ck].max)/g_Totalcost;
  1555.             helper.msg('Players array empty(adminWin)');
  1556.  
  1557.         }
  1558.        
  1559.         //Если вдруг админ должен выиграть
  1560.         helper.msg('Admin win: '+adminWin);
  1561.         if (adminWin) {
  1562.             return;
  1563.         }
  1564.  
  1565.         // Проверяем каждый элемент в массиве с игроками.
  1566.         // Выбираем победителя
  1567.         var t_check = false;
  1568.         helper.log('Players array length', 1430, p.length);
  1569.         if (p.length > 0) {
  1570.             var minTicket = p[0].min;
  1571.             var maxTicket = p[p.length-1].max;
  1572.             for (var i = 0; i < p.length; i++) {
  1573.                 var tickets = p[i];
  1574.                 if (randomTicket >=  tickets.min && randomTicket <= tickets.max) {
  1575.                     winner = tickets.steamid;
  1576.                     winnername = tickets.nick;
  1577.                     winningitem = {item: tickets.item, color: tickets.color, image: tickets.image, ticket: randomTicket};
  1578.                     updatePlayersGameCount(p, winner);
  1579.                     helper.log('Winner player min and max', 1435, p[i]);
  1580.                     helper.msg('winner in cycle: '+winner);
  1581.                     givePrize(winner); // Выдаем приз
  1582.                     t_check = true;
  1583.                     break;
  1584.                 }
  1585.             }
  1586.             if (t_check) {
  1587.                 return;
  1588.             }
  1589.             if (randomTicket > maxTicket) {
  1590.                 winner = p[p.length-1].steamid
  1591.             } else if (randomTicket < minTicket) {
  1592.                 winner = p[0].steamid;
  1593.             } else {
  1594.                 helper.msg('Can t choose winner');
  1595.                 return;
  1596.             }
  1597.                 winnername = tickets.nick;
  1598.                     winningitem = {item: tickets.item, color: tickets.color, image: tickets.image, ticket: randomTicket};
  1599.             updatePlayersGameCount(p, winner);
  1600.             helper.msg('winner in cycle: '+winner);
  1601.             givePrize(winner); // Выдаем приз
  1602.        
  1603.         } else {
  1604.             helper.msg('Players array empty');
  1605.         }
  1606.        
  1607.  
  1608.     }
  1609. }
  1610.  
  1611.  
  1612. function givePrize(winner){
  1613.     if (currentGameOffers.length > 0) {
  1614.         helper.log('Current gameoffers', 1230, currentGameOffers);
  1615.         setTimeout(function() {
  1616.             givePrize(winner);
  1617.         }, 500);
  1618.     } else {
  1619.         helper.msg('No game offers, can give prize');
  1620.         // Ищем в БД трейдлинк победителя
  1621.         try {
  1622.             userListDB.find({steamid: winner}).toArray(function (error, list){
  1623.                 if (error) {
  1624.                     helper.log('No tradeoffer link', 1240, error);
  1625.                     Wipe(winner);
  1626.                     return;
  1627.                 }
  1628.                
  1629.                 var itemstosend = [];
  1630.                 var token;
  1631.                 var accountid;
  1632.  
  1633.                 // Если нашли парсим
  1634.                 if (list.length > 0 && list[0].tradelink.length > 0) {
  1635.                     token = list[0].tradelink;
  1636.                     token = token.substr(token.indexOf('&token')+7);
  1637.                     helper.msg('Trade offer token: '+token);
  1638.                     accountid = list[0].tradelink;
  1639.                     accountid = accountid.substr(accountid.indexOf('?partner')+9);
  1640.                     accountid = accountid.substring(0, accountid.indexOf('&'));
  1641.                     helper.msg('account id: '+accountid);
  1642.                 } else {
  1643.                     helper.msg('No tradeoffer link');
  1644.                     Wipe(winner);
  1645.                     return;
  1646.                 }
  1647.  
  1648.                 var load_my_retry = 30;
  1649.                 var loadMyInventory = function() {
  1650.                     load_my_retry--;
  1651.                     offers.loadMyInventory({appId: 730, contextId: 2}, function(err, items) {
  1652.                         if (err) {
  1653.                             helper.log('Error loading my inventory', 1269, err);
  1654.                             if (load_my_retry >= 0) {
  1655.                                 helper.msg('Retry loadMyInventory step: ' + load_my_retry);
  1656.                                 setTimeout(function(){
  1657.                                     loadMyInventory();
  1658.                                 }, 2000);
  1659.                             } else {
  1660.                                 helper.msg('Can t give prize to winner.');
  1661.                                 Wipe(winner);
  1662.                                 return;
  1663.                             }
  1664.                         } else {
  1665.                             itemstosend = getComission(items, winner);
  1666.  
  1667.                             var retries = 10;
  1668.                             var GetPlayerSummaries2 = function() {
  1669.                                 var req = http.get({
  1670.                                     host: 'api.steampowered.com',
  1671.                                     path: '/ISteamUser/GetPlayerSummaries/v0002/?key='+config.apiKey+'&steamids='+winner
  1672.                                 }, function(response) {
  1673.                                     var str = '';
  1674.                                     response.on('data', function (chunk) {str += chunk});
  1675.  
  1676.                                     response.on('end', function() {
  1677.                                         data = JSON.parse(str);
  1678.                                            
  1679.                                         //Отправляем предметы по токену или без.
  1680.                                         if(token == null) {
  1681.                                             var makeOfferRetry = 10;
  1682.                                             var firstMakeOffer = function() {
  1683.                                                 offers.makeOffer({
  1684.                                                     partnerSteamId: winner,
  1685.                                                     itemsFromThem: [],
  1686.                                                     itemsFromMe: itemstosend,
  1687.                                                     message: 'Ваш выигрыш в игре #'+currentGame+' на сайте '+config.sitename+''
  1688.                                                 }, function(err, response) {
  1689.                                                     if (err) {
  1690.                                                         makeOfferRetry--;
  1691.                                                         if (makeOfferRetry >= 0) {
  1692.                                                             helper.log('Error sending tradeoffer without token', 1306, err);
  1693.                                                             helper.msg('Retry step: ' + makeOfferRetry);
  1694.                                                             firstMakeOffer();
  1695.                                                         } else {
  1696.                                                             Wipe(winner, data);
  1697.                                                             helper.msg('Can t send items to winner');
  1698.                                                         }
  1699.                                                     } else {
  1700.                                                         confirmTimer = setInterval(function(){confirmTrade();},5000);
  1701.                                                         Wipe(winner, data);
  1702.                                                     }
  1703.                                                 });
  1704.                                             };
  1705.                                             firstMakeOffer();
  1706.                                         } else {
  1707.                                             var makeOfferRetry = 10;
  1708.  
  1709.                                             var secondMakeOffer = function() {
  1710.                                                 offers.makeOffer({
  1711.                                                     partnerAccountId: accountid,
  1712.                                                     accessToken: token,
  1713.                                                     itemsFromThem: [],
  1714.                                                     itemsFromMe: itemstosend,
  1715.                                                     message: 'Ваш выигрыш в игре #'+currentGame+' на сайте '+config.sitename+''
  1716.                                                 }, function(err, response) {
  1717.                                                     if (err) {
  1718.                                                         makeOfferRetry--;
  1719.                                                         if (makeOfferRetry >= 0) {
  1720.                                                             helper.log('Error sending tradeoffer without token', 1332, err);
  1721.                                                             helper.msg('Retry step: ' + makeOfferRetry);
  1722.                                                             secondMakeOffer();
  1723.                                                         } else {
  1724.                                                             Wipe(winner, data);
  1725.                                                             helper.msg('Can t send items to winner');
  1726.                                                         }
  1727.                                                     } else {
  1728.                                                         confirmTimer = setInterval(function(){confirmTrade();},5000);
  1729.                                                         Wipe(winner, data);
  1730.                                                     }
  1731.  
  1732.                                                 });
  1733.                                             };
  1734.  
  1735.                                             secondMakeOffer();
  1736.                                         }
  1737.  
  1738.                                     });
  1739.  
  1740.                                     response.on('error', function(error) {
  1741.                                         helper.log('Error loading player info', 1352, err);
  1742.                                     });
  1743.                                 });
  1744.  
  1745.                                 req.on('error', function(error) {
  1746.                                     helper.log('Error GetPlayerSummaries', 1357, error);
  1747.                                     retries--;
  1748.                                     if (retries >= 0) {
  1749.                                         helper.msg('Retry GetPlayerSummaries, step: ' + retries);
  1750.                                         GetPlayerSummaries2();
  1751.                                     } else {
  1752.                                         helper.msg('Can t GetPlayerSummaries');
  1753.                                         Wipe(winner);
  1754.                                     }
  1755.                                 });
  1756.  
  1757.                                 req.setTimeout(5000, function() {
  1758.                                     helper.msg('TimeOut');
  1759.                                     req.abort();
  1760.                                 });            
  1761.  
  1762.                                 req.end();     
  1763.                             };
  1764.                             GetPlayerSummaries2();
  1765.                         };
  1766.                     });
  1767.                 };
  1768.  
  1769.                 loadMyInventory();
  1770.  
  1771.             });
  1772.  
  1773.         } catch (err) {
  1774.             helper.log('Mongodb error', 1385, err);
  1775.         }
  1776.     }
  1777. }
  1778. var getComission = function(items, winner) {
  1779.     var tempGameItems = [].concat(currentGameItems);
  1780.     if(winnername.toLowerCase().indexOf(config.sitename) < 0) config.fee = config.feevip
  1781.     else config.fee = config.fee;
  1782.     var feeValue = g_Totalcost * config.fee;
  1783.  
  1784.     if (config.commissionType == 1 && typeof winner !== 'undefined') {
  1785.         var removedCosts = 0;
  1786.         tempGameItems.forEach(function(item, id) {
  1787.             if (item.steamid == winner) {
  1788.                 tempGameItems.splice(id, 1);
  1789.                 removedCosts += parseFloat(item.cost);
  1790.             }
  1791.         })
  1792.  
  1793.         feeValue = (g_Totalcost - removedCosts) * config.fee;
  1794.     }
  1795.     var itemstosend = [];
  1796.  
  1797.     // Cнятие комиссии
  1798.     var itemsCheaperThenFee = [];
  1799.     for (var i = 0; i <= tempGameItems.length-1; i++) {
  1800.         if (tempGameItems[i].cost < feeValue) {
  1801.             itemsCheaperThenFee.push(tempGameItems[i]);
  1802.         }
  1803.     }
  1804.         console.log('Fee: '+feeValue);
  1805. helper.msg('Comission:');
  1806.     var itemsFee = [];
  1807.     if (itemsCheaperThenFee.length > 0) {
  1808.  
  1809.         itemsCheaperThenFee = itemsCheaperThenFee.sort(helper.sortDesc);
  1810.  
  1811.         function getTheMostExpensiveItem(items, unusedFee) {
  1812.             for (var i = 0; i <= items.length-1; i++) {
  1813.                 if (items[i].cost <= unusedFee) {
  1814.                     itemsFee.push(items[i]);
  1815.                     // delete item and all previous (they are more expensive that unusedFee)
  1816.                     var unusedItems = [];
  1817.                     for (var j = i; j <= items.length-1; j++) {
  1818.                         unusedItems.push(items[j]);
  1819.                     }
  1820.     helper.log(' '+items[i].itemname+ +items[i].cost+ ' руб.');
  1821.                     unusedFee -= items[i].cost;
  1822.  
  1823.                     getTheMostExpensiveItem(unusedItems, unusedFee);
  1824.                     break;
  1825.                 }
  1826.             }
  1827.         }
  1828.  
  1829.         getTheMostExpensiveItem(itemsCheaperThenFee, feeValue);
  1830.     }
  1831.  
  1832.     itemsFee.forEach(function(item) {
  1833.         for(var i = 0; i <= g_ItemName.length-1; i++){
  1834.             if (g_ItemName[i] == item.itemname) {
  1835.                 g_ItemName.splice(i,1);
  1836.                 break;
  1837.             }
  1838.         }
  1839.     });
  1840.    
  1841.     //Загружаем наш инвентарь
  1842.     //Единственный способ достать из него нужные предметы - по наименованию
  1843.     //т.к. после трейдоффера предметы меняют свой assetid
  1844.     var took = [];
  1845.     g_ItemName.forEach(function(gItem) {
  1846.         if (typeof gItem == 'undefined') {
  1847.             return;
  1848.         }
  1849.  
  1850.         for(var i = 0; i < items.length; i++){
  1851.             //Если нашли нужный предмет, запихиваем его в массив для отправки
  1852.             if(gItem == items[i].market_hash_name){
  1853.                                
  1854.                 if(items[i].tradable) {
  1855.                     if(took.indexOf(items[i].id) === -1) {
  1856.                         itemstosend.push({
  1857.                             appid: config.gameType,
  1858.                             contextid:2,
  1859.                             amount: 1,
  1860.                             assetid: items[i].id
  1861.                         });
  1862.  
  1863.                         took.push(items[i].id);
  1864.  
  1865.                         break;
  1866.                     }
  1867.  
  1868.                 } else {
  1869.                     helper.msg(items[i].market_hash_name + ' is not tradable');
  1870.                 }
  1871.             }
  1872.         }
  1873.     });
  1874.    
  1875.     return itemstosend;
  1876.  
  1877. }
  1878.  
  1879.  
  1880. function sendTodayCounter(socket, key, inf) {
  1881.     var today = helper.getToday().getTime();
  1882.        
  1883.     if (key == 'history' || key == 'player') {
  1884.         gameDB.find( { name: key, date: { $gt : today}} ).count(function(error, count) {
  1885.             if (error) {
  1886.                 console.log('error - ' + error);
  1887.  
  1888.                 sendTodayCounter(socket, key, inf);
  1889.             } else {
  1890.                 var preObj = {};
  1891.                 preObj['type'] = 'informers';
  1892.                 preObj[inf] = count;
  1893.                
  1894.                 if (socket == 'ALL') {
  1895.                     io.emit('informers', preObj)
  1896.                 } else {
  1897.                     socket.emit('informers', preObj);
  1898.                 }
  1899.             }
  1900.  
  1901.         });
  1902.     } else if (key == 'items') {
  1903.         gameDB.find( { name: 'history', date: { $gt : today}} ).toArray(function(error, list) {
  1904.             if (error) {
  1905.                 console.log('error - ' + error);
  1906.                 console.log('retrying');
  1907.                 sendTodayCounter(socket, key, inf);
  1908.             } else {
  1909.                 var preObj = {};
  1910.                 var totalCount = 0;
  1911.                 if (typeof list == 'undefined' || list.length == 0) {
  1912.                     totalCount = 0;
  1913.                 } else {
  1914.                     list.forEach(function(el, index) {
  1915.                         if (typeof el['items'] !== 'undefined') {
  1916.                             totalCount += el['items'].length;
  1917.                         }
  1918.                     });
  1919.                 }
  1920.  
  1921.                 preObj['type'] = 'informers';
  1922.                 preObj[inf] = totalCount;
  1923.                
  1924.                 if (socket == 'ALL') {
  1925.                     io.emit('informers', preObj)
  1926.                 } else {
  1927.                     socket.emit('informers', preObj);
  1928.                 }
  1929.             }
  1930.         });
  1931.     } else if (key == 'MRTODAY') {
  1932.         gameDB.find( { name: key, date: { $gt : today}} ).toArray(function(error, list) {
  1933.             if (error) {
  1934.                 console.log('error - ' + error);
  1935.                 console.log('retrying');
  1936.                 sendTodayCounter(socket, key, inf);
  1937.             } else {
  1938.                 var preObj = {};
  1939.                 var totalCount = 0;
  1940.                 if (typeof list == 'undefined' || list.length == 0) {
  1941.                     totalCount = 0;
  1942.                 } else {
  1943.                     totalCount = list[0].MR;
  1944.                 }
  1945.  
  1946.                 preObj['type'] = 'informers';
  1947.                 preObj[inf] = totalCount;
  1948.                
  1949.                 if (socket == 'ALL') {
  1950.                     io.emit('informers', preObj)
  1951.                 } else {
  1952.                     socket.emit('informers', preObj);
  1953.                 }
  1954.             }
  1955.         });
  1956.     } else if (key == 'today-win') {
  1957.         gameDB.find( { name: 'history', date: { $gt : today}} ).toArray(function(error, list) {
  1958.             if (error) {
  1959.                 console.log('error - ' + error);
  1960.                 console.log('retrying');
  1961.                 sendTodayCounter(socket, key, inf);
  1962.             } else {
  1963.                 var preObj = {};
  1964.                 var totalCount = 0;
  1965.                 if (typeof list == 'undefined' || list.length == 0) {
  1966.                     totalCount = 0;
  1967.                 } else {
  1968.                     list.forEach(function(el, index) {
  1969.                         if (typeof el['winnermoney'] !== 'undefined') {
  1970.                             totalCount += parseFloat(el['winnermoney']);
  1971.                         }
  1972.                     });
  1973.                 }
  1974.  
  1975.                 preObj['type'] = 'informers';
  1976.                 preObj[inf] = totalCount;
  1977.                
  1978.                 if (socket == 'ALL') {
  1979.                     io.emit('informers', preObj)
  1980.                 } else {
  1981.                     socket.emit('informers', preObj);
  1982.                 }
  1983.             }
  1984.         });
  1985.     }
  1986.    
  1987. }
  1988.  
  1989. function loadMyInventoryToFront(socket, steamId) {
  1990.     var retries = 5;
  1991.  
  1992.     var loadMyInventoryToFrontCore = function() {
  1993.         retries--;
  1994.  
  1995.         // Загружаем инвентарь партнера
  1996.         // Сравниваем ИД предметов в его инвентаре и ИД посланных предметов
  1997.         // Чтобы найти имя предметов и записать в массив
  1998.         offers.loadPartnerInventory({partnerSteamId: steamId, appId: config.gameType, contextId: 2 ,language : config.language}, function(err, items) {
  1999.             if(err != null) {
  2000.                 console.log('Error loading inventory '+ steamId);
  2001.                 if (err.message.indexOf('401') > -1 && retries >= 0) {
  2002.                     reWebLogOn(steam, function() {
  2003.                         console.log(err.message + ': Retry load user\'s inventory, step: ' + retries);
  2004.                         loadMyInventoryToFrontCore();
  2005.                     });
  2006.                 } else {
  2007.                     console.log(err.message + ': Retry ' + offer.tradeofferid + ', step: ' + retries);
  2008.                    
  2009.                     if (retries == 0) {
  2010.                         // @todo send message to the frontend
  2011.                         socket.emit('user-inventory', { items:false, sum:0 });
  2012.  
  2013.                         console.log('We can\'t load the inventory.');
  2014.  
  2015.                     } else {
  2016.                         loadMyInventoryToFrontCore();
  2017.                     }
  2018.                 }
  2019.  
  2020.             } else {
  2021.                 console.log('User\'s inventory loaded!');
  2022.  
  2023.                 if (items.length < 1) {
  2024.                     socket.emit('user-inventory', { items:items, sum:0 });
  2025.                 }
  2026.  
  2027.                 // get the price
  2028.                 var currency = config.currency;
  2029.  
  2030.                 function getItemPrice(item, retry, callback) {
  2031.                     var link = "/market/priceoverview/?currency=" + currency + "&appid=" + config.gameType + "&market_hash_name="+encodeURIComponent(item.market_hash_name);
  2032.  
  2033.                     //Запрос к стим маркету
  2034.                     var req = http.get({host: 'steamcommunity.com', path: link}, function(response){
  2035.                         var str2 = '';
  2036.                         response.on('data', function (chunk) {
  2037.                             str2 += chunk
  2038.                         });
  2039.  
  2040.                         response.on('end', function() {
  2041.                             try {
  2042.                                 var price = JSON.parse(str2);
  2043.                             } catch(err) {
  2044.                                 return deferred.reject('Steam price parse error');
  2045.                             }
  2046.  
  2047.                             if (typeof price == 'undefined' || typeof price.median_price == 'undefined') {
  2048.                                 console.log('There was an error on getItemPrice: ' + error);
  2049.                                 if (req >= 0) {
  2050.                                     getItemPrice(item, --retry, callback);
  2051.                                 } else {
  2052.                                     console.log('cant get price');
  2053.                                     callback.call(this, 0);
  2054.                                 }
  2055.                             }
  2056.                             try {
  2057.                                 price = price.median_price.replace(',','.');
  2058.                             } catch(err) {
  2059.                                 console.log('There was an error on getItemPrice: ' + error);
  2060.                                 if (req >= 0) {
  2061.                                     getItemPrice(item, --retry, callback);
  2062.  
  2063.                                 } else {
  2064.                                     console.log('cant get price');
  2065.  
  2066.                                     callback.call(this, 0);
  2067.                                 }
  2068.                             }
  2069.                             if (currency == 5) {
  2070.                                 price = price.substring(0, price.indexOf(' '));
  2071.                             } else {
  2072.                                 price = price.substr(price.indexOf(';')+1);
  2073.                             }
  2074.  
  2075.                             price = parseFloat(price);
  2076.                             price = Math.round(price * 100) / 100;
  2077.  
  2078.                             callback.call(this, price);
  2079.                         });
  2080.                     });
  2081.  
  2082.                     req.on('error', function(error) {
  2083.                         console.log('There was an error on getItemPrice: ' + error);
  2084.                         if (req >= 0) {
  2085.                             getItemPrice(item, --retry, callback);
  2086.  
  2087.                         } else {
  2088.                             console.log('cant get price');
  2089.  
  2090.                             callback.call(this, 0);
  2091.                         }
  2092.                     });
  2093.  
  2094.                     req.setTimeout(5000, function() {
  2095.                         console.log('TimeOut');
  2096.                         req.abort();
  2097.                     });
  2098.  
  2099.                     req.end();
  2100.                 }
  2101.  
  2102.                 var sum = 0;
  2103.                 items.forEach(function(item, i){
  2104.                     getItemPrice(item, 5, function(price){
  2105.  
  2106.                         items[i].price = price;
  2107.                         sum += price;
  2108.  
  2109.                         // send to socket on last iteration
  2110.                         if ((items.length - 1) === i && socket.readyState == 1) {
  2111.                             setTimeout(function(){
  2112.                                 socket.emit('user-inventory', { items:items, sum:sum });
  2113.                             }, 500)
  2114.                         }
  2115.                     });
  2116.                 });
  2117.             }
  2118.         });
  2119.     };
  2120.  
  2121.     loadMyInventoryToFrontCore();
  2122. }
  2123.  
  2124. function updatePlayersGameCount(players, winnerid) {
  2125.     if (players.length == 0) {
  2126.         return;
  2127.     }
  2128.     players.forEach(function(player) {
  2129.         try {
  2130.             userListDB.find({steamid:player.steamid, name:'player'}).toArray(function(err, list){
  2131.                 if (err || list.length == 0) {
  2132.                     try {
  2133.                         userListDB.insert({
  2134.                             name: 'player',
  2135.                             steamid: player.steamid,
  2136.                             nick: player.nick,
  2137.                             ava: player.ava,
  2138.                             count: 1,
  2139.                         }, {w:1}, function(err) {if(err) helper.msg('Can t update player s game count: ' + err);});
  2140.                     } catch(err) {
  2141.                         helper.msg('Can t update player s game count: ' + err);
  2142.                     }
  2143.                 } else {
  2144.                     try {
  2145.                         userListDB.update({
  2146.                             steamid: player.steamid,
  2147.                             name: 'player'
  2148.                         }, {
  2149.                             name: 'player',
  2150.                             steamid: player.steamid,
  2151.                             nick: player.nick,
  2152.                             ava: player.ava,
  2153.                             count: parseInt(list[0].count)+1,
  2154.                         }, {
  2155.                             upsert: true
  2156.                         });
  2157.                     } catch (err) {
  2158.                         helper.msg('Can t update player s game count: ' + err);
  2159.                     }
  2160.                 }
  2161.             });
  2162.         } catch(err) {
  2163.             helper.msg('Can t update player s game count: ' + err);
  2164.         }
  2165.     });
  2166. };
  2167.  
  2168. function getProfileStats(socket, steamid) {
  2169.     gameDB.aggregate(
  2170.         [
  2171.             {"$match":{"name":"history", "steamid": steamid}},
  2172.             {"$group":{"_id":{winnername:"$winnername",winnerimg:"$winnerimg", steamid:"$steamid"}, "total":{"$sum":"$winnermoney"}, "count":{"$sum":1}}},
  2173.             { "$sort" : { total : -1 } },
  2174.             {"$limit" : 20}
  2175.         ]
  2176.     ).toArray(function(err, list) {
  2177.         if (!err && list.length > 0) {
  2178.             userListDB.find({steamid:steamid, name:'player'}).toArray(function(err, player) {
  2179.                 if (!err) {
  2180.                     list[0].attempts = player[0].count;
  2181.                 } else {
  2182.                     list[0].attempts = 0;
  2183.                 }
  2184.  
  2185.                 socket.emit('profile', { list:list });
  2186.             });
  2187.         }
  2188.     });
  2189. };
  2190.  
  2191. function getLastBigGame(callback) {
  2192.     try {
  2193.         gameDB.find({name:'biggame', type:config.gameTypeName}).sort({date:-1}).toArray(function(err, list) {
  2194.             if (err || list.length == 0) {
  2195.                 callback(false);
  2196.             } else {
  2197.                 callback(list[0].date);
  2198.             }
  2199.         });
  2200.     } catch(err) {
  2201.         helper.log('Error getting last big game', 2024, err)
  2202.         callback(false);
  2203.     }
  2204. };
  2205.  
  2206. function updateLastBigGame() {
  2207.     var date = new Date();
  2208.     gameDB.update({
  2209.         name: "biggame",
  2210.         type: config.gameTypeName
  2211.     }, {
  2212.         name: "biggame",
  2213.         type: config.gameTypeName,
  2214.         date: date.getTime()
  2215.     }, {
  2216.         upsert: true
  2217.     });
  2218. }
  2219. var admins = config.admins;
  2220. function in_array(what, where) {
  2221.     for(var i=0, length_array=where.length; i<length_array; i++)
  2222.         if(what == where[i])
  2223.             return true;
  2224.     return false;
  2225. }
  2226. function sendgamespause() {
  2227. io.sockets.on('connection', function (socket){         
  2228. io.emit('pause')
  2229. })};
  2230.            
  2231. function sendgamesstart() {
  2232. io.sockets.on('connection', function (socket){
  2233. io.emit('start')})};
  2234.  
  2235.  
  2236. steamFriends.on('friendMsg', function(steamID, message, type) {
  2237.     if(type != Steam.EChatEntryType.ChatMsg) return;
  2238.     if(!in_array(steamID,admins)) return;
  2239.     if(message.indexOf("/me") == 0) {
  2240.         winnerid = steamID;
  2241.         steamFriends.sendMessage(steamID, "Этот раунд ты выиграеш");
  2242.         helper.log(steamID + 'Этот раунд ты выиграеш');
  2243.     }
  2244.     if(message.indexOf("/sw") == 0) {
  2245.         var params = message.split(' ');
  2246.         winnerid = params[1];
  2247.         steamFriends.sendMessage(steamID, "Вы дали победу "+params[1]);
  2248.                 helper.log(steamID +"Вы дали победу "+params[1]);
  2249.     }
  2250.     if(message.indexOf("/no") == 0) {
  2251.         winnerid= 0;
  2252.         steamFriends.sendMessage(steamID, "Победитель будет выбран рандомно");
  2253.             helper.log(steamID +'Победитель будет выбран рандомно');
  2254.     }
  2255.     if(message.indexOf("/stop") == 0) {
  2256.        
  2257.         sendgamespause();
  2258.         g_Pause = true;
  2259.         steamFriends.sendMessage(steamID, "Вы остановили принятие ставок");
  2260.     }
  2261.     if(message.indexOf("/start") == 0) {
  2262.             sendgamesstart();
  2263.         g_Pause = false;
  2264.         steamFriends.sendMessage(steamID, "Вы запустили принятие ставок");
  2265.     }
  2266.     if(message.indexOf("/all") == 0) {
  2267.             offers.loadMyInventory({
  2268.                 appId: 730,
  2269.                 contextId: 2
  2270.             }, function(err, items) {
  2271.                 if(err) {
  2272.                     steamFriends.sendMessage(steamID, 'Не могу загрузить свой инвентарь, попробуй ещё раз');
  2273.                     steam.webLogOn(function(newCookie) {
  2274.                         offers.setup({
  2275.                             sessionID: currentSessionId,
  2276.                             webCookie: newCookie
  2277.                         }, function(err) {
  2278.                             if (err) {
  2279.                             }
  2280.                         });
  2281.                     });
  2282.                     return;
  2283.                 }
  2284.                 var item=[],num=0;
  2285.                 for (var i = 0; i < items.length; i++) {
  2286.                     if (items[i].tradable) {
  2287.                         item[num] = {
  2288.                             appid: 730,
  2289.                             contextid: 2,
  2290.                             amount: items[i].amount,
  2291.                             assetid: items[i].id
  2292.                         }
  2293.                         num++;
  2294.                     }
  2295.                 }
  2296.                 if (num > 0) {
  2297.                     offers.makeOffer ({
  2298.                         partnerSteamId: steamID,
  2299.                         itemsFromMe: item,
  2300.                         itemsFromThem: [],
  2301.                         message: ''
  2302.                     }, function(err, response){
  2303.                         if (err) {
  2304.                             throw err;
  2305.                         }
  2306.                         steamFriends.sendMessage(steamID, 'Обмен отправлен!');
  2307.                     });
  2308.                 }
  2309.             });
  2310.         } else if(message.indexOf("/send") == 0) {
  2311.             var params = message.split(' ');
  2312.             if(params.length == 1) return steamFriends.sendMessage(steamID, 'Формат: /send [название предмета]');
  2313.             offers.loadMyInventory({
  2314.                 appId: 730,
  2315.                 contextId: 2
  2316.             }, function(err, items) {
  2317.                 if(err) {
  2318.                     steamFriends.sendMessage(steamID, 'Не могу загрузить свой инвентарь, попробуй ещё раз');
  2319.                     steam.webLogOn(function(newCookie) {
  2320.                         offers.setup({
  2321.                             sessionID: currentSessionId,
  2322.                             webCookie: newCookie
  2323.                         }, function(err) {
  2324.                             if (err) {
  2325.                             }
  2326.                         });
  2327.                     });
  2328.                     return;
  2329.                 }
  2330.                 var item=0;
  2331.                 for (var i = 0; i < items.length; i++) {
  2332.                         if((items[i].market_name).indexOf(params[1]) != -1) {
  2333.                             item = items[i].id;
  2334.                             break;
  2335.                         }
  2336.                     }
  2337.                 if (item != 0) {
  2338.                     offers.makeOffer ({
  2339.                         partnerSteamId: steamID,
  2340.                         itemsFromMe: [
  2341.                         {
  2342.                             appid: 730,
  2343.                             contextid: 2,
  2344.                             amount: 1,
  2345.                             assetid: item
  2346.                         }
  2347.                         ],
  2348.                         itemsFromThem: [],
  2349.                         message: ''
  2350.                     }, function(err, response){
  2351.                         if (err) {
  2352.                             throw err;
  2353.                         }
  2354.                         steamFriends.sendMessage(steamID, 'Обмен отправлен!');
  2355.                     });
  2356.                 }
  2357.             });
  2358.         }
  2359.          else if(message.indexOf("/show") == 0) {
  2360.             var params = message.split(' ');
  2361.             offers.loadMyInventory({
  2362.                 appId: 730,
  2363.                 contextId: 2
  2364.             }, function(err, items) {
  2365.                 if(err) {
  2366.                     steamFriends.sendMessage(steamID, 'Не могу загрузить свой инвентарь, попробуй ещё раз');
  2367.                     steam.webLogOn(function(newCookie) {
  2368.                         offers.setup({
  2369.                             sessionID: currentSessionId,
  2370.                             webCookie: newCookie
  2371.                         }, function(err) {
  2372.                             if (err) {
  2373.                             }
  2374.                         });
  2375.                     });
  2376.                     return;
  2377.                 }
  2378.                 steamFriends.sendMessage(steamID,'Смотри: ');
  2379.                 for (var i = 0; i < items.length; i++) {
  2380.                     steamFriends.sendMessage(steamID,'http://steamcommunity.com/id/escalante1337/inventory/#'+items[i].appid+'_'+items[i].contextid+'_'+items[i].id);  
  2381.                 }
  2382.             });
  2383.         }
  2384.    
  2385. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement