Advertisement
Guest User

TradeBot

a guest
Jan 27th, 2015
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.51 KB | None | 0 0
  1. username = 'username';
  2. password = 'password';
  3.  
  4. var steam = require('steam');
  5. var steamtrade = require('steam-trade');
  6. var fs = require('fs');
  7. var winston = require('winston');
  8. var readline = require('readline');
  9.  
  10. // CSGO AppID = 730
  11. // TF2 AppID = 440
  12. var appid = {
  13. CSGO: 730,
  14. Steam: 753
  15. };
  16.  
  17. var contextid = {
  18. CSGO: 2,
  19. Steam: 6
  20. }
  21.  
  22. var inTrade = false;
  23. var myBackpack;
  24.  
  25. var rl = readline.createInterface({
  26. input: process.stdin,
  27. output: process.stdout
  28. });
  29.  
  30.  
  31. var logger = new (winston.Logger)({
  32. transports: [
  33. new (winston.transports.Console)({
  34. colorize: true,
  35. level: 'debug'
  36. }),
  37. new (winston.transports.File)({
  38. level: 'info',
  39. timestamp: true,
  40. filename: 'crimsonbot.log',
  41. json: false
  42. })
  43. ]
  44. });
  45.  
  46.  
  47. var client = new steam.SteamClient();
  48. var trade = new steamtrade();
  49.  
  50. if(fs.existsSync('servers.json')) {
  51. steam.servers = JSON.parse(fs.readFileSync('servers.json'));
  52. }
  53.  
  54.  
  55. var sentryfile;
  56. if(fs.existsSync('sentryfile.' + username + '.hash')) {
  57. sentryfile = fs.readFileSync('sentryfile.' + username + '.hash');
  58. }
  59.  
  60. client.logOn({
  61. accountName: username,
  62. password: password,
  63. shaSentryfile: sentryfile
  64. });
  65.  
  66.  
  67. client.on('error', function(e) {
  68. if (e.eresult == steam.EResult.AccountLogonDenied) {
  69. rl.question('Steam Guard Code: ', function(code) {
  70. client.logOn({
  71. accountName: username,
  72. password: password,
  73. authCode: code
  74. });
  75. });
  76. } else {
  77. logger.error('Steam Error: ' + e.eresult);
  78. }
  79. });
  80.  
  81. client.on('sentry', function(sentry) {
  82. logger.info('Got new sentry file hash from Steam. Saving.');
  83. fs.writeFile('sentryfile.' + username + '.hash', sentry);
  84. });
  85.  
  86. client.on('loggedOn', function() {
  87. logger.info('Logged on to Steam');
  88. client.setPersonaName("[TradeBot] Mouse");
  89. client.setPersonaState(steam.EPersonaState.Offline);
  90. });
  91.  
  92. client.on('webSessionID', function(sessionid) {
  93. trade.sessionID = sessionid;
  94. client.webLogOn(function(cookie) {
  95. cookie.forEach(function(part) {
  96. trade.setCookie(part.trim());
  97. });
  98. logger.info('Logged into web');
  99. // Online or LookingToTrade
  100. client.setPersonaState(steam.EPersonaState.LookingToTrade);
  101. });
  102. });
  103.  
  104. client.on('friend', function(steamID, relationship) {
  105. if (relationship == steam.EFriendRelationship.PendingInvitee) {
  106. logger.info('[' + steamID + '] Accepted friend request');
  107. client.addFriend(steamID);
  108. }
  109. else if (relationship == steam.EFriendRelationship.None) {
  110. logger.info('[' + steamID + '] Un-friended');
  111. }
  112. });
  113.  
  114. client.on('friendMsg', function(steamID, message, type) {
  115. if (type == steam.EChatEntryType.ChatMsg) {
  116. logger.info('[' + steamID + '] MSG: ' + message);
  117. client.sendMessage(steamID, 'Test');
  118. }
  119. });
  120.  
  121. client.on('tradeProposed', function(tradeID, steamID) {
  122. if (inTrade) {
  123. client.respondToTrade(tradeID, false);
  124. client.sendMessage(steamID, 'Trading with someone else');
  125. } else {
  126. client.respondToTrade(tradeID, true);
  127. logger.info('[' + steamID + '] Accepted trade');
  128. }
  129. });
  130.  
  131. client.on('sessionStart', function(steamID) {
  132. inTrade = true;
  133. client.setPersonaState(steam.EPersonaState.Busy);
  134. trade.open(steamID, function() {
  135. trade.loadInventory(appid.CSGO, contextid.CSGO, function(inv) {
  136. if (!inv) {
  137. logger.error('Error getting own inventory. Cancelling trade.');
  138. client.sendMessage(steamID, 'Could not load inventory. Please try again later.');
  139. trade.cancel(steamID);
  140. } else {
  141. logger.debug('Found '+inv.length+' items in inventory.');
  142. myBackpack = inv;
  143. onTradeStart(steamID);
  144. }
  145. });
  146. });
  147. });
  148.  
  149. trade.on('chatMsg', function(msg) {
  150. logger.debug('TradeMsg: '+msg);
  151. if (req = msg.match(/^!add (\d+) (\d+)/i)) {
  152. var series = req[1];
  153. addCrates(series, amount); // Add Items
  154. } else {
  155. trade.chatMsg('Use !add <type> <amount>');
  156. }
  157. });
  158.  
  159.  
  160. trade.on('ready',function() {
  161. logger.debug('User clicked ready');
  162. trade.ready(function() {
  163. setTimeout(function () {
  164. trade.confirm(function() {
  165. logger.debug('Confirming Trade');
  166. });
  167. }, 1500);
  168. });
  169. });
  170.  
  171. trade.on('offerChanged', function(itemAdded, item) {
  172. if (itemAdded)
  173. logger.info('User added: '+item.name);
  174. else
  175. logger.info('User removed: '+item.name);
  176. });
  177.  
  178. trade.on('unready',function() {
  179. logger.debug('User clicked unready');
  180. });
  181.  
  182.  
  183. trade.on('end', function(result, getItems) {
  184. inTrade = false;
  185. myBackpack = null;
  186. client.setPersonaState(steam.EPersonaState.LookingToTrade);
  187.  
  188. if (result == 'timeout') {
  189. logger.warn('Trade timed out');
  190. client.sendMessage(trade.tradePartnerSteamID, 'The trade timed out');
  191. } else if (result == 'complete') {
  192. logger.info('Trade complete');
  193. } else {
  194. logger.debug('Trade ended: '+result);
  195. }
  196. });
  197.  
  198. // Message in Steam Trade Window
  199. function onTradeStart(steamID) {
  200. trade.chatMsg('Testing Trade Chat', function() {
  201. trade.chatMsg('!add <series> <amount>', function() {
  202. });
  203. });
  204. }
  205.  
  206.  
  207. // TF2 Working Item Trade (For Supply Crates requested via Trade Chat window)
  208. function addCrates(series, amount) {
  209. // Filter out all the crates
  210. var pool = myBackpack.filter(function (item) {
  211. return item.tags.some(function(element, index, array) {
  212. return element.internal_name == 'Supply Crate';
  213. });
  214. });
  215.  
  216. // Filter out the series
  217. var re = new RegExp('#' + series, 'i'); // ex: #82
  218. pool = pool.filter(function (item) {
  219. return item.name.match(re);
  220. });
  221.  
  222. // Let the user know we don't have enough
  223. if (amount > pool.length) {
  224. logger.debug('User requested '+amount+' of series '+series+'. I only have '+pool.length+' available.');
  225. trade.chatMsg('I have '+pool.length+' crates of series '+series+' available.');
  226. }
  227.  
  228. // Add what we should to the current trade
  229. for (var i = 0; i < amount && i < pool.length; i++) {
  230. logger.debug('Adding '+pool[i].name);
  231. trade.addItem(pool[i]);
  232. }
  233. }
  234.  
  235.  
  236. // Attempt to make TF2 supply crate code work for CSGO Weapon Cases
  237. /*
  238. function addCrates(series, amount) {
  239. // Filter out all the crates
  240. var pool = myBackpack.filter(function (item) {
  241. return item.tags.some(function(element, index, array) {
  242. return element.internal_name == 'Weapon Case';
  243. });
  244. });
  245.  
  246. // Filter out the series
  247. var re = new RegExp('Operation' + series, 'i');
  248. pool = pool.filter(function (item) {
  249. return item.name.match(re);
  250. });
  251.  
  252. // Let the user know we don't have enough
  253. if (amount > pool.length) {
  254. logger.debug('User requested '+amount+' of series '+series+'. I only have '+pool.length+' available.');
  255. trade.chatMsg('I have '+pool.length+' crates of series '+series+' available.');
  256. }
  257.  
  258. // Add what we should to the current trade
  259. for (var i = 0; i < amount && i < pool.length; i++) {
  260. logger.debug('Adding '+pool[i].name);
  261. trade.addItem(pool[i]);
  262. }
  263. }
  264. /*
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement