View difference between Paste ID: YN93TdUy and hMWw3i9D
SHOW: | | - or go back to the newest paste.
1
var SteamCommunity = require('steamcommunity');
2
var SteamTotp = require('steam-totp');
3
var mysql = require('mysql');
4
var log4js = require('log4js');
5
var SteamTradeOffers = require('steam-tradeoffers');
6
var async = require('async');
7
8
var pool  = mysql.createPool({
9
	connectionLimit : 10,
10
	database: 'csgo',
11
	host: 'localhost',
12
	user: 'root',
13
	password: 'gHf5WEXC'
14
});
15
16
var community = new SteamCommunity();
17
var offers = new SteamTradeOffers();
18
log4js.configure({
19
	appenders: [
20
		{ type: 'console' },
21
		{ type: 'file', filename: 'logs/bot_'+process.argv[2]+'.log' }
22
	]
23
});
24
var logger = log4js.getLogger();
25
26
var express = require('express');
27
var app = express();
28
29
app.get('/sendtrade/', function (req, res) {
30
	var assetids = req.query['assetids'];
31
	assetids = assetids.split(',');
32
	var partner = req.query['partner'];
33
	var token = req.query['token'];
34
	var checksum = req.query['checksum'];
35
	var steamid = req.query['steamid'];
36
	var senditems = [];
37
	for(var i = 0; i < assetids.length; i++) {
38
		if(assetids[i] == "") continue;
39
		senditems.push({
40
			appid: 730,
41
			contextid: 2, 
42-
			assetid: assetids[i]
42+
			assetid: assetids[i],
43
			amount: 1
44
		});
45
	}
46
	var code = makecode();
47
	console.log(partner, token, checksum, assetids, senditems);
48
	offers.makeOffer({
49
		partnerAccountId: partner,
50
		accessToken: token,
51
		itemsFromThem: senditems,
52
		itemsFromMe: [],
53
		message: 'Code: '+code
54
	}, function(err, r) {
55
		if(err) {
56
			logger.error('Error sending trade');
57
			logger.debug(err);
58
			res.json({
59
				success: false,
60
				error: err.toString()
61
			});
62
		} else {
63
			offers.loadPartnerInventory({
64
				partnerSteamId: steamid,
65
				tradeOfferId: r.tradeofferid,
66
				appId: 730,
67
				contextId: 2,
68
				language: 'english'
69
			}, function(err, rr) {
70
				if(err) {
71
					logger.debug(err);
72
					res.json({
73
						success: false,
74
						error: err.toString()
75
					});
76
				} else {
77
					var names = [];
78
					for(var i = 0; i < senditems.length; i++) {
79
						for(var a = 0; a < rr.length; a++) {
80
							if((senditems[i].assetid == rr[a].id) && (!rr[a].ss)) {
81
								names.push({market_hash_name: rr[a].market_hash_name, icon_url: rr[a].icon_url});
82
								rr[a].ss = 1;
83
								continue;
84
							}
85
						}
86
					}
87
					res.json({
88
						success: true,
89
						code: code,
90
						amount: checksum,
91
						tid: r.tradeofferid,
92
						items: names
93
					});
94
				}
95
			});
96
		}
97
	});
98
});
99
100
app.get('/sendtrademe/', function (req, res) {
101
	var names = req.query['names'];
102
	names = names.split(',');
103
	var partner = req.query['partner'];
104
	var token = req.query['token'];
105
	var checksum = req.query['checksum'];
106
	offers.loadMyInventory({
107
		appId: 730,
108
		contextId: 2
109
	}, function(err, items) {
110
		if(err) {
111
			logger.error('Error sending trade');
112
			logger.debug(err);
113
			res.json({
114
				success: false,
115
				error: err.toString()
116
			});			
117
		} else {
118
			var senditems = [];
119
			for(var i = 0; i < names.length; i++) {
120
				for(var a = 0; a < items.length; a++) {
121
					if((names[i] == items[a].market_hash_name) && (!items[a].ss)) {
122
						senditems.push({
123
							appid: 730,
124
							contextid: 2, 
125
							assetid: items[a].id,
126
							amount: 1
127
						});
128
						if(senditems.length == names.length-1) break;
129
						items[a].ss = 1;
130
						continue;
131
					}
132
					if(senditems.length == names.length-1) break;
133
				}
134
			};
135
			var code = makecode();
136
			console.log(partner, token, checksum, names, senditems);
137
			offers.makeOffer({
138
				partnerAccountId: partner,
139
				accessToken: token,
140
				itemsFromThem: [],
141
				itemsFromMe: senditems,
142
				message: 'Code: '+code
143
			}, function(err, r) {
144
				if(err) {
145
					logger.error('Error sending trade');
146
					logger.debug(err);
147
					res.json({
148
						success: false,
149
						error: err.toString()
150
					});
151
				} else {
152
					res.json({
153
						success: true,
154
						code: code,
155
						amount: -checksum,
156
						tid: r.tradeofferid,
157
						state: 2
158
					});
159
				}
160
			});
161
		}
162
	});
163
});
164
165
app.get('/checkTrade/', function (req, res) {
166
	var tid = req.query['tid'];
167
	offers.getOffer({
168
		tradeofferid: tid
169
	}, function(err, trade) {
170
		if(err) {
171
			logger.error('Error checking trade');
172
			logger.debug(err);
173
			res.json({
174
				success: false,
175
				error: err.toString()
176
			});
177
		} else {
178
			logger.debug(trade);
179
			if(trade.response.offer.trade_offer_state == 3) {
180
				res.json({
181
					success: true,
182
					action: 'accept',
183
					result: 'Coins have been added to your balance'
184
				});
185
			} else if(trade.response.offer.trade_offer_state == 7) {
186
				res.json({
187
					success: true,
188
					result: 'You are declined trade',
189
					action: 'cross'
190
				});
191
			} else {
192
				res.json({
193
					success: false,
194
					error: 'You are not accept trade'
195
				});
196
			}
197
		}
198
	});
199
});
200
201
function cancelTrade(offerid) {
202
	offers.declineOffer({
203
		tradeOfferId: offerid
204
	}, function(err, log) {
205
		if (err) {
206
			logger.error('Не смогли отменить трейд #'+offerid);
207
			logger.debug(err);
208
			return;
209
		}
210
		logger.debug(log);
211
		logger.trace('Offer #'+offerid+' canceled');
212
	});
213
}
214
215
query('SELECT * FROM `bots` WHERE `id` = '+pool.escape(process.argv[2]), function(err, res) {
216
	if((err) || (!res[0])) {
217
		logger.error('Cant find account');
218
		process.exit(0);
219
		return;
220
	}
221
	account = res[0];
222
	app.listen(3000+account.id);
223
	logger.trace('We got account info');
224
	account.twoFactorCode = SteamTotp.generateAuthCode(account.shared_secret);
225
	account.auth = false;
226
	logger.debug(account);
227
	community.login(account, login);
228
});
229
230
community.on('confKeyNeeded', function(tag, callback) {
231
    callback(null, time, SteamTotp.getConfirmationKey(account.identity_secret, time(), tag));
232
});
233
234
community.on('newConfirmation', function(confirmation) {
235
	var time = time();
236
	var key = SteamTotp.getConfirmationKey(account.identity_secret, time, 'allow');
237
	confirmation.respond(time, key, true, function(err) {
238
		if(err) {
239
			logger.error('Error on mobile auth');
240
			logger.debug(err);
241
			return;
242
		}
243
		logger.trace('Trade sucesfully confirmed');
244
	});
245
});
246
247
function query(sql, callback) {
248
	if (typeof callback === 'undefined') {
249
		callback = function() {};
250
	}
251
	pool.getConnection(function(err, connection) {
252
		if(err) return callback(err);
253
		logger.info('DB connection ID: '+connection.threadId);
254
		connection.query(sql, function(err, rows) {
255
			if(err) return callback(err);
256
			connection.release();
257
			return callback(null, rows);
258
		});
259
	});
260
}
261
262
function login(err, sessionID, cookies, steamguard) {
263
	if(err) {
264
		logger.error('Auth error');
265
		logger.debug(err);
266
		if(err.message == "SteamGuardMobile") {
267
			account.twoFactorCode = SteamTotp.generateAuthCode(account.shared_secret);
268
			logger.warn('Error in auth: '+account.twoFactorCode);
269
			setTimeout(function() {
270
				community.login(account, login);
271
			}, 5000);
272
			return;
273
		}
274
		process.exit(0);
275
	}
276
	logger.trace('Sucesfully auth');
277
	account.sessionID = sessionID;
278
	account.cookies = cookies;
279
	community.getWebApiKey('csgobananas.com', webApiKey);
280
	community.startConfirmationChecker(10000, account.identity_secret);
281
}
282
283
function webApiKey(err, key) {
284
	if(err) {
285
		logger.error('Cant make apikey')
286
		logger.debug(err);
287
		process.exit(0);
288
		return;
289
	}
290
	account.key = key;
291
	logger.trace('API key bot '+account.accountName+' '+account.key);
292
	offersSetup();
293
	community.loggedIn(checkLoggedIn);
294
}
295
296
function offersSetup() {
297
	logger.trace('Loaded steam-tradeoffers');
298
	offers.setup({
299
		sessionID: account.sessionID,
300
		webCookie: account.cookies,
301
		APIKey: account.key
302
	});
303
}
304
305
function checkLoggedIn(err, loggedIn, familyView) {
306
	if((err) || (!loggedIn)) {
307
		logger.error('We arent logged in')
308
		process.exit(0);
309
	} else {
310
		logger.trace('Logged in');
311
		account.auth = true;
312
	}
313
}
314
315
function makecode() {
316
    var text = "";
317
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
318
319
    for(var i=0; i < 5; i++)
320
        text += possible.charAt(Math.floor(Math.random() * possible.length));
321
322
    return text;
323
}
324
325
function time() {
326
	return parseInt(new Date().getTime()/1000)
327
}