Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var Winston = require('winston');
- var Logger = new (Winston.Logger)({
- transports: [
- new (Winston.transports.Console)({
- colorize: true,
- timestamp: true,
- level: 'debug',
- label: 'BOT'
- }),
- new (Winston.transports.File)({
- level: 'info',
- label: 'BOT',
- createDirectory: true,
- timestamp: true,
- filename: 'bot.log',
- json: false
- })
- ]
- });
- var Crypto = require("crypto");
- var SteamUser = require('steam-user');
- var SteamTotp = require('steam-totp');
- var SteamTradeOffers = require('steam-tradeoffers');
- var TradeOfferManager = require('steam-tradeoffer-manager');
- var Steamcommunity = require('steamcommunity');
- var Client = new SteamUser();
- var Offers = new SteamTradeOffers();
- var Manager = new TradeOfferManager({
- "steam": Client,
- "domain": "localhost",
- "language": "ru",
- "pollInterval": 15000
- });
- var Community = new Steamcommunity();
- var Config = require('./config.js');
- /**
- * Старый говно код
- */
- var RedisClient, io, Requestify;
- module.exports.init = function (redis, ioSocket, requestifyCore) {
- io = ioSocket;
- RedisClient = redis.createClient({host: Config.redis.host, port: Config.redis.port});
- Requestify = requestifyCore;
- };
- var RedisChannels = {
- checkList: 'check.list',
- checkedList: 'checked.list',
- betsList: 'bets.list',
- sendOffersList: 'send.offers.list',
- tradeoffersList: 'tradeoffers.list',
- declineList: 'decline.list',
- usersQueue: 'usersQueue.list',
- itemstobonus: 'items.to.bonus'
- };
- /**
- * Переменные авторизации
- */
- var LogonDetails = {
- "accountName": Config.bot.username,
- "password": Config.bot.password,
- "twoFactorCode": SteamTotp.getAuthCode(Config.bot.secret)
- };
- var Variables = {
- redis: {
- checkProcceed: false,
- checkedProcceed: false,
- declineProcceed: false,
- betsProcceed: false,
- sendProcceed: false,
- itemsTobonusProcced: false
- },
- auth: false,
- delayForNewGame: null,
- depositTime: null,
- acceptOffer: null,
- checkingOffers: []
- };
- /**
- * Авторизация бота
- */
- Client.logOn(LogonDetails);
- /**
- * Обработка депозита
- */
- var Deposit_Check = function () {
- Variables.depositTime = Date.now();
- Requestify.post(Config.domain + '/api/checkOffer', {
- secretKey: Config.secretKey
- }).then(function (response) {
- if (JSON.parse(response.body).success) {
- Variables.redis.checkProcceed = false;
- }
- }, function (response) {
- Logger.error("Ошибка при проверке оффера");
- console.log(response.body);
- setTimeout(function () {
- Deposit_Check();
- }, 2000);
- });
- };
- var Deposit_Accept = function (offer) {
- if (!Variables.acceptOffer) {
- Logger.info("Попытка принятия оффера #" + offer.id);
- Variables.acceptOffer = true;
- }
- Offers.acceptOffer({tradeOfferId: offer.id}, function (err, body) {
- if (!err && body) {
- RedisClient.multi([
- ["lrem", RedisChannels.tradeoffersList, 0, offer.id],
- ["lrem", RedisChannels.usersQueue, 1, offer.steamid64],
- ["rpush", RedisChannels.betsList, JSON.stringify(offer)]
- ]).exec(function (err, replies) {
- RedisClient.lrange(RedisChannels.usersQueue, 0, -1, function (err, queues) {
- io.sockets.emit('queue', queues);
- RedisClient.lrange(RedisChannels.checkedList, 0, -1, function (err, queues) {
- queues.forEach(function (element, i, arr) {
- if (JSON.parse(element).id == offer.id) {
- RedisClient.lrem(RedisChannels.checkedList, 0, element);
- }
- });
- });
- Logger.info("Оффер #" + offer.id + " успешно принят");
- Logger.info("Оффер #" + offer.id + " принят за " + ((Date.now() - Variables.depositTime) / 1000).toFixed(2) + " секунд");
- Variables.redis.checkedProcceed = false;
- Variables.acceptOffer = false;
- Variables.depositTime = null;
- });
- });
- } else {
- Get_Error_Code(err.toString(), function (code) {
- if (code != 28) {
- Logger.error("Ошибка при принятии оффера #" + offer.id + " (" + err + ")");
- RedisClient.multi([
- ['rpush', RedisChannels.declineList, offer.id],
- ["lrem", RedisChannels.tradeoffersList, 0, offer.id],
- ['lrem', RedisChannels.usersQueue, 1, offer.steamid64]
- ]).exec(function (err, replies) {
- RedisClient.lrange(RedisChannels.checkedList, 0, -1, function (err, queues) {
- queues.forEach(function (element, i, arr) {
- if (JSON.parse(element).id == offer.id) {
- RedisClient.lrem(RedisChannels.checkedList, 0, element);
- }
- });
- });
- Variables.acceptOffer = false;
- Variables.depositTime = null;
- Variables.redis.checkedProcceed = false;
- });
- return;
- }
- if (code == 11) {
- RedisClient.lrem(RedisChannels.usersQueue, 0, offer.steamid64);
- RedisClient.lrem(RedisChannels.tradeoffersList, 0, offer.id);
- RedisClient.lrange(RedisChannels.checkedList, 0, -1, function (err, queues) {
- queues.forEach(function (element, i, arr) {
- if (JSON.parse(element).id == offer.id) {
- RedisClient.lrem(RedisChannels.checkedList, 0, element);
- }
- });
- });
- }
- Variables.redis.checkedProcceed = false;
- });
- }
- });
- };
- var Deposit_Decline = function (offer) {
- Logger.info("Попытка отклонения оффера #" + offer);
- Offers.declineOffer({tradeOfferId: offer}, function (err, body) {
- if (!err) {
- Logger.info("Оффер #" + offer + " успешно отклонён");
- RedisClient.lrem(RedisChannels.declineList, 0, offer);
- RedisClient.lrem(RedisChannels.tradeoffersList, 0, offer);
- Variables.redis.declineProcceed = false;
- } else {
- Logger.error("Ошибка отклонения оффера #" + offer);
- Variables.redis.declineProcceed = false;
- }
- });
- };
- /**
- * Проверка ставки
- */
- var Check_Bet = function () {
- Requestify.post(Config.domain + '/api/newBet', {
- secretKey: Config.secretKey
- }).then(function (response) {
- if (JSON.parse(response.body).success) {
- Logger.info("Ставка добавленна");
- Variables.redis.betsProcceed = false;
- }
- }, function (response) {
- Logger.error("Ошибка при добавлении новой ставки");
- console.log(response.body);
- setTimeout(function () {
- Check_Bet()
- }, 2000);
- });
- };
- var addNewItemsBonus = function(){
- Requestify.post(Config.domain + '/api/newItemsBonus', {
- secretKey: Config.secretKey
- })
- .then(function(response) {
- var answer = JSON.parse(response.body);
- if(answer.success){
- console.tag('SteamBotBonus').log('success');
- itemsTobonusProcced = false;
- }
- },function(response){
- console.tag('SteamBotBonus').error('Something wrong with newItems. Retry...');
- setTimeout(function(){addNewItemsBonus()}, 1000);
- });
- }
- /**
- * Отправка выйгрыша
- */
- var Send_Prize = function (steamid64, token, items, game, offer) {
- var Trade = Manager.createOffer(steamid64, token);
- Trade.setToken(token);
- Trade.getUserDetails(function (err, me, them) {
- if (err) {
- Logger.error("Ошибка получения данных об Escrow либо недействительная ссылка на трейд!");
- Logger.info("Трейду будет присвоен статус отправленного")
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 1);
- });
- Variables.redis.sendProcceed = false;
- return;
- }
- if (them.escrowDays > 0 || me.escrowDays > 0) {
- Logger.error("Ошибка отпрвка выйгрыша у пользователя Escrow");
- Variables.redis.sendProcceed = false;
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 1);
- });
- } else {
- Manager.loadInventory(730, 2, true, function (err, inventory) {
- if (err) {
- Logger.error("Ошибка получения инвентаря! при отправке выйгрыша");
- Variables.redis.sendProcceed = false;
- return;
- }
- var pool = inventory.filter(function (item) {
- for (var i = 0; i < items.length; i++) {
- if (item["classid"] == items[i]) {
- items.splice(i, 1);
- return true
- }
- }
- return false
- });
- Trade.setMessage(Config.nameSite + " игра:" + game + " Хеш : " + Crypto.randomBytes(30).toString('hex'));
- Trade.addMyItems(pool);
- Trade.send(function (err) {
- if (err) {
- if (items < 1) {
- Logger.info("В игре #" +game + " не было ставок скинами");
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 1);
- });
- } else {
- Logger.error("Ошибка при отправке выйгрыша (" + err + ")");
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 2);
- });
- }
- Variables.redis.sendProcceed = false;
- } else {
- Logger.info("Оффер успешно отправлен пользователю с SteamID64: " + steamid64);
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 1);
- Variables.redis.sendProcceed = false;
- });
- }
- });
- });
- }
- });
- };
- var Send_Prize_Low = function (steamid64, token, items, game, offer) {
- var Trade = Manager.createOffer(steamid64, token);
- Trade.setToken(token);
- Trade.getUserDetails(function (err, me, them) {
- if (err) {
- Logger.error("Ошибка получения данных об Escrow либо недействительная ссылка на трейд");
- Logger.info("Трейду будет присвоен статус отправленного")
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 1);
- });
- Variables.redis.sendProcceed = false;
- return;
- }
- if (them.escrowDays > 0 || me.escrowDays > 0) {
- Logger.error("Ошибка отпрвка выйгрыша у пользователя Escrow");
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 1);
- });
- Variables.redis.sendProcceed = false;
- } else {
- Manager.loadInventory(730, 2, true, function (err, inventory) {
- if (err) {
- Logger.error("Ошибка получения инвентаря! при отправке выйгрыша");
- Variables.redis.sendProcceed = false;
- return;
- }
- var pool = inventory.filter(function (item) {
- for (var i = items.length-1; i > 0; i--) {
- if (item["classid"] == items[i]) {
- items.splice(i, 1);
- return true
- }
- }
- return false
- });
- Trade.setMessage('Переотправка '+Config.nameSite + " игра:" + game + " Хеш : " + Crypto.randomBytes(30).toString('hex'));
- Trade.addMyItems(pool);
- Trade.send(function (err) {
- if (err) {
- if (items < 1) {
- Logger.info("В игре #" +game + " не было ставок скинами");
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 1);
- });
- } else {
- Logger.error("Ошибка при отправке выйгрыша (" + err + ")");
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 2);
- });
- }
- Variables.redis.sendProcceed = false;
- } else {
- Logger.info("Оффер успешно отправлен пользователю с SteamID64: " + steamid64);
- RedisClient.lrem(RedisChannels.sendOffersList, 0, offer, function (err, data) {
- Set_Prize_Status(game, 1);
- Variables.redis.sendProcceed = false;
- });
- }
- });
- });
- }
- });
- };
- /**
- * Парсинг трейд оффера
- */
- var Parse_Offer = function (offer) {
- var Items = [];
- offer.itemsToReceive.forEach(function(item, i, arr) {
- Items[i] = {
- appid: item.appid,
- name: item.market_name,
- market_hash_name: item.market_hash_name,
- classid: item.classid
- };
- var Type = item.type;
- var Rarity = '';
- var Arr = Type.split(',');
- if (Arr.length == 2) Type = Arr[1].trim();
- if (Arr.length == 3) Type = Arr[2].trim();
- if (Arr.length && arr[0] == 'Нож') Type = '★';
- switch (Type) {
- case 'Армейское качество':
- Rarity = 'milspec';
- break;
- case 'Запрещенное':
- Rarity = 'restricted';
- break;
- case 'Засекреченное':
- Rarity = 'classified';
- break;
- case 'Тайное':
- Rarity = 'covert';
- break;
- case 'Ширпотреб':
- Rarity = 'common';
- break;
- case 'Промышленное качество':
- Rarity = 'common';
- break;
- case '★':
- Rarity = 'rare';
- break;
- }
- Items[i].rarity = Rarity;
- });
- var value = {
- offerid: offer.id,
- accountid: offer.partner.steamid64,
- items: JSON.stringify(Items)
- };
- RedisClient.rpush(RedisChannels.checkList, JSON.stringify(value));
- };
- /**
- * Обновление статуса приза
- */
- var Set_Prize_Status = function (game, status) {
- Requestify.post(Config.domain + '/api/setPrizeStatus', {
- secretKey: Config.secretKey,
- game: game,
- status: status
- }).then(function (response) {
- }, function (response) {
- Logger.error("Ошибка при обновлении трейд статуса");
- setTimeout(function () {
- Set_Prize_Status()
- }, 2000);
- });
- }
- /**
- * Проверка существования оффера в массиве
- */
- var Check_Offer_Exists = function (offer_id) {
- for (var i = 0, len = Variables.checkingOffers.length; i < len; ++i) {
- var offer = Variables.checkingOffers[i];
- if (offer == offer_id) {
- return true;
- break;
- }
- }
- return false;
- };
- /**
- * Получение Error Code оффера
- */
- var Get_Error_Code = function (err, callback) {
- var errCode = 0;
- var match = err.match(/\(([^()]*)\)/);
- if (match != null && match.length == 2) errCode = match[1];
- callback(errCode);
- };
- /**
- * Функции Steam клиента
- */
- Client.on('loggedOn', function () {
- Logger.info("Successful authorization (SteamID64: " + Client.steamID.getSteamID64() + ")");
- });
- Client.on('webSession', function (sessionID, cookies) {
- Client.setPersona(SteamUser.Steam.EPersonaState.Online);
- Manager.setCookies(cookies, function (err) {
- if (err) {
- Logger.error('Ошибка установки WebSession Cookies: ' + err);
- process.exit(1);
- return
- }
- });
- Offers.setup({
- sessionID: sessionID,
- webCookie: cookies,
- APIKey: Config.apiKey
- });
- Community.setCookies(cookies);
- Community.startConfirmationChecker(10000, Config.bot.identity_secret);
- Community.on('sessionExpired', function (err) {
- Logger.info("Сессия устарела. Получаем новые Cookie");
- Client.webLogOn();
- });
- RedisClient.lrange(RedisChannels.tradeoffersList, 0, -1, function (err, offers) {
- offers.forEach(function (offer) {
- Variables.checkingOffers.push(offer);
- });
- });
- Variables.auth = true;
- });
- Client.on('accountLimitations', function (limited, communityBanned, locked) {
- if (limited || communityBanned || locked) {
- Logger.error("Аккаунт заблокирован. Бот отключается");
- process.exit(1);
- }
- });
- /**
- * Функции Steam менеджера
- */
- Manager.on('newOffer', function (offer) {
- if (offer.state == 2) {
- if (Check_Offer_Exists(offer.id)) return;
- if (offer.itemsToGive.length != 0 && Config.admins.indexOf(offer.partner.getSteamID64()) != -1) {
- Logger.info("Оффер #" + offer.id + " от администратора " + offer.partner.getSteamID64());
- offer.accept();
- return;
- }
- if(Config.bonusbot.indexOf(offer.partner.getSteamID64()) != -1){
- Offers.acceptOffer({tradeOfferId: offer.id}, function(error, traderesponse) {
- if(!error) {
- if ('undefined' != typeof traderesponse.tradeid) {
- Offers.getItems({tradeId: traderesponse.tradeid}, function (error, recieved_items) {
- if (!error) {
- var itemsForParse = [], itemstobonus = [], i = 0;
- recieved_items.forEach(function(item){
- itemsForParse[i++] = item.id;
- })
- Offers.loadMyInventory({appId: 730, contextId: 2, language: 'russian'}, function(error, botItems){
- if(!error){
- i = 0;
- botItems.forEach(function(item){
- if(itemsForParse.indexOf(item.id) != -1){
- var rarity = '', type = '';
- var arr = item.type.split(',');
- if (arr.length == 2) rarity = arr[1].trim();
- if (arr.length == 3) rarity = arr[2].trim();
- if (arr.length && arr[0] == 'Нож') rarity = 'Тайное';
- if (arr.length) type = arr[0];
- var quality = item.market_name.match(/\(([^()]*)\)/);
- if(quality != null && quality.length == 2) {
- quality = quality[1];
- } else {
- quality = " ";
- }
- itemstobonus[i++] = {
- inventoryId: item.id,
- classid: item.classid,
- name: item.name,
- market_hash_name: item.market_hash_name,
- rarity: rarity,
- quality: quality,
- type: type
- }
- }
- });
- }
- RedisClient.rpush(RedisChannels.itemstobonus, JSON.stringify(itemstobonus));
- return;
- });
- }
- return;
- });
- }
- }
- return;
- });
- }
- if (offer.itemsToGive.length != 0) {
- offer.decline();
- return;
- }
- offer.getUserDetails(function (err, me, them) {
- if (!err && them) {
- if (them.escrowDays != 0) {
- offer.decline();
- return;
- }
- } else {
- Logger.error("Ошибка при получении Escrow данных пользователя " + offer.partner.getSteamID64());
- offer.decline();
- return;
- }
- });
- if (Config.bonusbot.indexOf(offer.partner.getSteamID64()) == -1 && offer.itemsToReceive.length != 0 && offer.itemsToGive.length == 0) {
- Variables.checkingOffers.push(offer.id);
- Logger.info("Новый оффер #" + offer.id + " от SteamID64: " + offer.partner.getSteamID64());
- offer.partner.steamid64 = offer.partner.getSteamID64();
- Parse_Offer(offer);
- RedisClient.multi([
- ['rpush', RedisChannels.tradeoffersList, offer.id],
- ['rpush', RedisChannels.usersQueue, offer.partner.getSteamID64()]
- ]).exec(function () {
- RedisClient.lrange(RedisChannels.usersQueue, 0, -1, function (err, queues) {
- io.sockets.emit('queue', queues);
- });
- });
- return;
- }
- }
- });
- Manager.on('pollFailure', function (err) {
- Logger.error("Ошибка SteamCommunity Polling: " + err);
- });
- /**
- * Работа с каналами Redis
- */
- var Queue_Proceed = function () {
- RedisClient.llen(RedisChannels.itemstobonus, function(err, length) {
- if (length > 0 && !Variables.redis.itemsTobonusProcced) {
- Logger.info("Бонус был добавлен");
- Variables.redis.itemsTobonusProcced = true;
- addNewItemsBonus();
- }
- });
- RedisClient.llen(RedisChannels.checkList, function (err, length) {
- if (length > 0 && !Variables.redis.checkProcceed) {
- Logger.info("Офферов для проверки: " + length);
- Variables.redis.checkProcceed = true;
- Deposit_Check();
- }
- });
- RedisClient.llen(RedisChannels.betsList, function (err, length) {
- if (length > 0 && !Variables.redis.betsProcceed && !Variables.delayForNewGame) {
- Logger.info("Офферов для добавления: " + length);
- Variables.redis.betsProcceed = true;
- Check_Bet();
- }
- });
- RedisClient.llen(RedisChannels.checkedList, function (err, length) {
- if (length > 0 && !Variables.redis.checkedProcceed && Variables.auth) {
- Logger.info("Офферов для подтверждения: " + length);
- Variables.redis.checkedProcceed = true;
- RedisClient.lindex(RedisChannels.checkedList, 0, function (err, offer) {
- Deposit_Accept(JSON.parse(offer));
- });
- }
- });
- RedisClient.llen(RedisChannels.declineList, function (err, length) {
- if (length > 0 && !Variables.redis.declineProcceed && Variables.auth) {
- Logger.info("Офферов для отмены: " + length);
- Variables.redis.declineProcceed = true;
- RedisClient.lindex(RedisChannels.declineList, 0, function (err, offer) {
- Deposit_Decline(JSON.parse(offer));
- });
- }
- });
- RedisClient.llen(RedisChannels.sendOffersList, function (err, length) {
- if (length > 0 && !Variables.redis.sendProcceed && Variables.auth) {
- Logger.info("Офферов для отправки победителям: " + length);
- Variables.redis.sendProcceed = true;
- RedisClient.lindex(RedisChannels.sendOffersList, 0, function (err, offer) {
- offer = JSON.parse(offer);
- Send_Prize(offer.steamid, offer.accessToken, offer.items, offer.game, JSON.stringify(offer));
- });
- }
- });
- };
- module.exports.delayForNewGame = function (value) {
- Variables.delayForNewGame = value;
- };
- setInterval(Queue_Proceed, 512);
- function checkBadGame(){
- console.log("Проверка не отправленных выигрышей");
- var mysql = require('mysql');
- var connection = mysql.createConnection({
- host : 'localhost',
- user : 'root',
- password: Config.db.password,
- database: Config.db.database
- });
- var curent_time = Math.round(new Date().getTime()/1000.0) - 3600; // сегодня - 14400000 утки - 86400000 7200000 - 2 часа
- connection.connect();
- 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';
- //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';
- //console.log(getBadGame);
- connection.query(getBadGame, function(err, rows, fields) {
- //console.log(err);
- if(typeof rows === 'undefined'){
- console.log("rows === undefined");
- return;
- }
- rows.forEach(function(item, i, arr) {
- console.log('Игра # '+item.id+' пользователю #'+ item.winner_id + ' не отправлено '+ item.items +" предметов. Пытаемся отправить.");
- sendoffer = [];
- offer = JSON.parse(item.won_items);
- offer.forEach(function(it, key, array) {
- sendoffer.push(it.classid);
- });
- //Send_Prize(steamid64, token, items, game, offer)
- Send_Prize_Low(item.steamid64, item.accessToken, sendoffer, item.id, offer);
- //sendTradeOfferLow(730, item.steamid64, item.accessToken, sendoffer, '', item.id, '');
- //sleep(1);
- });
- });
- connection.end();
- }
- setInterval(function(){checkBadGame();}, 600000);
- /**
- * Отлавливание неизвестной ошибки
- */
- /*
- process.on('uncaughtException', function (err) {
- Logger.error('Ошибка которая не выводится функциями (' + err + ') !');
- });
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement