· 6 years ago · Mar 02, 2019, 02:12 PM
1var fs = require('fs');
2var crypto = require('crypto');
3var console = process.console;
4var config = require('./config/config.js');
5var Steam = require('steam');
6var SteamWebLogOn = require('steam-weblogon');
7var getSteamAPIKey = require('steam-web-api-key');
8var SteamTradeOffers = require('steam-tradeoffers');
9var SteamTotp = require('steam-totp');
10var SteamCommunity = require('steamcommunity');
11var confirmations = new SteamCommunity();
12
13var domain = require('domain');
14var redisClient, io, requestify;
15module.exports.init = function(redis, ioSocket, requestifyCore) {
16 io = ioSocket;
17 if (process.env.REDIS_URL) {
18 var redisUrl = require('url').parse(process.env.REDIS_URL);
19 redisClient = redis.createClient(redisUrl.port, redisUrl.hostname);
20 /*
21 Use it only when need to auth
22 redisClient.auth(redisUrl.auth.split(":")[1]);
23 */
24 } else {
25 redisClient = redis.createClient();
26 }
27 requestify = requestifyCore;
28}
29
30var logOnOptions = {
31 account_name: config.bot.username,
32 password: config.bot.password
33};
34
35var authCode = ''; // code received by email
36
37try {
38 logOnOptions.sha_sentryfile = getSHA1(fs.readFileSync('bots/ssfn2616591384358764314'));
39 logOnOptions.two_factor_code = SteamTotp.getAuthCode('I5LkMaIt5+jFwG24wuC21R4SVbk=');
40} catch (e) {
41 if (authCode !== '') {
42 logOnOptions.auth_code = authCode;
43 }
44}
45function getSHA1(bytes) {
46 var shasum = crypto.createHash('sha1');
47 shasum.end(bytes);
48 return shasum.read();
49}
50// if we've saved a server list, use it
51if (fs.existsSync('./config/servers')) {
52 Steam.servers = JSON.parse(fs.readFileSync('./config/servers'));
53}
54
55var steamClient = new Steam.SteamClient();
56var steamUser = new Steam.SteamUser(steamClient);
57var steamFriends = new Steam.SteamFriends(steamClient);
58var steamWebLogOn = new SteamWebLogOn(steamClient, steamUser);
59var offers = new SteamTradeOffers();
60
61var checkingOffers = [],
62 WebSession = false,
63 countRetries = [],
64 comission = [],
65 globalSession;
66
67const redisChannels = {
68 checkItemsList: config.prefix + 'checkItems.list',
69 checkList: config.prefix + 'check.list',
70 checkedList: config.prefix + 'checked.list',
71 betsList: config.prefix + 'bets.list',
72 sendOffersList: config.prefix + 'send.offers.list',
73 sendOffersListLottery: config.prefix + 'send.offers.list.lottery',
74 tradeoffersList: config.prefix + 'tradeoffers.list',
75 declineList: config.prefix + 'decline.list',
76 usersQueue: config.prefix + 'usersQueue.list'
77}
78
79function steamBotLogger(log){
80 console.tag('SteamBot').log(log);
81}
82steamClient.connect();
83steamClient.on('debug', steamBotLogger);
84steamClient.on('connected', function() {
85 steamUser.logOn(logOnOptions);
86});
87
88steamClient.on('logOnResponse', function(logonResp) {
89 if (logonResp.eresult === Steam.EResult.OK) {
90 steamBotLogger('Logged in!');
91 steamFriends.setPersonaState(Steam.EPersonaState.Online);
92
93 steamWebLogOn.webLogOn(function(sessionID, newCookie) {
94 console.log('steamWebLogOn');
95 getSteamAPIKey({
96 sessionID: sessionID,
97 webCookie: newCookie
98 }, function(err, APIKey) {
99 console.log('getSteamAPIKey');
100 if(err) {
101 steamBotLogger(err);
102 }
103 offers.setup({
104 sessionID: sessionID,
105 webCookie: newCookie,
106 APIKey: APIKey
107 });
108 console.log(APIKey);
109 WebSession = true;
110 globalSession = sessionID;
111 redisClient.lrange(redisChannels.tradeoffersList, 0, -1, function(err, offers){
112 offers.forEach(function(offer) {
113 checkingOffers.push(offer);
114 });
115 handleOffers();
116 });
117 redisClient.del(redisChannels.usersQueue);
118 redisClient.del(redisChannels.sendOffersListLottery);
119 confirmations.setCookies(newCookie);
120 confirmations.startConfirmationChecker(10000, '67u9HbjfC0uSyfGE9BSfL0x4Ln4=');
121 steamBotLogger('Setup Offers!');
122 });
123 });
124 }
125});
126
127steamClient.on('servers', function(servers) {
128 fs.writeFile('./config/servers', JSON.stringify(servers));
129});
130steamClient.on('error', function(error) {
131 console.log(error);
132});
133steamUser.on('updateMachineAuth', function(sentry, callback) {
134 fs.writeFileSync('sentry', sentry.bytes);
135 callback({ sha_file: getSHA1(sentry.bytes) });
136});
137/*function reWebLogOn(callback) {
138 steamWebLogOn.webLogOn(function(sessionID, newCookie){
139 offers.setup({
140 sessionID: globalSession,
141 webCookie: newCookie
142 }, function() {
143 if (typeof callback == "function") {
144 callback();
145 }
146 });
147 });
148}*/
149function addQueue(steamid, count) {
150 counts = 0;
151 responses = [];
152 var send = function() {
153 requestify.post('https://'+config.domain+'/api/userqueue', {
154 secretKey: config.secretKey,
155 action: 'queueUser',
156 id: steamid[counts]
157 }).then(function(response) {
158 responses[counts] = JSON.parse(response.body);
159 responses[counts].steamid = steamid[counts];
160
161 counts++;
162 if(counts == count) {
163 console.log(responses);
164 io.sockets.emit('queue', responses);
165 }
166 else
167 send();
168 },function(response){
169 io.sockets.emit('queue', responses);
170 });
171 }
172 send();
173}
174function handleOffers() {
175 console.tag('SteamBot', 'handleOffers').log('handleOffers check starting');
176 var start = new Date();
177 offers.getOffers({
178 get_received_offers: 1,
179 active_only: 1,
180 time_historical_cutoff: Math.round(Date.now() / 1000)
181 }, function(error, body) {
182 if(error)
183 console.log(error);
184 if (
185 body
186 && body.response
187 && body.response.trade_offers_received
188 ) {
189 body.response.trade_offers_received.forEach(function(offer) {
190 if (offer.trade_offer_state == 2) {
191 if(is_checkingOfferExists(offer.tradeofferid)) return;
192
193 if(offer.items_to_give != null && config.admins.indexOf(offer.steamid_other) != -1) {
194 console.tag('SteamBot', 'TradeOffer').log('TRADE OFFER #' + offer.tradeofferid + ' FROM: Admin ' + offer.steamid_other);
195 offers.acceptOffer({tradeOfferId: offer.tradeofferid});
196 return;
197 }
198 if(offer.items_to_give != null) {
199 console.log('no items to give');
200 offers.declineOffer({tradeOfferId: offer.tradeofferid});
201 return;
202 }
203 offers.getTradeHoldDuration({
204 tradeOfferId: offer.tradeofferid
205 }, function(err, response) {
206 if(response === undefined) {
207 console.log('error escrow');
208 offers.declineOffer({tradeOfferId: offer.tradeofferid}); //ESCROW не подключен
209 return;
210 }
211 if(response.their != 0) {
212 console.log('escrow disable decline offer');
213 offers.declineOffer({tradeOfferId: offer.tradeofferid}); //ESCROW не подключен
214 return;
215 }
216 if (offer.items_to_receive != null && offer.items_to_give == null) {
217 checkingOffers.push(offer.tradeofferid);
218 var end = new Date();
219 console.log('СкороÑть ' + (end.getTime()-start.getTime()) + ' мÑ');
220 console.tag('SteamBot', 'TradeOffer').log('TRADE OFFER #' + offer.tradeofferid + ' FROM: ' + offer.steamid_other);
221 redisClient.multi([
222 ['rpush', redisChannels.tradeoffersList, offer.tradeofferid],
223 ['rpush', redisChannels.checkItemsList, JSON.stringify(offer)],
224 ['rpush', redisChannels.usersQueue, offer.steamid_other]
225 ]).exec(function(){
226 redisClient.lrange(redisChannels.usersQueue, 0, -1, function(err, queues) {
227 addQueue(queues, queues.length);
228 });
229 });
230 return;
231 }
232 });
233 }
234 });
235 }
236 });
237}
238
239steamUser.on('tradeOffers', function(number) {
240 if (number > 0) {
241 handleOffers();
242 }
243});
244var parseOffer = function(offer, offerJson) {
245 offers.loadPartnerInventory({partnerSteamId: offer.steamid_other, appId: 730, contextId: 2, tradeOfferId: offer.tradeofferid/*,language: "russian"*/}, function(err, hitems) {
246 if (err) {
247 //reWebLogOn(function() {
248 console.tag('SteamBot').error('parseOffer error, ReWebLogon');
249 if(countRetries[offerJson.tradeofferid] > 4) {
250 console.log(err);
251 console.tag('SteamBot').error('Error to load inventory');
252 redisClient.multi([
253 ["lrem", redisChannels.usersQueue, 0, offer.steamid_other],
254 ['lrem', redisChannels.checkItemsList, 0, offerJson]
255 ])
256 .exec(function (err, replies) {
257 redisClient.lrange(redisChannels.usersQueue, 0, -1, function(err, queues) {
258 addQueue(queues, queues.length);
259 });
260 countRetries[offerJson.tradeofferid] = 0;
261 offers.declineOffer({tradeOfferId: offer.tradeofferid});
262 parseItemsProcceed = false;
263 });
264 return;
265 }
266 countRetries[offerJson.tradeofferid]++;
267 parseOffer(offer, offerJson);
268 //});
269 return;
270 }
271 var items = offer.items_to_receive;
272 var items_to_check = [], num = 0;
273 for (var i = 0; i < items.length; i++) {
274 for (var j = 0; j < hitems.length; j++) {
275 if (items[i].assetid == hitems[j].id) {
276 items_to_check[num] = {
277 appid:hitems[j].appid,
278 name:hitems[j].market_name,
279 market_hash_name:hitems[j].market_hash_name,
280 classid:hitems[j].classid
281 };
282 var type = hitems[j].type;
283 var rarity = '';
284 var types = ["StatTrakâ„¢ "," Pistol", " SMG", " Rifle", " Shotgun", " Sniper Rifle", " Machinegun", " Container", " Knife", " Sticker", " Music Kit", " Key", " Pass", " Gift", " Tag", " Tool"];
285 var typesrep = ["","", "", "", "", "", "", "", "", "", "", "", "", "", "", ""];
286 type = str_replace(types,typesrep,type);
287 /*var arr = type.split(',');
288 if (arr.length == 2) type = arr[1].trim();
289 if (arr.length == 3) type = arr[2].trim();
290 if (arr.length && arr[0] == 'Ðож') type = '★';*/
291 console.log(type);
292 switch (type) {
293 case 'Mil-Spec Grade': rarity = 'milspec'; break;
294 case 'Restricted': rarity = 'restricted'; break;
295 case 'Classified': rarity = 'classified'; break;
296 case 'Covert': rarity = 'covert'; break;
297 case 'Consumer Grade': rarity = 'common'; break;
298 case 'Industrial Grade': rarity = 'common'; break;
299 case '★': rarity = 'rare'; break;
300 }
301 items_to_check[num].rarity = rarity;
302 num++;
303 break;
304 }
305 }
306 }
307 var value = {
308 offerid: offer.tradeofferid,
309 accountid: offer.steamid_other,
310 items: JSON.stringify(items_to_check)
311 };
312 countRetries[offerJson.tradeofferid] = 0;
313 console.tag('SteamBot', 'Offer #' + value.offerid).log(value);
314 redisClient.multi([
315 ['rpush', redisChannels.checkList, JSON.stringify(value)],
316 ['lrem', redisChannels.checkItemsList, 0, offerJson]
317 ])
318 .exec(function (err, replies) {
319 parseItemsProcceed = false;
320 });
321
322 });
323}
324
325var checkOfferPrice = function(){
326 requestify.post('https://'+config.domain+'/api/checkOffer', {
327 secretKey: config.secretKey
328 })
329 .then(function(response) {
330 var answer = JSON.parse(response.body);
331
332 if(answer.success){
333 checkProcceed = false;
334 }
335 },function(response){
336 console.tag('SteamBot').error('Something wrong with check offers. Retry...');
337 setTimeout(function(){checkOfferPrice()}, 1000);
338 });
339
340}
341
342var checkNewBet = function(){
343 requestify.post('https://'+config.domain+'/api/newBet', {
344 secretKey: config.secretKey
345 })
346 .then(function(response) {
347 var answer = JSON.parse(response.body);
348 if(answer.success){
349 betsProcceed = false;
350 }
351 },function(response){
352 console.tag('SteamBot').error('Something wrong with send a new bet. Retry...');
353 setTimeout(function(){checkNewBet()}, 1000);
354 });
355}
356
357var checkArrGlobal = [];
358var checkArrGlobalLottery = [];
359var sendTradeOfferLottery = function(appId, partnerSteamId, accessToken, sendItems, message, game, offerJson) {
360 var d = domain.create();
361 d.on('error', function(err) {
362 console.log(err.stack);
363 console.tag('SteamBot').error('Error to send the bet');
364 //setPrizeStatus(game, 2);
365 sendProcceedLottery = false;
366 });
367 d.run(function () {
368 if(offer.items.length <= 0) {
369 console.tag('SteamBot', 'SendPrize').log(offer.items.length + ' remove trade');
370 redisClient.lrem(redisChannels.sendOffersListLottery, 0, offerJson, function(err, data){
371 //setPrizeStatus(game, 1);
372 sendProcceedLottery = false;
373 });
374 return;
375 }
376 offers.loadMyInventory({
377 appId: appId,
378 contextId: 2
379 }, function (err, items) {
380 if(err) {
381 //reWebLogOn(function() {
382 //setPrizeStatus(game, 1);
383 sendProcceedLottery = false;
384 //});
385 console.tag('SteamBot', 'SendPrize').log('LoadMyInventory error. Reset offers!');
386 return;
387 }
388 var itemsFromMe = [],
389 checkArr = [],
390 num = 0;
391 sendItems = JSON.parse(sendItems);
392 console.log(sendItems);
393 console.log(sendItems.classid);
394 for (var j = 0; j < items.length; j++) {
395 if (items[j].tradable && (items[j].classid == sendItems.classid)) {
396 itemsFromMe[0] = {
397 appid: 730,
398 contextid: 2,
399 amount: items[j].amount,
400 assetid: items[j].id
401 };
402 num++;
403 break;
404 }
405 }
406 if (num > 0) {
407 offers.makeOffer({
408 partnerSteamId: partnerSteamId,
409 accessToken: accessToken,
410 itemsFromMe: itemsFromMe,
411 itemsFromThem: [],
412 message: message
413 }, function (err, response) {
414 if (err) {
415 console.log(err);
416 if((err.toString().indexOf('(15)') != -1) || (err.toString().indexOf('available') != -1)) {
417 console.log('true');
418 redisClient.lrem(redisChannels.sendOffersListLottery, 0, offerJson, function(err, data){
419 //setPrizeStatus(game, 2);
420 sendProcceedLottery = false;
421 });
422 return;
423 }
424 console.tag('SteamBot', 'SendPrize').error('Error to send offer.' + err);
425 //setPrizeStatus(game, 1);
426 sendProcceedLottery = false;
427 return;
428 }
429 checkArrGlobalLottery = checkArrGlobalLottery.concat(checkArr);
430 console.log(checkArrGlobalLottery);
431 console.log(checkArr);
432 redisClient.lrem(redisChannels.sendOffersListLottery, 0, offerJson, function(err, data){
433 //setPrizeStatus(game, 1);
434 sendProcceedLottery = false;
435 });
436 //SteamCommunity.checkConfirmations();
437 console.tag('SteamBot', 'SendPrize').log('TradeOffer #' + response.tradeofferid +' send!');
438 });
439 }else{
440 console.tag('SteamBot', 'SendPrize').log('Items not found!');
441 //setPrizeStatus(game, 2);
442 //sendProcceedLottery = false;
443 redisClient.lrem(redisChannels.sendOffersListLottery, 0, offerJson, function(err, data){
444 //setPrizeStatus(game, 2);
445 sendProcceedLottery = false;
446 });
447 }
448 });
449
450 });
451};
452var sendTradeOffer = function(appId, partnerSteamId, accessToken, sendItems, message, game, offerJson) {
453 var d = domain.create();
454 d.on('error', function(err) {
455 console.log(err.stack);
456 console.tag('SteamBot').error('Error to send the bet');
457 setPrizeStatus(game, 2);
458 sendProcceed = false;
459 });
460 d.run(function () {
461 if(offer.items.length <= 0) {
462 console.tag('SteamBot', 'SendPrize').log(offer.items.length + ' remove trade');
463 redisClient.lrem(redisChannels.sendOffersList, 0, offerJson, function(err, data){
464 setPrizeStatus(game, 1);
465 sendProcceed = false;
466 });
467 return;
468 }
469 offers.loadMyInventory({
470 appId: appId,
471 contextId: 2
472 }, function (err, items) {
473 if(err) {
474 //reWebLogOn(function() {
475 setPrizeStatus(game, 1);
476 sendProcceed = false;
477 //});
478 console.tag('SteamBot', 'SendPrize').log('LoadMyInventory error. Reset offers!');
479 return;
480 }
481 var itemsFromMe = [],
482 checkArr = [],
483 num = 0;
484 var i = 0;
485 for (var i = 0; i < sendItems.length; i++) {
486 for (var j = 0; j < items.length; j++) {
487 if (items[j].tradable && (items[j].classid == sendItems[i])) {
488 if ((checkArr.indexOf(items[j].id) == -1) && (checkArrGlobal.indexOf(items[j].id) == -1)) {
489 checkArr[i] = items[j].id;
490 itemsFromMe[num] = {
491 appid: 730,
492 contextid: 2,
493 amount: items[j].amount,
494 assetid: items[j].id
495 };
496 num++;
497 break;
498 }
499 }
500 }
501 }
502 if (num > 0) {
503 offers.makeOffer({
504 partnerSteamId: partnerSteamId,
505 accessToken: accessToken,
506 itemsFromMe: itemsFromMe,
507 itemsFromThem: [],
508 message: message
509 }, function (err, response) {
510 if (err) {
511 console.log(err);
512 if((err.toString().indexOf('(15)') != -1) || (err.toString().indexOf('available') != -1)) {
513 console.log('true');
514 redisClient.lrem(redisChannels.sendOffersList, 0, offerJson, function(err, data){
515 setPrizeStatus(game, 2);
516 sendProcceed = false;
517 });
518 return;
519 }
520 console.tag('SteamBot', 'SendPrize').error('Error to send offer.' + err);
521 setPrizeStatus(game, 1);
522 sendProcceed = false;
523 return;
524 }
525 checkArrGlobal = checkArrGlobal.concat(checkArr);
526 console.log(checkArrGlobal);
527 console.log(checkArr);
528 redisClient.lrem(redisChannels.sendOffersList, 0, offerJson, function(err, data){
529 setPrizeStatus(game, 1);
530 sendProcceed = false;
531 });
532 //SteamCommunity.checkConfirmations();
533 console.tag('SteamBot', 'SendPrize').log('TradeOffer #' + response.tradeofferid +' send!');
534 });
535 }else{
536 console.tag('SteamBot', 'SendPrize').log('Items not found!');
537 //setPrizeStatus(game, 2);
538 //sendProcceed = false;
539 redisClient.lrem(redisChannels.sendOffersList, 0, offerJson, function(err, data){
540 setPrizeStatus(game, 2);
541 sendProcceed = false;
542 });
543 }
544 });
545
546 });
547};
548
549var setPrizeStatus = function(game, status){
550 requestify.post('https://'+config.domain+'/api/setPrizeStatus', {
551 secretKey: config.secretKey,
552 game: game,
553 status: status
554 })
555 .then(function(response) {
556
557 },function(response){
558 console.tag('SteamBot').log('Something wrong with set prize status. Retry...');
559 setTimeout(function(){setPrizeStatus()}, 1000);
560 });
561}
562
563var is_checkingOfferExists = function(tradeofferid){
564 for(var i = 0, len = checkingOffers.length; i<len; ++i ){
565 var offer = checkingOffers[i];
566 if(offer == tradeofferid){
567 return true;
568 break;
569 }
570 }
571 return false;
572}
573
574var checkedOffersProcceed = function(offerJson){
575 var d = domain.create();
576 d.on('error', function(err) {
577 console.tag('SteamBot').log(err.stack);
578 });
579
580 d.run(function () {
581 var offer = JSON.parse(offerJson);
582 if (offer.success) {
583 console.tag('SteamBot').log('Procceding accept: #' + offer.offerid);
584 offers.acceptOffer({tradeOfferId: offer.offerid}, function (err, body) {
585 if (!err) {
586 redisClient.multi([
587 ["lrem", redisChannels.tradeoffersList, 0, offer.offerid],
588 ["lrem", redisChannels.usersQueue, 0, offer.steamid64],
589 ["rpush", redisChannels.betsList, offerJson],
590 ["lrem", redisChannels.checkedList, 0, offerJson]
591 ])
592 .exec(function (err, replies) {
593 redisClient.lrange(redisChannels.usersQueue, 0, -1, function(err, queues) {
594 addQueue(queues, queues.length);
595 console.tag('SteamBot').log("New bet Accepted!");
596 checkedProcceed = false;
597 });
598 });
599
600 } else {
601 console.tag('SteamBot').error('Error. With accept tradeoffer #' + offer.offerid)
602 .tag('SteamBot').log(err);
603 offers.getOffer({tradeOfferId: offer.offerid}, function (err, body){
604 if(err) {
605 checkedProcceed = false;
606 return;
607 }
608 if(body.response.offer){
609 var offerCheck = body.response.offer;
610 if(offerCheck.trade_offer_state == 2) {
611 checkedProcceed = false;
612 return;
613 }
614 if(offerCheck.trade_offer_state == 3){
615 redisClient.multi([
616 ["lrem", redisChannels.tradeoffersList, 0, offer.offerid],
617 ["lrem", redisChannels.usersQueue, 0, offer.steamid64],
618 ["rpush", redisChannels.betsList, offerJson],
619 ["lrem", redisChannels.checkedList, 0, offerJson]
620 ])
621 .exec(function (err, replies) {
622 redisClient.lrange(redisChannels.usersQueue, 0, -1, function(err, queues) {
623 addQueue(queues, queues.length);
624 checkedProcceed = false;
625 });
626 });
627 }else {
628 redisClient.multi([
629 ["lrem", redisChannels.tradeoffersList, 0, offer.offerid],
630 ["lrem", redisChannels.usersQueue, 0, offer.steamid64],
631 ["lrem", redisChannels.checkedList, 0, offerJson]
632 ])
633 .exec(function (err, replies) {
634 redisClient.lrange(redisChannels.usersQueue, 0, -1, function(err, queues) {
635 addQueue(queues, queues.length);
636
637 checkedProcceed = false;
638 });
639 });
640 }
641 }
642 })
643 }
644 });
645 }
646 });
647}
648
649var declineOffersProcceed = function(offerid){
650 console.tag('SteamBot').log('Procceding decline: #' + offerid);
651 offers.declineOffer({tradeOfferId: offerid}, function (err, body) {
652 if (!err) {
653 console.tag('SteamBot').log('Offer #' + offerid + ' Decline!');
654 redisClient.lrem(redisChannels.declineList, 0, offerid);
655 declineProcceed = false;
656 } else {
657 console.tag('SteamBot').error('Error. With decline tradeoffer #' + offer.offerid)
658 .tag('SteamBot').log(err);
659 declineProcceed = false;
660 }
661 });
662}
663
664var queueProceed = function() {
665 redisClient.llen(redisChannels.checkList, function(err, length) {
666 if (length > 0 && !checkProcceed) {
667 console.tag('SteamBot','Queues').info('CheckOffers:' + length);
668 checkProcceed = true;
669 checkOfferPrice();
670 }
671 });
672 redisClient.llen(redisChannels.checkedList, function(err, length) {
673 if(length > 0 && !checkedProcceed && WebSession) {
674 console.tag('SteamBot','Queues').info('CheckedOffers:' + length);
675 checkedProcceed = true;
676 redisClient.lindex(redisChannels.checkedList, 0,function (err, offer) {
677 checkedOffersProcceed(offer);
678 });
679 }
680 });
681 redisClient.llen(redisChannels.declineList, function(err, length) {
682 if(length > 0 && !declineProcceed && WebSession) {
683 console.tag('SteamBot','Queues').info('DeclineOffers:' + length);
684 declineProcceed = true;
685 redisClient.lindex(redisChannels.declineList, 0,function (err, offer) {
686 declineOffersProcceed(offer);
687 });
688 }
689 });
690 redisClient.llen(redisChannels.betsList, function(err, length) {
691 if (length > 0 && !betsProcceed && !delayForNewGame) {
692 console.tag('SteamBot','Queues').info('Bets:' + length);
693 betsProcceed = true;
694 checkNewBet();
695 }
696 });
697 redisClient.llen(redisChannels.sendOffersList, function(err, length) {
698 if (length > 0 && !sendProcceed && WebSession) {
699 console.tag('SteamBot','Queues').info('Send winner offers:' + length);
700 sendProcceed = true;
701 redisClient.lindex(redisChannels.sendOffersList, 0,function (err, offerJson) {
702 offer = JSON.parse(offerJson);
703 sendTradeOffer(offer.appId, offer.steamid, offer.accessToken, offer.items, '', offer.game, offerJson);
704 });
705 }
706 });
707 redisClient.llen(redisChannels.sendOffersListLottery, function(err, length) {
708 if (length > 0 && !sendProcceedLottery && WebSession) {
709 console.tag('SteamBot','Queues').info('Send lottery winner offers:' + length);
710 sendProcceedLottery = true;
711 redisClient.lindex(redisChannels.sendOffersListLottery, 0,function (err, offerJson) {
712 offer = JSON.parse(offerJson);
713 sendTradeOfferLottery(offer.appId, offer.steamid, offer.accessToken, offer.items, '', offer.game, offerJson);
714 });
715 }
716 });
717 redisClient.llen(redisChannels.checkItemsList, function(err, length) {
718 if (length > 0 && !parseItemsProcceed && WebSession) {
719 console.tag('SteamBot','Queues').info('Parse items:' + length);
720 parseItemsProcceed = true;
721 redisClient.lindex(redisChannels.checkItemsList, 0, function (err, offerJson) {
722 offer = JSON.parse(offerJson);
723 countRetries[offerJson.tradeofferid] = 0;
724 parseOffer(offer, offerJson);
725 });
726 }
727 });
728}
729var parseItemsProcceed = false;
730var checkProcceed = false;
731var checkedProcceed = false;
732var declineProcceed = false;
733var betsProcceed = false;
734var sendProcceed = false;
735var sendProcceedLottery = false;
736var delayForNewGame = false;
737setInterval(queueProceed, 1500);
738
739module.exports.handleOffers = handleOffers;
740module.exports.delayForNewGame = function(value){
741 delayForNewGame = value;
742};
743
744function str_replace ( search, replace, subject ) {
745 if(!(replace instanceof Array)){
746 replace=new Array(replace);
747 if(search instanceof Array){
748 while(search.length>replace.length){
749 replace[replace.length]=replace[0];
750 }
751 }
752 }
753
754 if(!(search instanceof Array))search=new Array(search);
755 while(search.length>replace.length){
756 replace[replace.length]='';
757 }
758
759 if(subject instanceof Array){
760 for(k in subject){
761 subject[k]=str_replace(search,replace,subject[k]);
762 }
763 return subject;
764 }
765
766 for(var k=0; k<search.length; k++){
767 var i = subject.indexOf(search[k]);
768 while(i>-1){
769 subject = subject.replace(search[k], replace[k]);
770 i = subject.indexOf(search[k],i);
771 }
772 }
773
774 return subject;
775
776}