Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.40 KB | None | 0 0
  1. ///////////////
  2. /// Modules ///
  3. ///////////////
  4. var io = require('socket.io').listen(8000);
  5. var mysql = require('mysql');
  6. var config = require("./config.js");
  7.  
  8. //Including Steam modules for the bot
  9. var Steam = require('steam');
  10. var SteamUser = require('steam-user');
  11. var SteamCommunity = require('steamcommunity');
  12. var SteamTotp = require('steam-totp');
  13. var TradeOfferManager = require('steam-tradeoffer-manager');
  14.  
  15. //Used to retrieve new prices.
  16. var totp = require('notp').totp;
  17. var base32 = require('thirty-two');
  18. var request = require('request');
  19. var crypto = require('crypto');
  20. var fs = require('fs');
  21.  
  22. var users = [];
  23. var activeTradeoffers = [];
  24. tradeReady = false;
  25.  
  26.  
  27. var mysql = mysql.createConnection({
  28. host : 'localhost',
  29. user : 'root',
  30. password : '',
  31. database : '',
  32. charset : 'utf8_general_ci'
  33. });
  34.  
  35.  
  36. ////////////////////
  37. ////// SOCKET //////
  38. ////////////////////
  39.  
  40. io.on('connection', function(socket){
  41. var user = false;
  42.  
  43. SocketReferer = socket.handshake.headers.referer;
  44. if(SocketReferer !== undefined){
  45. if(SocketReferer.includes(config.siteLink) !== true){
  46. socket.disconnect();
  47. console.log('Disconnected socket from outside, referer: ' + SocketReferer);
  48. }
  49. }
  50.  
  51. socket.on('userKey', function(key){
  52. if(key.length>0){
  53. mysql.query('SELECT * FROM users WHERE secret = ?',[key], function(err, row) {
  54. if (!row.length) {
  55. return socket.disconnect();
  56. }
  57. user = row[0];
  58.  
  59. for(var i = 0; i < users.length; i++)
  60. {
  61. if(users[i].steamid == user.steamid)
  62. {
  63. users[i].socket.disconnect();
  64. users.splice(i,1);
  65. }
  66. }
  67.  
  68. users.push({
  69. socket:socket,
  70. steamid:user.steamid
  71. });
  72.  
  73. });
  74. }
  75. });
  76.  
  77.  
  78. socket.on('submitTrade', function(data){
  79. if((tradeReady === true) && user!== false){
  80. if(user.tradelink == 0){
  81. sendToSteamid(user.steamid,{type:'trademsg', message: 'Please set a tradelink before attempting to trade.'});
  82. return;
  83. }
  84. processTrade(user, data.userOfferItems, data.botOfferItems);
  85. }
  86. });
  87.  
  88. });
  89.  
  90.  
  91.  
  92. function processTrade(user, useritems, botitems){
  93. sendToSteamid(user.steamid,{type:'trademsg', message: 'Processing trade.'});
  94. userOfferValue = 0;
  95. botOfferValue = 0;
  96. userItemNameString = '';
  97. botItemNameString = '';
  98. userItems = (useritems.substr(0, useritems.length - 1)).split(',');
  99.  
  100. if(botitems !== ""){
  101. botItems = (botitems.substr(0, botitems.length - 1)).split(',');
  102. } else {
  103. botItems = [];
  104. }
  105.  
  106.  
  107. manager.getUserInventoryContents(user.steamid, 730, 2, true, function(err, inventory){
  108. if(inventory.length == 0){
  109. console.log('Empty inventory');
  110. sendToSteamid(user.steamid,{type:'trademsg', message: 'Your inventory was registered as empty.'});
  111. return;
  112. } else if(err){
  113. console.log('Error loading partner inventory');
  114. sendToSteamid(user.steamid,{type:'trademsg', message: 'Error loading your inventory.'});
  115. return;
  116. } else {
  117.  
  118. for (var i = 0; i < inventory.length; i++) {
  119. currentItem = inventory[i];
  120. if(userItems.indexOf(currentItem.assetid) > -1){
  121.  
  122. var itemPriceInfo = prices.prices.filter(function(search) {
  123. return search.market_hash_name == currentItem.market_hash_name;
  124. });
  125.  
  126. itemPrice = itemPriceInfo[0].price;
  127.  
  128. itemCondition = getCondition(currentItem['tags']);
  129. itemPrice = (getItemPrice(itemCondition, currentItem.market_hash_name, itemPrice, user)).round(2);
  130.  
  131. if(itemPrice<config.minValue){
  132. console.log('['+user.steamid+'] One of the items was below minimum value.');
  133. sendToSteamid(user.steamid,{type:'trademsg', message: 'One of the items you offered was below our minimum item value for accepted skins.'});
  134. return;
  135. }
  136.  
  137. userItemNameString += currentItem.market_hash_name + ','
  138. userOfferValue = +userOfferValue + +itemPrice;
  139. }
  140. }
  141.  
  142. if(botItems.length === 0){
  143. console.log('['+user.steamid+'] Is donating skins worth: ' + userOfferValue);
  144.  
  145. var offer = manager.createOffer(user.tradelink);
  146. for (var i = 0; i < userItems.length; i++) {
  147. offer.addTheirItem({"appid": 730, "contextid": 2, "assetid": userItems[i]});
  148. }
  149.  
  150. tradeString = makeSecret(8);
  151. offer.setMessage('Thank you for donating to '+config.siteName+'. Your reference number is: #'+tradeString);
  152.  
  153. offer.send(function(err, status) {
  154. if(err){
  155. console.log('['+user.steamid+'] Trade is not active, error: ' + err);
  156. return;
  157. } else {
  158. mysql.query('INSERT INTO trades (`botitems`,`useritems`,`profit`,`tradeid`,`steamid`,`time`,`secret`) VALUES (?,?,?,?,?,?,?)',['Donation', userItemNameString, userOfferValue, offer.id, user.steamid, Math.floor(Date.now() / 1000), tradeString], function(err, row) {if(err){console.log(err);}});
  159. console.log('['+user.steamid+'] Trade is active, #' + offer.id + ', secret: ' + tradeString);
  160. sendToSteamid(user.steamid,{type:'trademsg', tid: offer.id, secret: tradeString});
  161. }
  162.  
  163. });
  164. //End of donation
  165. } else {
  166. manager.loadInventory(730, 2, true, function(err, inventory) {
  167. for (var i = 0; i < inventory.length; i++) {
  168. currentItem = inventory[i];
  169. if(botItems.indexOf(currentItem.assetid) > -1){
  170. var itemPriceInfo = prices.prices.filter(function(search) {
  171. return search.market_hash_name == currentItem.market_hash_name;
  172. });
  173.  
  174. itemPrice = itemPriceInfo[0].price;
  175. itemName = currentItem.market_hash_name;
  176.  
  177. if((itemName.includes("Key") === true) && (itemName.includes("Caupsle") !== true)){
  178. itemPrice = (itemPrice * config.botKeyWorth).round(2);
  179. }
  180.  
  181. botOfferValue = +botOfferValue + +itemPrice;
  182. botItemNameString += currentItem.market_hash_name + ','
  183. }
  184. }
  185.  
  186. if(botOfferValue > userOfferValue){
  187. console.log('['+user.steamid+'] Trade is bad, user items value: ' + userOfferValue + ', bot items value: ' + botOfferValue);
  188. sendToSteamid(user.steamid,{type:'trademsg', message: 'Issues with one or more of the items.'});
  189. messageAdmin('SteamID: ' + user.steamid + ' attempted to do a modified trade, their offer value: ' + userOfferValue + ', bots offer value: ' + botOfferValue);
  190. return;
  191. } else if((config.botItemsPerUsers / userItems.length) < 1){
  192. console.log('['+user.steamid+'] User offered too many items.');
  193. sendToSteamid(user.steamid,{type:'trademsg', message: 'For every bot item, you can offer '+config.botItemsPerUsers+' as a maximum.'});
  194. } else {
  195.  
  196. console.log('['+user.steamid+'] Trade is good, user items value: ' + userOfferValue + ', bot items value: ' + botOfferValue);
  197. tradeProfit = (userOfferValue - botOfferValue).round(2);
  198.  
  199. var offer = manager.createOffer(user.tradelink);
  200.  
  201. for (var i = 0; i < botItems.length; i++) {
  202. offer.addMyItem({"appid": 730, "contextid": 2, "assetid": botItems[i]});
  203. }
  204.  
  205. for (var i = 0; i < userItems.length; i++) {
  206. offer.addTheirItem({"appid": 730, "contextid": 2, "assetid": userItems[i]});
  207. }
  208.  
  209. tradeString = makeSecret(8);
  210. offer.setMessage('Thank you for trading at '+config.siteName+'. Your reference number is: #'+tradeString);
  211.  
  212. offer.getUserDetails(function(err, me, them) {
  213. if (err) {
  214. console.log('['+user.steamid+'] Unable to get user details.');
  215. return;
  216. } else if (them.escrowDays > 0) {
  217. console.log('['+user.steamid+'] User is in escrow.');
  218. sendToSteamid(user.steamid,{type:'trademsg', message: '<strong>Escrow!</strong><br>We detected that you are in escrow, and therefore we cannot trade with you, sadly.'});
  219. return;
  220. } else {
  221. offer.send(function(err, status) {
  222. if(err){
  223. console.log('['+user.steamid+'] Trade is not active, error: ' + err);
  224. return;
  225. } else {
  226. mysql.query('INSERT INTO trades (`botitems`,`useritems`,`profit`,`tradeid`,`steamid`,`time`,`secret`) VALUES (?,?,?,?,?,?,?)',[botItemNameString, userItemNameString, tradeProfit, offer.id, user.steamid, Math.floor(Date.now() / 1000), tradeString], function(err, row) {if(err){console.log(err);}});
  227. if (status == 'pending') {
  228. community.acceptConfirmationForObject(config.identity, offer.id, function(err) {
  229. if (err) {
  230. console.log('['+user.steamid+'] Trade is active, #' + offer.id);
  231. sendToSteamid(user.steamid,{type:'trademsg', tid: offer.id, secret: tradeString});
  232. } else {
  233. console.log('['+user.steamid+'] Trade is active, #' + offer.id + ', secret: ' + tradeString);
  234. sendToSteamid(user.steamid,{type:'trademsg', tid: offer.id, secret: tradeString});
  235. }
  236. });
  237. }
  238. }
  239.  
  240. });
  241. }
  242. });
  243. } //End of sending the offer.
  244.  
  245. });
  246.  
  247. } //End of processing bot skins, and sending the offer.
  248.  
  249. }
  250.  
  251.  
  252. })
  253. }
  254.  
  255. function getItemPrice(grade, name, price, who){
  256. itemRates = config.itemConditionRate;
  257. if(who !== "bot"){
  258. if(who.bonus === 1){
  259. bonusRate = config.bonusRate;
  260. } else {
  261. bonusRate = 0;
  262. }
  263. for (var i = 0; i < itemRates.length; i++) {
  264. if(itemRates[i][0] === grade){
  265. if(grade === "Covert"){
  266. if(name.includes("★") === true) (price * (config.itemRateKnives + bonusRate)).round(2);
  267. }
  268. return (price * (itemRates[i][1] + bonusRate)).round(2);
  269. }
  270. } //Done checking itemRates array.
  271. if((grade === "Base Grade") && (name.includes("Key") === true) && (name.includes("Caupsle") !== true)){
  272. return price * (config.itemRateKeys + bonusRate);
  273. }
  274.  
  275. return price * (config.itemRateMisc + bonusRate);
  276. }
  277. }
  278.  
  279. function getCondition(tags){
  280. for (var i = 0; i < tags.length; i++) {
  281. if(tags[i].category_name === "Quality"){
  282. return tags[i].name;
  283. }
  284. }
  285. }
  286.  
  287. function sendToSteamid(steamid,msg){
  288. for(var i = 0; i < users.length; i++)
  289. {
  290. if(users[i].steamid == steamid) return users[i].socket.emit('message',msg);
  291. }
  292. }
  293.  
  294. setPrices();
  295. function setPrices(msg){
  296. bitSkinsCode = totp.gen(base32.decode(config.bitskinsSecret));
  297. request('https://bitskins.com/api/v1/get_all_item_prices/?api_key='+config.bitskinsApi+"&code="+bitSkinsCode, function(error, response, body) {
  298.  
  299. pricesCheck = JSON.parse(body);
  300. if(pricesCheck.status === "fail"){
  301. console.log('[BOT] Error updating prices.');
  302. if(msg === true){
  303. messageAdmin('Failed to update the prices.');
  304. }
  305. } else {
  306. console.log('[BOT] Prices updated successfully.');
  307. if(msg === true){
  308. messageAdmin('Prices updated successfully.');
  309. }
  310. fs.writeFileSync('prices.txt', body);
  311. fs.writeFileSync(config.priceFilePath, body);
  312. }
  313.  
  314. });
  315. prices = JSON.parse(fs.readFileSync('prices.txt'));
  316. }
  317.  
  318. setInterval(function() {
  319. setPrices();
  320. }, config.priceUpdate * 1000);
  321.  
  322. function updateBotsInventory(msg){
  323. request(config.siteLink + 'lbi.php?password='+config.updateSecret, function(error, response, body) {
  324. console.log('[BOT] Inventory update result: ' + body);
  325. if(msg === true){
  326. messageAdmin('Inventory update status: ' + body);
  327. }
  328. if(body === "Error"){
  329. if(msg === true){
  330. messageAdmin('Retrying to update in 10 seconds.');
  331. }
  332. setTimeout(function() {
  333. updateBotsInventory();
  334. }, 10000);
  335. }
  336. });
  337. }
  338.  
  339. function makeSecret(){
  340. var text = "";
  341. var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  342.  
  343. for( var i=0; i < 8; i++ )
  344. text += possible.charAt(Math.floor(Math.random() * possible.length));
  345.  
  346. return text;
  347. }
  348.  
  349. Number.prototype.round = function(places) {
  350. return +(Math.round(this + "e+" + places) + "e-" + places);
  351. }
  352. ///////////////////////
  353. ////// STEAM BOT //////
  354. ///////////////////////
  355.  
  356. var client = new SteamUser();
  357. var community = new SteamCommunity();
  358. var manager = new TradeOfferManager({
  359. "steam": client, // Polling every 30 seconds is fine since we get notifications from Steam
  360. "domain": "localhost", // Our domain is example.com
  361. "language": "en" // We want English item descriptions
  362. });
  363.  
  364. var logOnOptions = {
  365. "accountName": config.username,
  366. "password": config.password,
  367. "twoFactorCode": SteamTotp.getAuthCode(config.shared)
  368. };
  369.  
  370. client.logOn(logOnOptions);
  371.  
  372. client.on('loggedOn', function() {
  373. console.log("[BOT] "+config.username+" logged into Steam");
  374. client.setPersona(Steam.EPersonaState.Online);
  375. client.addFriend(config.admin);
  376. });
  377.  
  378. client.on('friendMessage#'+config.admin, function(steamID, message){
  379. if(message === 'code'){
  380. code = SteamTotp.generateAuthCode(config.shared);
  381. client.chatMessage(config.admin, 'Your login code: '+code+'');
  382. } else if(message === 'uinv'){
  383. updateBotsInventory(true);
  384. } else if(message === 'uprice'){
  385. setPrices(true);
  386. } else {
  387. client.chatMessage(config.admin, 'Invalid command, I know the following:\ncode\nuinv\nuprice');
  388. }
  389. });
  390.  
  391. manager.on('newOffer', function(offer) {
  392. var partner = offer.partner.getSteamID64();
  393. if(partner === config.admin){
  394. console.log("["+partner+"] Tradeoffer from Admin registered, and accepted.");
  395. offer.accept();
  396. } else {
  397. console.log("["+partner+"] Sent a tradeoffer directly to the bot.");
  398. offer.decline();
  399. }
  400. });
  401.  
  402. manager.on('sentOfferChanged', function(offer, oldState) {
  403. if(offer.state == TradeOfferManager.ETradeOfferState.Accepted) {
  404. console.log('[#'+offer.id+'] Offer was accepted');
  405. mysql.query('UPDATE trades SET status=? WHERE tradeid=? ',[1, offer.id], function(err, row) {if(err){console.log(err);}});
  406. updateBotsInventory();
  407. } else {
  408. if(offer.state !== 2){
  409. console.log('Tradeoffer was declined');
  410. mysql.query('DELETE FROM `trades` WHERE tradeid=?',[offer.id], function(err, row) {if(err){console.log(err);}});
  411. }
  412. }
  413. });
  414.  
  415. client.on("webSession", function(sessionID, cookies) {
  416. manager.setCookies(cookies);
  417. community.setCookies(cookies);
  418. SteamTotp.steamID = client.steamID;
  419. community.startConfirmationChecker(10000, config.identity);
  420. tradeReady = true;
  421. console.log("[BOT] Got websession, accepting trades now.");
  422. });
  423.  
  424. function messageAdmin(message){
  425. client.chatMessage(config.admin, message);
  426. }
  427.  
  428. //////////////////
  429. //So we don't DC//
  430. //////////////////
  431. setInterval(function() {
  432. mysql.query('SELECT * FROM users WHERE steamid=? ',['1'], function(err, row) {if(err){console.log(err);}});
  433. }, 10 * 1000);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement