Advertisement
Guest User

Bot.js

a guest
Mar 13th, 2018
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.47 KB | None | 0 0
  1. var mysql = require('mysql');
  2. var SteamUser = require('steam-user');
  3. var TradeOfferManager = require('steam-tradeoffer-manager');
  4. var SteamTotp = require('steam-totp');
  5. var SteamCommunity = require('steamcommunity');
  6. var fs = require('fs');
  7. var request = require('request');
  8. var config = require('./config.json');
  9. var CryptoJS = require("crypto-js");
  10. var log4js = require('log4js');
  11. var express = require('express');
  12. var app = express();
  13.  
  14. var community = new SteamCommunity();
  15. var client = new SteamUser();
  16. var manager = new TradeOfferManager({
  17. steam: client,
  18. domain: 'localhost',
  19. language: 'en'
  20. });
  21.  
  22. var server = require('http').createServer();
  23. var io = require('socket.io')(server);
  24. server.listen(2052);
  25.  
  26. updateLog();
  27. function updateLog() {
  28. log4js.configure({
  29. appenders: {
  30. out:{ type: 'console' },
  31. app:{ type: 'file', filename: 'logs/bot/bot'+time()+'.log' }
  32. },
  33. categories: {
  34. default: { appenders: [ 'out', 'app' ], level: 'all' }
  35. }
  36. });
  37. setTimeout(function(){
  38. updateLog();
  39. }, 24 * 3600 * 1000);
  40. }
  41.  
  42. var logger = log4js.getLogger();
  43.  
  44. var pool = mysql.createPool({
  45. database: config.database["database"],
  46. host: config.database["host"],
  47. user: config.database["user"],
  48. password: config.database["password"]
  49. });
  50.  
  51.  
  52. process.on('uncaughtException', function (err) {
  53. logger.trace('Strange error');
  54. logger.debug(err);
  55. });
  56.  
  57. //GAME INFO
  58. var AppID = config.optionsBot.AppID;
  59. var ContextID = config.optionsBot.ContextID;
  60. var proxies = config.proxies;
  61. var delayPrice = config.optionsBot.delayPrice;//minutes
  62.  
  63. var minItemDeposit = config.optionsBot.minItemDeposit;//$
  64. var minDeposit = config.optionsBot.minDeposit; //$
  65. var minWithdraw = config.optionsBot.minWithdraw;//$
  66. var offers = {};
  67. var deposits = {};
  68. var withdraws = {};
  69. var invUserD = {};
  70. var invUserW = {};
  71. var waitDeposit = {};
  72. var waitWithdraw = {};
  73. var timeBetween = config.optionsBot.timeBetween; //minutes between deposits and withdraws
  74.  
  75.  
  76. //Polling Steam and Logging On
  77. client.logOn({
  78. accountName: config.bots.username,
  79. password: config.bots.password,
  80. twoFactorCode: SteamTotp.generateAuthCode(config.bots.sharedSecret)
  81. });
  82.  
  83. //CONNECT
  84. var users = {};
  85.  
  86. io.on('connection', function(socket) {
  87. var user = false;
  88.  
  89. socket.on('hash', function(m) {
  90. pool.query('SELECT `steamid`, `name`, `avatar`, `tradeLink`, `balance`, `banTrade`, `rank` FROM users WHERE `hash` = ' + pool.escape(m.hash), function(err, row) {
  91. if((err) || (!row.length)){
  92. return socket.disconnect();
  93. }else{
  94. user = row[0];
  95. user.type = m.type;
  96.  
  97. socket.join(user.steamid);
  98.  
  99. users[user.steamid] = {
  100. steamid: user.steamid,
  101. avatar: user.avatar,
  102. name: user.name,
  103. tradeLink: user.tradeLink,
  104. socket: socket
  105. }
  106.  
  107. socket.emit('message', {
  108. type: 'hello',
  109. balance: user.balance,
  110. withdraw: config.optionsBot.withdrawEnable
  111. });
  112.  
  113. if(m.type == 'deposit'){
  114. getMyInv(user, socket);
  115.  
  116. if(deposits[user.steamid] !== undefined && deposits[user.steamid]['active']){
  117. if(offers[deposits[user.steamid]['id']] !== undefined){
  118. socket.emit('message', {
  119. type: 'checkOffer',
  120. mtype: 'sent',
  121. code: offers[deposits[user.steamid]['id']]['code'],
  122. id: deposits[user.steamid]['id'],
  123. bot: deposits[user.steamid]['bot']
  124. });
  125. }
  126. }
  127. } else if(m.type == 'withdraw'){
  128. getBotInv(user, socket);
  129.  
  130. if(withdraws[user.steamid] !== undefined && withdraws[user.steamid]['active']){
  131. if(offers[withdraws[user.steamid]['id']] !== undefined){
  132. if(offers[withdraws[user.steamid]['id']]['confirmed']){
  133. socket.emit('message', {
  134. type: 'checkOffer',
  135. mtype: 'sent',
  136. code: offers[withdraws[user.steamid]['id']]['code'],
  137. id: withdraws[user.steamid]['id'],
  138. bot: withdraws[user.steamid]['bot']
  139. });
  140. }else{
  141. socket.emit('message', {
  142. type: 'checkOffer',
  143. mtype: 'confirm',
  144. code: offers[withdraws[user.steamid]['id']]['code'],
  145. id: withdraws[user.steamid]['id'],
  146. bot: withdraws[user.steamid]['bot']
  147. });
  148. }
  149. }
  150. }
  151. }
  152. }
  153. });
  154. });
  155.  
  156. socket.on('message', function(m) {
  157. if(!user) return;
  158.  
  159. if(m.type == 'userInv'){
  160. if(user.type == 'deposit'){
  161. return getMyInv(user, socket);
  162. } else if(user.type == 'withdraw'){
  163. return getBotInv(user, socket);
  164. }
  165. return;
  166. }
  167.  
  168. if(user.banTrade == 1){
  169. socket.emit('message', {
  170. type: 'error',
  171. enable: false,
  172. error: 'Error: You are banned to trade!'
  173. });
  174. return;
  175. }
  176.  
  177. if(user.rank == 8 || user.rank == 5) {
  178. // YOUTUBER OR STREAMER
  179. socket.emit('message', {
  180. type: 'error',
  181. enable: false,
  182. error: 'Error: You dont have permission to trade because you have test coins!'
  183. });
  184. return;
  185. }
  186.  
  187. if(m.type == 'deposit') return deposit(m.items, user, socket);
  188. if(m.type == 'withdraw') return withdraw(m.items, user, socket);
  189. });
  190.  
  191. socket.on('disconnect', function(m) {
  192. delete users[user.steamid];
  193. });
  194. });
  195.  
  196. //GET BALANCE
  197. function getBalance(steamid) {
  198. pool.query('SELECT `balance` FROM `users` WHERE `steamid` = '+pool.escape(steamid), function(err, row) {
  199. if((err) || (!row.length)) {
  200. logger.error('Failed to load your balance');
  201. logger.debug(err);
  202. return;
  203. }
  204. io.sockets.in(steamid).emit('message', {
  205. type: 'balance',
  206. balance: row[0].balance
  207. });
  208. });
  209. }
  210.  
  211. //GETTING PRICES
  212. var priceUrl = 'https://api.csgofast.com/price/all';
  213.  
  214. function getPriceList() {
  215. request(priceUrl, function(dataAndEvents, r, actual) {
  216. ok = JSON.parse(actual);
  217. if (200 != r.statusCode) {
  218. if (fs.existsSync("/var/Bot/jackpot/prices.json")) {
  219. ok = JSON.parse(fs.readFileSync("/var/Bot/prices.json"));
  220. logger.warn('[BOT] Loading Prices - Server sided prices loaded!');
  221. }
  222. } else {
  223. fs.writeFileSync("/var/Bot/prices.json", actual);
  224. logger.warn('[BOT] Loading Prices - API prices loaded!');
  225. }
  226. });
  227. }
  228. getPriceList();
  229. setInterval(getPriceList, delayPrice * 60 * 1000);
  230.  
  231. //GET ITEM PRICE
  232. function getPriceItem(name){
  233. var priceItem = 0;
  234. if (name) {
  235. var prices = require('./prices.json');
  236. priceItem = parseInt(prices[name] * 1000);
  237. }
  238. return priceItem;
  239. }
  240.  
  241. //GET ALL ITEMS
  242. var itemsWithdraw = {};
  243. getItems();
  244.  
  245. function getItems(){
  246. pool.query('SELECT * FROM `items`', function(err, items) {
  247. if(err) {
  248. logger.error(err);
  249. return;
  250. }
  251.  
  252. items.forEach(function(item){
  253. itemsWithdraw[item.itm_id] = {
  254. name: item.name,
  255. status: item.status
  256. }
  257. });
  258.  
  259. logger.debug('[BOT] Items withdraw loaded!');
  260. });
  261. }
  262.  
  263. //DEPOSIT
  264. function deposit(items, user, socket){
  265. socket.emit('message', {
  266. type: 'alert',
  267. alert: 'Preparing trade offer please wait...'
  268. });
  269.  
  270. if(waitDeposit[user.steamid] !== undefined && waitDeposit[user.steamid]['time'] - time() > 0){
  271. socket.emit('message', {
  272. type: 'error',
  273. error: 'Error: You need to wait '+timeBetween+' minutes between deposits!'
  274. });
  275. return;
  276. }
  277.  
  278. if(user.type != 'deposit'){
  279. socket.emit('message', {
  280. type: 'error',
  281. error: 'Error: Invalid page!'
  282. });
  283. return;
  284. }
  285.  
  286. waitDeposit[user.steamid] = {
  287. time: (time() + timeBetween * 60)
  288. }
  289.  
  290. if(!user.tradeLink){
  291. socket.emit('message', {
  292. type: 'error',
  293. error: 'Error: You need to set trade link!'
  294. });
  295. return;
  296. }
  297.  
  298. if(deposits[user.steamid] !== undefined && deposits[user.steamid]['active']){
  299. socket.emit('message', {
  300. type: 'error',
  301. error: 'Error: You have already a offer active!'
  302. });
  303. return;
  304. }
  305.  
  306. if(items.length <= 0){
  307. socket.emit('message', {
  308. type: 'error',
  309. error: 'Error: You need to deposit minimum 1 item!'
  310. });
  311. return;
  312. }
  313.  
  314. var reqOpts = {
  315. url: 'http://steamcommunity.com/inventory/' + encodeURIComponent(user.steamid) + '/730/'+ '2?l=eng&count=5000'
  316. };
  317.  
  318. var totalItems = [];
  319. var totalPrice = 0;
  320.  
  321. request(reqOpts, function(err, response, body) {
  322. if(err) {
  323. logger.error(err);
  324. return;
  325. }
  326. if(response && response.statusCode == 200){
  327. var body = JSON.parse(body);
  328. var assets = body['assets'];
  329. var descriptions = body['descriptions'];
  330.  
  331. if(!assets) return;
  332.  
  333. //GET ITEMS
  334. assets.forEach(function(valuey, y) {
  335. descriptions.forEach(function(valuez, z) {
  336. if(valuey['classid'] == valuez['classid'] && valuey['instanceid'] == valuez['instanceid']){
  337. var isTradable = valuez['tradable'];
  338. if(isTradable == 1){
  339. if(/(Souvenir)/.exec(valuez['market_hash_name'])) return;
  340.  
  341. if(getPriceItem(valuez['market_hash_name']) >= minItemDeposit * 1000){
  342. items.forEach(function(item){
  343. if(valuey['assetid'] == item){
  344. totalItems.push({
  345. id: valuez['classid']+'_'+valuez['instanceid'],
  346. name: valuez['market_hash_name'],
  347. image: valuez['icon_url']
  348. });
  349. totalPrice += getPriceItem(valuez['market_hash_name']);
  350. }
  351. });
  352. }
  353. }
  354. }
  355. });
  356. });
  357.  
  358. //VERIFY
  359. if(totalItems.length != items.length){
  360. socket.emit('message', {
  361. type: 'error',
  362. error: 'Error: Invalids items in your offer. Please refresh your inventory!'
  363. });
  364. return;
  365. }
  366.  
  367. if(totalPrice < minDeposit * 1000){
  368. socket.emit('message', {
  369. type: 'error',
  370. error: 'Error: You need to deposit minimum '+minDeposit+'$!'
  371. });
  372. return;
  373. }
  374.  
  375. var create = manager.createOffer(user.steamid, user.tradeLink.split('token=')[1]);
  376.  
  377. items.forEach(function(item){
  378. create.addTheirItem({
  379. "appid": AppID,
  380. "contextid": ContextID,
  381. "assetid": item
  382. });
  383. });
  384.  
  385. //SEND OFFER
  386. socket.emit('message', {
  387. type: 'checkOffer',
  388. mtype: 'process',
  389. code: code,
  390. id: create.id,
  391. bot: config.bots.botname
  392. });
  393.  
  394. var code = makeCode();
  395. create.setMessage('CSGOKnight | Deposit | +'+totalPrice+' coins | Code '+code);
  396.  
  397. create.send(function(err, status) {
  398. if(err){
  399. socket.emit('message', {
  400. type: 'error',
  401. error: 'Error: There was an error sending your trade offer. Please try again later.'
  402. });
  403. logger.error(err);
  404. return;
  405. }else{
  406. logger.debug('[BOT] Offer #' + create.id + " is " + status + " >> Deposit");
  407.  
  408. offers[create.id] = {
  409. type: 'deposit',
  410. steamid: user.steamid,
  411. items: totalItems,
  412. total: totalPrice,
  413. status: status,
  414. code: code,
  415. confirmed: true
  416. };
  417.  
  418. deposits[user.steamid] = {
  419. active: true,
  420. id: create.id,
  421. bot: config.bots.botname
  422. }
  423.  
  424. //INSERT TRADE
  425. pool.query('INSERT INTO `trades` SET `type` = '+pool.escape('deposit')+', `user` = '+pool.escape(user.steamid)+', `tradeId` = '+pool.escape(create.id)+', `items` = '+pool.escape(items.join('/'))+', `amount` = '+parseInt(totalPrice)+', `code` = '+pool.escape(code)+', `time` = '+pool.escape(time())+', `status` = '+pool.escape(status), function(err) {
  426. if(err) {
  427. logger.error(err);
  428. return;
  429. }
  430. });
  431.  
  432. socket.emit('message', {
  433. type: 'checkOffer',
  434. mtype: 'sent',
  435. code: code,
  436. id: create.id,
  437. bot: config.bots.botname
  438. });
  439.  
  440. socket.emit('message', {
  441. type: 'success',
  442. success: 'Your deposit offer has been sent. Check offers tab from profile for more informations.'
  443. });
  444. }
  445. });
  446. }
  447. });
  448. }
  449.  
  450. //WITHDRAW
  451. function withdraw(items, user, socket){
  452. if(config.optionsBot.withdrawEnable == false){
  453. socket.emit('message', {
  454. type: 'error',
  455. error: 'Error: The withdraw is unavailable at this moment. Try again later!'
  456. });
  457. return;
  458. }
  459.  
  460. socket.emit('message', {
  461. type: 'alert',
  462. alert: 'Preparing trade offer please wait...'
  463. });
  464.  
  465. if(waitWithdraw[user.steamid] !== undefined && waitWithdraw[user.steamid]['time'] - time() > 0){
  466. socket.emit('message', {
  467. type: 'error',
  468. error: 'Error: You need to wait '+timeBetween+' minutes between withdraws!'
  469. });
  470. return;
  471. }
  472.  
  473. if(user.type != 'withdraw'){
  474. socket.emit('message', {
  475. type: 'error',
  476. error: 'Error: Invalid page!'
  477. });
  478. return;
  479. }
  480.  
  481. waitWithdraw[user.steamid] = {
  482. time: (time() + timeBetween * 60)
  483. }
  484.  
  485. if(!user.tradeLink){
  486. socket.emit('message', {
  487. type: 'error',
  488. error: 'Error: You need to set trade link!'
  489. });
  490. return;
  491. }
  492.  
  493. if(withdraws[user.steamid] !== undefined && withdraws[user.steamid]['active']){
  494. socket.emit('message', {
  495. type: 'error',
  496. error: 'Error: You have already a offer active!'
  497. });
  498. return;
  499. }
  500.  
  501. if(items.length <= 0){
  502. socket.emit('message', {
  503. type: 'error',
  504. error: 'Error: You need to withdraw minimum 1 item!'
  505. });
  506. return;
  507. }
  508.  
  509. var totalItems = [];
  510. var totalPrice = 0;
  511.  
  512. manager.loadInventory(AppID, ContextID, true, function(err0, myItems) {
  513. if(err0) {
  514. logger.error(err0);
  515. return;
  516. }
  517.  
  518. //GET ITEMS
  519. myItems.forEach(function(item){
  520. var isTradable = item['tradable'];
  521. if(isTradable == 1){
  522. items.forEach(function(assetid){
  523. if(item['assetid'] == assetid){
  524. var itm_id = item['classid']+'_'+item['instanceid'];
  525. if(itemsWithdraw[itm_id] !== undefined){
  526. if(itemsWithdraw[itm_id]['status'] == 1){
  527. socket.emit('message', {
  528. type: 'error',
  529. error: 'Error: The item '+item['market_hash_name']+' is already in a offer. Please try again later!'
  530. });
  531. return;
  532. }
  533. totalItems.push({
  534. id: item['classid']+'_'+item['instanceid'],
  535. name: item['market_hash_name'],
  536. image: item['icon_url']
  537. });
  538. totalPrice += getPriceItem(item['market_hash_name']);
  539. }
  540. }
  541. });
  542. }
  543. });
  544.  
  545. //VERIFY
  546. if(totalItems.length != items.length){
  547. socket.emit('message', {
  548. type: 'error',
  549. error: 'Error: Invalids items in your offer. Please refresh your inventory!'
  550. });
  551. return;
  552. }
  553.  
  554. if(totalPrice < minWithdraw * 1000){
  555. socket.emit('message', {
  556. type: 'error',
  557. error: 'Error: You need to withdraw minimum '+minWithdraw+'$!'
  558. });
  559. return;
  560. }
  561.  
  562. pool.query('SELECT `balance`, `countDeposits`, `available` FROM `users` WHERE `steamid` = '+pool.escape(user.steamid), function(err1, row1) {
  563. if((err1) || (!row1.length)) {
  564. logger.error('Failed to find DB');
  565. logger.debug(err1);
  566. socket.emit('message', {
  567. type: 'error',
  568. error: 'You are not DB'
  569. });
  570. return;
  571. }
  572.  
  573. if(row1[0].countDeposits <= 0){
  574. socket.emit('message', {
  575. type: 'error',
  576. error: 'Error: You need to deposit first minimum '+minDeposit+'$!'
  577. });
  578. return;
  579. }
  580.  
  581. if(row1[0].available < totalPrice){
  582. socket.emit('message', {
  583. type: 'error',
  584. error: 'Error: You need to have withdraw available '+totalPrice+' coins. Need '+(totalPrice - row1[0].available)+'!'
  585. });
  586. return;
  587. }
  588.  
  589. if(row1[0].balance >= totalPrice) {
  590. //EDIT BALANCE
  591. pool.query('UPDATE `users` SET `balance` = `balance` - '+parseInt(totalPrice)+', `available` = `available` - '+parseInt(totalPrice)+' WHERE `steamid` = '+pool.escape(user.steamid), function(err2, row2) {
  592. if(err2) {
  593. logger.error('Error in withdraw');
  594. logger.debug(err2);
  595. socket.emit('message', {
  596. type: 'error',
  597. error: 'You dont have enough points'
  598. });
  599. return;
  600. }
  601.  
  602. var create = manager.createOffer(user.steamid, user.tradeLink.split('token=')[1]);
  603.  
  604. items.forEach(function(item){
  605. create.addMyItem({
  606. "appid": AppID,
  607. "contextid": ContextID,
  608. "assetid": item
  609. });
  610. });
  611.  
  612. //CREATE OFFER
  613. socket.emit('message', {
  614. type: 'checkOffer',
  615. mtype: 'process',
  616. code: code,
  617. id: create.id,
  618. bot: config.bots.botname
  619. });
  620.  
  621. var code = makeCode();
  622. create.setMessage('CSGOKnight | Withdraw | -'+totalPrice+' coins | Code '+code);
  623.  
  624. create.send(function(err3, status) {
  625. if(err3){
  626. socket.emit('message', {
  627. type: 'error',
  628. error: 'Error: There was an error sending your trade offer. Please try again later.'
  629. });
  630. logger.error(err);
  631. return;
  632. }else{
  633. logger.debug('[BOT] Offer #' + create.id + " is " + status + " << Withdraw");
  634.  
  635. offers[create.id] = {
  636. type: 'withdraw',
  637. steamid: user.steamid,
  638. items: totalItems,
  639. total: totalPrice,
  640. status: status,
  641. code: code,
  642. confirmed: false
  643. };
  644.  
  645. withdraws[user.steamid] = {
  646. active: true,
  647. id: create.id,
  648. bot: config.bots.botname
  649. }
  650.  
  651. //INSERT TRADE
  652. pool.query('INSERT INTO `trades` SET `type` = '+pool.escape('withdraw')+', `user` = '+pool.escape(user.steamid)+', `tradeId` = '+pool.escape(create.id)+', `items` = '+pool.escape(items.join('/'))+', `amount` = '+parseInt(totalPrice)+', `code` = '+pool.escape(code)+', `time` = '+pool.escape(time())+', `status` = '+pool.escape(status), function(err4) {
  653. if(err4) {
  654. logger.error(err4);
  655. return;
  656. }
  657. });
  658.  
  659. //INSERT ITEMS
  660. totalItems.forEach(function(item){
  661. pool.query('UPDATE `items` SET `status` = 1 WHERE `itm_id` = '+pool.escape(item.id), function(err5) {
  662. if(err5) {
  663. logger.error(err5);
  664. return;
  665. }
  666. });
  667. itemsWithdraw[item.id]['status'] = 1;
  668. });
  669.  
  670. socket.emit('message', {
  671. type: 'checkOffer',
  672. mtype: 'confirm',
  673. code: code,
  674. id: create.id,
  675. bot: config.bots.botname
  676. });
  677.  
  678. getBalance(user.steamid);
  679.  
  680. socket.emit('message', {
  681. type: 'success',
  682. success: 'Your withdraw offer has been sent but need bot confirmation. Wait few moments!'
  683. });
  684.  
  685. community.checkConfirmations();
  686. }
  687. });
  688.  
  689. });
  690. } else {
  691. socket.emit('message', {
  692. type: 'error',
  693. error: 'You dont have any money'
  694. });
  695. }
  696. });
  697. });
  698. }
  699.  
  700.  
  701.  
  702.  
  703. //Offer handling
  704. function acceptOffer(offer) {
  705. offer.accept(function(err) {
  706. if (err) logger.error('Unable to accept offer: ' + err);
  707. community.checkConfirmations();
  708. logger.debug('[BOT] Offer #' + offer.id + " is accepted" );
  709. });
  710. }
  711.  
  712. function declineOffer(offer) {
  713. offer.decline(function(err) {
  714. if (err) return logger.error('Unable to decline offer: ' + err);
  715. logger.debug('[BOT] Offer #' + offer.id + " is declined" );
  716. });
  717. }
  718.  
  719. //
  720. client.on('loggedOn', function(details, parental) {
  721. logger.warn("[BOT] Signed in!");
  722. client.setPersona(SteamUser.Steam.EPersonaState.Online);
  723. });
  724.  
  725. client.on('webSession', function(sessionID, cookies) {
  726. manager.setCookies(cookies);
  727. community.setCookies(cookies);
  728. community.startConfirmationChecker(config.optionsBot.confirmationInterval, config.bots.identitySecret);
  729. logger.warn("[BOT] Session cookies set!");
  730. });
  731.  
  732. manager.on('sentOfferChanged', function(offer) {
  733.  
  734. if(offer.state == 3){
  735.  
  736. if(offers.hasOwnProperty(offer.id)){
  737.  
  738. io.sockets.in(offers[offer.id]['steamid']).emit('message', {
  739. type: 'success',
  740. success: 'The trade offer has been accepted.'
  741. });
  742.  
  743. if(offers[offer.id]['type'] == 'deposit' && offers[offer.id]['status'] == 'sent'){
  744.  
  745. if(offer.itemsToGive.length == 0 && offer.itemsToReceive.length > 0 ){
  746.  
  747. //EDIT TRADE
  748. pool.query('UPDATE `trades` SET `status` = '+pool.escape('accepted')+' WHERE `tradeId` = '+pool.escape(offer.id), function(err1) {
  749. if(err1) {
  750. logger.error(err1);
  751. return;
  752. }
  753.  
  754. offers[offer.id]['status'] = 'accepted';
  755.  
  756. io.sockets.in(offers[offer.id]['steamid']).emit('message', {
  757. type: 'checkOffer',
  758. mtype: 'accepted',
  759. code: offers[offer.id]['code'],
  760. id: offer.id,
  761. bot: deposits[offers[offer.id]['steamid']]['bot']
  762. });
  763.  
  764. //EDIT ITEMS
  765. offers[offer.id]['items'].forEach(function(item){
  766. pool.query('INSERT INTO `items` SET `tradeD` = '+pool.escape(offer.id)+', `name` = '+pool.escape(item.name)+', `img` = '+pool.escape(item.image)+', `itm_id` = '+pool.escape(item.id)+', `time` = '+pool.escape(time()), function(err2) {
  767. if(err2) {
  768. logger.error(err2);
  769. return;
  770. }
  771. });
  772.  
  773. itemsWithdraw[item.id] = {
  774. name: item.name,
  775. status: 0
  776. }
  777. });
  778.  
  779. //EDIT BALANCE
  780. pool.query('UPDATE `users` SET `balance` = `balance` + '+parseInt(offers[offer.id]['total'])+', `countDeposits` = `countDeposits` + 1, `totalDeposits` = `totalDeposits` + '+parseInt(offers[offer.id]['total'])+' WHERE `steamid` = '+pool.escape(offers[offer.id]['steamid']), function(err3) {
  781. if(err3) {
  782. logger.error(err3);
  783. return;
  784. }
  785.  
  786. getBalance(offers[offer.id]['steamid']);
  787.  
  788. if(deposits[offers[offer.id]['steamid']] !== undefined){
  789. deposits[offers[offer.id]['steamid']]['active'] = false;
  790. }
  791.  
  792. logger.debug('[BOT] Offer #' + offer.id + " is accepted >> Deposit");
  793. });
  794. });
  795. }
  796.  
  797. } else if(offers[offer.id]['type'] == 'withdraw' && offers[offer.id]['status'] == 'pending'){
  798.  
  799. if(offer.itemsToGive.length > 0 && offer.itemsToReceive.length == 0 ){
  800.  
  801. //EDIT TRADE
  802. pool.query('UPDATE `trades` SET `status` = '+pool.escape('accepted')+' WHERE `tradeId` = '+pool.escape(offer.id), function(err1) {
  803. if(err1) {
  804. logger.error(err1);
  805. return;
  806. }
  807.  
  808. offers[offer.id]['status'] = 'accepted';
  809.  
  810. io.sockets.in(offers[offer.id]['steamid']).emit('message', {
  811. type: 'checkOffer',
  812. mtype: 'accepted',
  813. code: offers[offer.id]['code'],
  814. id: offer.id,
  815. bot: withdraws[offers[offer.id]['steamid']]['bot']
  816. });
  817.  
  818. //DELETE ITEMS
  819. offers[offer.id]['items'].forEach(function(item){
  820. pool.query('DELETE FROM `items` WHERE `itm_id` = '+pool.escape(item.id), function(err2) {
  821. if(err2) {
  822. logger.error(err2);
  823. return;
  824. }
  825. });
  826.  
  827. delete itemsWithdraw[item.id];
  828. });
  829.  
  830. if(withdraws[offers[offer.id]['steamid']] !== undefined){
  831. withdraws[offers[offer.id]['steamid']]['active'] = false;
  832. }
  833.  
  834. logger.debug('[BOT] Offer #' + offer.id + " is accepted << Withdraw");
  835. });
  836. }
  837. }
  838. }
  839.  
  840. } else if(offer.state != 2){
  841.  
  842. if(offers.hasOwnProperty(offer.id)){
  843.  
  844. io.sockets.in(offers[offer.id]['steamid']).emit('message', {
  845. type: 'error',
  846. error: 'The trade offer has been rejected.'
  847. });
  848.  
  849. offer.decline();
  850.  
  851. if(offers[offer.id]['type'] == 'deposit' && offers[offer.id]['status'] == 'sent'){
  852.  
  853. //EDIT TRADE
  854. pool.query('UPDATE `trades` SET `status` = '+pool.escape('declined')+' WHERE `tradeId` = '+pool.escape(offer.id), function(err1) {
  855. if(err1) {
  856. logger.error(err1);
  857. return;
  858. }
  859.  
  860. offers[offer.id]['status'] = 'declined';
  861.  
  862. io.sockets.in(offers[offer.id]['steamid']).emit('message', {
  863. type: 'checkOffer',
  864. mtype: 'declined',
  865. code: offers[offer.id]['code'],
  866. id: offer.id,
  867. bot: deposits[offers[offer.id]['steamid']]['bot']
  868. });
  869.  
  870. if(deposits[offers[offer.id]['steamid']] !== undefined){
  871. deposits[offers[offer.id]['steamid']]['active'] = false;
  872. }
  873.  
  874. logger.debug('[BOT] Offer #' + offer.id + " is declined >> Deposit");
  875. });
  876.  
  877. } else if(offers[offer.id]['type'] == 'withdraw' && offers[offer.id]['status'] == 'pending'){
  878.  
  879. //EDIT TRADE
  880. pool.query('UPDATE `trades` SET `status` = '+pool.escape('declined')+' WHERE `tradeId` = '+pool.escape(offer.id), function(err1) {
  881. if(err1) {
  882. logger.error(err1);
  883. return;
  884. }
  885.  
  886. offers[offer.id]['status'] = 'declined';
  887.  
  888. io.sockets.in(offers[offer.id]['steamid']).emit('message', {
  889. type: 'checkOffer',
  890. mtype: 'declined',
  891. code: offers[offer.id]['code'],
  892. id: offer.id,
  893. bot: withdraws[offers[offer.id]['steamid']]['bot']
  894. });
  895.  
  896. //EDIT BALANCE
  897. pool.query('UPDATE `users` SET `balance` = `balance` + '+parseInt(offers[offer.id]['total'])+', `available` = `available` + '+parseInt(offers[offer.id]['total'])+' WHERE `steamid` = '+pool.escape(offers[offer.id]['steamid']), function(err2) {
  898. if(err2) {
  899. logger.error(err2);
  900. return;
  901. }
  902.  
  903. getBalance(offers[offer.id]['steamid']);
  904.  
  905. offers[offer.id]['items'].forEach(function(item){
  906. pool.query('UPDATE `items` SET `status` = 0 WHERE `itm_id` = '+pool.escape(item.id), function(err3) {
  907. if(err3) {
  908. logger.error(err3);
  909. return;
  910. }
  911. });
  912.  
  913. itemsWithdraw[item.id]['status'] = 0;
  914. });
  915.  
  916. if(withdraws[offers[offer.id]['steamid']] !== undefined){
  917. withdraws[offers[offer.id]['steamid']]['active'] = false;
  918. }
  919.  
  920. logger.debug('[BOT] Offer #' + offer.id + " is declined << Withdraw");
  921. });
  922. });
  923. }
  924. }
  925. }
  926. });
  927.  
  928. manager.on('newOffer', function(offer) {
  929. declineOffer(offer);
  930. });
  931.  
  932. community.on("confirmationAccepted", function(trade) {
  933. logger.debug("[BOT] Successfully confirmed the offer #"+ trade.creator);
  934.  
  935. if(offers[trade.creator] !== undefined){
  936. offers[trade.creator]['confirmed'] = true;
  937. io.sockets.in(offers[trade.creator]['steamid']).emit('message', {
  938. type: 'checkOffer',
  939. mtype: 'sent',
  940. code: offers[trade.creator]['code'],
  941. id: trade.creator,
  942. bot: config.bots.botname
  943. });
  944.  
  945. io.sockets.in(offers[trade.creator]['steamid']).emit('message', {
  946. type: 'success',
  947. success: 'Your withdraw offer has been sent. Check offers tab from profile for more informations.'
  948. });
  949. }
  950. });
  951.  
  952. community.on("confKeyNeeded", function(deepDataAndEvents, updateFunc) {
  953. logger.warn("[BOT] Need confKey");
  954.  
  955. var time = Math.floor(Date.now() / 1000);
  956. updateFunc(null, time, SteamTotp.getConfirmationKey(config.bots.identitySecret, time, deepDataAndEvents));
  957. });
  958.  
  959. community.on("sessionExpired", function(err) {
  960. logger.error('[BOT] Session expired, logging in...');
  961.  
  962. community.stopConfirmationChecker();
  963. client.webLogOn();
  964. });
  965. //
  966.  
  967.  
  968.  
  969.  
  970. //Refresh polldata.json
  971. manager.on('pollData', function(pollData) {
  972. fs.writeFile('polldata.json', JSON.stringify(pollData));
  973. });
  974.  
  975. if (fs.existsSync('polldata.json')) {
  976. manager.pollData = JSON.parse(fs.readFileSync('polldata.json'));
  977. }
  978. //
  979.  
  980.  
  981.  
  982.  
  983. //GET USER INV
  984. function getMyInv(user, socket){
  985. if(invUserD[user.steamid] !== undefined && invUserD[user.steamid]['time'] - time() > 0){
  986. socket.emit('message', {
  987. type: 'alert',
  988. alert: 'Inventory loaded from cache!'
  989. });
  990.  
  991. socket.emit('message', {
  992. type: 'waitInv',
  993. time: (invUserD[user.steamid]['time'] - time())
  994. });
  995.  
  996. socket.emit('message', {
  997. type: 'userInv',
  998. items: invUserD[user.steamid]['items']
  999. });
  1000. return;
  1001. }
  1002.  
  1003. var reqOpts = {
  1004. url: 'http://steamcommunity.com/inventory/' + encodeURIComponent(user.steamid) + '/' + AppID + '/' + ContextID + '?l=eng&count=5000'
  1005. };
  1006.  
  1007. request(reqOpts, function(err, response, body) {
  1008. if(err) {
  1009. logger.error(err);
  1010. return;
  1011. }
  1012.  
  1013. if(response && response.statusCode == 200){
  1014. var body = JSON.parse(body);
  1015. var assets = body['assets'];
  1016. var descriptions = body['descriptions'];
  1017.  
  1018. if(!assets) return;
  1019.  
  1020. var totalItems = [];
  1021.  
  1022. assets.forEach(function(valuey, y) {
  1023. descriptions.forEach(function(valuez, z) {
  1024. if(valuey['classid'] == valuez['classid'] && valuey['instanceid'] == valuez['instanceid']){
  1025. var isTradable = valuez['tradable'];
  1026. if(isTradable == 1){
  1027. if(/(Souvenir)/.exec(valuez['market_hash_name'])) return;
  1028.  
  1029. if(getPriceItem(valuez['market_hash_name']) >= minItemDeposit * 1000){
  1030. //Link Inspect Item
  1031. var view = '';
  1032. if(valuez['actions'] !== undefined){
  1033. view = valuez['actions'][0].link;
  1034. view = view.replace("%owner_steamid%", user.steamid);
  1035. view = view.replace("%assetid%", valuey['assetid']);
  1036. }
  1037. //Color Item
  1038. var color = '';
  1039. if(valuez['tags'][4] !== undefined) color = valuez['tags'][4].color;
  1040. //Stickers Item
  1041. var stickers = [];
  1042. var date = valuez['descriptions'];
  1043. date.forEach(function(itm){
  1044. if(itm.value !== undefined){
  1045. var allStickers = itm.value;
  1046. if(/(sticker)/.exec(allStickers)) {
  1047. var allStickers = allStickers.split('src="');
  1048. delete allStickers[0];
  1049.  
  1050. var names = allStickers[allStickers.length - 1].split('<br>Sticker: ')[1].split('</center>')[0];
  1051. names = names.split(', ');
  1052.  
  1053. var i = 0;
  1054. allStickers.forEach(function(sticker){
  1055. stickers.push({
  1056. 'image': sticker.split('"')[0],
  1057. 'name': names[i]
  1058. });
  1059. i++;
  1060. });
  1061. }
  1062. }
  1063. })
  1064.  
  1065. totalItems.push({
  1066. 'id': valuey['assetid'],
  1067. 'name': valuez['market_hash_name'],
  1068. 'price': getPriceItem(valuez['market_hash_name']),
  1069. 'image': valuez['icon_url'],
  1070. 'view': view,
  1071. 'color': color,
  1072. 'stickers': stickers
  1073. });
  1074. }
  1075. }
  1076. }
  1077. });
  1078. });
  1079.  
  1080. socket.emit('message', {
  1081. type: 'userInv',
  1082. items: totalItems
  1083. });
  1084.  
  1085. if(totalItems.length > 0){
  1086. socket.emit('message', {
  1087. type: 'alert',
  1088. alert: 'Inventory loaded!'
  1089. });
  1090. }else{
  1091. socket.emit('message', {
  1092. type: 'error',
  1093. error: 'No items in inventory!'
  1094. });
  1095. }
  1096.  
  1097. invUserD[user.steamid] = {
  1098. time: (time() + 60),
  1099. items: totalItems
  1100. }
  1101.  
  1102. socket.emit('message', {
  1103. type: 'waitInv',
  1104. time: 60
  1105. });
  1106. }
  1107. });
  1108. }
  1109.  
  1110. //GET BOT INV
  1111. function getBotInv(user, socket){
  1112. if(invUserW[user.steamid] !== undefined && invUserW[user.steamid]['time'] - time() > 0){
  1113. socket.emit('message', {
  1114. type: 'alert',
  1115. alert: 'Inventory loaded from cache!'
  1116. });
  1117.  
  1118. socket.emit('message', {
  1119. type: 'waitInv',
  1120. time: (invUserW[user.steamid]['time'] - time())
  1121. });
  1122.  
  1123. socket.emit('message', {
  1124. type: 'userInv',
  1125. items: invUserW[user.steamid]['items']
  1126. });
  1127. return;
  1128. }
  1129.  
  1130. manager.loadInventory(AppID, ContextID, true, function(err, myItems) {
  1131. var totalItems = [];
  1132. myItems.forEach(function(item){
  1133. var isTradable = item['tradable'];
  1134. if(isTradable == 1){
  1135. var itm_id = item['classid']+'_'+item['instanceid'];
  1136. if(itemsWithdraw[itm_id] !== undefined){
  1137. if(itemsWithdraw[itm_id]['status'] == 0){
  1138. //Link Inspect Item
  1139. var view = '';
  1140. if(item['actions'] !== undefined){
  1141. view = item['actions'][0].link;
  1142. view = view.replace("%owner_steamid%", user.steamid);
  1143. view = view.replace("%assetid%", item['assetid']);
  1144. }
  1145. //Color Item
  1146. var color = '';
  1147. if(item['tags'][4] !== undefined) color = item['tags'][4].color;
  1148. //Stickers Item
  1149. var stickers = [];
  1150. var date = item['descriptions'];
  1151. date.forEach(function(itm){
  1152. if(itm.value !== undefined){
  1153. var allStickers = itm.value;
  1154. if(/(sticker)/.exec(allStickers)) {
  1155. var allStickers = allStickers.split('src="');
  1156. delete allStickers[0];
  1157.  
  1158. var names = allStickers[allStickers.length - 1].split('<br>Sticker: ')[1].split('</center>')[0];
  1159. names = names.split(', ');
  1160.  
  1161. var i = 0;
  1162. allStickers.forEach(function(sticker){
  1163. stickers.push({
  1164. 'image': sticker.split('"')[0],
  1165. 'name': names[i]
  1166. });
  1167. i++;
  1168. });
  1169. }
  1170. }
  1171. })
  1172.  
  1173. totalItems.push({
  1174. 'id': item['assetid'],
  1175. 'name': item['market_hash_name'],
  1176. 'price': getPriceItem(item['market_hash_name']),
  1177. 'image': item['icon_url'],
  1178. 'view': view,
  1179. 'color': color,
  1180. 'stickers': stickers
  1181. });
  1182. }
  1183. }
  1184. }
  1185. });
  1186.  
  1187. socket.emit('message', {
  1188. type: 'userInv',
  1189. items: totalItems
  1190. });
  1191.  
  1192. if(totalItems.length > 0){
  1193. socket.emit('message', {
  1194. type: 'alert',
  1195. alert: 'Inventory loaded!'
  1196. });
  1197. }else{
  1198. socket.emit('message', {
  1199. type: 'error',
  1200. error: 'No items in inventory!'
  1201. });
  1202. }
  1203.  
  1204. invUserW[user.steamid] = {
  1205. time: (time() + 60),
  1206. items: totalItems
  1207. }
  1208.  
  1209. socket.emit('message', {
  1210. type: 'waitInv',
  1211. time: 60
  1212. });
  1213. });
  1214. }
  1215. //
  1216.  
  1217. function time(){
  1218. return parseInt(new Date().getTime()/1000);
  1219. }
  1220.  
  1221. function makeCode() {
  1222. var text = "";
  1223. var possible = "abcdefghijklmnopqrstuvwxyz0123456789";
  1224.  
  1225. for(var i=0; i < 6; i++)
  1226. text += possible.charAt(Math.floor(Math.random() * possible.length));
  1227.  
  1228. return text;
  1229. }
  1230.  
  1231. function getProxy(){
  1232. return "http://" + proxies[random(0,proxies.length-1)];
  1233. }
  1234.  
  1235. function random(min, max) {
  1236. return Math.floor(Math.random() * (max - min + 1)) + min;
  1237. }
  1238.  
  1239. function query(sql, callback) {
  1240. if (typeof callback === 'undefined') {
  1241. callback = function() {};
  1242. }
  1243. pool.getConnection(function(err, connection) {
  1244. if(err) return callback(err);
  1245. connection.query(sql, function(err, rows) {
  1246. if(err) return callback(err);
  1247. connection.release();
  1248. return callback(null, rows);
  1249. });
  1250. });
  1251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement