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 | } |