Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
849
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.28 KB | None | 0 0
  1. const SteamUser = require('steam-user');
  2. const SteamTotp = require('steam-totp');
  3. const SteamCommunity = require('steamcommunity');
  4. const TradeOfferManager = require('steam-tradeoffer-manager');
  5. const client = new SteamUser();
  6. const community = new SteamCommunity();
  7. const manager = new TradeOfferManager({
  8. steam: client,
  9. community: community,
  10. language: 'en'
  11. });
  12.  
  13. const TeamFortress2 = require('tf2');
  14.  
  15. const tf2 = new TeamFortress2(client);
  16. const fs = require('fs');
  17. const colors = require('colors');
  18. const colours = require('colors/safe');
  19. const currencies = require('./Currencies.json')
  20. const config = require('./config');
  21.  
  22. var arrayOfObjects = [];
  23. var busy = false;
  24.  
  25. const readAndWrite = require('./readAndWrite.js');
  26. const ReadAndWrite = new readAndWrite();
  27. const logOnOptions = {
  28. accountName: config.accountName,
  29. password: config.password,
  30. twoFactorCode: SteamTotp.generateAuthCode(config.shared_secret)
  31. };
  32.  
  33. client.logOn(logOnOptions);
  34.  
  35. tf2.on("backpackLoaded", function() {
  36. tf2.sortBackpack(4);
  37. console.log("TF2 backpack loaded and re-organized by type.");
  38. });
  39.  
  40. client.on('loggedOn', () => {
  41. client.setPersona(SteamUser.Steam.EPersonaState.LookingToTrade, config.botName);
  42. client.gamesPlayed(440);
  43. console.log(colours.bgGreen(config.botName) + ' is online and looking for trade.'.green);
  44.  
  45. });
  46. client.on('webSession', (sessionid, cookies) => {
  47. manager.setCookies(cookies);
  48. community.setCookies(cookies);
  49. });
  50.  
  51. client.on('friendRelationship', function(steamID, relationship) {
  52. if(relationship == 2) {
  53. console.log('You friend request from: ' + steamID + ' while you were online.');
  54. client.addFriend(steamID, function(err) {
  55. if(err) {
  56. console.log('Error adding friend ' + err.message);
  57. return;
  58. }
  59. client.chatMessage(steamID, 'Hi! I\'m a TF2 trading bot. I buy and sell items. To get started type !help. (Remember you can\'t negotiate here! :steamfacepalm:)');
  60. console.log('Added user: ' + steamID);
  61. });
  62. } else if(relationship == 0) {
  63. console.log('User: ' + steamID + ' removed the you from his/hers friends list while you were online.');
  64. }
  65. });
  66.  
  67. client.on('friendMessage', function(steamID, message) {
  68. switch(message) {
  69. case "!help":
  70. client.chatMessage(steamID, "Here's the list of commands: !help, !howtotrade, !listings, !owner, !group, !donate, !offerdeclined (Make sure to type them correctly. No capital letters.)");
  71. break;
  72. case "Hi":
  73. client.chatMessage(steamID, "Hi! I'm a TF2 trading bot. I buy and sell items. To get started type !help. (Remember you can't negotiate here! ːsteamfacepalmː)");
  74. break
  75. case "hi":
  76. client.chatMessage(steamID, "Hi! I'm a TF2 trading bot. I buy and sell items. To get started type !help. (Remember you can't negotiate here! ːsteamfacepalmː)");
  77. break
  78. case "Hello":
  79. client.chatMessage(steamID, "Hello! I'm a TF2 trading bot. I buy and sell items. To get started type !help. (Remember you can't negotiate here! ːsteamfacepalmː)");
  80. break
  81. case "hello":
  82. client.chatMessage(steamID, "Hello! I'm a TF2 trading bot. I buy and sell items. To get started type !help. (Remember you can't negotiate here! ːsteamfacepalmː)");
  83. break
  84. case "Sup":
  85. client.chatMessage(steamID, "Sup! I'm a TF2 trading bot. I buy and sell items. To get started type !help. (Remember you can't negotiate here! ːsteamfacepalmː)");
  86. break
  87. case "sup":
  88. client.chatMessage(steamID, "Sup! I'm a TF2 trading bot. I buy and sell items. To get started type !help. (Remember you can't negotiate here! ːsteamfacepalmː)");
  89. break
  90. case "fuck you":
  91. client.chatMessage(steamID, "Watch your profanity please! :steamfacepalm:");
  92. break
  93. case "Fuck you":
  94. client.chatMessage(steamID, "Watch your profanity please! :steamfacepalm:");
  95. break
  96. case "Fuck":
  97. client.chatMessage(steamID, "Watch your profanity please! :steamfacepalm:");
  98. break
  99. case "fuck":
  100. client.chatMessage(steamID, "Watch your profanity please! :steamfacepalm:");
  101. break
  102. case "bitch":
  103. client.chatMessage(steamID, "Watch your profanity please! :steamfacepalm:");
  104. break
  105. case "Bitch":
  106. client.chatMessage(steamID, "Watch your profanity please! :steamfacepalm:");
  107. break
  108. case "!owner":
  109. client.chatMessage(steamID, "You can contact my owner for negotiations about trades and etc: https://steamcommunity.com/profiles/76561198278886387 (But remember no refund at all cost!)");
  110. break
  111. case "!howtotrade":
  112. client.chatMessage(steamID, "How to trade: Look up my prices and send me a trade offer! (I accept pure and overpay only.)");
  113. break;
  114. case "!listings":
  115. client.chatMessage(steamID, "You can find my listings here: https://backpack.tf/classifieds?steamid=76561198840991984");
  116. break;
  117. case "!group":
  118. client.chatMessage(steamID, "Here join my group: https://steamcommunity.com/groups/DTG55 ");
  119. break;
  120. case "!donate":
  121. client.chatMessage(steamID, "You can donate here https://steamcommunity.com/tradeoffer/new/?partner=880726256&token=IlLGnhB2 (Thank you for your donation!)");
  122. break;
  123. case "!offerdeclined":
  124. client.chatMessage(steamID, "You can read here https://steamcommunity.com/profiles/76561198840991984 for the reason your offer is declined.");
  125. break;
  126. default:
  127. client.chatMessage(steamID, "Please enter a valid command, use !help for a list of useful commands.");
  128. break;
  129. }
  130. });
  131.  
  132. manager.on('newOffer', (offer) => {
  133. if (busy) {
  134. arrayOfObjects.push(offer);
  135. console.log(`Pushing offer #${offer.id}`);
  136. } else {
  137. processTradeOffer(offer);
  138. }
  139. });
  140.  
  141. //When an offer sent by another Steam user changes state.
  142. manager.on('receivedOfferChanged', function(offer, oldState) {
  143. console.log(offer.partner.getSteam3RenderedID() + `'s Offer #${offer.id} changed: ${TradeOfferManager.ETradeOfferState[oldState]} -> ${TradeOfferManager.ETradeOfferState[offer.state]}`);
  144. //When we accept a trade offer.
  145. if(offer.state == TradeOfferManager.ETradeOfferState.Accepted) {
  146. offer.getReceivedItems(function(err, items) {
  147. if(err) {
  148. console.log('The bot couldn\'t get the items it received.');
  149. } else {
  150. var itemNames = items.map(function(item) {
  151. return item.name;
  152. });
  153. //Log the items, serparated by a comma.
  154. console.log('The bot recieved the following items: ' + itemNames.join(', '));
  155. client.inviteToGroup(offer.partner.getSteamID64(), config.groupID);
  156. }
  157. });
  158. }
  159. });
  160.  
  161. //setInterval to parse incomming offers that were added to a queue.
  162. setInterval(function() {
  163.  
  164. if (arrayOfObjects.length > 0 && !busy) {
  165.  
  166. processTradeOffer(arrayOfObjects[0]);
  167. }
  168. }, 10000);
  169.  
  170. const processTradeOffer = function(offer) {
  171. busy = true;
  172. return getUserDetalles(offer)
  173. .then(function(escrowDays) {
  174. return identyOffer(offer, escrowDays);
  175. }).then(function(offerState) {
  176. return finishTradeOffer(offer, offerState);
  177. }).then(function() {
  178. if (arrayOfObjects.length > 0) {
  179. arrayOfObjects.splice(0, 1);
  180. }
  181. busy = false;
  182. }).catch(function() {
  183. busy = false;
  184. arrayOfObjects.push(offer);
  185. })
  186. }
  187.  
  188. const identyOffer = function(offer, escrowDays) {
  189. return new Promise(function(resolve, reject) {
  190. var offerState = 'undefined';
  191. if (offer.isGlitched() || offer.state === 11 || escrowDays > 0) {
  192. offerState = 'denegable';
  193. return resolve(offerState);
  194. } else if (offer.partner.getSteamID64() === config.id_bossAccount) {
  195. offerState = 'aceptable';
  196. return resolve(offerState);
  197. } else if (offer.itemsToGive.length < 1) {
  198. offerState = 'aceptable';
  199. console.log('Donation =)');
  200. return resolve(offerState);
  201.  
  202. } else {
  203. offerState = 'valida';
  204. return resolve(offerState);
  205. }
  206. })
  207. }
  208. const finishTradeOffer = function(offer, offerState) {
  209. switch (offerState) {
  210. case 'aceptable':
  211. return acceptTradeOffer(offer);
  212. case 'denegable':
  213. return declineTradeOffer(offer);
  214. case 'valida':
  215. return identifyItems(offer).then(function(offerState) {
  216. return finishTradeOffer(offer, offerState);
  217. });
  218. default:
  219. return Promise.reject();
  220. }
  221.  
  222. }
  223. const identifyItems = function(offer) {
  224. var getValueToGive = getValueItemsToGive(offer);
  225. var getValueToReceive = getValueItemsToReceive(offer);
  226. return Promise.all([getValueToGive, getValueToReceive])
  227. .then((results) => {
  228. return determinateOfferState(results[0], results[1]);
  229. }).catch(err => {
  230. if (arrayOfObjects.length > 0) {
  231. arrayOfObjects.splice(0, 1)
  232. }
  233. busy = false;
  234. })
  235. }
  236. const getUserDetalles = function(offer) {
  237. return new Promise(function(resolve, reject) {
  238. offer.getUserDetails(function(err, me, them) {
  239. if (them) {
  240. return resolve(them.escrowDays);
  241. } else {
  242. return reject();
  243. }
  244. })
  245. })
  246. }
  247. const determinateOfferState = function(valueToGive, valueToReceive) {
  248. var ToGive = getRight(valueToGive);
  249. var ToReceive = getRight(valueToReceive);
  250.  
  251. if (ToReceive >= ToGive) {
  252. console.log('Items to Give have a value of :'.bgRed + ToGive);
  253. console.log('Items to Receive have a value of :'.bgGreen + ToReceive);
  254. offerState = 'aceptable';
  255. return Promise.resolve(offerState);
  256. } else {
  257. console.log('Items to Give have a value of :'.bgRed + ToGive);
  258. console.log('Items to Receive have a value of :'.bgGreen + ToReceive);
  259. offerState = 'denegable';
  260. return Promise.resolve(offerState);
  261. }
  262. }
  263. const getValueItemsToGive = function(offer) {
  264. return new Promise(function(resolve, reject) {
  265. var filename = './DBPrices.json';
  266. var type = 'utf8';
  267. ReadAndWrite.readDataBase(filename, type)
  268. .then(function(database) {
  269. var promises = [];
  270. var arrItemsToGive = offer.itemsToGive;
  271.  
  272. for (var i = 0; i < arrItemsToGive.length; i++) {
  273.  
  274. var buying = false;
  275.  
  276. promises.push(getValueOfEachItem(database, arrItemsToGive[i], buying));
  277. }
  278. Promise.all(promises)
  279. .then((outgoingValue) => {
  280. return sumValues(outgoingValue);
  281. }).then(function(valueToGive) {
  282. return resolve(valueToGive);
  283. }).catch(err =>
  284. console.log(err));
  285. })
  286. })
  287.  
  288. }
  289. const getValueItemsToReceive = function(offer) {
  290. return new Promise(function(resolve, reject) {
  291. var filename = './DBPrices.json';
  292. var type = 'utf8';
  293. ReadAndWrite.readDataBase(filename, type)
  294. .then(function(database) {
  295.  
  296. var arrItemsToReceive = offer.itemsToReceive;
  297. var promises = [];
  298. for (var i in arrItemsToReceive) {
  299. var buying = true;
  300.  
  301. promises.push(getValueOfEachItem(database, arrItemsToReceive[i], buying))
  302. }
  303. Promise.all(promises)
  304. .then((incomingValue) => {
  305. return sumValues(incomingValue);
  306. }).then(function(valueToReceive) {
  307. return resolve(valueToReceive);
  308. }).catch(err => console.log(err));
  309. })
  310. })
  311.  
  312. }
  313. const getValueOfEachItem = function(database, object, buying) {
  314.  
  315. return new Promise(function(resolve, reject) {
  316.  
  317. setItemDetails(object)
  318. .then((item) => {
  319. if (!buying) {
  320. if (currencies[item.name]) {
  321. return resolve(currencies[item.name].value);
  322. } else if (database[item.name]) {
  323. if (database[item.name].craftable == item.craft) {
  324. return resolve(database[item.name].sell);
  325. } else {
  326. console.log(item.name + item.craft);
  327. return resolve(999999);
  328. }
  329. } else {
  330. console.log(item.name + 'User is taking an unknown item from us');
  331. return resolve(999999);
  332. }
  333. } else {
  334. if (item.appid != '440') {
  335. console.log('User is giving us an item from other Steam Game');
  336. return resolve(0);
  337. } else {
  338. if (currencies[item.name]) {
  339. return resolve(currencies[item.name].value);
  340. } else if (database[item.name]) {
  341. if (database[item.name].craftable == item.craft) {
  342.  
  343. return resolve(database[item.name].buy)
  344.  
  345. } else {
  346. console.log('Item name in DBPrices with no coincidence in craft');
  347.  
  348. console.log(item.name + item.craft);
  349. return resolve(0);
  350. }
  351. } else {
  352. console.log('User is giving us an unknown item. add to DBPrices');
  353. console.log(item.name + item.craft);
  354. return resolve(0);
  355.  
  356. }
  357. }
  358. }
  359. })
  360.  
  361.  
  362. })
  363. }
  364.  
  365. const setItemDetails = function(object) {
  366. return new Promise(function(resolve, reject) {
  367. var item ={};
  368. var desc = object.descriptions;
  369. item.appid = object.appid;
  370. item.name = object.market_hash_name;
  371. item.craft = 'Craftable';
  372. var found = desc.some(function(el) {
  373. return el.value === '( Not Usable in Crafting )'
  374. });
  375. if (found) {
  376. item.craft = 'Non-Craftable';
  377. }
  378. return resolve(item);
  379.  
  380.  
  381. })
  382. }
  383. const sumValues = function(arrNumbers) {
  384. return new Promise(function(resolve, reject) {
  385. if (arrNumbers.length > 0) {
  386. const sum = arrNumbers.reduce((total, amount) => total + amount);
  387. return resolve(sum);
  388. } else {
  389. return resolve(0);
  390. }
  391. })
  392. }
  393.  
  394. function getRight(v) {
  395.  
  396. var i = Math.floor(v),
  397. f = Math.round((v - i) / 0.11);
  398. return i + (f === 9 || f * 0.11);
  399.  
  400. }
  401. const acceptTradeOffer = function(offer) {
  402.  
  403. offer.accept(false, function(error, status) {
  404. if (error) {
  405. console.log(`\nError: Failed to accept the trade offer #${offer.id}\n`);
  406. console.log(error);
  407. return Promise.reject();
  408.  
  409. } else if (status === 'pending') {
  410. console.log(`StatusMsg : The trade offer #${offer.id} is accepted but needs confirmation`);
  411.  
  412. community.acceptConfirmationForObject(config.identity_secret, offer.id, function(error) {
  413.  
  414. if (error) {} else {
  415. console.log(`StatusMsg : The trade offer #${offer.id} is confirmed`.green);
  416. return Promise.resolve();
  417. }
  418. });
  419.  
  420. } else {
  421. console.log(`StatusMsg : The trade offer #${offer.id} is accepted`.green);
  422. return Promise.resolve();
  423. }
  424. });
  425.  
  426. }
  427. const declineTradeOffer = function(offer) {
  428.  
  429. offer.decline(function(error) {
  430.  
  431. if (error) {
  432. console.log(`\nError: Failed to decline the trade offer #${offer.id}\n`);
  433. console.log(error);
  434. declineTradeOffer(offer);
  435. } else {
  436. console.log(`StatusMsg : The trade offer #${offer.id} is declined`.red);
  437. return Promise.resolve();
  438. }
  439. });
  440. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement