Advertisement
Guest User

Untitled

a guest
Jul 17th, 2016
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.22 KB | None | 0 0
  1. var config = require('config');
  2. var fs = require('fs');
  3.  
  4. var hash = require('crypto').createHash('sha1');
  5. hash.update(Math.random().toString());
  6. hash = hash.digest('hex');
  7.  
  8. var Steam = require('steam');
  9. var SteamWebLogOn = require('steam-weblogon');
  10. var getSteamAPIKey = require('steam-web-api-key');
  11. var steamtrade = require('steam-trade');
  12. var SteamTradeOffers = require('steam-tradeoffers');
  13. var SteamTotp = require('steam-totp');
  14. var SteamcommunityMobileConfirmations = require('steamcommunity-mobile-confirmations');
  15.  
  16. var F2ATXT = fs.readFileSync('./'+config.get('steam.username')+'.2fa');
  17. if (!F2ATXT) {
  18. console.log('You need a "user.2fa"! Set this up by setting a phone number, then running enable.js!');
  19. process.exit(0);
  20. }
  21. var twofa = JSON.parse(F2ATXT);
  22.  
  23. var logOnOptions = {
  24. account_name: config.get('steam.username'),
  25. password: config.get('steam.password'),
  26. two_factor_code: SteamTotp.generateAuthCode(twofa.shared_secret)
  27. };
  28.  
  29. if (process.argv[2] == '2fa') {
  30. console.log('2fa:',logOnOptions.two_factor_code);
  31. return;
  32. }
  33.  
  34. if (!config.get('steam.id')) {
  35. console.log('You must put in the config steam.id (should start with 765...)');
  36. return;
  37. }
  38.  
  39. var SteamMC;
  40.  
  41. var steamClient = new Steam.SteamClient();
  42. var steamUser = new Steam.SteamUser(steamClient);
  43. var steamFriends = new Steam.SteamFriends(steamClient);
  44. var steamWebLogOn = new SteamWebLogOn(steamClient, steamUser);
  45. var OffersManager = new SteamTradeOffers();
  46. var steamTrading = new Steam.SteamTrading(steamClient);
  47. var trade = new steamtrade();
  48.  
  49. // Log stuff
  50. function LOG(msg) {
  51. console.log(msg);
  52. }
  53.  
  54. var appid = {
  55. TF2: 440,
  56. Steam: 753
  57. };
  58.  
  59. var contextid = {
  60. TF2: 2,
  61. Steam: 6
  62. }
  63.  
  64. // Login
  65. steamClient.connect();
  66. steamClient.on('connected', function() {
  67. steamUser.logOn(logOnOptions);
  68. });
  69.  
  70. // Bot started, set up trade offer with steam api key
  71. steamClient.on('logOnResponse', function(logonResp) {
  72. if (logonResp.eresult === Steam.EResult.OK) {
  73. LOG('Bot Online...');
  74. steamFriends.setPersonaState(Steam.EPersonaState.Online);
  75.  
  76. steamWebLogOn.webLogOn(function(sessionID, newCookie) {
  77. SteamMC = new SteamcommunityMobileConfirmations({
  78. steamid: config.get('steam.id'),
  79. identity_secret: twofa.identity_secret,
  80. device_id: 'android:'+hash,
  81. webCookie: newCookie
  82. });
  83. checkMC();
  84.  
  85. getSteamAPIKey({
  86. sessionID: sessionID,
  87. webCookie: newCookie
  88. }, function(err, APIKey) {
  89. if (err) {
  90. LOG('[ERR STEAM API]');
  91. console.log(err);
  92. }
  93. OffersManager.setup({
  94. sessionID: sessionID,
  95. webCookie: newCookie,
  96. APIKey: APIKey
  97. });
  98. LOG('Steam Bot Ready');
  99. handleOffers();
  100. });
  101. });
  102. }
  103. });
  104.  
  105. function webLogOn() {
  106. steamWebLogOn.webLogOn(function(sessionID, newCookie) {
  107. SteamMC = new SteamcommunityMobileConfirmations({
  108. steamid: config.get('steam.id'),
  109. identity_secret: twofa.identity_secret,
  110. device_id: 'android:'+hash,
  111. webCookie: newCookie
  112. });
  113. checkMC();
  114.  
  115. getSteamAPIKey({
  116. sessionID: sessionID,
  117. webCookie: newCookie
  118. }, function(err, APIKey) {
  119. sw = SW(APIKey);
  120. if (err) {
  121. LOG('[ERR STEAM API]');
  122. console.log(err);
  123. }
  124. OffersManager.setup({
  125. sessionID: sessionID,
  126. webCookie: newCookie,
  127. APIKey: APIKey
  128. });
  129. LOG('Steam Bot Ready');
  130. handleOffers();
  131. });
  132. });
  133. }
  134.  
  135. steamFriends.on('friend', (steamID, relationship) => {
  136. if (relationship == Steam.EFriendRelationship.RequestRecipient) {
  137. LOG('[' + steamID + '] Accepted friend request');
  138. steamFriends.addFriend(steamID);
  139. steamFriends.sendMessage(steamID, 'Hello! I\'m a bot that buys Mann Co. Audition Reels and Mann Co. Director\'s Cut Reels! To see available commands, please type !help.')
  140. }
  141.  
  142. });
  143.  
  144. steamFriends.on('friendMsg', (id, msg) => {
  145. if (msg.indexOf('!help') == 0) {
  146. steamFriends.sendMessage(id, 'You can use the command !prices to check current buying prices, !tradelink to get my trade offer link, !listings to see my current listings on third-party websites, and !owner to contact my owner');
  147. }
  148. else if (msg.indexOf('!tradelink') == 0) {
  149. steamFriends.sendMessage(id, 'My trade link is https://steamcommunity.com/tradeoffer/new/?partner=193233186');
  150. }
  151. else if (msg.indexOf('!listings') == 0) {
  152. steamFriends.sendMessage(id, 'I currently have TF2Outpost, TF2Bazaar, and backpack.tf listings. You can check my TF2Outpost listing at http://www.tf2outpost.com/trade/27214705#latest , TF2Bazaar listing at http://bazaar.tf/trade/1340977 , and my backpack.tf listings at https://backpack.tf/u/76561198153498914');
  153. }
  154. else if (msg.indexOf('!prices') == 0) {
  155. var priceList = config.get('prices');
  156. steamFriends.sendMessage(id, 'I am currently buying Mann Co. Audition Reels for ' + priceList[0] + ' refined and Mann Co. Directors Cut Reels for ' + priceList[1] + ' refined.');
  157. }
  158. else if (msg.indexOf('!owner') == 0) {
  159. steamFriends.sendMessage(id, 'My owner is rycao18. You can contact him at http://steamcommunity.com/id/rycao18');
  160. }
  161. if (config.get('admins').indexOf(id) == -1) return;
  162. if (msg.indexOf('!setprice') == 0) {
  163. var match = msg.match(/!setprice (director|audition) ([\.0-9]+)/);
  164. if (!match) steamFriends.sendMessage(id, 'Usage: !setprice <director or audtion> <price> (e.g. !setprice director 3.77)');
  165. else {
  166. steamFriends.sendMessage(id, 'Successfully set price of '+match[1] + ' reels to '+match[2] + '!');
  167. PRICES[match[1] == 'audition' ? 0 : 1] = parseFloat(match[2]);
  168. changePrices();
  169. }
  170. }
  171. });
  172.  
  173. // Handle offers
  174. function handleOffers() {
  175. OffersManager.getOffers({
  176. get_received_offers: 1,
  177. active_only: 1,
  178. time_historical_cutoff: Math.random(Date.now() / 1000)
  179. }, (err, body) => {
  180. if (!body || !body.response || !body.response.trade_offers_received) return;
  181. var offers = body.response.trade_offers_received;
  182. offers.filter(o => o.trade_offer_state == 2).forEach((offer) => {
  183. var sender = offer.steamid_other;
  184. var theirItems = offer.items_to_receive;
  185. var myItems = offer.items_to_give;
  186. if (config.get('admins').indexOf(sender) != -1 && offer.message == 'give') {
  187. OffersManager.acceptOffer({ tradeOfferId: offer.tradeofferid }, () => checkMC());
  188. LOG('Accepting Admin Offer from '+sender);
  189. return;
  190. }
  191. var decline = false;
  192. var theirScrap = 0;
  193. var myScrap = 0;
  194. var priceList = config.get('prices');
  195. if (theirItems) {
  196. theirItems.forEach(i => {
  197. LOG(theirScrap);
  198. LOG(theirItems);
  199. var ind = config.get('items').indexOf(console.log(i));
  200. if (ind != -1) theirScrap += refToScrap(priceList[ind]);
  201. });
  202. }
  203. if (myItems) {
  204. myItems.forEach(i => {
  205. LOG(myScrap);
  206. if (i.classid == '2675') myScrap += 1;
  207. else if (i.classid == '5564') myScrap += 3;
  208. else if (i.classid == '2674') myScrap += 9;
  209. else decline = true;
  210. });
  211. }
  212. if (decline || theirScrap < myScrap) {
  213. OffersManager.declineOffer({ tradeOfferId: offer.tradeofferid });
  214. LOG('DECLINED offer from '+sender);
  215. } else {
  216. OffersManager.acceptOffer({ tradeOfferId: offer.tradeofferid }, () => checkMC());
  217. var str = '';
  218. if (!myItems) str = ' No mobile confirmation needed.'
  219. LOG('ACCEPTED offer from '+sender+' (paid '+myScrap+' scrap for '+theirScrap+' scrap in items)'+str);
  220. }
  221. });
  222. });
  223. }
  224.  
  225. function checkMC() {
  226. SteamMC.FetchConfirmations((err, conf) => {
  227. if (err) {
  228. console.log(err);
  229. } else if (conf.length == 0) return;
  230. else {
  231. conf.forEach(c => SteamMC.AcceptConfirmation(c, (err, res) => {
  232. if (err) {
  233. console.log('Err accepting',err);
  234. } else LOG('Mobile accepted!');
  235. }));
  236. }
  237. });
  238. }
  239.  
  240. // New offers => process
  241. steamUser.on('tradeOffers', (num) => {
  242. if (num > 0) handleOffers();
  243. })
  244.  
  245. function refToScrap(price) {
  246. return Math.round(price*9)
  247. ;}
  248.  
  249. var PRICES = config.get('prices');
  250.  
  251. function changePrices() {
  252. fs.readFile('./config/default.json', 'utf8', (err, data) => {
  253. var json = JSON.stringify(PRICES).replace(/(,|\[)(\d)(,|\])/gi, '\$1\$2.00\$3').replace(/,/g, ', ');
  254. fs.writeFile('./config/default.json', data.replace(/"prices": \[.*?\],/, '"prices": '+json+','));
  255. console.log('Saving');
  256. });
  257. }
  258.  
  259. //Live Trading
  260. var inTrade = false
  261.  
  262. steamTrading.on('tradeProposed', (tradeID, steamID) => {
  263. if (inTrade) {
  264. steamTrading.respondToTrade(tradeID, false);
  265. steamFriends.sendMessage(steamID, 'Sorry! I\'m currently in a trade with someone else!');
  266. LOG('Someone requested to trade with me while I was trading with someone else.');
  267. }
  268. else {
  269. steamTrading.respondToTrade(tradeID, true);
  270. LOG('Now in live trade with ' + steamID);
  271. }
  272. });
  273.  
  274. trade.on('ready', function() {
  275. trade.ready(function() {
  276. trade.confirm();
  277. })
  278. });
  279.  
  280. steamUser.on('tradeStarted', function(steamID) {
  281. trade.open(steamID);
  282. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement