Advertisement
skoniks

CSGF v6 BOT

Sep 23rd, 2019
2,183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var config = require('./config.js'),
  2.     id = process.argv[process.argv.length-2],
  3.     ip = process.argv[process.argv.length-1],
  4.     redis = require('redis'),
  5.     requestify = require('requestify'),
  6.     Steam = require('steam-client'),
  7.     SteamUser = require('steam-user'),
  8.     SteamCommunity = require('steamcommunity'),
  9.     SteamTotp = require('steam-totp'),
  10.     TradeOfferManager = require('steam-tradeoffer-manager'),
  11.     fs = require('fs');
  12.  
  13. process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
  14. if(typeof config.accounts[id] == "undefined"){
  15.     console.error('invalid id');
  16.     process.exit(1);
  17.     return;
  18. }
  19. console.log(`Starting bot #${id}`);
  20. var rClient = redis.createClient(config.connection.redis);
  21. var SteamClient = new Steam.CMClient(Steam.EConnectionProtocol.TCP);
  22. SteamClient.bind(ip);
  23. var client = new SteamUser(SteamClient);
  24. var manager = new TradeOfferManager({
  25.     "steam": client,
  26.     "domain": config.web.domain,
  27.     "language": "ru",
  28.     "cancelTime": 300000,
  29.     "cancelOfferCount": 20,
  30.     "cancelOfferCountMinAge": 60000,
  31. });
  32. var webSession = false;
  33. var community = new SteamCommunity();
  34. var logOnOptions = function(){
  35.     return {
  36.         "accountName": config.accounts[id].username,
  37.         "password": config.accounts[id].password,
  38.         "twoFactorCode": SteamTotp.getAuthCode(config.accounts[id].shared_secret),
  39.         "rememberPassword": true,
  40.     }
  41. };
  42. if (fs.existsSync(`./polldata/${id}.json`)) manager.pollData = JSON.parse(fs.readFileSync(`./polldata/${id}.json`));
  43. community.on('debug', function(data) {
  44.     console.log(data);
  45. });
  46. if(!config.accounts[id].ban) client.logOn(logOnOptions());
  47. client.on('loggedOn', function() {
  48.     console.log("Logged into Steam! ip: " + client.publicIP);
  49.     console.log('Steam server: ' + SteamClient.remoteAddress);
  50.     client.setPersona(SteamUser.Steam.EPersonaState.Online, "CSGF #" + id + " | " + config.accounts[id].username.toUpperCase());
  51.     client.gamesPlayed(730);
  52.     client.addFriend(config.admins[0], function(err, name){});
  53. });
  54. client.on('error', function(err) {
  55.     var now = new Date();
  56.     console.error(now + ' | ERR | ' + err.msg);
  57.     console.error(err);
  58. });
  59. client.on('disconnected', function(eresult, msg) {
  60.     var now = new Date();
  61.     console.error(now + ' | DISCONNECTED | ' + msg);
  62.     console.error(eresult, msg);
  63. });
  64. client.on('webSession', function(sessionID, cookies) {
  65.     community.setCookies(cookies);
  66.     manager.setCookies(cookies, function(err) {
  67.         if (err) {
  68.             console.error(err);
  69.             process.exit(1);
  70.             return;
  71.         }
  72.         console.log("Got API key: " + manager.apiKey);
  73.         /*manager.getInventoryContents(config.settings.appid, 2, true, function(err, inventory) {
  74.             if (err) {
  75.                 console.error('getInventoryContents: ' + err.message);
  76.                 checkErr(err.message);
  77.                 return;
  78.             }
  79.             console.log("Found " + inventory.length + " CS:GO items");
  80.         });*/
  81.         setTimeout(function(){
  82.             webSession = true;
  83.             console.log('webSession = ' + sessionID);
  84.         }, 1000);
  85.     });
  86. });
  87. var conf_proceed = false;
  88. var Confirmation = function(offer, ecount){
  89.     if(conf_proceed){
  90.         setTimeout(function(){Confirmation(offer, ecount)}, 10000);
  91.     } else {
  92.         conf_proceed = true;
  93.         console.log(`Offer #${offer.id} requires confirmation`);
  94.         community.acceptConfirmationForObject(config.accounts[id].identity_secret, offer.id, function(err) {
  95.             if (err) {
  96.                 console.error('Confirming offer #' + offer.id + ' error: ' + err.msg);
  97.                 if(ecount < 5){
  98.                     setTimeout(function(){Confirmation(offer, ecount + 1)}, 10000);
  99.                 } else {
  100.                     offer.decline();
  101.                 }
  102.             } else {
  103.                 console.log(`Offer #${offer.id} confirmed`);
  104.             }
  105.             conf_proceed = false;
  106.         });
  107.     }
  108. }
  109. manager.on('newOffer', function(offer) {
  110.     console.log("New offer #" + offer.id + " from " + offer.partner.getSteamID64());
  111.     if(config.admins.indexOf(offer.partner.getSteamID64()) != -1){
  112.         offer.accept(true, function(err) {
  113.             if (err) {
  114.                 console.error("Offer #" + offer.id + " unable to accept offer: " + err.message);
  115.                 checkErr(err.message);
  116.             } else {
  117.                 Confirmation(offer, 0);
  118.                 console.log("Offer #" + offer.id + " accepted");
  119.             }
  120.         });
  121.     }
  122. });
  123. manager.on('receivedOfferChanged', function(offer, oldState) {
  124.     console.log(`Offer #${offer.id} changed: ${TradeOfferManager.ETradeOfferState[oldState]} -> ${TradeOfferManager.ETradeOfferState[offer.state]}`);
  125.     parseOffer(offer);
  126. });
  127. manager.on('sentOfferChanged', function(offer, oldState) {
  128.     console.log(`Offer #${offer.id} changed: ${TradeOfferManager.ETradeOfferState[oldState]} -> ${TradeOfferManager.ETradeOfferState[offer.state]} | ${oldState} -> ${offer.state}`);
  129.     rClient.rpush(config.rchannels(id).complete, JSON.stringify({offer: offer}), function(err) {
  130.         console.log(`Offer #${offer.id} added to complete list`);
  131.         parseOffer(offer);
  132.     });
  133. });
  134. manager.on('pollData', function(pollData) {
  135.     fs.writeFile(`./polldata/${id}.json`, JSON.stringify(pollData), function() {});
  136. });
  137. function parseOffer(offer){
  138.     if (offer.state == TradeOfferManager.ETradeOfferState.Accepted) {
  139.         offer.getReceivedItems(function(err, items) {
  140.             if (err) {
  141.                 console.error(`Offer #${offer.id} Couldn't get received items: ${err.message}`);
  142.                 checkErr(err.message);
  143.                rClient.rpush(config.rchannels(id).trecheck, JSON.stringify(offer), function(err) {
  144.                    console.log(`Offer #${offer.id} added to trecheck list`);
  145.                });
  146.            } else {
  147.                if(items.length){
  148.                    var accepted = {
  149.                        account: offer.partner.getSteamID64(),
  150.                        id: offer.id,
  151.                        items: JSON.stringify(items),
  152.                    }
  153.                    rClient.rpush(config.rchannels(id).accepted, JSON.stringify(accepted), function(err) {
  154.                        console.log(`Offer #${offer.id} added to accepted list`);
  155.                        lastDepTime = Date.now();
  156.                    });
  157.                }
  158.            }
  159.        });
  160.    }
  161. }
  162. function sendtrade(itemsIdsFromMe, itemsIdsFromThem, trade, message, callback){
  163.    var offer = manager.createOffer(trade);
  164.    offer.getUserDetails(function(err, me, them) {
  165.        if (err) {
  166.            console.error("Unable to get users data: " + err.message);
  167.             checkErr(err.message);
  168.            callback(false, "Unable to get users data: " + err.message, 0);
  169.        } else if (them.escrowDays > 0) {
  170.            console.log("Partner don have escrow");
  171.            callback(false, "Partner don have escrow", 0);
  172.        } else {
  173.            var itemsFromMe = [];
  174.            for(var i = 0; i<itemsIdsFromMe.length;i++){
  175.                itemsFromMe.push({
  176.                    assetid: itemsIdsFromMe[i].id,
  177.                    appid: itemsIdsFromMe[i].appid,
  178.                    contextid: 2,
  179.                    amount: 1
  180.                });
  181.            }
  182.            offer.addMyItems(itemsFromMe);
  183.            var itemsFromThem = [];
  184.            for(var i = 0; i<itemsIdsFromThem.length;i++){
  185.                itemsFromThem.push({
  186.                    assetid: itemsIdsFromThem[i].id,
  187.                    appid: itemsIdsFromThem[i].appid,
  188.                    contextid: 2,
  189.                    amount: 1
  190.                });
  191.            }
  192.            offer.addTheirItems(itemsFromThem);
  193.            offer.setMessage(message);
  194.            offer.send(function(err, status) {
  195.                if (err) {
  196.                    console.error(err.message);
  197.                     checkErr(err.message);
  198.                    callback(false, err.message, 0);
  199.                } else if (status == 'pending') {
  200.                    Confirmation(offer, 0);
  201.                    callback(true, '', offer.id);
  202.                } else {
  203.                    console.log(`Offer #${offer.id} sent successfully`);
  204.                    callback(true, '', offer.id);
  205.                }
  206.            });
  207.        }
  208.    });
  209. }
  210. var reCheckP = false,
  211.    apCheckP = false,
  212.    acCheckP = false,
  213.    deCheckP = false,
  214.    seCheckP = false,
  215.    osCheckP = false,
  216.    coCheckP = false,
  217.    trCheckP = false,
  218.    upCheckP = false,
  219.    ciCheckP = false,
  220.    Queue = setInterval(function(){queueProceed()}, 1000);
  221. lastDepTime = Date.now();
  222. function checkWorking(){
  223.    if(config.accounts[id].ban) return;
  224.    console.log('Checking activity! Last action: ' + (Date.now() - lastDepTime)/1000 + ' sec ago!');
  225.    if(((Date.now() - lastDepTime)/1000) >= 3600 ){
  226.         if(((Date.now() - lastDepTime)/1000) >= 3600 * 2){
  227.             console.error('Unactive bot, Restarting');
  228.             process.exit(1);
  229.         }
  230.        if(!reCheckP && !apCheckP && !acCheckP && !deCheckP && !seCheckP && !osCheckP && !coCheckP && !trCheckP && !upCheckP && !ciCheckP){
  231.            console.error('Unactive bot, Relogining');
  232.             webSession = false;
  233.             client.relog();
  234.        } else {
  235.            console.log('reCheckP ' + reCheckP);
  236.            console.log('apCheckP ' + apCheckP);
  237.            console.log('acCheckP ' + acCheckP);
  238.            console.log('deCheckP ' + deCheckP);
  239.            console.log('seCheckP ' + seCheckP);
  240.            console.log('osCheckP ' + osCheckP);
  241.            console.log('coCheckP ' + coCheckP);
  242.            console.log('trCheckP ' + trCheckP);
  243.            console.log('upCheckP ' + upCheckP);
  244.            console.log('ciCheckP ' + ciCheckP);
  245.        }
  246.    }
  247. }
  248. function checkErr(msg){
  249.     if(msg == "Not Logged In"){
  250.         webSession = false;
  251.         client.relog();
  252.     } else if(msg == 'Malformed response'){
  253.         lastDepTime = Date.now() - 3650000;
  254.         setTimeout(checkWorking, 10000);
  255.     }
  256. }
  257. setInterval(function(){checkWorking()}, 300000);
  258. var queueProceed = function() {
  259.    if(!webSession && !config.accounts[id].ban) return;
  260.    rClient.llen(config.rchannels(id).osending, function(err, length) {
  261.        if (length > 0 && !seCheckP) {
  262.            seCheckP = true;
  263.            rClient.lindex(config.rchannels(id).osending, 0, function(err, offerJson) {
  264.                var offer = JSON.parse(offerJson);
  265.                console.log("Sending offer# " + offer.id);
  266.                rClient.lrem(config.rchannels(id).osending, 0, offerJson, function(err, data) {
  267.                    if(config.accounts[id].ban){
  268.                        rClient.rpush(config.rchannels(id).offrsent, JSON.stringify({id: offer.id, success: false, err: "Bot banned"}), function(err) {
  269.                            console.log('Error to send offer #' + offer.id);
  270.                            seCheckP = false;
  271.                        });
  272.                    } else {
  273.                        sendtrade(offer.itemsIdsFromMe, offer.itemsIdsFromThem, offer.trade, offer.message, function(success, err, newid) {
  274.                            if(success){
  275.                                rClient.rpush(config.rchannels(id).offrsent, JSON.stringify({id: offer.id, success: true, newid: newid}), function(err) {
  276.                                    console.log('Offer #' + offer.id + ' added to offrsent list');
  277.                                    lastDepTime = Date.now();
  278.                                });
  279.                            } else {
  280.                                rClient.rpush(config.rchannels(id).offrsent, JSON.stringify({id: offer.id, success: false, err: err}), function(err) {
  281.                                    console.log('Error to send offer #' + offer.id);
  282.                                });
  283.                            }
  284.                            setTimeout(function(){
  285.                                seCheckP = false;
  286.                            }, 5000);
  287.                        });
  288.                    }
  289.                });
  290.            });
  291.        }
  292.    });
  293.    rClient.llen(config.rchannels(id).offrsent, function(err, length) {
  294.        if (length > 0 && !osCheckP) {
  295.            osCheckP = true;
  296.            console.log('Checking sent offers: ' + length);
  297.            requestify.post(config.web.domain + '/api/checksent', {
  298.                secretKey: config.web.secretKey,
  299.                botid: id
  300.            }).then(function(response) {
  301.                osCheckP = false;
  302.            }, function(response) {
  303.                osCheckP = false;
  304.                console.error('Error checking sent offers!');
  305.            });
  306.        }
  307.    });
  308.    rClient.llen(config.rchannels(id).received, function(err, length) {
  309.        if (length > 0 && !reCheckP) {
  310.            reCheckP = true;
  311.            console.log('Checking received trades: ' + length);
  312.            requestify.post(config.web.domain + '/api/checkreceived', {
  313.                secretKey: config.web.secretKey,
  314.                botid: id
  315.            }).then(function(response) {
  316.                reCheckP = false;
  317.            }, function(response) {
  318.                reCheckP = false;
  319.                console.error('Error checking received trades!');
  320.            });
  321.        }
  322.    });
  323.    rClient.llen(config.rchannels(id).complete, function(err, length) {
  324.        if (length > 0 && !coCheckP) {
  325.            coCheckP = true;
  326.            console.log('Checking complete trades: ' + length);
  327.            requestify.post(config.web.domain + '/api/checkcomplete', {
  328.                secretKey: config.web.secretKey,
  329.                botid: id,
  330.            }).then(function(response) {
  331.                coCheckP = false;
  332.            }, function(response) {
  333.                coCheckP = false;
  334.                console.error('Error checking received trades!');
  335.            });
  336.        }
  337.    });
  338.    rClient.llen(config.rchannels(id).approved, function(err, length) {
  339.        if (length > 0 && !apCheckP) {
  340.            apCheckP = true;
  341.            rClient.lindex(config.rchannels(id).approved, 0, function(err, offerJson) {
  342.                var toffer = JSON.parse(offerJson);
  343.                console.log("Accepting offer: " + toffer.id);
  344.                manager.getOffer(toffer.id, function(err, offer){
  345.                    if(err){
  346.                        console.log("Unable to get offer: " + toffer.id + " - " + err.message);
  347.                        rClient.lrem(config.rchannels(id).approved, 0, offerJson, function(err, data) {
  348.                            setTimeout(function(){
  349.                                apCheckP = false;
  350.                            }, 5000);
  351.                        });
  352.                    } else {
  353.                        offer.accept(true, function(err) {
  354.                            rClient.lrem(config.rchannels(id).approved, 0, offerJson, function(err, data) {
  355.                                setTimeout(function(){
  356.                                    apCheckP = false;
  357.                                }, 5000);
  358.                            });
  359.                            if (err) {
  360.                                console.error("Unable to accept offer: " + err.message);
  361.                                 checkErr(err.message);
  362.                                if(toffer.attempts < 3){
  363.                                    toffer.attempts++;
  364.                                    rClient.rpush(config.rchannels(id).approved, JSON.stringify(toffer), function(err) {
  365.                                        console.log('Offer added to approved list')
  366.                                    });
  367.                                }
  368.                            } else {
  369.                                console.log("Offer accepted");
  370.                            }
  371.                        });
  372.                    }
  373.                });
  374.            });
  375.        }
  376.    });
  377.    rClient.llen(config.rchannels(id).accepted, function(err, length) {
  378.        if (length > 0 && !acCheckP) {
  379.            acCheckP = true;
  380.            requestify.post(config.web.domain + '/api/checkaccepted', {
  381.                secretKey: config.web.secretKey,
  382.                botid: id
  383.            }).then(function(response) {
  384.                acCheckP = false;
  385.            }, function(response) {
  386.                acCheckP = false;
  387.                console.error('Error checking accepted trades!');
  388.            });
  389.        }
  390.    });
  391.    rClient.llen(config.rchannels(id).declined, function(err, length) {
  392.        if (length > 0 && !deCheckP) {
  393.            deCheckP = true;
  394.            rClient.lindex(config.rchannels(id).declined, 0, function(err, offerJson) {
  395.                var oid = JSON.parse(offerJson);
  396.                console.log("Declining offer: " + oid);
  397.                manager.getOffer(oid, function(err, offer){
  398.                    if(err){
  399.                        console.log("Unable to get offer: " + oid + " - " + err.message);
  400.                         checkErr(err.message);
  401.                        rClient.lrem(config.rchannels(id).declined, 0, offerJson, function(err, data) {
  402.                            setTimeout(function(){
  403.                                deCheckP = false;
  404.                            }, 5000);
  405.                        });
  406.                    } else {
  407.                        offer.decline();
  408.                        rClient.lrem(config.rchannels(id).declined, 0, offerJson, function(err, data) {
  409.                            setTimeout(function(){
  410.                                deCheckP = false;
  411.                            }, 5000);
  412.                        });
  413.                    }
  414.                });
  415.            });
  416.        }
  417.    });
  418.    rClient.llen(config.rchannels(id).trecheck, function(err, length) {
  419.        if (length > 0 && !trCheckP) {
  420.            trCheckP = true;
  421.            rClient.lindex(config.rchannels(id).trecheck, 0, function(err, offerJson) {
  422.                rClient.lrem(config.rchannels(id).trecheck, 0, offerJson, function(err, data) {
  423.                    var offer = JSON.parse(offerJson);
  424.                    console.log(`Offer #${offer.id} rechecking`);
  425.                    manager.getOffer(offer.id, function(err, offer){
  426.                        if(err){
  427.                            console.error("Couldn't get received items: " + err.message);
  428.                             checkErr(err.message);
  429.                            rClient.rpush(config.rchannels(id).trecheck, JSON.stringify(offer), function(err) {
  430.                                console.log('Offer added to trecheck list');
  431.                            });
  432.                        } else {
  433.                            parseOffer(offer);
  434.                        }
  435.                    });
  436.                    setTimeout(function(){
  437.                        trCheckP = false;
  438.                    }, 30000);
  439.                });
  440.            });
  441.        }
  442.    });
  443. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement