Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.55 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("Backpack TF2 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, 'Hello! 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 == 3) {
  63. client.inviteToGroup(steamID, config.groupID);
  64. } else if(relationship == 0) {
  65. console.log('User: ' + steamID + ' removed the you from his/hers friends list while you were online.');
  66. }
  67. });
  68.  
  69. client.on('friendMessage', function(steamID, message) {
  70. switch(message) {
  71. case "!help":
  72. client.chatMessage(steamID, "Here's the list of commands: !help, !howtotrade, !prices, !owner, !group, !donate, !offerdeclined (Make sure to type them correctly. No capital letters.)");
  73. break;
  74. case "!owner":
  75. 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!)");
  76. break
  77. case "!howtotrade":
  78. client.chatMessage(steamID, "How to trade: Look up my prices and send me a trade offer! (I accept pure and overpay only.)");
  79. break;
  80. case "!prices":
  81. client.chatMessage(steamID, "You can find my prices here: https://backpack.tf/classifieds?steamid=76561198840991984");
  82. break;
  83. case "!group":
  84. client.chatMessage(steamID, "Here join my group: https://steamcommunity.com/groups/DTG55 ");
  85. break;
  86. case "!donate":
  87. client.chatMessage(steamID, "You can donate here https://steamcommunity.com/tradeoffer/new/?partner=880726256&token=IlLGnhB2 (Thank you for your donation!)");
  88. break;
  89. case "!offerdeclined":
  90. client.chatMessage(steamID, "You can read here https://steamcommunity.com/profiles/76561198840991984 for the reason your offer is declined.");
  91. break;
  92. default:
  93. client.chatMessage(steamID, "Please enter a valid command, use !help for a list of useful commands.");
  94. break;
  95. }
  96. });
  97.  
  98. manager.on('newOffer', (offer) => {
  99. if (busy) {
  100. arrayOfObjects.push(offer);
  101. console.log(`Pushing offer #${offer.id}`);
  102. } else {
  103. processTradeOffer(offer);
  104. }
  105. });
  106.  
  107. //setInterval to parse incomming offers that were added to a queue.
  108. setInterval(function() {
  109.  
  110. if (arrayOfObjects.length > 0 && !busy) {
  111.  
  112. processTradeOffer(arrayOfObjects[0]);
  113. }
  114. }, 10000);
  115.  
  116. const processTradeOffer = function(offer) {
  117. busy = true;
  118. return getUserDetalles(offer)
  119. .then(function(escrowDays) {
  120. return identyOffer(offer, escrowDays);
  121. }).then(function(offerState) {
  122. return finishTradeOffer(offer, offerState);
  123. }).then(function() {
  124. if (arrayOfObjects.length > 0) {
  125. arrayOfObjects.splice(0, 1);
  126. }
  127. busy = false;
  128. }).catch(function() {
  129. busy = false;
  130. arrayOfObjects.push(offer);
  131. })
  132. }
  133.  
  134. const identyOffer = function(offer, escrowDays) {
  135. return new Promise(function(resolve, reject) {
  136. var offerState = 'undefined';
  137. if (offer.isGlitched() || offer.state === 11 || escrowDays > 0) {
  138. offerState = 'denegable';
  139. return resolve(offerState);
  140. } else if (offer.partner.getSteamID64() === config.id_bossAccount) {
  141. offerState = 'aceptable';
  142. return resolve(offerState);
  143. } else if (offer.itemsToGive.length < 1) {
  144. offerState = 'aceptable';
  145. console.log('Donation =)');
  146. return resolve(offerState);
  147.  
  148. } else {
  149. offerState = 'valida';
  150. return resolve(offerState);
  151. }
  152. })
  153. }
  154. const finishTradeOffer = function(offer, offerState) {
  155. switch (offerState) {
  156. case 'aceptable':
  157. return acceptTradeOffer(offer);
  158. case 'denegable':
  159. return declineTradeOffer(offer);
  160. case 'valida':
  161. return identifyItems(offer).then(function(offerState) {
  162. return finishTradeOffer(offer, offerState);
  163. });
  164. default:
  165. return Promise.reject();
  166. }
  167.  
  168. }
  169. const identifyItems = function(offer) {
  170. var getValueToGive = getValueItemsToGive(offer);
  171. var getValueToReceive = getValueItemsToReceive(offer);
  172. return Promise.all([getValueToGive, getValueToReceive])
  173. .then((results) => {
  174. return determinateOfferState(results[0], results[1]);
  175. }).catch(err => {
  176. if (arrayOfObjects.length > 0) {
  177. arrayOfObjects.splice(0, 1)
  178. }
  179. busy = false;
  180. })
  181. }
  182. const getUserDetalles = function(offer) {
  183. return new Promise(function(resolve, reject) {
  184. offer.getUserDetails(function(err, me, them) {
  185. if (them) {
  186. return resolve(them.escrowDays);
  187. } else {
  188. return reject();
  189. }
  190. })
  191. })
  192. }
  193. const determinateOfferState = function(valueToGive, valueToReceive) {
  194. var ToGive = getRight(valueToGive);
  195. var ToReceive = getRight(valueToReceive);
  196.  
  197. if (ToReceive >= ToGive) {
  198. console.log('Items to Give have a value of :'.bgRed + ToGive);
  199. console.log('Items to Receive have a value of :'.bgGreen + ToReceive);
  200. offerState = 'aceptable';
  201. return Promise.resolve(offerState);
  202. } else {
  203. console.log('Items to Give have a value of :'.bgRed + ToGive);
  204. console.log('Items to Receive have a value of :'.bgGreen + ToReceive);
  205. offerState = 'denegable';
  206. return Promise.resolve(offerState);
  207. }
  208. }
  209. const getValueItemsToGive = function(offer) {
  210. return new Promise(function(resolve, reject) {
  211. var filename = './DBPrices.json';
  212. var type = 'utf8';
  213. ReadAndWrite.readDataBase(filename, type)
  214. .then(function(database) {
  215. var promises = [];
  216. var arrItemsToGive = offer.itemsToGive;
  217.  
  218. for (var i = 0; i < arrItemsToGive.length; i++) {
  219.  
  220. var buying = false;
  221.  
  222. promises.push(getValueOfEachItem(database, arrItemsToGive[i], buying));
  223. }
  224. Promise.all(promises)
  225. .then((outgoingValue) => {
  226. return sumValues(outgoingValue);
  227. }).then(function(valueToGive) {
  228. return resolve(valueToGive);
  229. }).catch(err =>
  230. console.log(err));
  231. })
  232. })
  233.  
  234. }
  235. const getValueItemsToReceive = function(offer) {
  236. return new Promise(function(resolve, reject) {
  237. var filename = './DBPrices.json';
  238. var type = 'utf8';
  239. ReadAndWrite.readDataBase(filename, type)
  240. .then(function(database) {
  241.  
  242. var arrItemsToReceive = offer.itemsToReceive;
  243. var promises = [];
  244. for (var i in arrItemsToReceive) {
  245. var buying = true;
  246.  
  247. promises.push(getValueOfEachItem(database, arrItemsToReceive[i], buying))
  248. }
  249. Promise.all(promises)
  250. .then((incomingValue) => {
  251. return sumValues(incomingValue);
  252. }).then(function(valueToReceive) {
  253. return resolve(valueToReceive);
  254. }).catch(err => console.log(err));
  255. })
  256. })
  257.  
  258. }
  259. const getValueOfEachItem = function(database, object, buying) {
  260.  
  261. return new Promise(function(resolve, reject) {
  262.  
  263. setItemDetails(object)
  264. .then((item) => {
  265. if (!buying) {
  266. if (currencies[item.name]) {
  267. return resolve(currencies[item.name].value);
  268. } else if (database[item.name]) {
  269. if (database[item.name].craftable == item.craft) {
  270. return resolve(database[item.name].sell);
  271. } else {
  272. console.log(item.name + item.craft);
  273. return resolve(999999);
  274. }
  275. } else {
  276. console.log(item.name + 'User is taking an unkown item from us');
  277. return resolve(999999);
  278. }
  279. } else {
  280. if (item.appid != '440') {
  281. console.log('User is giving us an item from other Steam Game');
  282. return resolve(0);
  283. } else {
  284. if (currencies[item.name]) {
  285. return resolve(currencies[item.name].value);
  286. } else if (database[item.name]) {
  287. if (database[item.name].craftable == item.craft) {
  288.  
  289. return resolve(database[item.name].buy)
  290.  
  291. } else {
  292. console.log('Item name in DBPrices with no coincidence in craft');
  293.  
  294. console.log(item.name + item.craft);
  295. return resolve(0);
  296. }
  297. } else {
  298. console.log('User is giving us an unknown item. add to DBPrices');
  299. console.log(item.name + item.craft);
  300. return resolve(0);
  301.  
  302. }
  303. }
  304. }
  305. })
  306.  
  307.  
  308. })
  309. }
  310.  
  311. const setItemDetails = function(object) {
  312. return new Promise(function(resolve, reject) {
  313. var item ={};
  314. var desc = object.descriptions;
  315. item.appid = object.appid;
  316. item.name = object.market_hash_name;
  317. item.craft = 'Craftable';
  318. var found = desc.some(function(el) {
  319. return el.value === '( Not Usable in Crafting )'
  320. });
  321. if (found) {
  322. item.craft = 'Non-Craftable';
  323. }
  324. return resolve(item);
  325.  
  326.  
  327. })
  328. }
  329. const sumValues = function(arrNumbers) {
  330. return new Promise(function(resolve, reject) {
  331. if (arrNumbers.length > 0) {
  332. const sum = arrNumbers.reduce((total, amount) => total + amount);
  333. return resolve(sum);
  334. } else {
  335. return resolve(0);
  336. }
  337. })
  338. }
  339.  
  340. function getRight(v) {
  341.  
  342. var i = Math.floor(v),
  343. f = Math.round((v - i) / 0.11);
  344. return i + (f === 9 || f * 0.11);
  345.  
  346. }
  347. const acceptTradeOffer = function(offer) {
  348.  
  349. offer.accept(false, function(error, status) {
  350. if (error) {
  351. console.log(`\nError: Failed to accept the trade offer #${offer.id}\n`);
  352. console.log(error);
  353. return Promise.reject();
  354.  
  355. } else if (status === 'pending') {
  356. console.log(`StatusMsg : The trade offer #${offer.id} is accepted but needs confirmation`);
  357.  
  358. community.acceptConfirmationForObject(config.identity_secret, offer.id, function(error) {
  359.  
  360. if (error) {} else {
  361. console.log(`StatusMsg : The trade offer #${offer.id} is confirmed`.green);
  362. return Promise.resolve();
  363. }
  364. });
  365.  
  366. } else {
  367. console.log(`StatusMsg : The trade offer #${offer.id} is accepted`.green);
  368. return Promise.resolve();
  369. }
  370. });
  371.  
  372. }
  373. const declineTradeOffer = function(offer) {
  374.  
  375. offer.decline(function(error) {
  376.  
  377. if (error) {
  378. console.log(`\nError: Failed to decline the trade offer #${offer.id}\n`);
  379. console.log(error);
  380. declineTradeOffer(offer);
  381. } else {
  382. console.log(`StatusMsg : The trade offer #${offer.id} is declined`.red);
  383. return Promise.resolve();
  384. }
  385.  
  386.  
  387. });
  388. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement