Guest User

Untitled

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