· 6 years ago · Sep 23, 2019, 04:52 PM
1var 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
13process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
14if(typeof config.accounts[id] == "undefined"){
15 console.error('invalid id');
16 process.exit(1);
17 return;
18}
19console.log(`Starting bot #${id}`);
20var rClient = redis.createClient(config.connection.redis);
21var SteamClient = new Steam.CMClient(Steam.EConnectionProtocol.TCP);
22SteamClient.bind(ip);
23var client = new SteamUser(SteamClient);
24var manager = new TradeOfferManager({
25 "steam": client,
26 "domain": config.web.domain,
27 "language": "ru",
28 "cancelTime": 300000,
29 "cancelOfferCount": 20,
30 "cancelOfferCountMinAge": 60000,
31});
32var webSession = false;
33var community = new SteamCommunity();
34var 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};
42if (fs.existsSync(`./polldata/${id}.json`)) manager.pollData = JSON.parse(fs.readFileSync(`./polldata/${id}.json`));
43community.on('debug', function(data) {
44 console.log(data);
45});
46if(!config.accounts[id].ban) client.logOn(logOnOptions());
47client.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});
54client.on('error', function(err) {
55 var now = new Date();
56 console.error(now + ' | ERR | ' + err.msg);
57 console.error(err);
58});
59client.on('disconnected', function(eresult, msg) {
60 var now = new Date();
61 console.error(now + ' | DISCONNECTED | ' + msg);
62 console.error(eresult, msg);
63});
64client.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});
87var conf_proceed = false;
88var 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}
109manager.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});
123manager.on('receivedOfferChanged', function(offer, oldState) {
124 console.log(`Offer #${offer.id} changed: ${TradeOfferManager.ETradeOfferState[oldState]} -> ${TradeOfferManager.ETradeOfferState[offer.state]}`);
125 parseOffer(offer);
126});
127manager.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});
134manager.on('pollData', function(pollData) {
135 fs.writeFile(`./polldata/${id}.json`, JSON.stringify(pollData), function() {});
136});
137function 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}
162function 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}
210var 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);
221lastDepTime = Date.now();
222function 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}
248function 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}
257setInterval(function(){checkWorking()}, 300000);
258var 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}