Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///////////////
- /// Modules ///
- ///////////////
- var io = require('socket.io').listen(8000);
- var mysql = require('mysql');
- var config = require("./config.js");
- //Including Steam modules for the bot
- var Steam = require('steam');
- var SteamUser = require('steam-user');
- var SteamCommunity = require('steamcommunity');
- var SteamTotp = require('steam-totp');
- var TradeOfferManager = require('steam-tradeoffer-manager');
- //Used to retrieve new prices.
- var totp = require('notp').totp;
- var base32 = require('thirty-two');
- var request = require('request');
- var crypto = require('crypto');
- var fs = require('fs');
- var users = [];
- var activeTradeoffers = [];
- tradeReady = false;
- var mysql = mysql.createConnection({
- host : 'localhost',
- user : 'root',
- password : '',
- database : '',
- charset : 'utf8_general_ci'
- });
- ////////////////////
- ////// SOCKET //////
- ////////////////////
- io.on('connection', function(socket){
- var user = false;
- SocketReferer = socket.handshake.headers.referer;
- if(SocketReferer !== undefined){
- if(SocketReferer.includes(config.siteLink) !== true){
- socket.disconnect();
- console.log('Disconnected socket from outside, referer: ' + SocketReferer);
- }
- }
- socket.on('userKey', function(key){
- if(key.length>0){
- mysql.query('SELECT * FROM users WHERE secret = ?',[key], function(err, row) {
- if (!row.length) {
- return socket.disconnect();
- }
- user = row[0];
- for(var i = 0; i < users.length; i++)
- {
- if(users[i].steamid == user.steamid)
- {
- users[i].socket.disconnect();
- users.splice(i,1);
- }
- }
- users.push({
- socket:socket,
- steamid:user.steamid
- });
- });
- }
- });
- socket.on('submitTrade', function(data){
- if((tradeReady === true) && user!== false){
- if(user.tradelink == 0){
- sendToSteamid(user.steamid,{type:'trademsg', message: 'Please set a tradelink before attempting to trade.'});
- return;
- }
- processTrade(user, data.userOfferItems, data.botOfferItems);
- }
- });
- });
- function processTrade(user, useritems, botitems){
- sendToSteamid(user.steamid,{type:'trademsg', message: 'Processing trade.'});
- userOfferValue = 0;
- botOfferValue = 0;
- userItemNameString = '';
- botItemNameString = '';
- userItems = (useritems.substr(0, useritems.length - 1)).split(',');
- if(botitems !== ""){
- botItems = (botitems.substr(0, botitems.length - 1)).split(',');
- } else {
- botItems = [];
- }
- manager.getUserInventoryContents(user.steamid, 730, 2, true, function(err, inventory){
- if(inventory.length == 0){
- console.log('Empty inventory');
- sendToSteamid(user.steamid,{type:'trademsg', message: 'Your inventory was registered as empty.'});
- return;
- } else if(err){
- console.log('Error loading partner inventory');
- sendToSteamid(user.steamid,{type:'trademsg', message: 'Error loading your inventory.'});
- return;
- } else {
- for (var i = 0; i < inventory.length; i++) {
- currentItem = inventory[i];
- if(userItems.indexOf(currentItem.assetid) > -1){
- var itemPriceInfo = prices.prices.filter(function(search) {
- return search.market_hash_name == currentItem.market_hash_name;
- });
- itemPrice = itemPriceInfo[0].price;
- itemCondition = getCondition(currentItem['tags']);
- itemPrice = (getItemPrice(itemCondition, currentItem.market_hash_name, itemPrice, user)).round(2);
- if(itemPrice<config.minValue){
- console.log('['+user.steamid+'] One of the items was below minimum value.');
- sendToSteamid(user.steamid,{type:'trademsg', message: 'One of the items you offered was below our minimum item value for accepted skins.'});
- return;
- }
- userItemNameString += currentItem.market_hash_name + ','
- userOfferValue = +userOfferValue + +itemPrice;
- }
- }
- if(botItems.length === 0){
- console.log('['+user.steamid+'] Is donating skins worth: ' + userOfferValue);
- var offer = manager.createOffer(user.tradelink);
- for (var i = 0; i < userItems.length; i++) {
- offer.addTheirItem({"appid": 730, "contextid": 2, "assetid": userItems[i]});
- }
- tradeString = makeSecret(8);
- offer.setMessage('Thank you for donating to '+config.siteName+'. Your reference number is: #'+tradeString);
- offer.send(function(err, status) {
- if(err){
- console.log('['+user.steamid+'] Trade is not active, error: ' + err);
- return;
- } else {
- mysql.query('INSERT INTO trades (`botitems`,`useritems`,`profit`,`tradeid`,`steamid`,`time`,`secret`) VALUES (?,?,?,?,?,?,?)',['Donation', userItemNameString, userOfferValue, offer.id, user.steamid, Math.floor(Date.now() / 1000), tradeString], function(err, row) {if(err){console.log(err);}});
- console.log('['+user.steamid+'] Trade is active, #' + offer.id + ', secret: ' + tradeString);
- sendToSteamid(user.steamid,{type:'trademsg', tid: offer.id, secret: tradeString});
- }
- });
- //End of donation
- } else {
- manager.loadInventory(730, 2, true, function(err, inventory) {
- for (var i = 0; i < inventory.length; i++) {
- currentItem = inventory[i];
- if(botItems.indexOf(currentItem.assetid) > -1){
- var itemPriceInfo = prices.prices.filter(function(search) {
- return search.market_hash_name == currentItem.market_hash_name;
- });
- itemPrice = itemPriceInfo[0].price;
- itemName = currentItem.market_hash_name;
- if((itemName.includes("Key") === true) && (itemName.includes("Caupsle") !== true)){
- itemPrice = (itemPrice * config.botKeyWorth).round(2);
- }
- botOfferValue = +botOfferValue + +itemPrice;
- botItemNameString += currentItem.market_hash_name + ','
- }
- }
- if(botOfferValue > userOfferValue){
- console.log('['+user.steamid+'] Trade is bad, user items value: ' + userOfferValue + ', bot items value: ' + botOfferValue);
- sendToSteamid(user.steamid,{type:'trademsg', message: 'Issues with one or more of the items.'});
- messageAdmin('SteamID: ' + user.steamid + ' attempted to do a modified trade, their offer value: ' + userOfferValue + ', bots offer value: ' + botOfferValue);
- return;
- } else if((config.botItemsPerUsers / userItems.length) < 1){
- console.log('['+user.steamid+'] User offered too many items.');
- sendToSteamid(user.steamid,{type:'trademsg', message: 'For every bot item, you can offer '+config.botItemsPerUsers+' as a maximum.'});
- } else {
- console.log('['+user.steamid+'] Trade is good, user items value: ' + userOfferValue + ', bot items value: ' + botOfferValue);
- tradeProfit = (userOfferValue - botOfferValue).round(2);
- var offer = manager.createOffer(user.tradelink);
- for (var i = 0; i < botItems.length; i++) {
- offer.addMyItem({"appid": 730, "contextid": 2, "assetid": botItems[i]});
- }
- for (var i = 0; i < userItems.length; i++) {
- offer.addTheirItem({"appid": 730, "contextid": 2, "assetid": userItems[i]});
- }
- tradeString = makeSecret(8);
- offer.setMessage('Thank you for trading at '+config.siteName+'. Your reference number is: #'+tradeString);
- offer.getUserDetails(function(err, me, them) {
- if (err) {
- console.log('['+user.steamid+'] Unable to get user details.');
- return;
- } else if (them.escrowDays > 0) {
- console.log('['+user.steamid+'] User is in escrow.');
- sendToSteamid(user.steamid,{type:'trademsg', message: '<strong>Escrow!</strong><br>We detected that you are in escrow, and therefore we cannot trade with you, sadly.'});
- return;
- } else {
- offer.send(function(err, status) {
- if(err){
- console.log('['+user.steamid+'] Trade is not active, error: ' + err);
- return;
- } else {
- mysql.query('INSERT INTO trades (`botitems`,`useritems`,`profit`,`tradeid`,`steamid`,`time`,`secret`) VALUES (?,?,?,?,?,?,?)',[botItemNameString, userItemNameString, tradeProfit, offer.id, user.steamid, Math.floor(Date.now() / 1000), tradeString], function(err, row) {if(err){console.log(err);}});
- if (status == 'pending') {
- community.acceptConfirmationForObject(config.identity, offer.id, function(err) {
- if (err) {
- console.log('['+user.steamid+'] Trade is active, #' + offer.id);
- sendToSteamid(user.steamid,{type:'trademsg', tid: offer.id, secret: tradeString});
- } else {
- console.log('['+user.steamid+'] Trade is active, #' + offer.id + ', secret: ' + tradeString);
- sendToSteamid(user.steamid,{type:'trademsg', tid: offer.id, secret: tradeString});
- }
- });
- }
- }
- });
- }
- });
- } //End of sending the offer.
- });
- } //End of processing bot skins, and sending the offer.
- }
- })
- }
- function getItemPrice(grade, name, price, who){
- itemRates = config.itemConditionRate;
- if(who !== "bot"){
- if(who.bonus === 1){
- bonusRate = config.bonusRate;
- } else {
- bonusRate = 0;
- }
- for (var i = 0; i < itemRates.length; i++) {
- if(itemRates[i][0] === grade){
- if(grade === "Covert"){
- if(name.includes("★") === true) (price * (config.itemRateKnives + bonusRate)).round(2);
- }
- return (price * (itemRates[i][1] + bonusRate)).round(2);
- }
- } //Done checking itemRates array.
- if((grade === "Base Grade") && (name.includes("Key") === true) && (name.includes("Caupsle") !== true)){
- return price * (config.itemRateKeys + bonusRate);
- }
- return price * (config.itemRateMisc + bonusRate);
- }
- }
- function getCondition(tags){
- for (var i = 0; i < tags.length; i++) {
- if(tags[i].category_name === "Quality"){
- return tags[i].name;
- }
- }
- }
- function sendToSteamid(steamid,msg){
- for(var i = 0; i < users.length; i++)
- {
- if(users[i].steamid == steamid) return users[i].socket.emit('message',msg);
- }
- }
- setPrices();
- function setPrices(msg){
- bitSkinsCode = totp.gen(base32.decode(config.bitskinsSecret));
- request('https://bitskins.com/api/v1/get_all_item_prices/?api_key='+config.bitskinsApi+"&code="+bitSkinsCode, function(error, response, body) {
- pricesCheck = JSON.parse(body);
- if(pricesCheck.status === "fail"){
- console.log('[BOT] Error updating prices.');
- if(msg === true){
- messageAdmin('Failed to update the prices.');
- }
- } else {
- console.log('[BOT] Prices updated successfully.');
- if(msg === true){
- messageAdmin('Prices updated successfully.');
- }
- fs.writeFileSync('prices.txt', body);
- fs.writeFileSync(config.priceFilePath, body);
- }
- });
- prices = JSON.parse(fs.readFileSync('prices.txt'));
- }
- setInterval(function() {
- setPrices();
- }, config.priceUpdate * 1000);
- function updateBotsInventory(msg){
- request(config.siteLink + 'lbi.php?password='+config.updateSecret, function(error, response, body) {
- console.log('[BOT] Inventory update result: ' + body);
- if(msg === true){
- messageAdmin('Inventory update status: ' + body);
- }
- if(body === "Error"){
- if(msg === true){
- messageAdmin('Retrying to update in 10 seconds.');
- }
- setTimeout(function() {
- updateBotsInventory();
- }, 10000);
- }
- });
- }
- function makeSecret(){
- var text = "";
- var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for( var i=0; i < 8; i++ )
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- return text;
- }
- Number.prototype.round = function(places) {
- return +(Math.round(this + "e+" + places) + "e-" + places);
- }
- ///////////////////////
- ////// STEAM BOT //////
- ///////////////////////
- var client = new SteamUser();
- var community = new SteamCommunity();
- var manager = new TradeOfferManager({
- "steam": client, // Polling every 30 seconds is fine since we get notifications from Steam
- "domain": "localhost", // Our domain is example.com
- "language": "en" // We want English item descriptions
- });
- var logOnOptions = {
- "accountName": config.username,
- "password": config.password,
- "twoFactorCode": SteamTotp.getAuthCode(config.shared)
- };
- client.logOn(logOnOptions);
- client.on('loggedOn', function() {
- console.log("[BOT] "+config.username+" logged into Steam");
- client.setPersona(Steam.EPersonaState.Online);
- client.addFriend(config.admin);
- });
- client.on('friendMessage#'+config.admin, function(steamID, message){
- if(message === 'code'){
- code = SteamTotp.generateAuthCode(config.shared);
- client.chatMessage(config.admin, 'Your login code: '+code+'');
- } else if(message === 'uinv'){
- updateBotsInventory(true);
- } else if(message === 'uprice'){
- setPrices(true);
- } else {
- client.chatMessage(config.admin, 'Invalid command, I know the following:\ncode\nuinv\nuprice');
- }
- });
- manager.on('newOffer', function(offer) {
- var partner = offer.partner.getSteamID64();
- if(partner === config.admin){
- console.log("["+partner+"] Tradeoffer from Admin registered, and accepted.");
- offer.accept();
- } else {
- console.log("["+partner+"] Sent a tradeoffer directly to the bot.");
- offer.decline();
- }
- });
- manager.on('sentOfferChanged', function(offer, oldState) {
- if(offer.state == TradeOfferManager.ETradeOfferState.Accepted) {
- console.log('[#'+offer.id+'] Offer was accepted');
- mysql.query('UPDATE trades SET status=? WHERE tradeid=? ',[1, offer.id], function(err, row) {if(err){console.log(err);}});
- updateBotsInventory();
- } else {
- if(offer.state !== 2){
- console.log('Tradeoffer was declined');
- mysql.query('DELETE FROM `trades` WHERE tradeid=?',[offer.id], function(err, row) {if(err){console.log(err);}});
- }
- }
- });
- client.on("webSession", function(sessionID, cookies) {
- manager.setCookies(cookies);
- community.setCookies(cookies);
- SteamTotp.steamID = client.steamID;
- community.startConfirmationChecker(10000, config.identity);
- tradeReady = true;
- console.log("[BOT] Got websession, accepting trades now.");
- });
- function messageAdmin(message){
- client.chatMessage(config.admin, message);
- }
- //////////////////
- //So we don't DC//
- //////////////////
- setInterval(function() {
- mysql.query('SELECT * FROM users WHERE steamid=? ',['1'], function(err, row) {if(err){console.log(err);}});
- }, 10 * 1000);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement