Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.03 KB | None | 0 0
  1. var Steam = require('steam');
  2. var SteamWeb = require('steam-webapi')
  3. var fs = require('fs');
  4. var winston = require('winston');
  5. var params = require('./settings');
  6. var sha = require('crypto').createHash('sha1');
  7. var SteamTradeOffers = require('steam-tradeoffers');
  8. var getSteamAPIKey = require('steam-web-api-key');
  9. var SteamWebLogOn = require('steam-weblogon');
  10. var util = require('util');
  11. var request = require('request');
  12. var Long = require('long');
  13.  
  14. var Bot = {}
  15.  
  16. SteamWeb.key = params.apiKey;
  17.  
  18. var myCustomLevels = {
  19. levels: {
  20. error: 0,
  21. success: 1,
  22. info: 2,
  23. debug: 3
  24. },
  25. colors: {
  26. error: 'red',
  27. success: 'green',
  28. info: 'blue',
  29. debug: 'yellow'
  30. }
  31. };
  32.  
  33. var logger = new(winston.Logger)({
  34. transports: [
  35. new(winston.transports.Console)({
  36. level: 'debug',
  37. colorize: true
  38. })
  39. ],
  40. levels: myCustomLevels.levels
  41. });
  42.  
  43. winston.addColors(myCustomLevels.colors);
  44.  
  45. // Declarations
  46. var serversFile = 'servers';
  47. var sentryFile = 'sentry';
  48. var sentryHash;
  49.  
  50. // Localization
  51. var messages = {
  52.  
  53. }
  54.  
  55. logger.info('Starting bot...');
  56.  
  57. if (fs.existsSync(sentryFile + '.shasentryfile')) {
  58. logger.success('Reading sentry hash from sha file...')
  59. sentryHash = fs.readFileSync(sentryFile + '.shasentryfile');
  60. params.auth_code = undefined;
  61. } else if (fs.existsSync(sentryFile + '.sentryfile')) {
  62. logger.success("Found steam sentry file! Converting and using...");
  63. sha.update(fs.readFileSync(sentryFile + '.sentryfile'));
  64. sha = new Buffer(sha.digest(), 'binary');
  65. sentryHash = sha;
  66. fs.writeFileSync(sentryFile + '.shasentryfile', sentryHash);
  67. params.auth_code = undefined;
  68. } else if (params.guardCode != '') {
  69. logger.info('No sentry hash was found. The Steam Guard code will be used instead.')
  70. }
  71.  
  72. if (fs.existsSync(serversFile)) {
  73. Steam.servers = JSON.parse(fs.readFileSync(serversFile));
  74. } else {
  75. logger.warn("No servers file found, using defaults");
  76. }
  77.  
  78.  
  79. // Starting to use node-steam from here
  80. var steamClient = new Steam.SteamClient();
  81. var bot = new Steam.SteamUser(steamClient);
  82. var steamFriends = new Steam.SteamFriends(steamClient);
  83. var steamWebLogOn = new SteamWebLogOn(steamClient, bot);
  84. var steamTrade = new SteamTradeOffers();
  85.  
  86. // Logging in with supplied info
  87. var logOnInfo = {
  88. account_name: params.username,
  89. password: params.password,
  90. auth_code: params.guardCode,
  91. sha_sentryfile: sentryHash
  92. };
  93.  
  94. steamClient.connect();
  95. steamClient.on('connected', function() {
  96. logger.info('Logging in...');
  97. bot.logOn(logOnInfo);
  98. });
  99.  
  100. steamClient.on('logOnResponse', function(logonResp) {
  101. if (logonResp.eresult === Steam.EResult.OK) {
  102. logger.success("Logged in to Steam");
  103. steamFriends.setPersonaState(Steam.EPersonaState.Online);
  104. logger.info("Initializing Steam Trading...");
  105. steamWebLogOn.webLogOn(function(sessionID, newCookie) {
  106. getSteamAPIKey({
  107. sessionID: sessionID,
  108. webCookie: newCookie
  109. }, function(err, APIKey) {
  110. steamTrade.setup({
  111. sessionID: sessionID,
  112. webCookie: newCookie,
  113. APIKey: APIKey
  114. }, function() {
  115. logger.success("Initialized Steam Trading!");
  116. logger.info("Checking for new trade offers...");
  117. handleTradeOffers();
  118. });
  119. });
  120. });
  121. } else {
  122. logger.error(logonResp);
  123. }
  124. });
  125.  
  126. bot.on('error', function(error) {
  127. logger.error("Caught Steam error", error);
  128. });
  129.  
  130. bot.on('loggedOff', function() {
  131. logger.error("Logged off from Steam");
  132. logger.info("Logging back in...");
  133. bot.logOn(logOnInfo);
  134. });
  135.  
  136. // Save the sentry hash to a file for later use when we get one
  137. bot.on('updateMachineAuth', function(buffer, callback) {
  138. logger.info("Sentry event fired - Writing sentry hash to file...");
  139. fs.writeFile(sentryFile + '.shasentryfile', buffer);
  140. callback({
  141. sha_file: getSHA1(sentry.bytes)
  142. });
  143. });
  144.  
  145. steamClient.on('servers', function(servers) {
  146. fs.writeFile(serversFile, JSON.stringify(servers));
  147. });
  148.  
  149. function sendWinnings() {
  150.  
  151. }
  152.  
  153. function fetchInventory(callback) {
  154. request("http://steamcommunity.com/profiles/" + params.botSteamId + "/inventory/json/730/2",
  155. function(error, response, body) {
  156. if (!error && response.statusCode == 200) {
  157. callback(JSON.parse(body));
  158. } else {
  159. logger.error("Failed to fetch bot's inventory.");
  160. setTimeout(function() {
  161. logger.debug("Retrying...");
  162. fetchInventory(callback);
  163. }, 10000);
  164. }
  165. })
  166. }
  167.  
  168. function update() {
  169. request.post("http://" + params.host + "/php/bot-update.php", {
  170. form: {
  171. password: params.serverPassword
  172. }
  173. }, function(error, response, body) {
  174. if (!error && response.statusCode == 200) {
  175. responseData = JSON.parse(body).data;
  176. if (responseData.potOver) {
  177. var itemsToGive = responseData.tradeItems;
  178. var itemsToKeep = responseData.profitItems;
  179. var roundId = responseData.roundId;
  180. var winnerTradeToken = responseData.winnerTradeToken;
  181. var winnerSteamID = responseData.winnerSteamId;
  182. logger.debug("Attempting to send to " + winnerTradeToken);
  183. request('https://steamcommunity.com/id/yungrichnigga/inventory/json/730/2',
  184. function(err, response, items) {
  185. if (err) {
  186. logger.error(err);
  187. }
  188. rgInventory = JSON.parse(items).rgInventory;
  189. itemsFromMe = [];
  190. alreadyAddedToWinnerTrade = [];
  191. for (var a = 0; a < itemsToGive.length; a++) {
  192. itemToGive = itemsToGive[a];
  193. var classId = itemToGive.classId;
  194. var instanceId = itemToGive.instanceId;
  195. var assetId = 0;
  196. for (var key in rgInventory) {
  197. if (rgInventory.hasOwnProperty(key)) {
  198. inventoryItem = rgInventory[key];
  199. var tAssetId = inventoryItem.id;
  200. var tClassId = inventoryItem.classid;
  201. var tInstanceId = inventoryItem.instanceid;
  202. if (tInstanceId === instanceId && tClassId === classId) {
  203. if (alreadyAddedToWinnerTrade.indexOf(tAssetId) != -1) {
  204. continue;
  205. }
  206. assetId = tAssetId;
  207. break;
  208. }
  209. }
  210. }
  211. if (assetId != 0) {
  212. itemsFromMe.push({
  213. "appid": 730,
  214. "contextid": 2,
  215. "amount": 1,
  216. "assetid": assetId
  217. });
  218. alreadyAddedToWinnerTrade.push(assetId);
  219. }
  220. }
  221. if (itemsFromMe.length > 0) {
  222. winnerMessage = "Congratulations, you have won on " + params.siteName + "! Here are your items. Round ID: " + roundId;
  223.  
  224. function toSteamId(accountId) {
  225. return new Long(parseInt(accountId, 10), 0x1100001).toString();
  226. }
  227. sendTradeOffer(winnerSteamID, winnerTradeToken, itemsFromMe, winnerMessage);
  228. } else {
  229. logger.error("No items to give!");
  230. }
  231. setTimeout(update, 200);
  232. });
  233. } else {
  234. setTimeout(update, 200);
  235. }
  236. } else {
  237. logger.error("Could not update bot!");
  238. logger.debug(error);
  239. }
  240. })
  241. }
  242. update();
  243.  
  244. function sendTradeOffer(steamId, tradeToken, items, msg) {
  245. steamTrade.makeOffer({
  246. partnerAccountId: steamId,
  247. accessToken: tradeToken,
  248. itemsFromThem: [],
  249. itemsFromMe: items,
  250. message: msg
  251. }, function(err, response) {
  252. if (err) {
  253. logger.error("Error! Retrying in 2 seconds...");
  254. logger.debug(err);
  255. setTimeout(function() {
  256. sendTradeOffer(steamId, tradeToken, items, msg);
  257. }, 2000);
  258. } else {
  259. logger.success("Sent Trade Offer!")
  260. }
  261. });
  262. }
  263.  
  264. function handleTradeOffers() {
  265. steamTrade.getOffers({
  266. get_received_offers: 1,
  267. active_only: 1
  268. }, function(error, body) {
  269. if (error) {
  270. setTimeout(handleTradeOffers, 200);
  271. return;
  272. }
  273. if (body.response.trade_offers_received) {
  274. body.response.trade_offers_received.forEach(function(offer) {
  275. shouldAccept = true;
  276. if (offer.trade_offer_state == 2) {
  277. logger.info("Steam trade request...");
  278. if (offer.items_to_give != undefined && params.admins.indexOf(offer.steamid_other) == -1) {
  279. logger.error("Declined trade because user wanted items!");
  280. logger.debug("Steam ID: " + offer.steamid_other);
  281. shouldAccept = false;
  282. }
  283. if (offer.items_to_receive) {
  284. offer.items_to_receive.forEach(function(item) {
  285. if (item.appid !== '730') {
  286. logger.error("Declined trade because an item was not for CS:GO!");
  287. logger.debug("App ID: " + item.appid);
  288. shouldAccept = false;
  289. }
  290. }, this);
  291. }
  292.  
  293. if (offer.items_to_receive && offer.items_to_receive.length > 10) {
  294. logger.error("Declined trade because of over 10 items!");
  295. logger.debug("# of Items: " + offer.items_to_receive.length);
  296. }
  297.  
  298. if (!shouldAccept) {
  299. logger.error("Declining... " + offer.tradeofferid)
  300. steamTrade.declineOffer({
  301. tradeOfferId: offer.tradeofferid
  302. });
  303. return;
  304. }
  305. if (params.admins.indexOf(offer.steamid_other) > -1 && offer.items_to_receive == undefined) {
  306. steamTrade.acceptOffer({
  307. tradeOfferId: offer.tradeofferid
  308. });
  309. return;
  310. }
  311. request.post("http://" + params.host + "/php/check-items.php", {
  312. form: {
  313. items: offer.items_to_receive,
  314. password: params.serverPassword,
  315. owner: offer.steamid_other
  316. }
  317. }, function(error, response, body) {
  318. if (!error && response.statusCode == 200) {
  319. json = JSON.parse(body);
  320.  
  321. if (json.success === 0) {
  322. logger.error("Profile is private!");
  323. return;
  324. }
  325. jsonData = json.data;
  326. if (jsonData.minDeposit == 1) {
  327. logger.success("Offer verified! Accepting...");
  328. steamTrade.acceptOffer({
  329. tradeOfferId: offer.tradeofferid
  330. }, function() {
  331. request.post("http://" + params.host + "/php/deposit.php", {
  332. form: {
  333. items: jsonData.allItems,
  334. password: params.serverPassword,
  335. owner: offer.steamid_other
  336. }
  337. }, function(error, response, body) {
  338. if (!error && response.statusCode == 200) {
  339. logger.debug("Successfully entered in pot!");
  340. } else {
  341. logger.debug("Error!", error);
  342. }
  343. });
  344. });
  345. } else {
  346. logger.error("Not minimum deposit... " + offer.tradeofferid);
  347. steamTrade.declineOffer({
  348. tradeOfferId: offer.tradeofferid
  349. });
  350. }
  351. }
  352. });
  353. }
  354. });
  355. }
  356. });
  357. }
  358.  
  359. bot.on('tradeOffers', function(number) {
  360. if (number > 0) {
  361. handleTradeOffers();
  362. }
  363. });
  364.  
  365. Bot.loadItems = function(callback) {}
  366.  
  367. function getSHA1(bytes) {
  368. var shasum = crypto.createHash('sha1');
  369. shasum.end(bytes);
  370. return shasum.read();
  371. }
  372.  
  373. module.exports = Bot;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement