· 8 years ago · Apr 19, 2017, 03:48 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 SteamCommunity = require('steamcommunity');
10var SteamcommunityMobileConfirmations = require('steamcommunity-mobile-confirmations');
11var SteamTotp = require('steam-totp');
12var redisClient, io, requestify;
13var acceptInterval;
14
15module.exports.init = function (redis, ioSocket, requestifyCore) {
16 io = ioSocket;
17 redisClient = redis.createClient();
18 requestify = requestifyCore;
19}
20
21var details = {
22 account_name: config.bot.username,
23 password: config.bot.password,
24 two_factor_code: generatekey(config.bot.secret)
25};
26
27var steamClient = new Steam.SteamClient();
28var steamUser = new Steam.SteamUser(steamClient);
29var steamFriends = new Steam.SteamFriends(steamClient);
30var steamWebLogOn = new SteamWebLogOn(steamClient, steamUser);
31var offers = new SteamTradeOffers();
32
33// Generation Device_ID
34var hash = require('crypto').createHash('sha1');
35hash.update(Math.random().toString());
36hash = hash.digest('hex');
37var device_id = 'android:' + hash;
38
39var checkingOffers = [],
40 WebCookies = [],
41 WebSession = false,
42 globalSession;
43
44const redisChannels = {
45 checkItemsList: 'checkItems.list',
46 checkList: 'check.list',
47 checkedList: 'checked.list',
48 betsList: 'bets.list',
49 sendOffersList: 'send.offers.list',
50 tradeoffersList: 'tradeoffers.list',
51 declineList: 'decline.list',
52 usersQueue: 'usersQueue.list',
53 sendShopList: 'send.shop.list',
54 itemstobonus: 'items.to.bonus'
55}
56var addNewItemsBonus = function(){
57 requestify.post('https://'+config.domain+'/api/newItemsBonus', {
58 secretKey: config.secretKey
59 })
60 .then(function(response) {
61 var answer = JSON.parse(response.body);
62 if(answer.success){
63 console.tag('SteamBotBonus').log('success');
64 itemsTobonusProcced = false;
65 }
66 },function(response){
67 console.tag('SteamBotShop').error('Something wrong with newItems. Retry...');
68 setTimeout(function(){addNewItemsBonus()}, 1000);
69 });
70}
71function steamBotLogger(log) {
72 console.tag('БОТ').log(log);
73}
74
75function EscrowLogger(log) {
76 console.tag('ЕÑкроу Бот').info(log);
77}
78
79function generatekey(secret) {
80 code = SteamTotp.generateAuthCode(secret);
81 EscrowLogger('Сгенерированный код : ' + code);
82 return code;
83}
84steamFriends.on('friendMsg', function(steamID, message, type) {
85 if (WebSession){
86 if (config.admins.indexOf(steamID) == -1) return;
87 if (message.indexOf("/bonus") == 0) {
88 steamFriends.sendMessage(steamID, "ДобовлÑÑŽ!");
89 MyInvToSite();
90 }
91 }
92});
93var MyInvToSite = function() {
94 console.tag('БОÐУС').log('UpdatingSiteItems');
95 try {
96 var itemstobonus = [], i = 0;
97 offers.loadMyInventory({
98 appId: 730,
99 contextId: 2,
100 language: 'russian'
101 }, function (error, botItems) {
102 if (!error) {
103 i = 0;
104 botItems.forEach(function (item) {
105 if (item.tradable) {
106 var rarity = '', type = '';
107 var arr = item.type.split(',');
108 if (arr.length == 2) rarity = arr[1].trim();
109 if (arr.length == 3) rarity = arr[2].trim();
110 if (arr.length && arr[0] == 'Ðож') rarity = 'Тайное';
111 if (arr.length) type = arr[0];
112 var quality = item.market_name.match(/\(([^()]*)\)/);
113 if (quality != null && quality.length == 2) quality = quality[1];
114 itemstobonus[i++] = {
115 inventoryId: item.id,
116 classid: item.classid,
117 name: item.name,
118 market_hash_name: item.market_hash_name,
119 rarity: rarity,
120 quality: quality,
121 type: type
122 }
123 }
124 });
125 }
126 redisClient.rpush(redisChannels.itemstobonus, JSON.stringify(itemstobonus));
127 return;
128 });
129 } catch (ex) {
130 console.tag('БОÐУС').error('Error to send the item');
131 sendProcceed = false;
132 }
133};
134steamClient.connect();
135steamClient.on('debug', steamBotLogger);
136steamClient.on('connected', function () {
137 steamUser.logOn(details);
138});
139
140steamClient.on('logOnResponse', function (logonResp) {
141 if (logonResp.eresult === Steam.EResult.OK) {
142 steamBotLogger('ЗалогинилÑÑ!');
143 steamFriends.setPersonaState(Steam.EPersonaState.Online);
144
145 steamWebLogOn.webLogOn(function (sessionID, newCookie) {
146 getSteamAPIKey({
147 sessionID: sessionID,
148 webCookie: newCookie
149 }, function (err, APIKey) {
150 offers.setup({
151 sessionID: sessionID,
152 webCookie: newCookie,
153 APIKey: APIKey
154 }, function (err) {
155 WebSession = true;
156 globalSession = sessionID;
157 WebCookies = newCookie;
158 redisClient.lrange(redisChannels.tradeoffersList, 0, -1, function (err, offers) {
159 offers.forEach(function (offer) {
160 checkingOffers.push(offer);
161 });
162 handleOffers();
163 });
164 steamBotLogger('ÐаÑтройка трейдов!');
165 });
166
167 });
168 });
169 }
170});
171
172
173function handleOffers() {
174 offers.getOffers({
175 get_received_offers: 1,
176 active_only: 1
177 }, function (error, body) {
178 if (
179 body
180 && body.response
181 && body.response.trade_offers_received
182 ) {
183 body.response.trade_offers_received.forEach(function (offer) {
184 if (offer.trade_offer_state == 2) {
185 if (is_checkingOfferExists(offer.tradeofferid)) return;
186
187 if (offer.items_to_give != null && config.admins.indexOf(offer.steamid_other) != -1) {
188 console.tag('БОТ', 'Трейд').log('Трейд #' + offer.tradeofferid + ' От: ÐДМИÐÐ ' + offer.steamid_other);
189 offers.acceptOffer({tradeOfferId: offer.tradeofferid});
190 return;
191 }
192 if (offer.items_to_give != null) {
193 offers.declineOffer({tradeOfferId: offer.tradeofferid});
194 return;
195 }
196 offers.getTradeHoldDuration({tradeOfferId: offer.tradeofferid}, function (err, response) {
197 if (err) {
198 steamBotLogger('Отклонение. Ðету ESCROW: ' + err);
199 offers.declineOffer({tradeOfferId: offer.tradeofferid});
200 steamBotLogger('Отклонение. Ðету ESCROW: ' + offer.tradeofferid);
201 return;
202 } else if (response.their != 0) {
203 steamBotLogger('response.their: ' + response.their);
204 offers.declineOffer({tradeOfferId: offer.tradeofferid});
205 steamBotLogger('Отклонение. Ðету ESCROW: ' + offer.tradeofferid);
206 return;
207 }
208 });
209 if (offer.items_to_receive != null && offer.items_to_give == null) {
210 checkingOffers.push(offer.tradeofferid);
211 console.tag('БОТ', 'Трейдофферы').log('Трейд #' + offer.tradeofferid + ' От: ' + offer.steamid_other);
212 redisClient.multi([
213 ['rpush', redisChannels.tradeoffersList, offer.tradeofferid],
214 ['rpush', redisChannels.checkItemsList, JSON.stringify(offer)],
215 ['rpush', redisChannels.usersQueue, offer.steamid_other]
216 ]).exec(function () {
217 redisClient.lrange(redisChannels.usersQueue, 0, -1, function (err, queues) {
218 io.sockets.emit('queue', queues);
219 });
220 });
221 return;
222 }
223 }
224 });
225 }
226 });
227}
228
229steamUser.on('tradeOffers', function (number) {
230 if (number > 0) {
231 handleOffers();
232 }
233});
234
235
236var parseOffer = function (offer, offerJson) {
237 offers.loadPartnerInventory({
238 partnerSteamId: offer.steamid_other,
239 appId: 730,
240 contextId: 2,
241 tradeOfferId: offer.tradeofferid,
242 language: "english"
243 }, function (err, hitems) {
244 if (err) {
245 redisClient.multi([
246 ['rpush', redisChannels.declineList, offer.tradeofferid],
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] == 'Ðож') type = '★';
273 switch (type) {
274 case 'ÐрмейÑкое качеÑтво':
275 rarity = 'milspec';
276 break;
277 case 'Запрещенное':
278 rarity = 'restricted';
279 break;
280 case 'ЗаÑекреченное':
281 rarity = 'classified';
282 break;
283 case 'Тайное':
284 rarity = 'covert';
285 break;
286 case 'Ширпотреб':
287 rarity = 'common';
288 break;
289 case 'Промышленное качеÑтво':
290 rarity = 'common';
291 break;
292 case '★':
293 rarity = 'rare';
294 break;
295 }
296 items_to_check[num].rarity = rarity;
297 num++;
298 break;
299 }
300 }
301 }
302 var value = {
303 offerid: offer.tradeofferid,
304 accountid: offer.steamid_other,
305 items: JSON.stringify(items_to_check)
306 };
307
308 console.tag('БОТ', 'Трейд #' + value.offerid).log(value);
309
310 redisClient.multi([
311 ['rpush', redisChannels.checkList, JSON.stringify(value)],
312 ['lrem', redisChannels.checkItemsList, 0, offerJson]
313 ])
314 .exec(function (err, replies) {
315 parseItemsProcceed = false;
316 });
317
318 });
319}
320
321var checkOfferPrice = function () {
322 requestify.post('https://' + config.domain + '/api/checkOffer', {
323 secretKey: config.secretKey
324 })
325 .then(function (response) {
326 var answer = JSON.parse(response.body);
327
328 if (answer.success) {
329 checkProcceed = false;
330 }
331 }, function (response) {
332 console.tag('БОТ').error('Something wrong with check offers. Retry...');
333 setTimeout(function () {
334 checkOfferPrice()
335 }, 1000);
336 });
337
338}
339
340var checkNewBet = function () {
341 requestify.post('https://' + config.domain + '/api/newBet', {
342 secretKey: config.secretKey
343 })
344 .then(function (response) {
345 var answer = JSON.parse(response.body);
346 if (answer.success) {
347 betsProcceed = false;
348 }
349 }, function (response) {
350 console.tag('БОТ').error('Something wrong with send a new bet. Retry...');
351 setTimeout(function () {
352 checkNewBet()
353 }, 1000);
354 });
355}
356
357var checkArrGlobal = [];
358
359
360var sendShopTradeOffer = function(appId, partnerSteamId, accessToken, sendItems, message, game, offerJson){
361 try {
362 offers.loadMyInventory({
363 appId: appId,
364 contextId: 2
365 }, function (err, items) {
366 if(err) {
367 console.log(err);
368 sendShopProcceed = false;
369 return;
370 }
371 var itemsFromMe = [],
372 checkArr = [],
373 num = 0;
374 var i = 0;
375 for (var i = 0; i < sendItems.length; i++) {
376 for (var j = 0; j < items.length; j++) {
377 if (items[j].tradable && (items[j].classid == sendItems[i])) {
378 if ((checkArr.indexOf(items[j].id) == -1) && (checkArrGlobal.indexOf(items[j].id) == -1)) {
379 checkArr[i] = items[j].id;
380 itemsFromMe[num] = {
381 appid: 730,
382 contextid: 2,
383 amount: items[j].amount,
384 assetid: items[j].id
385 };
386 num++;
387 break;
388 }
389 }
390 }
391 }
392 if (num > 0) {
393 offers.makeOffer({
394 partnerSteamId: partnerSteamId,
395 accessToken: accessToken,
396 itemsFromMe: itemsFromMe,
397 itemsFromThem: [],
398 message: 'Ваша покупка на Ñайте '+config.domain
399 }, function (err, response) {
400 if (err) {
401 console.tag('SteamBot', 'SendPrize').error('Shop: Error to send offer:' + err.message);
402 getErrorCode(err.message, function(errCode){
403 if(errCode == 15) {
404 redisClient.lrem(redisChannels.sendShopList, 0, offerJson, function (err, data) {
405 sendShopProcceed = false;
406 });
407 sendShopProcceed = false;
408 }
409 sendProsendShopProcceedcceed = false;
410 });
411 return;
412 }
413 checkArrGlobal = checkArrGlobal.concat(checkArr);
414 console.log(checkArrGlobal);
415 console.log(checkArr);
416 redisClient.lrem(redisChannels.sendShopList, 0, offerJson, function(err, data){
417 sendShopProcceed = false;
418 });
419 console.tag('SteamBot', 'SendPrize').log('Shop: TradeOffer #' + response.tradeofferid +' send!');
420 });
421 }else{
422 console.tag('SteamBot', 'SendPrize').log('Shop: Items not found!');
423 redisClient.lrem(redisChannels.sendShopList, 0, offerJson, function(err, data){
424 sendShopProcceed = false;
425 });
426 }
427 });
428
429 }catch(ex){
430 console.tag('SteamBot').error('Shop: Error to send the bet');
431 setPrizeStatus(game, 2);
432 sendShopProcceed = false;
433 }
434};
435
436var sendTradeOffer = function (appId, partnerSteamId, accessToken, sendItems, message, game, offerJson) {
437 try {
438 offers.loadMyInventory({
439 appId: appId,
440 contextId: 2
441 }, function (err, items) {
442 if (err) {
443 console.log(err);
444 sendProcceed = false;
445 return;
446 }
447 var itemsFromMe = [],
448 checkArr = [],
449 num = 0;
450 var i = 0;
451 for (var i = 0; i < sendItems.length; i++) {
452 for (var j = 0; j < items.length; j++) {
453 if (items[j].tradable && (items[j].classid == sendItems[i])) {
454 if ((checkArr.indexOf(items[j].id) == -1) && (checkArrGlobal.indexOf(items[j].id) == -1)) {
455 checkArr[i] = items[j].id;
456 itemsFromMe[num] = {
457 appid: 730,
458 contextid: 2,
459 amount: items[j].amount,
460 assetid: items[j].id
461 };
462 num++;
463 break;
464 }
465 }
466 }
467 }
468 if (num > 0) {
469 offers.makeOffer({
470 partnerSteamId: partnerSteamId,
471 accessToken: accessToken,
472 itemsFromMe: itemsFromMe,
473 itemsFromThem: [],
474 message: 'ПоздравлÑем Ñ Ð¿Ð¾Ð±ÐµÐ´Ð¾Ð¹ на Ñайте ' + config.nameSite + ' | Ð’ игре #' + game
475 }, function (err, response) {
476 if (err) {
477 console.tag('БОТ', 'Отправка выигрыша').error('Ошибка отправки выигрыша:' + err.message);
478 getErrorCode(err.message, function (errCode) {
479 if (errCode == 15 || errCode == 25 || err.message.indexOf('Ошибка отправки вашего трейда. Попробуйте позже!')) {
480 redisClient.lrem(redisChannels.sendOffersList, 0, offerJson, function (err, data) {
481 setPrizeStatus(game, 2);
482 sendProcceed = false;
483 });
484 sendProcceed = false;
485 }
486 sendProcceed = false;
487 });
488 return;
489 }
490 checkArrGlobal = checkArrGlobal.concat(checkArr);
491 redisClient.lrem(redisChannels.sendOffersList, 0, offerJson, function (err, data) {
492 setPrizeStatus(game, 1);
493 sendProcceed = false;
494 });
495 console.tag('БОТ', 'Отправка выигрыша').log('Трейд #' + response.tradeofferid + ' отправлен!');
496 AcceptMobileOffer();
497 });
498 } else {
499 console.tag('БОТ', 'Отправка выигрыша').log('Вещи не найдены!');
500 redisClient.lrem(redisChannels.sendOffersList, 0, offerJson, function (err, data) {
501 setPrizeStatus(game, 1);
502 sendProcceed = false;
503 });
504 }
505 });
506
507 } catch (ex) {
508 console.tag('БОТ').error('Ошибка отправки выигрыша');
509 setPrizeStatus(game, 2);
510 sendProcceed = false;
511 }
512};
513
514var setPrizeStatus = function (game, status) {
515 requestify.post('https://' + config.domain + '/api/setPrizeStatus', {
516 secretKey: config.secretKey,
517 game: game,
518 status: status
519 })
520 .then(function (response) {
521
522 }, function (response) {
523 console.tag('БОТ').log('Ошибка Ñ ÑтатуÑом приза. Перепробываем...');
524 setTimeout(function () {
525 setPrizeStatus()
526 }, 1000);
527 });
528}
529
530var is_checkingOfferExists = function (tradeofferid) {
531 for (var i = 0, len = checkingOffers.length; i < len; ++i) {
532 var offer = checkingOffers[i];
533 if (offer == tradeofferid) {
534 return true;
535 break;
536 }
537 }
538 return false;
539}
540
541var checkedOffersProcceed = function (offerJson) {
542 var offer = JSON.parse(offerJson);
543 if (offer.success) {
544 console.tag('БОТ').log('ПроцеÑÑ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ñ‚Ñ€ÐµÐ¹Ð´Ð°: #' + offer.offerid);
545 offers.acceptOffer({tradeOfferId: offer.offerid}, function (err, body) {
546 if (!err) {
547 redisClient.multi([
548 ["lrem", redisChannels.tradeoffersList, 0, offer.offerid],
549 ["lrem", redisChannels.usersQueue, 1, offer.steamid64],
550 ["rpush", redisChannels.betsList, offerJson],
551 ["lrem", redisChannels.checkedList, 0, offerJson]
552 ])
553 .exec(function (err, replies) {
554 redisClient.lrange(redisChannels.usersQueue, 0, -1, function (err, queues) {
555 io.sockets.emit('queue', queues);
556 console.tag('БОТ').log("Ставка принÑта!");
557 checkedProcceed = false;
558 });
559 });
560 } else {
561 console.tag('БОТ').error('Ошибка при принÑтии трейда #' + offer.offerid)
562 .tag('БОТ').log(err);
563
564 offers.getOffer({tradeOfferId: offer.offerid}, function (err, body) {
565 if (body.response.offer) {
566 var offerCheck = body.response.offer;
567 if (offerCheck.trade_offer_state == 2) {
568 checkedProcceed = false;
569 return;
570 }
571 if (offerCheck.trade_offer_state == 3) {
572 redisClient.multi([
573 ["lrem", redisChannels.tradeoffersList, 0, offer.offerid],
574 ["lrem", redisChannels.usersQueue, 1, offer.steamid64],
575 ["rpush", redisChannels.betsList, offerJson],
576 ["lrem", redisChannels.checkedList, 0, offerJson]
577 ])
578 .exec(function (err, replies) {
579 redisClient.lrange(redisChannels.usersQueue, 0, -1, function (err, queues) {
580 io.sockets.emit('queue', queues);
581 checkedProcceed = false;
582 });
583 });
584 } else {
585 redisClient.multi([
586 ["lrem", redisChannels.tradeoffersList, 0, offer.offerid],
587 ["lrem", redisChannels.usersQueue, 1, offer.steamid64],
588 ["lrem", redisChannels.checkedList, 0, offerJson]
589 ])
590 .exec(function (err, replies) {
591 redisClient.lrange(redisChannels.usersQueue, 0, -1, function (err, queues) {
592 io.sockets.emit('queue', queues);
593 checkedProcceed = false;
594 });
595 });
596 }
597 }
598 })
599 }
600 });
601 }
602}
603
604function AcceptMobileOffer() {
605 // Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… подтверждений
606 var steamcommunityMobileConfirmations = new SteamcommunityMobileConfirmations(
607 {
608 steamid: config.bot.steamid,
609 identity_secret: config.bot.identity_secret,
610 device_id: device_id,
611 webCookie: WebCookies,
612 });
613
614 steamcommunityMobileConfirmations.FetchConfirmations((function (err, confirmations) {
615 if (err) {
616 console.log(err);
617 return;
618 }
619 console.tag('БОТ', 'Мобильное подтверждение').log('Трейдов в ожидании: ' + confirmations.length);
620 if (!confirmations.length) {
621 return;
622 }
623 steamcommunityMobileConfirmations.AcceptConfirmation(confirmations[0], (function (err, result) {
624 if (err) {
625 console.log(err);
626 return;
627 }
628 clearInterval(acceptInterval);
629 console.tag('БОТ', 'Мобильное подтверждение').log('Результат: ' + result);
630 }).bind(this));
631 }).bind(this));
632}
633
634var declineOffersProcceed = function (offerid) {
635 console.tag('БОТ').log('ПроцеÑÑ Ð¾Ñ‚ÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ: #' + offerid);
636 offers.declineOffer({tradeOfferId: offerid}, function (err, body) {
637 if (!err) {
638 console.tag('БОТ').log('Трейд #' + offerid + ' Отклонен!');
639 redisClient.lrem(redisChannels.declineList, 0, offerid);
640 declineProcceed = false;
641 } else {
642 console.tag('БОТ').error('Ошибка при принÑтии трейда #' + offer.offerid)
643 .tag('БОТ').log(err);
644 declineProcceed = false;
645 }
646 });
647}
648
649var queueProceed = function () {
650 redisClient.llen(redisChannels.itemstobonus, function(err, length) {
651 if (length > 0 && !itemsTobonusProcced) {
652 console.tag('SteamBotBonus','Queues').info('New items to bonus:' + length);
653 itemsTobonusProcced = true;
654 addNewItemsBonus();
655 }
656 });
657 redisClient.llen(redisChannels.checkList, function (err, length) {
658 if (length > 0 && !checkProcceed) {
659 console.tag('БОТ', 'Проверка').info('Проверка трейдов:' + length);
660 checkProcceed = true;
661 checkOfferPrice();
662 }
663 });
664 redisClient.llen(redisChannels.checkedList, function (err, length) {
665 if (length > 0 && !checkedProcceed && WebSession) {
666 console.tag('БОТ', 'Проверка').info('Проверено трейдов:' + length);
667 checkedProcceed = true;
668 redisClient.lindex(redisChannels.checkedList, 0, function (err, offer) {
669 checkedOffersProcceed(offer);
670 });
671 }
672 });
673 redisClient.llen(redisChannels.declineList, function (err, length) {
674 if (length > 0 && !declineProcceed && WebSession) {
675 console.tag('БОТ', 'Проверка').info('Отклонено трейдов:' + length);
676 declineProcceed = true;
677 redisClient.lindex(redisChannels.declineList, 0, function (err, offer) {
678 declineOffersProcceed(offer);
679 });
680 }
681 });
682 redisClient.llen(redisChannels.betsList, function (err, length) {
683 if (length > 0 && !betsProcceed && !delayForNewGame) {
684 console.tag('БОТ', 'Проверка').info('Ставок:' + length);
685 betsProcceed = true;
686 checkNewBet();
687 }
688 });
689 redisClient.llen(redisChannels.sendOffersList, function (err, length) {
690 if (length > 0 && !sendProcceed && WebSession) {
691 console.tag('БОТ', 'Проверка').info('Отправка трейда победителю:' + length);
692 sendProcceed = true;
693 redisClient.lindex(redisChannels.sendOffersList, 0, function (err, offerJson) {
694 offer = JSON.parse(offerJson);
695 sendTradeOffer(offer.appId, offer.steamid, offer.accessToken, offer.items, '', offer.game, offerJson);
696 });
697 }
698 });
699 redisClient.llen(redisChannels.sendShopList, function(err, length) {
700 if (length > 0 && !sendShopProcceed && WebSession) {
701 console.tag('Магазин','Проверка').info('Отправка вещей из магазина:' + length);
702 sendShopProcceed = true;
703 redisClient.lindex(redisChannels.sendShopList, 0,function (err, offerJson) {
704 offer = JSON.parse(offerJson);
705 sendShopTradeOffer(offer.appId, offer.steamid, offer.accessToken, offer.items, '', offer.game, offerJson);
706 });
707 }
708 });
709 redisClient.llen(redisChannels.checkItemsList, function (err, length) {
710 if (length > 0 && !parseItemsProcceed && WebSession) {
711 console.tag('БОТ', 'Проверка').info('ÐŸÐ°Ñ€Ñ Ð²ÐµÑ‰ÐµÐ¹:' + length);
712 parseItemsProcceed = true;
713 redisClient.lindex(redisChannels.checkItemsList, 0, function (err, offerJson) {
714 offer = JSON.parse(offerJson);
715 parseOffer(offer, offerJson);
716 });
717 }
718 });
719}
720var parseItemsProcceed = false;
721var itemsTobonusProcced = false;
722var checkProcceed = false;
723var checkedProcceed = false;
724var declineProcceed = false;
725var betsProcceed = false;
726var sendProcceed = false;
727var delayForNewGame = false;
728var sendShopProcceed = false;
729setInterval(queueProceed, 1500);
730setInterval(AcceptMobileOffer, 15000);
731
732
733module.exports.handleOffers = handleOffers;
734module.exports.delayForNewGame = function (value) {
735 delayForNewGame = value;
736};
737
738function getErrorCode(err, callback) {
739 var errCode = 0;
740 var match = err.match(/\(([^()]*)\)/);
741 if (match != null && match.length == 2) errCode = match[1];
742 callback(errCode);
743}
744
745/*function checkBadGame(){
746var mysql = require('mysql');
747var connection = mysql.createConnection({
748host : 'localhost',
749user : 'root',
750password : '5h9n1zt9XNoO',
751database : 'acsgo'
752});
753
754connection.connect();
755
756//Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ‚ нам вытащить данные о игре предметы и users
757getBadGame ='SELECT won_items, winner_id, items, won_items, g.id as id, steamid64, accessToken FROM `games` as g JOIN users as u ON winner_id = u.id WHERE `status_prize` = 2 AND status = 3 ORDER BY id DESC LIMIT 0,1';
758connection.query(getBadGame, function(err, rows, fields) {
759//проходимÑÑ Ð¿Ð¾ каждому пользователю
760rows.forEach(function(item, i, arr) {
761console.log('Игра # '+item.id+' пользователю #'+ item.winner_id + ' не отправлено '+ item.items +" предметов. ПытаемÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ.");
762sendoffer = [];
763offer = JSON.parse(item.won_items);
764offer.forEach(function(it, key, array) {
765sendoffer.push(it.classid);
766});
767sendTradeOffer(730, item.steamid64, item.accessToken, sendoffer, '', item.id, '');
768});
769});
770connection.end();
771}
772setInterval(function(){checkBadGame();}, 999000000);*/