· 8 years ago · Jul 20, 2017, 04:22 PM
1var Winston = require('winston');
2var Logger = new (Winston.Logger)({
3 transports: [
4 new (Winston.transports.Console)({
5 colorize: true,
6 timestamp: true,
7 level: 'debug',
8 label: 'BOT'
9 }),
10 new (Winston.transports.File)({
11 level: 'info',
12 label: 'BOT',
13 createDirectory: true,
14 timestamp: true,
15 filename: 'bot.log',
16 json: false
17 })
18 ]
19});
20
21var Crypto = require("crypto");
22
23var SteamUser = require('steam-user');
24var SteamTotp = require('steam-totp');
25var SteamTradeOffers = require('steam-tradeoffers');
26var TradeOfferManager = require('steam-tradeoffer-manager');
27var Steamcommunity = require('steamcommunity');
28
29var Client = new SteamUser();
30var Offers = new SteamTradeOffers();
31var Manager = new TradeOfferManager({
32 "steam": Client,
33 "domain": "localhost",
34 "language": "ru",
35 "pollInterval": 15000
36});
37var Community = new Steamcommunity();
38
39var Config = require('./config.js');
40
41/**
42 * Старый говно код
43 */
44
45var RedisClient, io, Requestify;
46
47module.exports.init = function (redis, ioSocket, requestifyCore) {
48 io = ioSocket;
49 RedisClient = redis.createClient({host: Config.redis.host, port: Config.redis.port});
50 Requestify = requestifyCore;
51};
52
53var RedisChannels = {
54 checkList: 'check.list',
55 checkedList: 'checked.list',
56 betsList: 'bets.list',
57 sendOffersList: 'send.offers.list',
58 tradeoffersList: 'tradeoffers.list',
59 declineList: 'decline.list',
60 usersQueue: 'usersQueue.list',
61 itemstobonus: 'items.to.bonus'
62};
63
64/**
65 * Переменные авторизации
66 */
67
68var LogonDetails = {
69 "accountName": Config.bot.username,
70 "password": Config.bot.password,
71 "twoFactorCode": SteamTotp.getAuthCode(Config.bot.secret)
72};
73
74
75
76var Variables = {
77 redis: {
78 checkProcceed: false,
79 checkedProcceed: false,
80 declineProcceed: false,
81 betsProcceed: false,
82 sendProcceed: false,
83 itemsTobonusProcced: false
84 },
85 auth: false,
86 delayForNewGame: null,
87 depositTime: null,
88 acceptOffer: null,
89 checkingOffers: []
90};
91
92/**
93 * ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð¾Ñ‚Ð°
94 */
95
96Client.logOn(LogonDetails);
97
98/**
99 * Обработка депозита
100 */
101
102var Deposit_Check = function () {
103
104 Variables.depositTime = Date.now();
105
106 Requestify.post('http://localhost/api/checkOffer', {
107 secretKey: Config.secretKey
108 }).then(function (response) {
109
110 if (JSON.parse(response.body).success) {
111 Variables.redis.checkProcceed = false;
112 }
113
114 }, function (response) {
115 Logger.error("Ошибка при проверке оффера");
116 console.log(response.body);
117 setTimeout(function () {
118 Deposit_Check();
119 }, 2000);
120 });
121};
122
123var Deposit_Accept = function (offer) {
124
125 if (!Variables.acceptOffer) {
126 Logger.info("Попытка принÑÑ‚Ð¸Ñ Ð¾Ñ„Ñ„ÐµÑ€Ð° #" + offer.id);
127
128 Variables.acceptOffer = true;
129 }
130
131 Offers.acceptOffer({tradeOfferId: offer.id}, function (err, body) {
132 if (!err && body) {
133 RedisClient.multi([
134 ["lrem", RedisChannels.tradeoffersList, 0, offer.id],
135 ["lrem", RedisChannels.usersQueue, 1, offer.steamid64],
136 ["rpush", RedisChannels.betsList, JSON.stringify(offer)]
137 ]).exec(function (err, replies) {
138 RedisClient.lrange(RedisChannels.usersQueue, 0, -1, function (err, queues) {
139 io.sockets.emit('queue', queues);
140
141 RedisClient.lrange(RedisChannels.checkedList, 0, -1, function (err, queues) {
142 queues.forEach(function (element, i, arr) {
143 if (JSON.parse(element).id == offer.id) {
144 RedisClient.lrem(RedisChannels.checkedList, 0, element);
145 }
146 });
147 });
148
149 Logger.info("Оффер #" + offer.id + " уÑпешно принÑÑ‚");
150 Logger.info("Оффер #" + offer.id + " принÑÑ‚ за " + ((Date.now() - Variables.depositTime) / 1000).toFixed(2) + " Ñекунд");
151
152 Variables.redis.checkedProcceed = false;
153 Variables.acceptOffer = false;
154 Variables.depositTime = null;
155 });
156 });
157 } else {
158 Get_Error_Code(err.toString(), function (code) {
159
160 if (code != 28) {
161 Logger.error("Ошибка при принÑтии оффера #" + offer.id + " (" + err + ")");
162
163 RedisClient.multi([
164 ['rpush', RedisChannels.declineList, offer.id],
165 ["lrem", RedisChannels.tradeoffersList, 0, offer.id],
166 ['lrem', RedisChannels.usersQueue, 1, offer.steamid64]
167 ]).exec(function (err, replies) {
168
169 RedisClient.lrange(RedisChannels.checkedList, 0, -1, function (err, queues) {
170 queues.forEach(function (element, i, arr) {
171 if (JSON.parse(element).id == offer.id) {
172 RedisClient.lrem(RedisChannels.checkedList, 0, element);
173 }
174 });
175 });
176
177 Variables.acceptOffer = false;
178 Variables.depositTime = null;
179 Variables.redis.checkedProcceed = false;
180 });
181 return;
182 }
183
184 if (code == 11) {
185 RedisClient.lrem(RedisChannels.usersQueue, 0, offer.steamid64);
186 RedisClient.lrem(RedisChannels.tradeoffersList, 0, offer.id);
187
188 RedisClient.lrange(RedisChannels.checkedList, 0, -1, function (err, queues) {
189 queues.forEach(function (element, i, arr) {
190 if (JSON.parse(element).id == offer.id) {
191 RedisClient.lrem(RedisChannels.checkedList, 0, element);
192 }
193 });
194 });
195 }
196
197 Variables.redis.checkedProcceed = false;
198 });
199 }
200 });
201};
202
203var Deposit_Decline = function (offer) {
204
205 Logger.info("Попытка Ð¾Ñ‚ÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ„Ñ„ÐµÑ€Ð° #" + offer);
206
207 Offers.declineOffer({tradeOfferId: offer}, function (err, body) {
208 if (!err) {
209 Logger.info("Оффер #" + offer + " уÑпешно отклонён");
210
211 RedisClient.lrem(RedisChannels.declineList, 0, offer);
212 RedisClient.lrem(RedisChannels.tradeoffersList, 0, offer);
213
214 Variables.redis.declineProcceed = false;
215 } else {
216 Logger.error("Ошибка Ð¾Ñ‚ÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ„Ñ„ÐµÑ€Ð° #" + offer);
217 Variables.redis.declineProcceed = false;
218 }
219 });
220};
221
222/**
223 * Проверка Ñтавки
224 */
225
226var Check_Bet = function () {
227 Requestify.post('http://localhost/api/newBet', {
228 secretKey: Config.secretKey
229 }).then(function (response) {
230
231 if (JSON.parse(response.body).success) {
232 Logger.info("Ставка добавленна");
233 Variables.redis.betsProcceed = false;
234 }
235
236 }, function (response) {
237 Logger.error("Ошибка при добавлении новой Ñтавки");
238 console.log(response.body);
239 setTimeout(function () {
240 Check_Bet()
241 }, 2000);
242 });
243};
244
245var addNewItemsBonus = function(){
246 Requestify.post('http://localhost/api/newItemsBonus', {
247 secretKey: Config.secretKey
248 })
249 .then(function(response) {
250 var answer = JSON.parse(response.body);
251 if(answer.success){
252 console.tag('SteamBotBonus').log('success');
253 itemsTobonusProcced = false;
254 }
255 },function(response){
256 console.tag('SteamBotBonus').error('Something wrong with newItems. Retry...');
257 setTimeout(function(){addNewItemsBonus()}, 1000);
258 });
259}
260
261/**
262 * Отправка выйгрыша
263 */
264
265var Send_Prize = function (steamid64, token, items, game, offer) {
266
267 var Trade = Manager.createOffer(steamid64, token);
268
269 Trade.setToken(token);
270 Trade.getUserDetails(function (err, me, them) {
271 if (err) {
272 Logger.error("Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… об Escrow при отправке выйгрыша");
273 Variables.redis.sendProcceed = false;
274 }
275
276 if (them.escrowDays > 0 || me.escrowDays > 0) {
277 Logger.error("Ошибка отпрвка выйгрыша у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Escrow");
278 Variables.redis.sendProcceed = false;
279 } else {
280 Manager.loadInventory(730, 2, true, function (err, inventory) {
281
282 if (err) {
283 Logger.error("Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ! при отправке выйгрыша");
284 Variables.redis.sendProcceed = false;
285 return;
286 }
287
288 var pool = inventory.filter(function (item) {
289 for (var i = 0; i < items.length; i++) {
290 if (item["classid"] == items[i]) {
291 items.splice(i, 1);
292 return true
293 }
294 }
295
296 return false
297 });
298
299 Trade.setMessage(Config.nameSite + " игра:" + game + " Хеш : " + Crypto.randomBytes(30).toString('hex'));
300 Trade.addMyItems(pool);
301 Trade.send(function (err) {
302 if (err) {
303 Logger.error("Ошибка при отправке выйгрыша (" + err + ")");
304
305 RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
306 Set_Prize_Status(game, 2);
307 });
308
309 Variables.redis.sendProcceed = false;
310
311 } else {
312 Logger.info("Оффер уÑпешно отправлен пользователю Ñ SteamID64: " + steamid64);
313
314 RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
315 Set_Prize_Status(game, 1);
316 Variables.redis.sendProcceed = false;
317 });
318 }
319 });
320 });
321 }
322 });
323
324};
325
326
327var Send_Prize_Low = function (steamid64, token, items, game, offer) {
328
329 var Trade = Manager.createOffer(steamid64, token);
330
331 Trade.setToken(token);
332 Trade.getUserDetails(function (err, me, them) {
333 if (err) {
334 Logger.error("Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… об Escrow при отправке выйгрыша");
335 Variables.redis.sendProcceed = false;
336 }
337
338 if (them.escrowDays > 0 || me.escrowDays > 0) {
339 Logger.error("Ошибка отпрвка выйгрыша у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Escrow");
340 Variables.redis.sendProcceed = false;
341 } else {
342 Manager.loadInventory(730, 2, true, function (err, inventory) {
343
344 if (err) {
345 Logger.error("Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ! при отправке выйгрыша");
346 Variables.redis.sendProcceed = false;
347 return;
348 }
349
350 var pool = inventory.filter(function (item) {
351 for (var i = items.length-1; i > 0; i--) {
352 if (item["classid"] == items[i]) {
353 items.splice(i, 1);
354 return true
355 }
356 }
357
358 return false
359 });
360
361 Trade.setMessage('Переотправка '+Config.nameSite + " игра:" + game + " Хеш : " + Crypto.randomBytes(30).toString('hex'));
362 Trade.addMyItems(pool);
363 Trade.send(function (err) {
364 if (err) {
365 Logger.error("Ошибка при отправке выйгрыша (" + err + ")");
366
367 RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
368 Set_Prize_Status(game, 2);
369 });
370
371 Variables.redis.sendProcceed = false;
372
373 } else {
374 Logger.info("Оффер уÑпешно отправлен пользователю Ñ SteamID64: " + steamid64);
375
376 RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
377 Set_Prize_Status(game, 1);
378 Variables.redis.sendProcceed = false;
379 });
380 }
381 });
382 });
383 }
384 });
385
386};
387
388
389
390
391/**
392 * ПарÑинг трейд оффера
393 */
394
395var Parse_Offer = function (offer) {
396
397 var Items = [];
398
399 offer.itemsToReceive.forEach(function(item, i, arr) {
400
401 Items[i] = {
402 appid: item.appid,
403 name: item.market_name,
404 market_hash_name: item.market_hash_name,
405 classid: item.classid
406 };
407
408 var Type = item.type;
409 var Rarity = '';
410 var Arr = Type.split(',');
411
412 if (Arr.length == 2) Type = Arr[1].trim();
413 if (Arr.length == 3) Type = Arr[2].trim();
414 if (Arr.length && arr[0] == 'Ðож') Type = '★';
415
416 switch (Type) {
417 case 'ÐрмейÑкое качеÑтво':
418 Rarity = 'milspec';
419 break;
420 case 'Запрещенное':
421 Rarity = 'restricted';
422 break;
423 case 'ЗаÑекреченное':
424 Rarity = 'classified';
425 break;
426 case 'Тайное':
427 Rarity = 'covert';
428 break;
429 case 'Ширпотреб':
430 Rarity = 'common';
431 break;
432 case 'Промышленное качеÑтво':
433 Rarity = 'common';
434 break;
435 case '★':
436 Rarity = 'rare';
437 break;
438 }
439
440 Items[i].rarity = Rarity;
441
442 });
443
444 var value = {
445 offerid: offer.id,
446 accountid: offer.partner.steamid64,
447 items: JSON.stringify(Items)
448 };
449
450 RedisClient.rpush(RedisChannels.checkList, JSON.stringify(value));
451
452};
453
454/**
455 * Обновление ÑтатуÑа приза
456 */
457
458var Set_Prize_Status = function (game, status) {
459 Requestify.post('http://localhost/api/setPrizeStatus', {
460 secretKey: Config.secretKey,
461 game: game,
462 status: status
463 }).then(function (response) {
464
465 }, function (response) {
466 Logger.error("Ошибка при обновлении трейд ÑтатуÑа");
467
468 setTimeout(function () {
469 Set_Prize_Status()
470 }, 2000);
471 });
472}
473
474/**
475 * Проверка ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ„Ñ„ÐµÑ€Ð° в маÑÑиве
476 */
477
478var Check_Offer_Exists = function (offer_id) {
479 for (var i = 0, len = Variables.checkingOffers.length; i < len; ++i) {
480 var offer = Variables.checkingOffers[i];
481 if (offer == offer_id) {
482 return true;
483 break;
484 }
485 }
486 return false;
487};
488
489/**
490 * Получение Error Code оффера
491 */
492
493var Get_Error_Code = function (err, callback) {
494 var errCode = 0;
495 var match = err.match(/\(([^()]*)\)/);
496 if (match != null && match.length == 2) errCode = match[1];
497 callback(errCode);
498};
499
500/**
501 * Функции Steam клиента
502 */
503
504Client.on('loggedOn', function () {
505 Logger.info("УÑÐ¿ÐµÑˆÐ½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð² Steam (SteamID64: " + Client.steamID.getSteamID64() + ")");
506});
507
508Client.on('webSession', function (sessionID, cookies) {
509 Client.setPersona(SteamUser.Steam.EPersonaState.Online);
510
511 Manager.setCookies(cookies, function (err) {
512 if (err) {
513 Logger.error('Ошибка уÑтановки WebSession Cookies: ' + err);
514 process.exit(1);
515 return
516 }
517 });
518
519 Offers.setup({
520 sessionID: sessionID,
521 webCookie: cookies,
522 APIKey: Config.apiKey
523 });
524
525 Community.setCookies(cookies);
526
527 Community.startConfirmationChecker(10000, Config.bot.identity_secret);
528
529 Community.on('sessionExpired', function (err) {
530 Logger.info("СеÑÑÐ¸Ñ ÑƒÑтарела. Получаем новые Cookie");
531 Client.webLogOn();
532 });
533
534 RedisClient.lrange(RedisChannels.tradeoffersList, 0, -1, function (err, offers) {
535 offers.forEach(function (offer) {
536 Variables.checkingOffers.push(offer);
537 });
538 });
539
540 Variables.auth = true;
541});
542
543Client.on('accountLimitations', function (limited, communityBanned, locked) {
544 if (limited || communityBanned || locked) {
545 Logger.error("Ðккаунт заблокирован. Бот отключаетÑÑ");
546 process.exit(1);
547 }
548});
549
550/**
551 * Функции Steam менеджера
552 */
553
554Manager.on('newOffer', function (offer) {
555 if (offer.state == 2) {
556
557 if (Check_Offer_Exists(offer.id)) return;
558
559 if (offer.itemsToGive.length != 0 && Config.admins.indexOf(offer.partner.getSteamID64()) != -1) {
560 Logger.info("Оффер #" + offer.id + " от админиÑтратора " + offer.partner.getSteamID64());
561 offer.accept();
562 return;
563 }
564
565 if(Config.bonusbot.indexOf(offer.partner.getSteamID64()) != -1){
566 Offers.acceptOffer({tradeOfferId: offer.id}, function(error, traderesponse) {
567 if(!error) {
568 if ('undefined' != typeof traderesponse.tradeid) {
569 Offers.getItems({tradeId: traderesponse.tradeid}, function (error, recieved_items) {
570 if (!error) {
571 var itemsForParse = [], itemstobonus = [], i = 0;
572 recieved_items.forEach(function(item){
573 itemsForParse[i++] = item.id;
574 })
575
576 Offers.loadMyInventory({appId: 730, contextId: 2, language: 'russian'}, function(error, botItems){
577 if(!error){
578 i = 0;
579
580 botItems.forEach(function(item){
581 if(itemsForParse.indexOf(item.id) != -1){
582 var rarity = '', type = '';
583 var arr = item.type.split(',');
584 if (arr.length == 2) rarity = arr[1].trim();
585 if (arr.length == 3) rarity = arr[2].trim();
586 if (arr.length && arr[0] == 'Ðож') rarity = 'Тайное';
587 if (arr.length) type = arr[0];
588 var quality = item.market_name.match(/\(([^()]*)\)/);
589 if(quality != null && quality.length == 2) {
590 quality = quality[1];
591 } else {
592 quality = " ";
593 }
594 itemstobonus[i++] = {
595 inventoryId: item.id,
596 classid: item.classid,
597 name: item.name,
598 market_hash_name: item.market_hash_name,
599 rarity: rarity,
600 quality: quality,
601 type: type
602 }
603 }
604 });
605
606 }
607 RedisClient.rpush(RedisChannels.itemstobonus, JSON.stringify(itemstobonus));
608 return;
609 });
610 }
611 return;
612 });
613 }
614 }
615 return;
616 });
617 }
618
619
620 if (offer.itemsToGive.length != 0) {
621 offer.decline();
622 return;
623 }
624
625 offer.getUserDetails(function (err, me, them) {
626 if (!err && them) {
627
628 if (them.escrowDays != 0) {
629 offer.decline();
630 return;
631 }
632
633 } else {
634 Logger.error("Ошибка при получении Escrow данных Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ " + offer.partner.getSteamID64());
635
636 offer.decline();
637 return;
638 }
639 });
640
641 /* if (Config.bonusbot.indexOf(offer.partner.getSteamID64()) == -1) {
642 checkingOffers.push(offer.tradeofferid);
643 Logger.info("Ð‘Ð¾Ð½ÑƒÑ Ð¾Ñ„ÐµÑ€ #" + offer.id + " от SteamID64: " + offer.partner.getSteamID64());
644 RedisClient.multi([
645 ['rpush', RedisChannels.tradeoffersList, offer.id],
646 ['rpush', RedisChannels.checkItemsList, JSON.stringify(offer)],
647 ['rpush', RedisChannels.usersQueue, offer.partner.getSteamID64()]
648 ]).exec(function(){
649 RedisClient.lrange(RedisChannels.usersQueue, 0, -1, function(err, queues) {
650 io.sockets.emit('queue', queues);
651 });
652 });
653 return;
654 } */
655
656 if (offer.itemsToReceive.length != 0 && offer.itemsToGive.length == 0) {
657 Variables.checkingOffers.push(offer.id);
658
659 Logger.info("Ðовый оффер #" + offer.id + " от SteamID64: " + offer.partner.getSteamID64());
660
661 offer.partner.steamid64 = offer.partner.getSteamID64();
662
663 Parse_Offer(offer);
664
665 RedisClient.multi([
666 ['rpush', RedisChannels.tradeoffersList, offer.id],
667 ['rpush', RedisChannels.usersQueue, offer.partner.getSteamID64()]
668 ]).exec(function () {
669 RedisClient.lrange(RedisChannels.usersQueue, 0, -1, function (err, queues) {
670 io.sockets.emit('queue', queues);
671 });
672 });
673 return;
674 }
675
676 }
677});
678
679Manager.on('pollFailure', function (err) {
680 Logger.error("Ошибка SteamCommunity Polling: " + err);
681});
682
683/**
684 * Работа Ñ ÐºÐ°Ð½Ð°Ð»Ð°Ð¼Ð¸ Redis
685 */
686
687var Queue_Proceed = function () {
688
689 RedisClient.llen(RedisChannels.itemstobonus, function(err, length) {
690 if (length > 0 && !Variables.redis.itemsTobonusProcced) {
691 Logger.info("Ð‘Ð¾Ð½ÑƒÑ Ð±Ñ‹Ð» добавлен");
692 Variables.redis.itemsTobonusProcced = true;
693 addNewItemsBonus();
694 }
695 });
696
697 RedisClient.llen(RedisChannels.checkList, function (err, length) {
698 if (length > 0 && !Variables.redis.checkProcceed) {
699 Logger.info("Офферов Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸: " + length);
700 Variables.redis.checkProcceed = true;
701 Deposit_Check();
702 }
703 });
704
705 RedisClient.llen(RedisChannels.betsList, function (err, length) {
706 if (length > 0 && !Variables.redis.betsProcceed && !Variables.delayForNewGame) {
707 Logger.info("Офферов Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ: " + length);
708 Variables.redis.betsProcceed = true;
709 Check_Bet();
710 }
711 });
712
713 RedisClient.llen(RedisChannels.checkedList, function (err, length) {
714 if (length > 0 && !Variables.redis.checkedProcceed && Variables.auth) {
715 Logger.info("Офферов Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ: " + length);
716 Variables.redis.checkedProcceed = true;
717 RedisClient.lindex(RedisChannels.checkedList, 0, function (err, offer) {
718 Deposit_Accept(JSON.parse(offer));
719 });
720 }
721 });
722
723 RedisClient.llen(RedisChannels.declineList, function (err, length) {
724 if (length > 0 && !Variables.redis.declineProcceed && Variables.auth) {
725 Logger.info("Офферов Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: " + length);
726 Variables.redis.declineProcceed = true;
727 RedisClient.lindex(RedisChannels.declineList, 0, function (err, offer) {
728 Deposit_Decline(JSON.parse(offer));
729 });
730 }
731 });
732
733 RedisClient.llen(RedisChannels.sendOffersList, function (err, length) {
734 if (length > 0 && !Variables.redis.sendProcceed && Variables.auth) {
735 Logger.info("Офферов Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ победителÑм: " + length);
736 Variables.redis.sendProcceed = true;
737 RedisClient.lindex(RedisChannels.sendOffersList, 0, function (err, offer) {
738 offer = JSON.parse(offer);
739 Send_Prize(offer.steamid, offer.accessToken, offer.items, offer.game, JSON.stringify(offer));
740 });
741 }
742 });
743
744};
745
746module.exports.delayForNewGame = function (value) {
747 Variables.delayForNewGame = value;
748};
749
750setInterval(Queue_Proceed, 512);
751
752
753function checkBadGame(){
754 console.log("Проверка не отправленных выигрышей");
755
756 var mysql = require('mysql');
757
758 var connection = mysql.createConnection({
759
760 host : 'localhost',
761 user : 'root',
762 password: Config.db.password,
763 database: Config.db.database
764 });
765
766 var curent_time = Math.round(new Date().getTime()/1000.0) - 3600; // ÑÐµÐ³Ð¾Ð´Ð½Ñ - 14400000 утки - 86400000 7200000 - 2 чаÑа
767 connection.connect();
768 getBadGame ='SELECT finished_at, 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 `finished_at` > (NOW() - INTERVAL 360 MINUTE) AND `status_prize` != 1 AND `status` = 3 ORDER BY id DESC LIMIT 0,1';
769 //getBadGame ='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';
770 //console.log(getBadGame);
771
772 connection.query(getBadGame, function(err, rows, fields) {
773 //console.log(err);
774 if(typeof rows === 'undefined'){
775 console.log("rows === undefined");
776 return;
777 }
778
779 rows.forEach(function(item, i, arr) {
780 console.log('Игра # '+item.id+' пользователю #'+ item.winner_id + ' не потрпавлено '+ item.items +" предметов. ПытаемÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ.");
781 sendoffer = [];
782 offer = JSON.parse(item.won_items);
783 offer.forEach(function(it, key, array) {
784 sendoffer.push(it.classid);
785 });
786
787 //Send_Prize(steamid64, token, items, game, offer)
788 Send_Prize_Low(item.steamid64, item.accessToken, sendoffer, item.id, offer);
789 //sendTradeOfferLow(730, item.steamid64, item.accessToken, sendoffer, '', item.id, '');
790 //sleep(1);
791 });
792 });
793 connection.end();
794}
795
796
797setInterval(function(){checkBadGame();}, 600000);
798
799/**
800 * Отлавливание неизвеÑтной ошибки
801 */
802
803/*
804process.on('uncaughtException', function (err) {
805 Logger.error('Ошибка ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ выводитÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñми (' + err + ') !');
806});
807*/