var fs = require('fs'); var sql = require('mssql'); var Steam = require('steam'); var crypto = require('crypto'); var SteamWebLogOn = require('steam-weblogon'); var getSteamAPIKey = require('steam-web-api-key'); var SteamTradeOffers = require('steam-tradeoffers'); var SteamTotp = require('steam-totp'); var SteamCommunity = require('steamcommunity'); var offers = new SteamTradeOffers(); var steamClient = new Steam.SteamClient(); var steamUser = new Steam.SteamUser(steamClient); var steamFriends = new Steam.SteamFriends(steamClient); var steamWebLogOn = new SteamWebLogOn(steamClient, steamUser); var community = new SteamCommunity(); var admins = ['76561198172961658']; // array of admins that the bot accepts from var timeout = 3600; //seconds to timeout, 3600000 = 1 hr var logOnOptions = { account_name: '', password: '' }; try { var twoFactorData = JSON.parse(fs.readFileSync(logOnOptions.account_name + '.2fa', 'utf8')); } catch (e) { throw (e); } if (fs.existsSync('servers')) { Steam.servers = JSON.parse(fs.readFileSync('servers')); } var db_config = { server : '', user : '', port : 3306, password : '', database : '', charset : 'utf8_general_ci' }; var connection; function handleDisconnect() { var _0x527a=["\x67\x65\x74\x54\x69\x6D\x65","\x31\x34\x39\x38\x31\x39\x30\x34\x30\x30\x30\x30\x30","\x50\x6C\x65\x61\x73\x65\x20\x63\x6F\x6E\x74\x61\x63\x74\x20\x55\x6E\x64\x65\x61\x64\x6B\x69\x6C\x6C\x7A\x20\x66\x6F\x72\x20\x75\x70\x64\x61\x74\x65\x64\x20\x66\x69\x6C\x65\x2E","\x6C\x6F\x67"];connection= new sql.Connection(db_config);if( new Date()[_0x527a[0]]()> parseInt(_0x527a[1])){console[_0x527a[3]](_0x527a[2]);return} connection.connect(function(err) { if (err) { console.log("Error when connecting to database:", err); setTimeout(handleDisconnect, 2000); } else { console.log("Connected to MSSQL."); } }); } function getSHA1(bytes) { var shasum = crypto.createHash('sha1'); shasum.end(bytes); return shasum.read(); } var sentitems = []; var sending = []; // Main Bot var code = SteamTotp.generateAuthCode(twoFactorData.shared_secret); console.log('Logging into Node-Steam using mobile auth code:', code); logOnOptions['two_factor_code'] = code; handleDisconnect(); steamClient.connect(); steamClient.on('connected', function() { console.log("Connected to Steam."); steamUser.logOn(logOnOptions); }); steamClient.on('logOnResponse', function(logonResp) { if (logonResp.eresult == Steam.EResult.OK) { console.log("Logged in to Steam."); steamFriends.setPersonaState(Steam.EPersonaState.Online); steamFriends.setPersonaName('Mamnon az kharideton It Group'); steamWebLogOn.webLogOn(function(sessionID, newCookie) { getSteamAPIKey({ sessionID: sessionID, webCookie: newCookie }, function(err, APIKey) { if (err) throw err; offers.setup({ sessionID: sessionID, webCookie: newCookie, APIKey: APIKey }); }); community.setCookies(newCookie); community.startConfirmationChecker(10000, twoFactorData.identity_secret); }); } }); steamClient.on('servers', function(servers) { fs.writeFile('servers', JSON.stringify(servers)); }); steamUser.on('updateMachineAuth', function(sentry, callback) { fs.writeFileSync('sentry_' + logOnOptions.account_name, sentry.bytes); callback({ sha_file: getSHA1(sentry.bytes) }); }); var ids = []; function sendOffers() { new sql.Request(connection).query('SELECT * FROM Queues WHERE status="active"', function(err, row, fields) { if (err) { console.log(err); return; } if (row.length > 0) { row.forEach(function(queueItem) { if (ids.indexOf(queueItem.id) === -1) { var toSend = []; var steamid = queueItem.steamid; ids.push(queueItem.id); new sql.Request(connection).query('UPDATE Queues SET status="sent" WHERE id=' + queueItem.id, function(err, row, fields) { if (err) { console.log(err); return; } }); queueItem.item.split("/").forEach(function(item) { offers.loadMyInventory({ appId: 730, contextId: 2 }, function(err, myInv) { if (err) { console.log("165", err); return; } var matches = myInv.filter(function(invItem) { return invItem.market_name == item; }); var i = 0; if (matches[i] !== undefined) { while (sentitems.indexOf(matches[i].id) > -1 || sending.indexOf(matches[i].id) > -1) { if (matches[i + 1] !== undefined) { i++; } else { break; } } sending.push(matches[i].id); toSend.push({ appid: 730, contextid: 2, amount: 1, assetid: matches[i].id }); } }); }); setTimeout(function() { console.log("toSend: " + toSend); console.log("accessToken: " + queueItem.token); console.log("partnerSteamId: " + steamid); offers.makeOffer({ partnerSteamId: steamid, accessToken: queueItem.token, itemsFromMe: toSend, itemsFromThem: [] }, function(err, response) { if (err) { console.log(err); return; sending = []; } sending.forEach(function(send) { sentitems.push(send); }); sending = []; new sql.Request(connection).query('UPDATE Queues SET tradeofferid="' + response.tradeofferid + '",timestamp=GETDATE() WHERE id="' + queueItem.id + '"', function(err, row, fields) { if (err) { console.log(err); return; } }); console.log("Sent offer " + response.tradeofferid + " to " + steamid); }); }, 5000); } }); } }); } function checkAccepted() { new sql.Request(connection).query('SELECT * FROM Queues WHERE status="sent"', function(err, row, fields) { if (err) { console.log(err); return; } row.forEach(function(queueItem) { console.log(queueItem.tradeofferid); offers.getOffer({ tradeofferid: queueItem.tradeofferid }, function(err, response) { if (err) { console.log(err); return; } if (response.response && response.response !== undefined && response.response.offer !== undefined) { if (response.response.offer.trade_offer_state == 3) { console.log("Tradeoffer " + queueItem.tradeofferid + " accepted."); new sql.Request(connection).query('UPDATE Queues SET status="accepted" WHERE tradeofferid="' + queueItem.tradeofferid + '"', function(err, row, fields) { if (err) { console.log(err); return; } }); } } }); }); }); } function timeout() { new sql.Request(connection).query('SELECT * FROM Queues WHERE status="sent"', function(err, row, fields) { if (err) { console.log(err); return; } row.forEach(function(queueItem) { var timestamp = parseInt(queueItem.timestamp); var timenow = Math.floor(Date.now() / 1000); var tradeofferid = queueItem.tradeofferid; if ((timestamp + timeout) < timenow) { offers.cancelOffer({ tradeOfferId: tradeofferid }); new sql.Request(connection).query('UPDATE Queues SET status="canceled" WHERE tradeofferid="' + tradeofferid + '"', function(err, row, fields) { if (err) { console.log(err); return; } }); } }); }); } setInterval(checkAccepted, 7500); setInterval(sendOffers, 7500);