Advertisement
Guest User

Untitled

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