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