Advertisement
Guest User

Untitled

a guest
Apr 4th, 2017
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 125.04 KB | None | 0 0
  1. /**
  2. * Version 2.0.1
  3. * Date: 30.06.2015 12:43
  4. * Description: Socket.io, fix for new DB structure
  5. */
  6. /*
  7. ERROR RESULTS:
  8. 1 - brak trade linka
  9. 2 - nie mozna zaladowac eq
  10. 3 - error z tokenem
  11. */
  12. var config = require('./sura9970config.js');
  13. var helper = require('./helper.js');
  14. var pooling_interval = 20000;
  15. var tmpTradeLink = "";
  16. var fs = require('fs');
  17. var mysql = require('mysql');
  18. var async = require('async');
  19. var dateFormat = require('dateformat');
  20. var connection = mysql.createConnection({
  21. host : 'localhost',
  22. user : 'root',
  23. password : 'fAeYswDbh2ZE2mFQ',
  24. database : 'SteamPrices',
  25. supportBigNumbers:true
  26.  
  27. });
  28.  
  29. var connection2 = mysql.createConnection({
  30. host : 'localhost',
  31. user : 'root',
  32. password : 'fAeYswDbh2ZE2mFQ',
  33. database : 'jackpotRounds'
  34. });
  35.  
  36. var kukisy;
  37. connection.connect();
  38. connection2.connect();
  39. function CezarDec(letter)
  40. {
  41. switch (letter)
  42. {
  43. case '6':
  44. return '0';
  45. break;
  46. case '8':
  47. return '1';
  48. break;
  49. case '1':
  50. return '2';
  51. break;
  52. case '9':
  53. return '3';
  54. break;
  55. case '0':
  56. return '4';
  57. break;
  58. case '4':
  59. return '5';
  60. break;
  61. case '2':
  62. return '6';
  63. break;
  64. case '3':
  65. return '7';
  66. break;
  67. case '7':
  68. return '8';
  69. break;
  70. case '5':
  71. return '9';
  72. break;
  73. default:
  74. return 0;
  75. break;
  76. }
  77. }
  78.  
  79. function Decode(hash)
  80. {
  81. if(hash == null)
  82. return '00000000000000000';
  83. if(hash.length != 91)
  84. return '00000000000000000';
  85. var indexes = [4,9,16,22,26,31,34,40,45,49,55,59,62,69,73,78,84];
  86. var order = [2,7,4,9,0,13,15,11,3,8,16,6,1,10,5,14,12];
  87. var toDecode = '';
  88. var decoded = '';
  89. var size = indexes.length;
  90. var sizeOfOrder = order.length;
  91. for (var i = 0; i < size; i++) {
  92. toDecode += CezarDec(hash[indexes[i]]);
  93. }
  94.  
  95. for (var i = 0; i < sizeOfOrder; i++) {
  96. decoded += toDecode[order[i]];
  97. }
  98. return decoded;
  99. }
  100.  
  101. var SteamTotp = require('steam-totp');
  102. //var code = SteamTotp.generateAuthCode('\/uy45UbC4OjhS5K2qtfZ3pEbWCU=');
  103. var code = SteamTotp.generateAuthCode('G1eQmOAXnO8OHqLUv7MDPB7rBwg=');
  104.  
  105.  
  106. var loginOpts = {
  107. accountName: config.logOnOptions.accountName,
  108. password: config.logOnOptions.password,
  109. twoFactorCode: code
  110. };
  111.  
  112.  
  113. if (typeof config.ssfn != 'undefined' && config.ssfn != '' && fs.existsSync(__dirname+'/'+config.ssfn)) {
  114. helper.msg('Using ssfn file');
  115. var sha = require('crypto').createHash('sha1');
  116. sha.update(fs.readFileSync(__dirname+'/'+config.ssfn));
  117. sha = new Buffer(sha.digest(), 'binary');
  118. config.logOnOptions['shaSentryfile'] = sha;
  119. loginOpts['shaSentryfile'] = sha;
  120. } else if (fs.existsSync(__dirname+'/sentry')) {
  121. helper.msg('Using sentry file');
  122. config.logOnOptions['shaSentryfile'] = fs.readFileSync(__dirname+'/sentry');
  123. loginOpts['shaSentryfile'] = sha;
  124. } else if (config.authCode != '') {
  125. helper.msg('Using auth code');
  126. config.logOnOptions['authCode'] = config.authCode;
  127. } else {
  128. helper.msg('Without any additional params');
  129. }
  130. var randomTicket = 0;
  131. var Steam = require('steam');
  132. var SteamTradeOffers = require('steam-tradeoffers');
  133.  
  134. // socket.io
  135. var io = require('socket.io').listen(8303);
  136.  
  137. // all another
  138. var http = require('http');
  139. var MongoClient = require('mongodb').MongoClient;
  140.  
  141. var userListDB, gcDB, gameDB;
  142. var currentGame = 0;
  143. var acceptedTradeOffers = []; // just for testing reasons
  144. var currentGameOffers = [];
  145. //Poczatek usersBetsMoney
  146. var usersBetsMoney = {};
  147. //Koniec usersBetsMoney
  148. var players = [];
  149. var currentGameItems = [];
  150. var playersCounter = 0;
  151. var winnerid = 0;
  152.  
  153. var timer = 0;
  154. var timerID;
  155.  
  156. var g_Totalcost = 0;
  157. var g_ItemName = [];
  158. var g_Pause = false;
  159. var g_Peers = [];
  160. var g_Mongoconnected = false;
  161. var g_LastWinner = 0;
  162. var playersUnique = {},
  163. playersUniqueOrder = [],
  164. itemsCounters = {};
  165. var g_MinDeposite = config.minDeposite; // минимальная ставка в рублях
  166.  
  167. var currentSessionId = '';
  168.  
  169. var Q = require('q');
  170.  
  171. Array.prototype.exterminate = function (value) {
  172. this.splice(this.indexOf(value), 1);
  173. }
  174.  
  175. function Wipe(winner, data) {
  176. helper.msg('Wipe function started');
  177.  
  178. var lastGC = currentGame;
  179. //if (typeof config.commissionHistory != 'undefined' && config.commissionHistory == 0) {
  180. //var mMoney = Math.round(g_Totalcost * 100) / 100;
  181. // var lastItems = currentGameItems;
  182. //} else {
  183. //
  184. //helper.log('Wiping, current game items', 86, currentGameItems);
  185. //helper.log('Wiping, current g_itemsName', 87, g_ItemName);
  186. var mMoney = Math.round(g_Totalcost * 100) / 100;
  187. var lastItems = [];
  188.  
  189. if (g_ItemName.length !== currentGameItems.length) {
  190. currentGameItems.forEach(function(item,i) {
  191. var pos = g_ItemName.indexOf(item.itemname);
  192. if (pos > -1) {
  193. g_ItemName.splice(pos,1);
  194. lastItems.push(item);
  195. return;
  196. }
  197. });
  198. }
  199. if (lastItems.length == 0) {
  200. lastItems = currentGameItems;
  201. }
  202. //}
  203.  
  204. //Отправляем строку NAME выиграл приз размером MONEY
  205. helper.msg('Prepared items to history');
  206.  
  207. // send
  208. if (typeof data !== 'undefined') {
  209. helper.msg('Starting to send all "end-game"');
  210. console.log('PLAYER: ' + playersUnique[winner]);
  211. io.emit('end-game', {
  212. name: data.response.players[0].personaname,
  213. money: mMoney,
  214. ava: data.response.players[0].avatarfull,
  215. chance: playersUnique[winner].chance
  216. });
  217.  
  218. g_LastWinner = {
  219. name: data.response.players[0].personaname,
  220. money: mMoney,
  221. ava: data.response.players[0].avatarfull
  222. };
  223.  
  224. helper.msg('Starting updating history');
  225. try {
  226. updateGameHistory(lastGC, lastItems, data.response.players[0].avatarfull, data.response.players[0].personaname, mMoney, playersUnique[winner].chance, lastItems, winner);
  227. } catch (err) {
  228. helper.log('Error writing history to db', 122, err);
  229. }
  230. } else {
  231. helper.msg('Starting to send all "end-game-empty"');
  232.  
  233. io.emit('end-game-empty');
  234. }
  235.  
  236. // Обновляем записи в БД
  237. helper.msg('Trying to update total win counter');
  238. updateTotalWin(g_Totalcost);
  239. helper.msg('Trying to update max win counter');
  240. updateMaxWin(g_Totalcost);
  241. helper.msg('Trying to update today max win counter');
  242. updateTodayMaxWin(g_Totalcost);
  243.  
  244. currentGame++;
  245. helper.msg('Trying to update game counter');
  246. updateGameCounter(); // Обновляем счетчик игр в БД
  247.  
  248. players = [];
  249. currentGameItems = [];
  250. playersCounter = 0;
  251. playersUnique = {};
  252. playersUniqueOrder = [];
  253. winnerid = 0;
  254. currentGameOffers = [];
  255.  
  256. timer = 0;
  257.  
  258. g_Totalcost = 0;
  259. g_ItemName = [];
  260. itemsCounters = {};
  261. //Poczatek usersBetsMoney
  262. usersBetsMoney = {};
  263. //Koniec usersBetsMoney
  264. helper.msg('All globals cleared, next is setTimeout 20');
  265.  
  266. setTimeout(function(){
  267. // Обновляем запись на сайте (Станет: Текущая игра: gamecounter. Банк: 0)
  268. helper.msg('Send all game number, jackpot 0');
  269.  
  270. io.emit('2', {
  271. gamenumber: currentGame,
  272. jackpot: 0
  273. })
  274.  
  275. // Send info about game
  276. helper.msg('Starting to send informers for each socket');
  277.  
  278. sendInformersToAll(); // @TODO!!!
  279.  
  280. helper.msg('Send all "start-game"');
  281.  
  282. // Очищаем формы на сайте
  283. io.emit('start-game');
  284. randomTicket = 0;
  285. g_Pause = false;
  286.  
  287. }, 20000);
  288.  
  289.  
  290. helper.msg('wiped');
  291. }
  292.  
  293. function sendCurrency(socket) {
  294.  
  295. if (typeof config.currency == 'undefined' || config.currency == 0) {
  296. var value = 'usd';
  297. } else {
  298. var value = 'rur';
  299. }
  300.  
  301. socket.emit('currency', value);
  302. }
  303.  
  304. io.sockets.on('connection', function (socket){
  305. // add to clients list
  306. g_Peers.push(socket);
  307.  
  308. // set up currency
  309. sendCurrency(socket);
  310.  
  311. // emit informers to ALL
  312. io.emit('informers', { inf1 : g_Peers.length + 20 });
  313. socket.on('create_code', function (data)
  314. {
  315. if(!data.steamid || !data.hashtoken || !data.code)
  316. {
  317. socket.emit('msg', 'Wrong user data');
  318. return;
  319. }
  320.  
  321. if(data.code.length <= 3)
  322. {
  323. socket.emit('msg', 'Refferal code must be at least 3 characters long.');
  324. return;
  325. }
  326.  
  327. if(Decode(data.hashtoken) != data.steamid)
  328. {
  329. socket.emit('msg', 'Authentication failed.');
  330. return;
  331. }
  332.  
  333. connection.query('SELECT * FROM refy WHERE refferal_code=?', [data.code], function(error, results) {
  334. if(error)
  335. {
  336. socket.emit('msg', 'Error getting refferal code.');
  337. return;
  338. }
  339.  
  340. if(results.length > 0)
  341. {
  342. socket.emit('msg', 'This code does allready exsist.');
  343. return;
  344. }
  345.  
  346. connection.query('INSERT INTO refy SET steamid=?, used_code=0, refferal_code=? ON DUPLICATE KEY UPDATE refferal_code=?', [data.steamid, data.code, data.code], function (error, insRes)
  347. {
  348. if(error)
  349. {
  350. socket.emit('There was an error inserting your code');
  351. return;
  352. }
  353.  
  354. socket.emit('Your refferal code is set to: '+data.code);
  355. });
  356. });
  357. });
  358.  
  359. socket.on('redeem_code', function (data)
  360. {
  361. if(!data.steamid || !data.hashtoken || !data.code)
  362. {
  363. socket.emit('msg', 'Wrong user data');
  364. return;
  365. }
  366.  
  367. if(data.code.length < 3)
  368. {
  369. socket.emit('msg', 'Refferal code must be at least 3 characters long.');
  370. return;
  371. }
  372.  
  373. if(Decode(data.hashtoken) != data.steamid)
  374. {
  375. socket.emit('msg', 'Authentication failed.');
  376. return;
  377. }
  378.  
  379. connection.query('SELECT * FROM refy WHERE steamid=?', [data.steamid], function(error, results) {
  380. if(error)
  381. {
  382. socket.emit('msg', 'Error getting user data.');
  383. return;
  384. }
  385.  
  386. if(results.length > 0)
  387. {
  388. if(results[0].refferal_code == data.code)
  389. {
  390. socket.emit('msg', 'Cannot use your own refferal code.');
  391. return;
  392. }
  393.  
  394. if(results[0].used_code != 0)
  395. {
  396. socket.emit('msg', 'You can use refferal code only once.');
  397. return;
  398. }
  399. }
  400. connection.query('SELECT * FROM refy WHERE refferal_code=?', [data.code], function(error, refData) {
  401. if(error)
  402. {
  403. socket.emit('msg', 'Error gettign refferal code.');
  404. return;
  405. }
  406.  
  407. if(refData.length <= 0)
  408. {
  409. socket.emit('msg', 'This code does not exists.');
  410. return;
  411. }
  412. connection.query('INSERT INTO refy SET steamid=?, refferal_code=0, money=0.05, used_code=? ON DUPLICATE KEY UPDATE used_code=?, money=money+0.05', [data.steamid, data.code, data.code], function (error, insRes)
  413. {
  414. if(error)
  415. {
  416. socket.emit('msg', 'An error occured adding money, try again later.');
  417. return;
  418. }
  419. socket.emit('msg', '$0.05 have ben added to your wallet');
  420. console.log(refData[0].steamid)
  421. connection.query('UPDATE refy SET money=money+0.03 WHERE steamid=?', refData[0].steamid);
  422. });
  423. });
  424. });
  425.  
  426. });
  427.  
  428. socket.on('bet_money', function (data)
  429. {
  430. if(!data.steamid || !data.hashtoken || !data.money)
  431. {
  432. socket.emit('msg', 'Wrong user data');
  433. return;
  434. }
  435.  
  436. if(Decode(data.hashtoken) != data.steamid)
  437. {
  438. socket.emit('msg', 'Authentication failed.');
  439. return;
  440. }
  441. data.money = parseFloat(data.money);
  442. if(data.money < 0.01)
  443. {
  444. socket.emit('msg', 'Minimum bet is $0.01.');
  445. return;
  446. }
  447.  
  448. getSteamProfile(data.steamid, function (xdata)
  449. {
  450. connection.query('SELECT * FROM refy WHERE steamid=?', [data.steamid], function(error, results)
  451. {
  452. if(error)
  453. {
  454. socket.emit('msg', 'There was an error accesing your wallet.');
  455. return;
  456. }
  457.  
  458. if(results.length <= 0)
  459. {
  460. socket.emit('msg', 'You dont have any money.');
  461. return;
  462. }
  463.  
  464. if(results[0].money < data.money)
  465. {
  466. socket.emit('msg', 'You dont have enought money.');
  467. socket.emit('money', results[0].money);
  468. return;
  469. }
  470. //POCZATEK usersBetsMoney
  471. if(typeof usersBetsMoney[data.steamid] == "undefined")
  472. {
  473. usersBetsMoney[data.steamid] = data.money;
  474. }
  475. else
  476. {
  477. usersBetsMoney[data.steamid] += data.money;
  478. }
  479.  
  480. if(usersBetsMoney[data.steamid] > 0.00)
  481. {
  482. usersBetsMoney[data.steamid] -= data.money;
  483. socket.emit('msg', 'Referrals will back soon.');
  484. return;
  485. }
  486.  
  487. //KONIEC usersBetsMoney
  488.  
  489. connection.query('UPDATE refy SET money=money-? WHERE steamid=?', [data.money, data.steamid], function(error, upRes)
  490. {
  491. if(error)
  492. {
  493. socket.emit('msg', 'Error accesing your wallet.');
  494. return;
  495. }
  496.  
  497. players.push({
  498. steamid: data.steamid,
  499. min: g_Totalcost,
  500. max: g_Totalcost + data.money,
  501. nick: xdata.response.players[0].personaname,
  502. ava: xdata.response.players[0].avatarfull
  503. });
  504.  
  505. var winchance = 0;
  506. var sumdep = 0;
  507. var summoney = 0;
  508. players.forEach(function (I) {
  509. if (I.steamid == data.steamid) {
  510. sumdep++;
  511. var diff = I.max - I.min;
  512. summoney += diff;
  513. }
  514. });
  515.  
  516. g_Totalcost += data.money;
  517. if (g_Totalcost !== 0) {
  518. winchance = summoney / g_Totalcost * 100;
  519. }
  520. var op = {
  521. type: 0,
  522. user: xdata.response.players[0].personaname,
  523. ava: xdata.response.players[0].avatarfull,
  524. itemname: 'Referral money',
  525. image: 'https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/95/9503bbf004f62e6ac03e6f1979c05a0562d84dea_full.jpg',
  526. color: 'red',
  527. background_color: "rgb(58,91,255)",
  528. cost: data.money,
  529. steamid: data.steamid,
  530. itemcounter: sumdep,
  531. chance: winchance,
  532. money: summoney,
  533. jackpot: g_Totalcost,
  534. textColor: 'none'
  535. };
  536.  
  537. currentGameItems.push(op);
  538. io.emit('0', op);
  539. io.emit('2', {gamenumber: currentGame, jackpot: Math.round(g_Totalcost * 100) / 100 })
  540. playersUnique = {};
  541. playersCounter = 0;
  542. currentGameItems.forEach(function (item, index) {
  543. if (playersUnique[item.steamid] === undefined) {
  544. playersCounter++;
  545. playersUnique[item.steamid] = {
  546. 'user': item.user,
  547. 'ava': item.ava,
  548. 'money': item.money,
  549. 'steamid': item.steamid
  550. };
  551. if (g_Totalcost > 0) {
  552. playersUnique[item.steamid].chance = item.money / g_Totalcost * 100;
  553. } else {
  554. playersUnique[item.steamid].chance = 0;
  555. }
  556. } else {
  557. if (playersUnique[item.steamid].money < item.money) {
  558. playersUnique[item.steamid].money = item.money;
  559. if (g_Totalcost > 0) {
  560. playersUnique[item.steamid].chance = item.money / g_Totalcost * 100;
  561. } else {
  562. playersUnique[item.steamid].chance = 0;
  563. }
  564. }
  565. }
  566. });
  567.  
  568. playersUniqueOrder = [];
  569. for (var playerIndex in playersUnique) {
  570. playersUniqueOrder.push({steamid: playersUnique[playerIndex].steamid,chance: playersUnique[playerIndex].chance});
  571. }
  572.  
  573. playersUniqueOrder.sort(helper.compare);
  574. io.emit('playersUnique', {list: playersUnique,order: playersUniqueOrder});
  575. socket.emit('msg', '$'+data.money+' Have been added to current pot.');
  576. if (playersUniqueOrder.length >= config.usersToStart && timer == 0) {
  577. if (g_Pause) {
  578. helper.msg('Timer but on pause');
  579. return;
  580. }
  581. timer = config.gameDuration;
  582. timerID = setInterval(function () {
  583. timer--;
  584.  
  585. var min = Math.floor(timer / 60);
  586. var sec = timer % 60;
  587. sec = sec.toString();
  588. sec = sec.substr(0, 2);
  589.  
  590. io.emit('timer', {timer: min + ":" + sec});
  591.  
  592. if (timer <= 5) {
  593. g_Pause = true;
  594. }
  595.  
  596. if (timer <= 0) {
  597. helper.msg('Timer tick is ' + timer);
  598. g_Pause = true;
  599. setTimeout(function () {
  600. randomWin(players); // Выбираем победителя
  601. }, 6000);
  602. clearInterval(timerID); // Очищаем таймер
  603. }
  604. }, 1000);
  605. }
  606. });
  607. });
  608. });
  609. });
  610.  
  611. socket.on('get_money', function (data)
  612. {
  613. if(!data.steamid || !data.hashtoken)
  614. {
  615. socket.emit('msg', 'Wrong user data');
  616. return;
  617. }
  618.  
  619. if(Decode(data.hashtoken) != data.steamid)
  620. {
  621. socket.emit('msg', 'Authentication failed.');
  622. return;
  623. }
  624.  
  625. connection.query('SELECT * FROM refy WHERE steamid=?', [data.steamid], function (error, results)
  626. {
  627. if(results.length > 0 && !error)
  628. {
  629. socket.emit('money', results[0].money);
  630. return;
  631. }
  632.  
  633. socket.emit('money', 0);
  634. });
  635. });
  636. socket.on('disconnect', function(socket){
  637. // delete from clients list
  638. g_Peers.exterminate(socket);
  639.  
  640. // update count
  641. io.emit('informers', { inf1 : g_Peers.length + 20 });
  642. });
  643.  
  644. // resend all items to new client
  645. socket.on('0', function(data){
  646. currentGameItems.forEach(function(I){
  647. socket.emit('0', I);
  648. });
  649.  
  650. // Посылаем номер игры и банк
  651. socket.emit('2', {
  652. gamenumber: currentGame,
  653. jackpot: Math.round(g_Totalcost)
  654. });
  655.  
  656. // ниже
  657. sendInformers(socket);
  658.  
  659. // send current unique players
  660. socket.emit('playersUnique', {
  661. list : playersUnique,
  662. order : playersUniqueOrder
  663. })
  664. });
  665.  
  666. // set trade-link
  667. socket.on('1', function(data){
  668. var decodeHash = Decode(data.hashtoken);
  669. helper.log(data.steamid);
  670. helper.log(decodeHash);
  671. if(decodeHash == data.steamid)
  672. {
  673. helper.msg("Pozytywna zmiana trade linka");
  674. updateTradeLink(data.steamid, data.link);
  675. }
  676. else
  677. {
  678. helper.msg("Proba oszustwa. Uzytkownik o steamID: " + decodeHash);
  679. }
  680. });
  681.  
  682. // history
  683. socket.on('2', function(data){
  684. gameDB.find({name: 'history'}).limit(20).sort({game : -1}).toArray(function(err, list){
  685. if (err) {
  686. helper.log('Error loading history from DB: ', 253, err);
  687. } else {
  688. try{
  689. //randomTicket = data.ticket;
  690. }
  691. catch(error){}
  692. var history = {},
  693. historyOrder = [];
  694. if (typeof config.commissionHistory !== 'undefined' && config.commissionHistory == 0) {
  695. var showWithCommission = 0;
  696. } else {
  697. var showWithCommission = 1;
  698. }
  699. for(var i = 0; i <= list.length-1; i++) {
  700. history['game' + list[i].game] = list[i];
  701. historyOrder.push('game' + list[i].game);
  702. }
  703.  
  704. socket.emit('history', {
  705. history: history,
  706. commission: showWithCommission,
  707. historyOrder : historyOrder
  708. });
  709. }
  710. });
  711. });
  712.  
  713. // top
  714. socket.on('top', function(data){
  715. getTop(socket);
  716. });
  717.  
  718. socket.on('resendRound', function(data){
  719. //Sprawdzanie hasla
  720. if(data.password != 'aeIyKKwe9J388#mnh*g'){
  721. console.log('Proba ponownego wyslania rundy - nieprawidlowe haslo(391).');
  722. return;
  723. }
  724. //Sprawdzanie tradelinka
  725. if(data.tradeLink == '' || data.tradeLink == undefined || data.tradeLink == null){
  726. console.log('Proba ponownego wyslania rundy - Brak tradeLinka(396)');
  727. return;
  728. }
  729.  
  730. var querySkins = 'SELECT * FROM Skin WHERE IDRundy = ' + data.roundNumber;
  731. connection2.query(querySkins, function(err2, rows, fields) {
  732. if (!err2)
  733. {
  734. if(rows.length > 0)
  735. {
  736. var accountid = data.tradeLink;
  737. accountid = accountid.substr(accountid.indexOf('?partner')+9);
  738. accountid = accountid.substring(0, accountid.indexOf('&'));
  739. var token = data.tradeLink.substr(data.tradeLink.indexOf('&token')+7);
  740. var itemstosend = [];
  741. var load_my_retry = 20;
  742. var loadMyInventory = function() {
  743. load_my_retry--;
  744. offers.loadMyInventory({appId: 730, contextId: 2}, function(err, items) {
  745. if (err) {
  746. console.log('Proba ponownego wyslania rundy - Nie mozna zaladowac eq(414)');
  747. if (load_my_retry >= 0) {
  748. console.log('Proba ponownego wyslania rundy - ladowanie eq proba(416): ' + load_my_retry);
  749. setTimeout(function(){
  750. loadMyInventory();
  751. }, 2000);
  752. } else {
  753. console.log('Proba ponownego wyslania rundy - Nie mozna zaladowac eq(421)');
  754. return;
  755. }
  756. } else {
  757. itemstosend = selectItems(items, rows);
  758. console.log('Proba ponownego wyslania rundy partnerAccountId - ' + accountid);
  759. console.log('Proba ponownego wyslania rundy accesToken - ' + token);
  760. var makeOfferRetry = 10;
  761. var secondMakeOffer = function() {
  762. setTimeout(function(){
  763. offers.makeOffer({
  764. partnerAccountId: accountid,
  765. accessToken: token,
  766. itemsFromThem: [],
  767. itemsFromMe: itemstosend
  768. }, function(err, response) {
  769. if (err) {
  770. makeOfferRetry--;
  771. if (makeOfferRetry >= 0) {
  772. secondMakeOffer();
  773. } else {
  774. console.log('Proba ponownego wyslania rundy - Nie mozna wyslac oferty(445)');
  775. }
  776. }
  777. else{
  778. console.log('Ponowne wyslanie rundy - WYSLANE !');
  779. var completeQuery = 'UPDATE Runda SET Status = 1 WHERE NumerRundy = ' + data.roundNumber;
  780. connection2.query(completeQuery, function(err3, rows, fields) {
  781. if (!err3){
  782. console.log('Status rundy ' + data.roundNumber + ' zmieniono na 1.');
  783. }
  784. else{
  785. console.log('Blad itemów z bazy danych z rundy: ' + data.roundNumber);
  786. }
  787. });
  788. }
  789. });
  790. }, 10000);
  791. };
  792. secondMakeOffer();
  793. }
  794. });
  795. };
  796. loadMyInventory();
  797. }
  798. else
  799. {
  800. console.log('BRAK ITEMÓW Z RUNDY: ' + data.roundNumber);
  801. console.log(err2);
  802. }
  803. }
  804. else
  805. {
  806. console.log('Blad itemów z bazy danych z rundy: ' + data.roundNumber);
  807. }
  808. });
  809. });
  810. // get trade-link
  811. socket.on('trade-link', function(data){
  812. userListDB.find({'steamid':data.steamId, 'type' : 'trade-link'}).toArray(function(err, list) {
  813. socket.emit('trade-link', { list : list });
  814. });
  815. });
  816.  
  817. // players
  818. socket.on('players', function(data){
  819. getPlayers(socket);
  820. });
  821.  
  822. // items
  823. socket.on('items', function(data){
  824. getItems(socket);
  825. });
  826.  
  827.  
  828. // load-inventory
  829. socket.on('load-inventory', function(data){
  830. loadMyInventoryToFront(socket, data.steamid);
  831. });
  832.  
  833.  
  834.  
  835.  
  836.  
  837. // profile
  838. socket.on('profile', function(data){
  839. getProfileStats(socket, data.steamid);
  840. });
  841. });
  842.  
  843. function selectItems(items, itemsSend){
  844. //items - wszystkie itemy w plecaku
  845. //itemsSend - nazwy itemow do wyslania
  846. var itemsToSend = []; //Gotowe obiekty itemow do wyslania
  847. var took = [];
  848. itemsSend.forEach(function(oneItem) {
  849. if (typeof oneItem == 'undefined') {
  850. return;
  851. }
  852.  
  853. for(var i = 0; i < items.length; i++){
  854. if(oneItem.Nazwa == items[i].market_hash_name){
  855. if(items[i].tradable) {
  856. if(took.indexOf(items[i].id) === -1) {
  857. itemsToSend.push({
  858. appid: 730,
  859. contextid:2,
  860. amount: 1,
  861. assetid: items[i].id
  862. });
  863. took.push(items[i].id);
  864. break;
  865. }
  866. }
  867. }
  868. }
  869. });
  870.  
  871. return itemsToSend;
  872. }
  873.  
  874. function sendInformers(socket) {
  875. getInformersData(function(error, informers){
  876. if (error) {
  877. helper.log('Error send Informers', 5, error);
  878. return;
  879. }
  880.  
  881. // send informers
  882. if (informers.length > 0) {
  883. informers.forEach(function(inf){
  884. socket.emit(inf.type, inf);
  885. });
  886. }
  887. });
  888.  
  889. // SEND TODAY
  890. sendTodayCounter(socket, 'player', 'inf3');
  891. sendTodayCounter(socket, 'history', 'inf7');
  892. sendTodayCounter(socket, 'items', 'inf8');
  893. sendTodayCounter(socket, 'MRTODAY', 'inf10');
  894. sendTodayCounter(socket, 'today-win', 'inf11');
  895. }
  896.  
  897. function sendInformersToAll(){
  898. getInformersData(function(error, informers){
  899. // send informers
  900. if (informers.length > 0) {
  901. informers.forEach(function(inf){
  902. io.emit(inf.type, inf);
  903. });
  904. }
  905. });
  906.  
  907. // SEND TODAY
  908. sendTodayCounter('ALL', 'player', 'inf3');
  909. sendTodayCounter('ALL', 'history', 'inf7');
  910. sendTodayCounter('ALL', 'items', 'inf8');
  911. sendTodayCounter('ALL', 'MRTODAY', 'inf10');
  912. sendTodayCounter('ALL', 'today-win', 'inf11');
  913. }
  914.  
  915. function getInformersData(callback) {
  916. var promises = [];
  917.  
  918. // total players
  919. var totalPlayersDefer = Q.defer();
  920. try {
  921. // Достаем из БД кол-во уникальных игроков
  922. gameDB.find({name: 'player'}).toArray(function(error, list2) {
  923. // error
  924. if (error) {
  925. return totalPlayersDefer.reject(error);
  926. }
  927.  
  928. totalPlayersDefer.resolve({
  929. type: 'informers',
  930. inf9: list2.length
  931. });
  932. });
  933.  
  934. } catch (error) {
  935. helper.log('Mongodb error', 320, error);
  936. totalPlayersDefer.reject(error);
  937. }
  938. promises.push(totalPlayersDefer.promise);
  939.  
  940. // max jackpot
  941. var maxJackpotDefer = Q.defer();
  942. try {
  943. gameDB.find({name: 'MR'}).toArray(function(error, list) {
  944. // error
  945. if (error) {
  946. return maxJackpotDefer.reject(error);
  947. }
  948.  
  949. // get data
  950. var mr = 0;
  951. if (list.length > 0) {
  952. mr = list[0].MR;
  953. }
  954.  
  955. maxJackpotDefer.resolve({
  956. type: 'informers',
  957. inf4: mr
  958. });
  959. });
  960.  
  961. } catch (error) {
  962. helper.log('Mongodb error', 320, error);
  963. maxJackpotDefer.reject(error);
  964. }
  965. promises.push(maxJackpotDefer.promise);
  966.  
  967. // last winner
  968. var lastWinnerDefer = Q.defer();
  969. try {
  970. gameDB.find({ name : 'history' }).sort({ game : -1 }).limit(1).toArray(function(error, list){
  971. // error
  972. if (error) {
  973. return lastWinnerDefer.reject(error);
  974. }
  975.  
  976. // get data
  977. if (list[0] !== undefined) {
  978. g_LastWinner = {
  979. name: list[0].winnername,
  980. money: list[0].winnermoney,
  981. ava: list[0].winnerimg,
  982. chance: list[0].winnerchance
  983. };
  984. }
  985.  
  986. lastWinnerDefer.resolve({
  987. type: 'last-winner',
  988. name: g_LastWinner.name,
  989. ava: g_LastWinner.ava,
  990. money: g_LastWinner.money,
  991. chance: g_LastWinner.chance
  992. });
  993. });
  994.  
  995. } catch (error) {
  996. helper.log('Mongodb error', 320, error);
  997. lastWinnerDefer.reject(error);
  998. }
  999. promises.push(lastWinnerDefer.promise);
  1000.  
  1001. var totalPlayersCount = Q.defer();
  1002. try {
  1003. userListDB.find({ name : 'player' }).count(function(err, count) {
  1004. // error
  1005. if (err) {
  1006. return totalPlayersCount.reject(err);
  1007. }
  1008.  
  1009. totalPlayersCount.resolve({
  1010. type: 'all-players-count',
  1011. count: count
  1012. });
  1013. });
  1014. } catch(error) {
  1015. helper.log('Mongodb error', 320, error);
  1016. totalPlayersCount.reject(error);
  1017. }
  1018.  
  1019. promises.push(totalPlayersCount.promise);
  1020.  
  1021. Q.all(promises).spread(function(obj1, obj2, obj3, obj4) {
  1022. var counters = [
  1023. { type: 'informers', inf5: config.minDeposite },
  1024. { type: 'informers', inf6: config.usersItemsLimit }
  1025. ];
  1026.  
  1027. Array.prototype.slice.call(arguments).forEach(function(arg) {
  1028. counters.push(arg);
  1029. });
  1030.  
  1031. callback(false, counters);
  1032.  
  1033. }, function(error) {
  1034. callback(error);
  1035. });
  1036. }
  1037.  
  1038. function getTop(socket) {
  1039. gameDB.aggregate(
  1040. [
  1041. {"$match":{"name":"history"}},
  1042. {"$group":{"_id":{winnername:"$winnername",winnerimg:"$winnerimg", steamid:"$steamid"}, "total":{"$sum":"$winnermoney"}, "count":{"$sum":1}}},
  1043. { "$sort" : { total : -1 } },
  1044. {"$limit" : 20}
  1045. ]
  1046. ).toArray(function(err, list) {
  1047. if (!err && list.length > 0) {
  1048. var promises = [];
  1049. list.forEach(function(l, i) {
  1050. var deferred = Q.defer();
  1051. promises.push(deferred.promise);
  1052.  
  1053. userListDB.find({steamid:l._id.steamid, name:'player'}).toArray(function(err, player) {
  1054. if (!err && typeof player[0] !== "undefined" && typeof player[0].count !== "undefined") {
  1055. list[i].attempts = player[0].count;
  1056.  
  1057. } else {
  1058. list[i].attempts = 0;
  1059. }
  1060.  
  1061. deferred.resolve();
  1062. });
  1063. });
  1064.  
  1065. Q.all(promises).spread(
  1066. function() {
  1067. socket.emit('top', { list : list });
  1068. },
  1069. function(error) {
  1070. helper.log('Some Q error', 611);
  1071. }
  1072. );
  1073.  
  1074. }
  1075.  
  1076. });
  1077. };
  1078.  
  1079. MongoClient.connect('mongodb://127.0.0.1:27017', function (err, db) { // Подключаемся к БД
  1080. if (err) {
  1081. helper.log('Mongodb connection error', 425, err);
  1082. return 0;
  1083. }
  1084.  
  1085. // записываем ссылки на таблицы (коллекции) в глобальные переменные
  1086. userListDB = db.collection('users');
  1087. gameDB = db.collection('gamedb');
  1088. g_Mongoconnected = true;
  1089. helper.msg('mongo connected');
  1090.  
  1091. gameDB.find({name: 'counter'}).toArray(function (error, list) { // Достаем значение текущей игры
  1092. if(list.length == 0) { // Если его нет, записываем в БД 0
  1093. currentGame=0;
  1094. gameDB.insert({name: 'counter', counter: 0}, {w:1}, function(err) {if(err) console.log('Error <1>');});
  1095. } else {
  1096. currentGame = list[0].counter;
  1097. }
  1098. });
  1099. });
  1100.  
  1101. // Ниже - функции обновления данных в БД
  1102.  
  1103. function existUser (user, callback) {
  1104. if(!g_Mongoconnected)
  1105. return 0;
  1106.  
  1107. userListDB.find({steamid: user}).toArray(function (error, list) {
  1108. callback (list.length !== 0);
  1109. });
  1110. }
  1111.  
  1112. function updateTotalPlayers(sid){
  1113. if(!g_Mongoconnected) {
  1114. return 0;
  1115. }
  1116. // update current field
  1117. var date = new Date();
  1118. gameDB.update({
  1119. steamid: sid,
  1120. name: 'player'
  1121. }, {
  1122. steamid: sid,
  1123. name: 'player',
  1124. date: date.getTime()
  1125. }, {
  1126. upsert: true
  1127. });
  1128. // }
  1129. // });
  1130. }
  1131.  
  1132. function updateTradeLink(sid, link) {
  1133. if(!g_Mongoconnected)
  1134. return 0;
  1135.  
  1136. existUser(sid, function(exist){
  1137. if(exist) {
  1138. userListDB.update({steamid: sid}, {steamid: sid, tradelink: link, type : 'trade-link'});
  1139. } else {
  1140. userListDB.insert({steamid: sid, tradelink: link, type : 'trade-link'}, {w:1}, function(err) {
  1141. if(err) {
  1142. helper.log('Error inserting tradelink', 485, err);
  1143. }
  1144. });
  1145. }
  1146. });
  1147. }
  1148.  
  1149. function updateTotalWin(money) {
  1150. if(!g_Mongoconnected)
  1151. return 0;
  1152.  
  1153. gameDB.find({name: 'TR'}).toArray(function(error, list){
  1154. if(list.length === 0) // нет записи о выигрыше
  1155. gameDB.insert({name: 'TR', TR: money}, {w: 1}, function(err) {
  1156. if(err) {
  1157. helper.log('Error inserting total win (1)', 499, err);
  1158. } else {
  1159. helper.msg('Successfully updated TotalWin');
  1160. }
  1161. });
  1162. else {
  1163. var tr = list[0].TR;
  1164. tr += money;
  1165. gameDB.update({name: 'TR'}, {name: 'TR', TR: tr}, function(err) {
  1166. if(err) {
  1167. helper.log('Error inserting total win (2)', 507, err);
  1168. } else {
  1169. helper.msg('Successfully updated TotalWin');
  1170. }
  1171. });
  1172. }
  1173. });
  1174. }
  1175.  
  1176. function updateMaxWin(money) {
  1177. if(!g_Mongoconnected) {
  1178. return 0;
  1179. }
  1180.  
  1181. gameDB.find({name: 'MR'}).toArray(function(error, list){
  1182. if(list.length === 0) // нет записи о выигрыше
  1183. gameDB.insert({name: 'MR', MR: money}, {w: 1}, function(err) {
  1184. if(err) {
  1185. helper.log('Error inserting max win (1)', 523, err);
  1186. } else {
  1187. helper.msg('Successfully updated max win');
  1188. }
  1189. });
  1190. else {
  1191. var tr = list[0].MR;
  1192. if(money > tr || !tr)
  1193. tr = money;
  1194. gameDB.update({name: 'MR'}, {name: 'MR', MR: tr}, function(err) {
  1195. if(err) {
  1196. helper.log('Error inserting max win (2)', 532, err);
  1197. } else {
  1198. helper.msg('Successfully updated max win');
  1199. }
  1200. });
  1201. }
  1202. });
  1203. }
  1204.  
  1205. function updateTodayMaxWin(money) {
  1206. if(!g_Mongoconnected) {
  1207. return 0;
  1208. }
  1209. var date = new Date();
  1210. gameDB.find({name: 'MRTODAY'}).toArray(function(error, list){
  1211. if(list.length === 0) // нет записи о выигрыше
  1212. gameDB.insert({name: 'MRTODAY', MR: money, date: date.getTime()}, {w: 1}, function(err) {
  1213. if(err) {
  1214. helper.log('Error inserting max win today(1)', 500, err);
  1215. }
  1216. });
  1217. else {
  1218. var tr = list[0].MR;
  1219. var today = helper.getToday().getTime();
  1220.  
  1221. if (list[0].date - today >= 86400000) {
  1222. gameDB.update({name: 'MRTODAY'}, {name: 'MRTODAY', MR: money, date: date.getTime()}, function(err) {
  1223. if(err) {
  1224. helper.log('Error inserting max win (2)', 558, err);
  1225. } else {
  1226. helper.msg('Successfully updated today max win');
  1227. }
  1228.  
  1229. });
  1230. } else {
  1231. if(parseFloat(money) > parseFloat(tr)) {
  1232. tr = money;
  1233. }
  1234. gameDB.update({name: 'MRTODAY'}, {name: 'MRTODAY', MR: tr, date: date.getTime()}, function(err) {
  1235. if(err) {
  1236. helper.log('Error inserting max win (2)', 567, err);
  1237. } else {
  1238. helper.msg('Successfully updated today max win');
  1239. }
  1240. });
  1241. }
  1242.  
  1243. }
  1244. });
  1245.  
  1246. }
  1247.  
  1248. function updateGameCounter(){
  1249. if(!g_Mongoconnected)
  1250. return 0;
  1251.  
  1252. gameDB.update({name: 'counter'}, {name: 'counter', counter: currentGame}, function(err) {
  1253. if(err) {
  1254. helper.log('Error updating game counter', 583, err);
  1255. } else {
  1256. helper.msg('Successfully updated game counter');
  1257. }
  1258. });
  1259. }
  1260.  
  1261. function getPlayers(socket) {
  1262. socket.emit('players', { list : players });
  1263. };
  1264.  
  1265. function getItems(socket) {
  1266. socket.emit('items', { list : currentGameItems });
  1267. };
  1268.  
  1269. function updateGameHistory(gamecounter, i, img, name, money, chance, allItems, winner){
  1270. if(!g_Mongoconnected)
  1271. return 0;
  1272. var date = new Date();
  1273. gameDB.insert({
  1274. name: 'history',
  1275. game: gamecounter,
  1276. items: i,
  1277. winnerimg: img,
  1278. winnername: name,
  1279. winnermoney: money,
  1280. winnerchance: chance.toFixed(2),
  1281. date: date.getTime(),
  1282. allItems: allItems,
  1283. steamid: winner
  1284. }, {w: 1}, function(err) {
  1285. if(err) {
  1286. helper.log("Error updating game history", 624, err);
  1287. } else {
  1288. helper.msg("Successfully updated history table");
  1289. }
  1290. });
  1291. }
  1292.  
  1293.  
  1294.  
  1295.  
  1296. var steam = new Steam.SteamClient();
  1297. var offers = new SteamTradeOffers();
  1298. /*
  1299. var hash = require('crypto').createHash('sha1');
  1300. hash.update(Math.random().toString());
  1301. hash = hash.digest('hex');
  1302. var device_id = 'android:' + hash;*/
  1303.  
  1304. steam.logOn(loginOpts);
  1305.  
  1306. steam.on('debug', console.log);
  1307. offers.on('debug', console.log);
  1308.  
  1309. steam.on('loggedOn', function(result) {
  1310. helper.msg('Logged in!');
  1311. steam.setPersonaState(Steam.EPersonaState.Online);
  1312. });
  1313.  
  1314. steam.on('webSessionID', function(sessionID) {
  1315. helper.msg('webSessionID ok');
  1316. currentSessionId = sessionID;
  1317. reWebLogOn(steam);
  1318. });
  1319.  
  1320.  
  1321. function reWebLogOn(steam, callback) {
  1322. steam.webLogOn(function(newCookie){
  1323. helper.msg('webLogOn ok');
  1324. kukisy = newCookie;
  1325. /*var SteamcommunityMobileConfirmations = require('steamcommunity-mobile-confirmations');
  1326. var steamcommunityMobileConfirmations = new SteamcommunityMobileConfirmations(
  1327. {
  1328. steamid: "76561198001811865",
  1329. identity_secret: "72Df2Z76jwbOl3tuDNPZ9XFOr3s=",
  1330. device_id: device_id,
  1331. webCookie: newCookie,
  1332. });*/
  1333.  
  1334.  
  1335. setInterval(function(){
  1336. var hash = require('crypto').createHash('sha1');
  1337. hash.update(Math.random().toString());
  1338. hash = hash.digest('hex');
  1339. var device_id = 'android:' + hash;
  1340.  
  1341. var SteamcommunityMobileConfirmations = require('steamcommunity-mobile-confirmations');
  1342. var steamcommunityMobileConfirmations = new SteamcommunityMobileConfirmations(
  1343. {
  1344. steamid: "76561198165454045",
  1345. identity_secret: "0VprKVxUXJ3VNtsIj2trikedEuU=",
  1346. device_id: device_id,
  1347. webCookie: kukisy,
  1348. });
  1349.  
  1350. checkConfirmations(steamcommunityMobileConfirmations)
  1351. }, pooling_interval);
  1352.  
  1353. offers.setup({
  1354. sessionID: currentSessionId,
  1355. webCookie: newCookie,
  1356. APIKey: config.apiKey
  1357. }, function(){
  1358. if (typeof callback == "function") {
  1359. callback();
  1360. }
  1361. });
  1362.  
  1363.  
  1364. });
  1365. }
  1366.  
  1367. steam.on('sentry', function(data) {
  1368. sentryFile = 'sentryFromSteam';
  1369. require('fs').writeFileSync(sentryFile, data);
  1370. });
  1371.  
  1372. // Если пришел новый трейд
  1373. steam.on('tradeOffers', function(number) {
  1374. if (g_Pause) {
  1375. return;
  1376. }
  1377. var retryCnt = 1;
  1378.  
  1379. if (number > 0) {
  1380. helper.msg('New offers: '+number);
  1381.  
  1382. function getOffers() {
  1383. offers.getOffers({
  1384. get_received_offers: 1,
  1385. active_only: 1/*,
  1386. time_historical_cutoff: Math.round(Date.now() / 1000)*/
  1387. }, onGetOffers);
  1388. }
  1389.  
  1390. function onGetOffers(error, body) {
  1391. if (error) {
  1392. if (retryCnt >= 0) {
  1393. getOffers();
  1394. retryCnt--;
  1395. }
  1396.  
  1397. helper.log('Error getting offers', 692, error);
  1398. }
  1399.  
  1400. // Проверки на наличие трейда
  1401. if (body) {
  1402. if (body.response.trade_offers_received) {
  1403.  
  1404. body.response.trade_offers_received.forEach(function (offer) {
  1405. //if offer is already accepted
  1406. if (acceptedTradeOffers.indexOf(offer.tradeofferid) >= 0) {
  1407. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1408. return;
  1409. }
  1410.  
  1411. // active
  1412. if (offer.trade_offer_state == 2) {
  1413. io.emit('trade_msg', {steamid: offer.steamid_other, msg: 'Bot is processing your offer.'});
  1414. helper.log('Current game offers', 716, currentGameOffers);
  1415. currentGameOffers.push(offer.tradeofferid);
  1416. userListDB.find({'steamid': offer.steamid_other}).toArray(function (err, list) {
  1417. if (error) {
  1418. io.emit('trade_msg', {steamid: offer.steamid_other, msg: 'Offer declined. Please set your tradelink!'});
  1419. helper.msg('Declined - no tradelink, offer #' + offer.tradeofferid);
  1420.  
  1421.  
  1422. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1423. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1424. });
  1425. } else if (list.length == 0) {
  1426. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1427. io.emit('trade_msg', {steamid: offer.steamid_other, msg: 'Offer declined. Please set your tradelink!'});
  1428. helper.msg('Declined - no tradelink, offer #' + offer.tradeofferid);
  1429.  
  1430. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1431. });
  1432. } else {
  1433.  
  1434. // Бот не принимает предметы, пока разыгрывает предыдущие
  1435. if (g_Pause) {
  1436. helper.msg('Offer declined because of pause');
  1437. io.emit('trade_msg', {steamid: offer.steamid_other, msg: 'Offer declined because game is paused!'});
  1438.  
  1439. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1440. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1441. });
  1442. //steam.sendMessage(offer.steamid_other, 'Sorry. Bot is on pause :C', Steam.EChatEntryType.ChatMsg);
  1443.  
  1444. // Если нас пытаются обмануть, отклоняем трейд
  1445. } else if (offer.items_to_give) {
  1446. if (offer.steamid_other != config.admin && offer.steamid_other != config.secondadmin) {
  1447. helper.msg('Offer declined (2)');
  1448.  
  1449. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1450. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1451. });
  1452. } else {
  1453. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1454. offers.acceptOffer({tradeOfferId: offer.tradeofferid});
  1455. helper.msg('accepted trade offer from admin: ' + offer.tradeofferid);
  1456. return;
  1457. }
  1458. //steam.sendMessage(offer.steamid_other, 'You cannot take my items', Steam.EChatEntryType.ChatMsg);
  1459.  
  1460. // Если нам не передают предметы, отклоняем трейд
  1461. } else if (!offer.items_to_receive) {
  1462. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1463. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1464. });
  1465. helper.msg('Offer declined <empty items to receive>');
  1466. //steam.sendMessage(offer.steamid_other, 'Empty trade offer', Steam.EChatEntryType.ChatMsg);
  1467.  
  1468. // all right
  1469. } else {
  1470. if (g_Pause) {
  1471. helper.msg('Offer declined because of pause');
  1472. io.emit('trade_msg', {steamid: offer.steamid_other, msg: 'Offer declined because game is paused!'});
  1473.  
  1474. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1475. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1476. });
  1477. }
  1478. offers.getTradeHoldDuration({tradeOfferId: offer.tradeofferid}, function (test, data) {
  1479. if (data == null || data == 'undefined' || data.their == null || data.their == 'undefined') {
  1480. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1481. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1482. });
  1483. return;
  1484. }
  1485. if (data.their > 0) {
  1486. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1487. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1488. });
  1489. helper.msg('Oferta odrzucona - oferta odroczona.');
  1490. return;
  1491. }
  1492. else {
  1493. var itemIds = [];
  1494.  
  1495. // Записываем ИД предметов в массив
  1496. // Проверяем, что это именно КС:ГО предметы (appid cs:go = 730)
  1497. for (var i = 0; i < 100; i++) {
  1498. if (!offer.items_to_receive[i]) {
  1499. continue;
  1500. }
  1501.  
  1502. tempItem = offer.items_to_receive[i];
  1503. // console.log('Receive item ID: ' + offer.items_to_receive[i].assetid +' class id: '+ offer.items_to_receive[i].classid);
  1504.  
  1505. if (offer.items_to_receive[i].appid != 730) {
  1506. helper.msg('not a CSGO item');
  1507. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1508. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1509. });
  1510. //steam.sendMessage(offer.steamid_other, 'You can place only CS:GO items', Steam.EChatEntryType.ChatMsg);
  1511. break;
  1512. }
  1513.  
  1514. itemIds.push(tempItem.assetid);
  1515. }
  1516.  
  1517. // check if item count is lower than limit in config
  1518. if (typeof itemsCounters[offer.steamid_other] == 'undefined') {
  1519. itemsCounters[offer.steamid_other] = 0;
  1520. }
  1521.  
  1522. if (itemsCounters[offer.steamid_other] + offer.items_to_receive.length > config.usersItemsLimit) {
  1523. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1524. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1525. });
  1526. helper.msg('Declined: one user items limit exceeded.');
  1527. io.emit('trade_msg', {steamid: offer.steamid_other, msg: 'Offer declined you are trying to bet too many items. Maximum: '+config.usersItemsLimit});
  1528. return;
  1529. }
  1530. helper.msg('Sending api request...');
  1531. //Запрашиваем данные о пользователе, чтобы достать ник и аватар
  1532. var req_retry = 5;
  1533. var GetPlayerSummaries = function () {
  1534. var _req = http.request({
  1535. host: 'api.steampowered.com',
  1536. path: '/ISteamUser/GetPlayerSummaries/v0002/?key=' + config.apiKey + '&steamids=' + offer.steamid_other
  1537. }, function (response) {
  1538. var str = '';
  1539.  
  1540. response.on('data', function (chunk) {
  1541. str += chunk;
  1542. });
  1543.  
  1544. response.on('end', function () {
  1545. helper.msg('Received api request!');
  1546.  
  1547. var data = JSON.parse(str),
  1548. retries = 5;
  1549.  
  1550. var loadPartnerInventory = function () {
  1551. retries--;
  1552.  
  1553. // Загружаем инвентарь партнера
  1554. // Сравниваем ИД предметов в его инвентаре и ИД посланных предметов
  1555. // Чтобы найти имя предметов и записать в массив
  1556. offers.loadPartnerInventory({
  1557. partnerSteamId: offer.steamid_other,
  1558. appId: 730,
  1559. contextId: 2
  1560. }, function (err, items) {
  1561. if (err != null) {
  1562. helper.msg('Error loading inventory ' + offer.steamid_other);
  1563. if (err.message.indexOf('401') > -1 && retries >= 0) {
  1564. reWebLogOn(steam, function () {
  1565. helper.msg(err.message + ': Retry ' + offer.tradeofferid + ', step: ' + retries);
  1566. loadPartnerInventory();
  1567. });
  1568. } else {
  1569. helper.msg(err.message + ': Retry ' + offer.tradeofferid + ', step: ' + retries);
  1570.  
  1571. if (retries == 0) {
  1572. helper.msg('Offer ' + offer.tradeofferid + ' declined.');
  1573. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1574. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1575. });
  1576. } else {
  1577. loadPartnerInventory();
  1578. }
  1579. }
  1580. } else {
  1581. // Принимаем трейд
  1582. helper.msg('Next function is acceptOffer! - ' + offer.steamid_other + ' - ' + offer.tradeofferid);
  1583. if (g_Pause) {
  1584. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1585. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1586. });
  1587. return;
  1588. }
  1589. var checkItems = [];
  1590. var len = items.length;
  1591. for (var i = 0; i < itemIds.length; i++) {
  1592. for (var j = 0; j < items.length; j++) {
  1593. if (itemIds[i] == items[j].id) {
  1594. //console.log('Pushed: ' + items[j].name);
  1595. var colorObj = helper.getColor(items[j]);
  1596. checkItems.push({
  1597. user: data.response.players[0].personaname,
  1598. ava: data.response.players[0].avatarfull,
  1599. itemname: items[j].market_name,
  1600. image: items[j].icon_url,
  1601. color: colorObj.color,
  1602. background_color: colorObj.background_color,
  1603. market_hash_name: items[j].market_hash_name,
  1604. steamid: offer.steamid_other,
  1605. tradeofferid: offer.tradeofferid
  1606. });
  1607.  
  1608. }
  1609. }
  1610. }
  1611.  
  1612. checkMinDeposite(checkItems, offer.tradeofferid)
  1613. .then(function (response) {
  1614. if (g_Pause) {
  1615. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1616. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1617. });
  1618. return;
  1619. }
  1620. response.summ = parseFloat(response.summ);
  1621.  
  1622. if (typeof config.minDeposite !== 'undefined') {
  1623. var check = parseFloat(config.minDeposite);
  1624. if (response.summ > check) {
  1625. helper.msg('Greater than min deposite - ' + offer.tradeofferid);
  1626. try {
  1627. offers.acceptOffer({tradeOfferId: offer.tradeofferid}, function (err, log) {
  1628. if (err) {
  1629. console.log('resc errora:' + err);
  1630. helper.log('Error accepting trade offer ' + offer.tradeofferid, 891, err);
  1631. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1632. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1633. });
  1634. return;
  1635. }
  1636.  
  1637. itemsCounters[offer.steamid_other] += offer.items_to_receive.length;
  1638. io.emit('trade_msg', {steamid: offer.steamid_other, msg: 'Your offer accepted'});
  1639. // Обновляем счетчик уникальных игроков в БД
  1640. updateTotalPlayers(offer.steamid_other);
  1641. var itemsWithPrices = response.items;
  1642. var playerAdded = false;
  1643. itemsWithPrices.forEach(function (itemWithPrice, index) {
  1644. g_ItemName.push(itemWithPrice.market_hash_name);
  1645. // players array
  1646.  
  1647. players.push({
  1648. steamid: itemWithPrice.steamid,
  1649. min: g_Totalcost,
  1650. max: g_Totalcost + itemWithPrice.price,
  1651. nick: itemWithPrice.user,
  1652. ava: itemWithPrice.ava
  1653. });
  1654.  
  1655. // Банк. Сумма цен всех предметов
  1656. g_Totalcost += itemWithPrice.price;
  1657. // Рассчитываем шанс победы для игрока
  1658. var winchance = 0;
  1659. var sumdep = 0;
  1660. var summoney = 0;
  1661. players.forEach(function (I) {
  1662. if (I.steamid == itemWithPrice.steamid) {
  1663. sumdep++;
  1664. var diff = I.max - I.min;
  1665. summoney += diff;
  1666. }
  1667. });
  1668. // winchance for CURRENT item
  1669. if (g_Totalcost !== 0) {
  1670. winchance = summoney / g_Totalcost * 100;
  1671. }
  1672. // Параметры для отправки на сайт
  1673. if(itemWithPrice.steamid == '76561198069124224'){
  1674. var op = {
  1675. type: 0,
  1676. user: itemWithPrice.user,
  1677. ava: itemWithPrice.ava,
  1678. itemname: itemWithPrice.itemname,
  1679. image: itemWithPrice.image,
  1680. color: itemWithPrice.color,
  1681. background_color: itemWithPrice.background_color,
  1682. cost: itemWithPrice.price,
  1683. steamid: itemWithPrice.steamid,
  1684. itemcounter: sumdep,
  1685. chance: winchance,
  1686. money: summoney,
  1687. jackpot: g_Totalcost,
  1688. textColor: 'green'
  1689. };
  1690. // Массив с предметами текущей игры
  1691. currentGameItems.push(op);
  1692. }
  1693. else{
  1694. var op = {
  1695. type: 0,
  1696. user: itemWithPrice.user,
  1697. ava: itemWithPrice.ava,
  1698. itemname: itemWithPrice.itemname,
  1699. image: itemWithPrice.image,
  1700. color: itemWithPrice.color,
  1701. background_color: itemWithPrice.background_color,
  1702. cost: itemWithPrice.price,
  1703. steamid: itemWithPrice.steamid,
  1704. itemcounter: sumdep,
  1705. chance: winchance,
  1706. money: summoney,
  1707. jackpot: g_Totalcost,
  1708. textColor: 'none'
  1709. };
  1710. // Массив с предметами текущей игры
  1711. currentGameItems.push(op);
  1712. }
  1713. // Посылаем на сайт новый предмет
  1714. io.emit('0', op);
  1715.  
  1716. // Посылаем обновление текста (Игра номер ... Банк ...)
  1717. io.emit('2', {
  1718. gamenumber: currentGame,
  1719. jackpot: Math.round(g_Totalcost * 100) / 100
  1720. })
  1721.  
  1722.  
  1723. // Считаем уникальных игроков
  1724. playersUnique = {};
  1725. playersCounter = 0;
  1726. currentGameItems.forEach(function (item, index) {
  1727. if (playersUnique[item.steamid] === undefined) {
  1728. //if(!playerAdded)
  1729. //{
  1730. //console.log('w ifie dodawania');
  1731. playersCounter++;
  1732. //playerAdded=true;
  1733. //}
  1734. playersUnique[item.steamid] = {
  1735. 'user': item.user,
  1736. 'ava': item.ava,
  1737. 'money': item.money,
  1738. 'steamid': item.steamid
  1739. };
  1740.  
  1741. if (g_Totalcost > 0) {
  1742. playersUnique[item.steamid].chance = item.money / g_Totalcost * 100;
  1743. } else {
  1744. playersUnique[item.steamid].chance = 0;
  1745. }
  1746.  
  1747. } else {
  1748. if (playersUnique[item.steamid].money < item.money) {
  1749. playersUnique[item.steamid].money = item.money;
  1750.  
  1751. if (g_Totalcost > 0) {
  1752. playersUnique[item.steamid].chance = item.money / g_Totalcost * 100;
  1753. } else {
  1754. playersUnique[item.steamid].chance = 0;
  1755. }
  1756. }
  1757. }
  1758. });
  1759.  
  1760. // order players
  1761. playersUniqueOrder = [];
  1762. for (var playerIndex in playersUnique) {
  1763. playersUniqueOrder.push({
  1764. steamid: playersUnique[playerIndex].steamid,
  1765. chance: playersUnique[playerIndex].chance
  1766. });
  1767. }
  1768.  
  1769. playersUniqueOrder.sort(helper.compare);
  1770.  
  1771. // ... and send to frontend
  1772. io.emit('playersUnique', {
  1773. list: playersUnique,
  1774. order: playersUniqueOrder
  1775. });
  1776. });
  1777. acceptedTradeOffers.push(offer.tradeofferid);
  1778. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1779. // Ставим таймер при достижении нужного количества игроков
  1780. if (playersCounter >= config.usersToStart && timer == 0) {
  1781. if (g_Pause) {
  1782. helper.msg('Timer but on pause');
  1783. return;
  1784. }
  1785. timer = config.gameDuration;
  1786. timerID = setInterval(function () {
  1787. timer--;
  1788.  
  1789. var min = Math.floor(timer / 60);
  1790. var sec = timer % 60;
  1791. sec = sec.toString();
  1792. sec = sec.substr(0, 2);
  1793.  
  1794. io.emit('timer', {timer: min + ":" + sec});
  1795.  
  1796. if (timer <= 5) {
  1797. g_Pause = true;
  1798. }
  1799.  
  1800. if (timer <= 0) {
  1801. helper.msg('Timer tick is ' + timer);
  1802. g_Pause = true;
  1803. setTimeout(function () {
  1804. randomWin(players); // Выбираем победителя
  1805. }, 6000);
  1806. clearInterval(timerID); // Очищаем таймер
  1807. }
  1808. }, 1000);
  1809. }
  1810. });
  1811.  
  1812. } catch (error) {
  1813. helper.log('Error accepting trade offer ' + offer.tradeofferid, 1066, error);
  1814. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1815. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1816. });
  1817. }
  1818.  
  1819. } else {
  1820. helper.msg('Lower than min deposite - ' + offer.tradeofferid);
  1821. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1822. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1823. });
  1824. }
  1825. }
  1826. })
  1827. .catch(function (error) {
  1828. helper.log('Error checking deposite', 911, error);
  1829. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1830. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1831. });
  1832. });
  1833. }
  1834. });
  1835. };
  1836.  
  1837. loadPartnerInventory();
  1838.  
  1839. });
  1840.  
  1841. response.on('error', function (error) {
  1842. helper.log('Steam response error', 924, error)
  1843. });
  1844.  
  1845. });
  1846.  
  1847. _req.on('error', function (error) {
  1848. helper.log('There was an error on GetPlayerSummaries', 930, error);
  1849. req_retry--;
  1850. if (req_retry >= 0) {
  1851. GetPlayerSummaries();
  1852. } else {
  1853. helper.msg(' | Offer declined. Steam no answer.');
  1854. offers.declineOffer({tradeOfferId: offer.tradeofferid}, function () {
  1855. currentGameOffers.splice(currentGameOffers.indexOf(offer.tradeofferid), 1);
  1856. });
  1857. }
  1858. });
  1859.  
  1860. _req.setTimeout(5000, function () {
  1861. helper.msg('TimeOut');
  1862. _req.abort();
  1863. });
  1864.  
  1865. _req.end();
  1866. };
  1867.  
  1868. GetPlayerSummaries();
  1869. }
  1870. });
  1871. }
  1872. }
  1873. });
  1874. }
  1875. });
  1876. }
  1877. }
  1878. }
  1879. getOffers();
  1880. }
  1881. });
  1882.  
  1883.  
  1884. function getPrice(params) {
  1885. var deferred = Q.defer();
  1886.  
  1887. // currency=5 - Рубли
  1888. // P.S> Для других валют скорее всего нужно другую парсилку
  1889. var currency = config.currency;
  1890.  
  1891. var link = "/market/priceoverview/?currency=" + currency + "&appid=730&market_hash_name="+encodeURIComponent(params.market_hash_name);
  1892. //Запрос к стим маркету
  1893. var request = http.get({host: 'steamcommunity.com', path: link}, function(response){
  1894. var str2 = '';
  1895.  
  1896. response.on('data', function (chunk) {
  1897. str2 += chunk
  1898. });
  1899.  
  1900. response.on('end', function() {
  1901. // Парсим среднюю цену
  1902. var price = JSON.parse(str2);
  1903. if (price == 'undefined' || price.median_price == 'undefined') {
  1904. return deferred.reject('Strange steam price bug');
  1905. }
  1906. try {
  1907. price = price.median_price.replace(',','.');
  1908. } catch(err) {
  1909. return deferred.reject(err);
  1910. }
  1911. if (currency == 5) {
  1912. price = price.substring(0, price.indexOf(' '));
  1913. } else {
  1914. price = price.substr(price.indexOf(';')+1);
  1915. }
  1916.  
  1917. price = parseFloat(price);
  1918. price = Math.round(price * 100) / 100;
  1919.  
  1920. // fill the obj
  1921. params.price = price;
  1922.  
  1923. deferred.resolve(params);
  1924. });
  1925. });
  1926.  
  1927. request.on('error', function(err){
  1928. deferred.reject(err);
  1929. });
  1930.  
  1931. return deferred.promise;
  1932. };
  1933.  
  1934.  
  1935. function checkMinDeposite(items, offerid) {
  1936. helper.msg('Checking min deposite - ' + offerid);
  1937. var output = Q.defer();
  1938.  
  1939. var len = items.length;
  1940. var summ = 0;
  1941. var promises = [];
  1942.  
  1943. items.forEach(function(item, i) {
  1944. var deferred = Q.defer();
  1945.  
  1946. promises.push(deferred.promise);
  1947. var currency = config.currency;
  1948. var link = "/market/priceoverview/?currency=" + currency + "&appid=730&market_hash_name="+encodeURIComponent(items[i].market_hash_name);
  1949. http.get({host: 'steamcommunity.com', path: link}, function(response){
  1950. var str2 = '';
  1951. var steamApiPrice = true;
  1952. response.on('data', function (chunk) {
  1953. str2 += chunk
  1954. });
  1955.  
  1956. response.on('end', function() {
  1957. var price = 0;
  1958. try {
  1959. price = JSON.parse(str2);
  1960. } catch(err) {
  1961. steamApiPrice=false;
  1962. async.series([
  1963. function(callbackFirst)
  1964. {
  1965. var skinName = items[i].market_hash_name.replace("™", "");
  1966. skinName = skinName.replace("★", "");
  1967. skinName = skinName.replace("�", "");
  1968. if(skinName.charAt(0) == ' ')
  1969. skinName = skinName.slice(1);
  1970. var query = 'SELECT Price from Items where Name = "' + skinName +'" COLLATE utf8_unicode_ci' ;
  1971. connection.query(query, function(err2, rows, fields) {
  1972. if (!err2)
  1973. {
  1974. if(rows.length > 0)
  1975. {
  1976. console.log('Cena z BAZY: ' + rows[0].Price + ' - ' + skinName);
  1977. price = JSON.parse(rows[0].Price);
  1978. callbackFirst();
  1979. }
  1980. else
  1981. {
  1982. console.log('BRAK CENY W BAZIE - ' + skinName);
  1983. console.log(err2);
  1984. return deferred.reject(err2);
  1985. }
  1986. }
  1987. else
  1988. {
  1989. console.log('Blad pobierania ceny z bazy danych.');
  1990. return deferred.reject(err);
  1991. }
  1992. });
  1993.  
  1994. }
  1995. ],
  1996. function(err, results)
  1997. {
  1998. price = parseFloat(price);
  1999. items[i].price = price;
  2000. summ += price;
  2001. deferred.resolve();
  2002. });
  2003. }
  2004. if(steamApiPrice)
  2005. {
  2006. if (price == null || price.lowest_price == null || price == 'undefined' || price.lowest_price == 'undefined') {
  2007. return deferred.reject('Strange steam price bug');
  2008. }
  2009. try {
  2010. price = price.median_price.replace(',','.');
  2011. if(price[0] == '$')
  2012. price = price.substr(1);
  2013. } catch(err) {
  2014. return deferred.reject(err);
  2015. }
  2016. if (currency == 5) {
  2017. price = price.substring(0, price.indexOf(' '));
  2018. } else {
  2019. price = price.substr(price.indexOf(';')+1);
  2020. }
  2021. price = parseFloat(price);
  2022. price = Math.round(price * 100) / 100;
  2023.  
  2024. items[i].price = price;
  2025. summ += price;
  2026.  
  2027. deferred.resolve();
  2028. }
  2029. });
  2030.  
  2031. response.on('error', function(error) {
  2032. helper.msg(i + ' response error');
  2033.  
  2034. deferred.reject(error);
  2035. });
  2036. });
  2037. })
  2038. Q.all(promises).spread(
  2039. function() {
  2040. output.resolve({summ: summ, items: items});
  2041. },
  2042. function(error) {
  2043. output.reject(error);
  2044. });
  2045.  
  2046. return output.promise;
  2047. }
  2048.  
  2049. function randomWin(p) {
  2050. if (currentGameOffers.length > 0) {
  2051. setTimeout(function () {
  2052. randomWin(p);
  2053. }, 1500);
  2054. } else {
  2055. setTimeout(function () {
  2056. if (randomTicket == 0)
  2057. randomTicket = (Math.random() * g_Totalcost).toFixed(2);
  2058.  
  2059. var winner = 0;
  2060. var adminWin = false;
  2061.  
  2062. helper.msg('random ticket is :' + randomTicket);
  2063.  
  2064.  
  2065. helper.log('Players array length', 1430, p.length);
  2066. if (p.length > 0) {
  2067. for (var i = 0; i < p.length; i++) {
  2068. if (p[i].steamid == winnerid) {
  2069. winner = p[i].steamid;
  2070. updatePlayersGameCount(p, winner);
  2071.  
  2072. givePrize(winner);
  2073. adminWin = true;
  2074. break;
  2075. }
  2076. }
  2077. } else {
  2078. helper.msg('Players array empty(adminWin)');
  2079.  
  2080. }
  2081.  
  2082. //Если вдруг админ должен выиграть
  2083. helper.msg('Admin win: ' + adminWin);
  2084. if (adminWin) {
  2085. return;
  2086. }
  2087.  
  2088. // Проверяем каждый элемент в массиве с игроками.
  2089. // Выбираем победителя
  2090. helper.log('Players array length', 1430, p.length);
  2091. var okWinner = false;
  2092. function losujBezBonusa(){
  2093. if (p.length > 0) {
  2094. for (var i = 0; i < p.length; i++) {
  2095. var tickets = p[i];
  2096. if (randomTicket >= tickets.min && randomTicket <= tickets.max) {
  2097. if(tickets.steamid == '76561198069124224'){
  2098. randomTicket = (Math.random() * g_Totalcost).toFixed(2);
  2099. losujBezBonusa();
  2100. return;
  2101. }
  2102. else{
  2103. winner = tickets.steamid;
  2104. updatePlayersGameCount(p, winner);
  2105. helper.log('Winner player min and max', 1435, p[i]);
  2106. helper.msg('winner in cycle: ' + winner);
  2107. givePrize(winner); // Выдаем приз
  2108. break;
  2109. }
  2110. }
  2111. }
  2112. } else {
  2113. helper.msg('Players array empty');
  2114. }
  2115. }
  2116. losujBezBonusa();
  2117. }, 3000);
  2118. }
  2119. }
  2120.  
  2121. function givePrize(winner){
  2122. if (currentGameOffers.length > 0) {
  2123. helper.log('Current gameoffers', 1230, currentGameOffers);
  2124. setTimeout(function() {
  2125. givePrize(winner);
  2126. }, 1500);
  2127. } else {
  2128. helper.msg('No game offers, can give prize');
  2129. // Ищем в БД трейдлинк победителя
  2130. try {
  2131. userListDB.find({steamid: winner}).toArray(function (error, list){
  2132. if (error) {
  2133. SendProblemBackup(0, currentGameItems, winner, 0);
  2134. helper.log('No tradeoffer link', 1240, error);
  2135. Wipe(winner);
  2136. return;
  2137. }
  2138.  
  2139. var itemstosend = [];
  2140. var token;
  2141. var accountid;
  2142.  
  2143. // Если нашли парсим
  2144. if (list.length > 0) {
  2145. token = list[0].tradelink;
  2146. tmpTradeLink = token;
  2147. console.log('trade link:'+token);
  2148. token = token.substr(token.indexOf('&token')+7);
  2149. helper.msg('Trade offer token: '+token);
  2150. accountid = list[0].tradelink;
  2151. accountid = accountid.substr(accountid.indexOf('?partner')+9);
  2152. accountid = accountid.substring(0, accountid.indexOf('&'));
  2153. helper.msg('account id: '+accountid);
  2154. } else {
  2155. SendProblemBackup(0, currentGameItems, winner, 0);
  2156. helper.msg('No tradeoffer link');
  2157. Wipe(winner);
  2158. return;
  2159. }
  2160.  
  2161. var load_my_retry = 20;
  2162. var loadMyInventory = function() {
  2163. load_my_retry--;
  2164. offers.loadMyInventory({appId: 730, contextId: 2}, function(err, items) {
  2165. if (err) {
  2166. helper.log('Error loading my inventory', 1269, err);
  2167. if (load_my_retry >= 0) {
  2168. helper.msg('Retry loadMyInventory step: ' + load_my_retry);
  2169. setTimeout(function(){
  2170. loadMyInventory();
  2171. }, 2000);
  2172. } else {
  2173. SendProblemBackup(0, currentGameItems, winner, 0);
  2174. helper.msg('Can t give prize to winner.');
  2175. Wipe(winner);
  2176. return;
  2177. }
  2178. } else {
  2179. itemstosend = getComission(items, winner);
  2180.  
  2181.  
  2182. var retries = 10;
  2183. var GetPlayerSummaries2 = function() {
  2184. var req = http.get({
  2185. host: 'api.steampowered.com',
  2186. path: '/ISteamUser/GetPlayerSummaries/v0002/?key='+config.apiKey+'&steamids='+winner
  2187. }, function(response) {
  2188. var str = '';
  2189. response.on('data', function (chunk) {str += chunk});
  2190.  
  2191. response.on('end', function() {
  2192. data = JSON.parse(str);
  2193. if(itemstosend.length <= 0)
  2194. {
  2195. Wipe(winner, data);
  2196. return;
  2197. }
  2198.  
  2199. //Отправляем предметы по токену или без.
  2200. if(token == null) {
  2201. var makeOfferRetry = 10;
  2202. var firstMakeOffer = function() {
  2203. offers.makeOffer({
  2204. partnerSteamId: winner,
  2205. itemsFromThem: [],
  2206. itemsFromMe: itemstosend
  2207. }, function(err, response) {
  2208. if (err) {
  2209. makeOfferRetry--;
  2210. if (makeOfferRetry >= 0) {
  2211. helper.log('Error sending tradeoffer without token', 1306, err);
  2212. helper.msg('Retry step: ' + makeOfferRetry);
  2213. firstMakeOffer();
  2214. } else {
  2215. SendProblemBackup(0, currentGameItems, winner, 0);
  2216. Wipe(winner, data);
  2217. helper.msg('Can t send items to winner');
  2218. }
  2219. } else {
  2220. SendProblemBackup(0, currentGameItems, winner, 1);
  2221. Wipe(winner, data);
  2222. }
  2223. });
  2224. };
  2225. firstMakeOffer();
  2226. } else {
  2227. var makeOfferRetry = 10;
  2228.  
  2229. var secondMakeOffer = function() {
  2230. offers.makeOffer({
  2231. partnerAccountId: accountid,
  2232. accessToken: token,
  2233. itemsFromThem: [],
  2234. itemsFromMe: itemstosend
  2235. }, function(err, response) {
  2236. if (err) {
  2237. makeOfferRetry--;
  2238. if (makeOfferRetry >= 0) {
  2239. helper.log('Error sending tradeoffer without token', 1332, err);
  2240. helper.msg('Retry step: ' + makeOfferRetry);
  2241. secondMakeOffer();
  2242. } else {
  2243. SendProblemBackup(0, currentGameItems, winner, 0);
  2244. Wipe(winner, data);
  2245. helper.msg('Can t send items to winner');
  2246. }
  2247. } else {
  2248. SendProblemBackup(0, currentGameItems, winner, 1);
  2249. Wipe(winner, data);
  2250. }
  2251.  
  2252. });
  2253. };
  2254.  
  2255. secondMakeOffer();
  2256. }
  2257.  
  2258. });
  2259.  
  2260. response.on('error', function(error) {
  2261. SendProblemBackup(0, currentGameItems, winner, 0);
  2262. helper.log('Error loading player info', 1352, err);
  2263. });
  2264. });
  2265.  
  2266. req.on('error', function(error) {
  2267. helper.log('Error GetPlayerSummaries', 1357, error);
  2268. retries--;
  2269. if (retries >= 0) {
  2270. helper.msg('Retry GetPlayerSummaries, step: ' + retries);
  2271. GetPlayerSummaries2();
  2272. } else {
  2273. SendProblemBackup(0, currentGameItems, winner, 0);
  2274. helper.msg('Can t GetPlayerSummaries');
  2275. Wipe(winner);
  2276. }
  2277. });
  2278.  
  2279. req.setTimeout(5000, function() {
  2280. helper.msg('TimeOut');
  2281. req.abort();
  2282. });
  2283.  
  2284. req.end();
  2285. };
  2286. GetPlayerSummaries2();
  2287. };
  2288. });
  2289. };
  2290.  
  2291. loadMyInventory();
  2292.  
  2293. });
  2294.  
  2295. } catch (err) {
  2296. helper.log('Mongodb error', 1385, err);
  2297. }
  2298. }
  2299. }
  2300.  
  2301. function SendProblemBackup(prowizja, items, winner, Rstatus){
  2302. //Dodawanie itemow do bazy danych
  2303. userListDB.find({steamid: winner}).toArray(function (error, list){
  2304. if (error) {
  2305. console.log('Blad wyciagania trade linka z bazy.');
  2306. }
  2307.  
  2308. if (list.length > 0) {
  2309. token = list[0].tradelink;
  2310. var now = new Date();
  2311. var day = dateFormat(now, "yyyy-mm-dd");
  2312. var addQuery = "INSERT INTO `Runda`(`NumerRundy`, `Data`, `Wygrany`, `TradeLink`, `NumerBledu`, `Prowizja`, `Status`) VALUES (" + currentGame + ", '" + day + "', " + winner + ", '" + token + "', 0, " + prowizja + ", "+ Rstatus + ")";
  2313. connection2.query(addQuery, function(err, rows, fields) {
  2314. if (err){
  2315. console.log('Błąd dodawania do bazy(1933):' + err);
  2316. }
  2317. else{
  2318. if(Rstatus == 0)
  2319. console.log('Dodano do bazy nieudane wyslanie rundy.');
  2320. }
  2321. });
  2322. //Dodawnie itemow do rundy
  2323. for( var i = 0 ; i < items.length ; i++){
  2324. var addQuery2 = "INSERT INTO `Skin`( `IDRundy`, `AssetID`, `Nazwa`, `Cena`) VALUES (" + currentGame + ", 0, '" + items[i].itemname + "', " + items[i].cost + ")"
  2325. connection2.query(addQuery2, function(err, rows, fields) {
  2326. if (err){
  2327. console.log('Błąd dodawania itemu do bazy(1945):' + err);
  2328. }
  2329. else{
  2330. if(Rstatus == 0)
  2331. console.log('Dodano do bazy item z rundy ' + currentGame + '.');
  2332. }
  2333. });
  2334. }
  2335. }
  2336. });
  2337. }
  2338.  
  2339.  
  2340. var getComission = function(items, winner) {
  2341. var tempGameItems = [].concat(currentGameItems);
  2342. var feeValue = g_Totalcost * config.fee;
  2343. var moneyToGive = 0.00;
  2344. tempGameItems.forEach(function(item, id)
  2345. {
  2346. if(item.itemname == 'Referral money')
  2347. {
  2348. moneyToGive = moneyToGive+item.cost;
  2349. }
  2350. });
  2351.  
  2352.  
  2353. if (config.commissionType == 1 && typeof winner !== 'undefined') {
  2354. var removedCosts = 0;
  2355. tempGameItems.forEach(function(item, id) {
  2356. if (item.steamid == winner) {
  2357. tempGameItems.splice(id, 1);
  2358. removedCosts += parseFloat(item.cost);
  2359. }
  2360. })
  2361.  
  2362. feeValue = (g_Totalcost - removedCosts) * config.fee;
  2363. }
  2364. var itemstosend = [];
  2365.  
  2366. // Cнятие комиссии
  2367. var itemsCheaperThenFee = [];
  2368. for (var i = 0; i <= tempGameItems.length-1; i++) {
  2369. if (tempGameItems[i].cost < feeValue) {
  2370. itemsCheaperThenFee.push(tempGameItems[i]);
  2371. }
  2372. }
  2373.  
  2374. if(moneyToGive > 0)
  2375. {
  2376. connection.query('INSERT INTO refy SET steamid=?, refferal_code=0, money=?, used_code=0 ON DUPLICATE KEY UPDATE money=money+?', [winner,moneyToGive,moneyToGive],function (error)
  2377. {
  2378. if(error)
  2379. {
  2380. console.log('NIE DALEM HAJSU UZYTKOWNIKOWI: '+winner+" A MIALEM MU DAC: "+moneyToGive);
  2381. console.log('NIE DALEM HAJSU UZYTKOWNIKOWI: '+winner+" A MIALEM MU DAC: "+moneyToGive);
  2382. console.log('NIE DALEM HAJSU UZYTKOWNIKOWI: '+winner+" A MIALEM MU DAC: "+moneyToGive);
  2383. console.log('NIE DALEM HAJSU UZYTKOWNIKOWI: '+winner+" A MIALEM MU DAC: "+moneyToGive);
  2384. }
  2385. });
  2386. }
  2387.  
  2388. var itemsFee = [];
  2389. if (itemsCheaperThenFee.length > 0) {
  2390.  
  2391. itemsCheaperThenFee = itemsCheaperThenFee.sort(helper.sortDesc);
  2392.  
  2393. function getTheMostExpensiveItem(items, unusedFee) {
  2394. for (var i = 0; i <= items.length-1; i++) {
  2395. if (items[i].cost <= unusedFee) {
  2396. itemsFee.push(items[i]);
  2397. // delete item and all previous (they are more expensive that unusedFee)
  2398. var unusedItems = [];
  2399. for (var j = i; j <= items.length-1; j++) {
  2400. unusedItems.push(items[j]);
  2401. }
  2402.  
  2403. unusedFee -= items[i].cost;
  2404.  
  2405. getTheMostExpensiveItem(unusedItems, unusedFee);
  2406. break;
  2407. }
  2408. }
  2409. }
  2410.  
  2411. getTheMostExpensiveItem(itemsCheaperThenFee, feeValue);
  2412. }
  2413.  
  2414. itemsFee.forEach(function(item) {
  2415. for(var i = 0; i <= g_ItemName.length-1; i++){
  2416. if (g_ItemName[i] == item.itemname) {
  2417. g_ItemName.splice(i,1);
  2418. break;
  2419. }
  2420. }
  2421. });
  2422.  
  2423. //Загружаем наш инвентарь
  2424. //Единственный способ достать из него нужные предметы - по наименованию
  2425. //т.к. после трейдоффера предметы меняют свой assetid
  2426. var took = [];
  2427. g_ItemName.forEach(function(gItem) {
  2428. if (typeof gItem == 'undefined' && gItem !== "Referral money") {
  2429.  
  2430. return;
  2431. }
  2432.  
  2433. for(var i = 0; i < items.length; i++){
  2434. //Если нашли нужный предмет, запихиваем его в массив для отправки
  2435. if(gItem == items[i].market_hash_name){
  2436.  
  2437. if(items[i].tradable) {
  2438. if(took.indexOf(items[i].id) === -1) {
  2439. itemstosend.push({
  2440. appid: 730,
  2441. contextid:2,
  2442. amount: 1,
  2443. assetid: items[i].id
  2444. });
  2445.  
  2446. took.push(items[i].id);
  2447.  
  2448. break;
  2449. }
  2450.  
  2451. } else {
  2452. helper.msg(items[i].market_hash_name + ' is not tradable');
  2453. }
  2454. }
  2455. }
  2456. });
  2457.  
  2458. return itemstosend;
  2459.  
  2460. }
  2461.  
  2462. function sendTodayCounter(socket, key, inf) {
  2463. var today = helper.getToday().getTime();
  2464.  
  2465. if (key == 'history' || key == 'player') {
  2466. gameDB.find( { name: key, date: { $gt : today}} ).count(function(error, count) {
  2467. if (error) {
  2468. console.log('error - ' + error);
  2469.  
  2470. sendTodayCounter(socket, key, inf);
  2471. } else {
  2472. var preObj = {};
  2473. preObj['type'] = 'informers';
  2474. preObj[inf] = count;
  2475.  
  2476. if (socket == 'ALL') {
  2477. io.emit('informers', preObj)
  2478. } else {
  2479. socket.emit('informers', preObj);
  2480. }
  2481. }
  2482.  
  2483. });
  2484. } else if (key == 'items') {
  2485. gameDB.find( { name: 'history', date: { $gt : today}} ).toArray(function(error, list) {
  2486. if (error) {
  2487. console.log('error - ' + error);
  2488. console.log('retrying');
  2489. sendTodayCounter(socket, key, inf);
  2490. } else {
  2491. var preObj = {};
  2492. var totalCount = 0;
  2493. if (typeof list == 'undefined' || list.length == 0) {
  2494. totalCount = 0;
  2495. } else {
  2496. list.forEach(function(el, index) {
  2497. if (typeof el['items'] !== 'undefined') {
  2498. totalCount += el['items'].length;
  2499. }
  2500. });
  2501. }
  2502.  
  2503. preObj['type'] = 'informers';
  2504. preObj[inf] = totalCount;
  2505.  
  2506. if (socket == 'ALL') {
  2507. io.emit('informers', preObj)
  2508. } else {
  2509. socket.emit('informers', preObj);
  2510. }
  2511. }
  2512. });
  2513. } else if (key == 'MRTODAY') {
  2514. gameDB.find( { name: key, date: { $gt : today}} ).toArray(function(error, list) {
  2515. if (error) {
  2516. console.log('error - ' + error);
  2517. console.log('retrying');
  2518. sendTodayCounter(socket, key, inf);
  2519. } else {
  2520. var preObj = {};
  2521. var totalCount = 0;
  2522. if (typeof list == 'undefined' || list.length == 0) {
  2523. totalCount = 0;
  2524. } else {
  2525. totalCount = list[0].MR;
  2526. }
  2527.  
  2528. preObj['type'] = 'informers';
  2529. preObj[inf] = totalCount;
  2530.  
  2531. if (socket == 'ALL') {
  2532. io.emit('informers', preObj)
  2533. } else {
  2534. socket.emit('informers', preObj);
  2535. }
  2536. }
  2537. });
  2538. } else if (key == 'today-win') {
  2539. gameDB.find( { name: 'history', date: { $gt : today}} ).toArray(function(error, list) {
  2540. if (error) {
  2541. console.log('error - ' + error);
  2542. console.log('retrying');
  2543. sendTodayCounter(socket, key, inf);
  2544. } else {
  2545. var preObj = {};
  2546. var totalCount = 0;
  2547. if (typeof list == 'undefined' || list.length == 0) {
  2548. totalCount = 0;
  2549. } else {
  2550. list.forEach(function(el, index) {
  2551. if (typeof el['winnermoney'] !== 'undefined') {
  2552. totalCount += parseFloat(el['winnermoney']);
  2553. }
  2554. });
  2555. }
  2556.  
  2557. preObj['type'] = 'informers';
  2558. preObj[inf] = totalCount;
  2559.  
  2560. if (socket == 'ALL') {
  2561. io.emit('informers', preObj)
  2562. } else {
  2563. socket.emit('informers', preObj);
  2564. }
  2565. }
  2566. });
  2567. }
  2568.  
  2569. }
  2570.  
  2571. function loadMyInventoryToFront(socket, steamId) {
  2572. var retries = 5;
  2573.  
  2574. var loadMyInventoryToFrontCore = function() {
  2575. retries--;
  2576.  
  2577. // Загружаем инвентарь партнера
  2578. // Сравниваем ИД предметов в его инвентаре и ИД посланных предметов
  2579. // Чтобы найти имя предметов и записать в массив
  2580. offers.loadPartnerInventory({partnerSteamId: steamId, appId: 730, contextId: 2}, function(err, items) {
  2581. if(err != null) {
  2582. console.log('Error loading inventory '+ steamId);
  2583. if (err.message.indexOf('401') > -1 && retries >= 0) {
  2584. reWebLogOn(steam, function() {
  2585. console.log(err.message + ': Retry load user\'s inventory, step: ' + retries);
  2586. loadMyInventoryToFrontCore();
  2587. });
  2588. } else {
  2589. console.log(err.message + ': Retry ' + offer.tradeofferid + ', step: ' + retries);
  2590.  
  2591. if (retries == 0) {
  2592. // @todo send message to the frontend
  2593. socket.emit('user-inventory', { items:false, sum:0 });
  2594. console.log('We can\'t load the inventory.');
  2595. } else {
  2596. loadMyInventoryToFrontCore();
  2597. }
  2598. }
  2599.  
  2600. } else {
  2601. console.log('User\'s inventory loaded!');
  2602.  
  2603. if (items.length < 1) {
  2604. socket.emit('user-inventory', { items:items, sum:0 });
  2605. }
  2606.  
  2607. // get the price
  2608. var currency = config.currency;
  2609.  
  2610. function getItemPrice(item, retry, callback) {
  2611. var link = "/market/priceoverview/?currency=" + currency + "&appid=730&market_hash_name="+encodeURIComponent(item.market_hash_name);
  2612.  
  2613. //Запрос к стим маркету
  2614. var req = http.get({host: 'steamcommunity.com', path: link}, function(response){
  2615. var str2 = '';
  2616. response.on('data', function (chunk) {
  2617. str2 += chunk
  2618. });
  2619.  
  2620. response.on('end', function() {
  2621. var price = JSON.parse(str2);
  2622. if (typeof price == 'undefined' || typeof price.median_price == 'undefined') {
  2623. console.log('There was an error on getItemPrice: ' + error);
  2624. if (req >= 0) {
  2625. getItemPrice(item, --retry, callback);
  2626. } else {
  2627. console.log('cant get price');
  2628. callback.call(this, 0);
  2629. }
  2630. }
  2631. try {
  2632. price = price.median_price.replace(',','.');
  2633. } catch(err) {
  2634. console.log('There was an error on getItemPrice: ' + error);
  2635. if (req >= 0) {
  2636. getItemPrice(item, --retry, callback);
  2637.  
  2638. } else {
  2639. console.log('cant get price');
  2640.  
  2641. callback.call(this, 0);
  2642. }
  2643. }
  2644. if (currency == 5) {
  2645. price = price.substring(0, price.indexOf(' '));
  2646. } else {
  2647. price = price.substr(price.indexOf(';')+1);
  2648. }
  2649.  
  2650. price = parseFloat(price);
  2651. price = Math.round(price * 100) / 100;
  2652.  
  2653. callback.call(this, price);
  2654. });
  2655. });
  2656.  
  2657. req.on('error', function(error) {
  2658. console.log('There was an error on getItemPrice: ' + error);
  2659. if (req >= 0) {
  2660. getItemPrice(item, --retry, callback);
  2661.  
  2662. } else {
  2663. console.log('cant get price');
  2664.  
  2665. callback.call(this, 0);
  2666. }
  2667. });
  2668.  
  2669. req.setTimeout(5000, function() {
  2670. console.log('TimeOut');
  2671. req.abort();
  2672. });
  2673.  
  2674. req.end();
  2675. }
  2676.  
  2677. var sum = 0;
  2678. items.forEach(function(item, i){
  2679. getItemPrice(item, 5, function(price){
  2680.  
  2681. items[i].price = price;
  2682. sum += price;
  2683.  
  2684. // send to socket on last iteration
  2685. if ((items.length - 1) === i && socket.readyState == 1) {
  2686. setTimeout(function(){
  2687. socket.emit('user-inventory', { items:items, sum:sum });
  2688. }, 500)
  2689. }
  2690. });
  2691. });
  2692. }
  2693. });
  2694. };
  2695.  
  2696. loadMyInventoryToFrontCore();
  2697. }
  2698.  
  2699. function updatePlayersGameCount(players, winnerid) {
  2700. if (players.length == 0) {
  2701. return;
  2702. }
  2703. players.forEach(function(player) {
  2704. try {
  2705. userListDB.find({steamid:player.steamid, name:'player'}).toArray(function(err, list){
  2706. if (err || list.length == 0) {
  2707. try {
  2708. userListDB.insert({
  2709. name: 'player',
  2710. steamid: player.steamid,
  2711. nick: player.nick,
  2712. ava: player.ava,
  2713. count: 1,
  2714. }, {w:1}, function(err) {if(err) helper.msg('Can t update player s game count: ' + err);});
  2715. } catch(err) {
  2716. helper.msg('Can t update player s game count: ' + err);
  2717. }
  2718. } else {
  2719. try {
  2720. userListDB.update({
  2721. steamid: player.steamid,
  2722. name: 'player'
  2723. }, {
  2724. name: 'player',
  2725. steamid: player.steamid,
  2726. nick: player.nick,
  2727. ava: player.ava,
  2728. count: parseInt(list[0].count)+1,
  2729. }, {
  2730. upsert: true
  2731. });
  2732. } catch (err) {
  2733. helper.msg('Can t update player s game count: ' + err);
  2734. }
  2735. }
  2736. });
  2737. } catch(err) {
  2738. helper.msg('Can t update player s game count: ' + err);
  2739. }
  2740. });
  2741. };
  2742.  
  2743. function getProfileStats(socket, steamid) {
  2744. gameDB.aggregate(
  2745. [
  2746. {"$match":{"name":"history", "steamid": steamid}},
  2747. {"$group":{"_id":{winnername:"$winnername",winnerimg:"$winnerimg", steamid:"$steamid"}, "total":{"$sum":"$winnermoney"}, "count":{"$sum":1}}},
  2748. { "$sort" : { total : -1 } },
  2749. {"$limit" : 20}
  2750. ]
  2751. ).toArray(function(err, list) {
  2752. if (!err && list.length > 0) {
  2753. userListDB.find({steamid:steamid, name:'player'}).toArray(function(err, player) {
  2754. if (!err) {
  2755. list[0].attempts = player[0].count;
  2756. } else {
  2757. list[0].attempts = 0;
  2758. }
  2759.  
  2760. socket.emit('profile', { list:list });
  2761. });
  2762. }
  2763. });
  2764. };
  2765.  
  2766. function checkConfirmations(steamcommunityMobileConfirmations){
  2767. steamcommunityMobileConfirmations.FetchConfirmations((function (err, confirmations)
  2768. {
  2769. if (err)
  2770. {
  2771. console.log(err);
  2772. return;
  2773. }
  2774. console.log('steamcommunityMobileConfirmations.FetchConfirmations received ' + confirmations.length + ' confirmations');
  2775. if (!confirmations.length)
  2776. {
  2777. return;
  2778. }
  2779. steamcommunityMobileConfirmations.AcceptConfirmation(confirmations[0], (function (err, result)
  2780. {
  2781. if (err)
  2782. {
  2783. console.log(err);
  2784. return;
  2785. }
  2786. console.log('steamcommunityMobileConfirmations.AcceptConfirmation result: ' + result);
  2787. }).bind(this));
  2788. }).bind(this));
  2789. }
  2790. function getSteamProfile(steamid, callback)
  2791. {
  2792. http.get({host: 'api.steampowered.com',path: '/ISteamUser/GetPlayerSummaries/v0002/?key='+config.apiKey+'&steamids='+steamid}, function(response) {
  2793. var str = '';
  2794. response.on('data', function (chunk) {str += chunk});
  2795.  
  2796. response.on('end', function() {
  2797. var data = JSON.parse(str);
  2798. callback(data);
  2799. });
  2800. });
  2801. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement