Advertisement
Guest User

Untitled

a guest
May 25th, 2017
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.76 KB | None | 0 0
  1. 'use strict';
  2.  
  3. /** TODO when recieving offer check prices and use prices that we determine,
  4. also check if their name has "csbot" in it, if so add 2% to all of their rates for items they give me,
  5. also check why offers from the admin arent being accepted
  6. */
  7. const SteamApi= require('steam-api');
  8. const SteamUser = require('steam-user');
  9. const SteamCommunity = require('steamcommunity');
  10. const SteamTotp = require('steam-totp');
  11. const Config = require('./botcfg.js'); // for logging in configuration
  12. const fs = require('fs');
  13. const TradeOfferManager = require('steam-tradeoffer-manager');
  14. const SteamlyticsAPI = require("node-steamlytics").API;
  15.  
  16. const Winston = require('winston'); // for logging
  17. const env = process.env.NODE_ENV || 'development'; // for logging
  18. const logDir = 'log'; // for logging
  19. const community = new SteamCommunity();
  20.  
  21. // Create the log directory if it does not exist
  22. if (!fs.existsSync(logDir)) {
  23. fs.mkdirSync(logDir);
  24. }
  25.  
  26. const tsFormat = () => (new Date()).toLocaleTimeString();
  27. const logger = new (Winston.Logger)({
  28. transports: [
  29. // colorize the output to the console
  30. new (Winston.transports.Console)({
  31. timestamp: tsFormat,
  32. colorize: true,
  33. level: 'info'
  34. }),
  35. new (require('winston-daily-rotate-file'))({
  36. filename: `${logDir}/-results.log`,
  37. timestamp: tsFormat,
  38. datePattern: 'yyyy-MM-dd',
  39. prepend: true,
  40. level: env === 'development' ? 'verbose' : 'info'
  41. })
  42. ]
  43. });
  44.  
  45.  
  46.  
  47. // testing logger output
  48. logger.debug('Debugging info');
  49. logger.verbose('Verbose info');
  50. logger.info('Hello world');
  51. logger.warn('Warning message');
  52. logger.error('Error info');
  53.  
  54. const client = new SteamUser();
  55. var offers = new TradeOfferManager({
  56. steam: client,
  57. community: community,
  58. domain: Config.domain,
  59. language: "en", // English item descriptions
  60. pollInterval: 10000, // (Poll every 10 seconds (10,000 ms)
  61. cancelTime: 300000 // Expire any outgoing trade offers that have been up for 5+ minutes (300,000 ms)
  62. });
  63.  
  64. var hasList=false;
  65. var list;
  66.  
  67. var steamlytics = new SteamlyticsAPI(Config.steamlyticsAPIKey, (api, account) => {
  68. logger.info("Connected to SteamLytics");
  69. if(!hasList){
  70. api.csgo.pricelist(function(items){
  71. logger.info("Got v2 pricelist from steamlytics, used one API call");
  72. list=items;
  73. hasList=true;
  74. });
  75. }
  76. });
  77.  
  78.  
  79.  
  80.  
  81. var appid = {
  82. TF2: 440,
  83. DOTA2: 570,
  84. CSGO: 730,
  85. Steam: 753
  86. };
  87.  
  88. var timeOffset;
  89. //getting offset for log in
  90. SteamTotp.getTimeOffset(function(error, offset, latentcy){
  91. timeOffset=offset;
  92. });
  93.  
  94. client.logOn({
  95. accountName: Config.username,
  96. password: Config.password,
  97. twoFactorCode: SteamTotp.getAuthCode(Config.shared_secret, timeOffset)
  98. });
  99.  
  100. client.on('loggedOn', () => {
  101. logger.info('Logged into steam as' + " " + Config.username);
  102. });
  103.  
  104. //checking for errors
  105. client.on('error', function (e) {
  106. // Some error occurred during logon. ENums found here:
  107. // https://github.com/SteamRE/SteamKit/blob/SteamKit_1.6.3/Resources/SteamLanguage/eresult.steamd
  108. logger.error(e);
  109. process.exit(1);
  110. });
  111.  
  112. client.on('webSession', function (sessionID, cookies) {
  113. logger.info("Got web session");
  114. // Set our status to "Online" (otherwise we always appear offline)
  115. client.setPersona(SteamUser.Steam.EPersonaState.Online);
  116. client.gamesPlayed(Config.nonSteamGame); //The gamesPlayed method takes one parameter – a Steam game's appid or a string for a non-Steam game.
  117. offers.setCookies(cookies);
  118. community.setCookies(cookies);
  119. community.startConfirmationChecker(10000, Config.identity_secret);
  120. manageOffers();
  121. });
  122.  
  123. //new items recieved
  124. client.on('newItems', function (count) {
  125. logger.info(count + " new items in our inventory");
  126. });
  127.  
  128. //checking limitations
  129. client.on('accountLimitations', function (limited, communityBanned, locked, canInviteFriends) {
  130. if (limited) {
  131. // More info: https://support.steampowered.com/kb_article.php?ref=3330-IAGK-7663
  132. logger.warn("Our account is limited. We cannot send friend invites, use the market, open group chat, or access the web API.");
  133. }
  134. if (communityBanned){
  135. // More info: https://support.steampowered.com/kb_article.php?ref=4312-UOJL-0835
  136. // http://forums.steampowered.com/forums/showpost.php?p=17054612&postcount=3
  137. logger.warn("Our account is banned from Steam Community");
  138. // I don't know if this alone means you can't trade or not.
  139. }
  140. if (locked){
  141. // Either self-locked or locked by a Valve employee: http://forums.steampowered.com/forums/showpost.php?p=17054612&postcount=3
  142. logger.error("Our account is locked. We cannot trade/gift/purchase items, play on VAC servers, or access Steam Community. Shutting down.");
  143. process.exit(1);
  144. }
  145. if (!canInviteFriends){
  146. // This could be important if you need to add users. In our case, they add us or just use a direct tradeoffer link.
  147. logger.warn("Our account is unable to send friend requests.");
  148. }
  149. });
  150.  
  151. // On startup check our friends list
  152. client.on('relationships', function(){
  153. var friendcount = 0;
  154. // For every friend we have...
  155. for (steamID in client.myFriends) {
  156. friendcount++;
  157. // If the status is a new friend request...
  158. if (client.myFriends[steamID] === SteamUser.Steam.EFriendRelationship.RequestRecipient) {
  159. logger.info("Friend request while offline from: "+steamID);
  160. // Accept friend requests from when we were offline
  161. client.addFriend(steamID);
  162. client.chatMessage(steamID, "Hi thanks for adding me. Send me a trade offer for some cool items");
  163. }
  164. }
  165. logger.info("We have "+friendcount+" friends.");
  166. if (friendcount > 200) {
  167. // We might be able to find old friends after using client.friends.requestFriendData([steamids])
  168. // but seishun will have to add support for it. Right now you can't see how long you've been friends through SteamFriends.
  169. // This is the only data available using requestFriendData function:
  170. // https://github.com/SteamRE/SteamKit/blob/master/Resources/Protobufs/steamclient/steammessages_clientserver.proto#L446-L469
  171. logger.warn("We're approaching the default friends limit. Maybe we need to purge old friends?");
  172. }
  173. });
  174.  
  175. // Friend requests while we're online
  176. client.on('friendRelationship', (steamid, relationship) => {
  177. if (relationship === 2) {
  178. client.addFriend(steamid);
  179. client.chatMessage(steamid, 'Hello there! Thanks for adding me!');
  180. }
  181. });
  182.  
  183. // When messaged
  184. client.on('friendMessage', function (senderID, message) {
  185. logger.info('[' + senderID + '] MSG: ' + message);
  186. client.chatMessage(senderID, Config.greetMsg);
  187. });
  188.  
  189. // When we get a new offer...
  190. offers.on('newOffer', function (offer) {
  191. logger.info("New offer #"+ offer.id +" from "+ offer.partner.getSteam3RenderedID());
  192. manageOffer(offer);
  193. });
  194.  
  195.  
  196. // When an offer sent by someone else changes s
  197. offers.on('receivedOfferChanged', function (offer, oldState) {
  198. logger.info(offer.partner.getSteam3RenderedID() +" Offer #" + offer.id + " changed: " + TradeOfferManager.ETradeOfferState[oldState] + " -> " + TradeOfferManager.ETradeOfferState[offer.state]);
  199.  
  200. // Alert us when we accept an offer
  201. if (offer.state == TradeOfferManager.ETradeOfferState.Accepted) {
  202. logger.info("Offer accepted from" + offer.partner.getSteam3RenderedID())
  203. offer.getReceivedItems(function (err, items) {
  204. if (err) {
  205. logger.error("Couldn't get received items: " + err);
  206. } else {
  207. var names = items.map(function(item) {
  208. return item.name;
  209. });
  210. // Log a comma-separated list of items received
  211. logger.info("Received: " + names.join(', '));
  212. }
  213. });
  214. }
  215. });
  216.  
  217. // When one of our offers changes states
  218. offers.on('sentOfferChanged', function (offer, oldState) {
  219. // Alert us when one of our offers is accepted
  220. if (offer.state == TradeOfferManager.ETradeOfferState.Accepted) {
  221. logger.info("Our sent offer #"+ offer.id + " has been accepted.");
  222. }
  223. });
  224.  
  225. // Steam is down or the API is having issues
  226. offers.on('pollFailure', function (err) {
  227. logger.error("Error polling for trade offers: "+err);
  228. });
  229.  
  230. // When we receive new trade offer data, save it so we can use it after a crash/quit
  231. offers.on('pollData', function (pollData) {
  232. fs.writeFile('polldata.json', JSON.stringify(pollData));
  233. });
  234.  
  235. function manageOffers(){
  236. logger.info("checking offers...");
  237. offers.getOffers(1, function (err, sent, recieved) {
  238. var count=0;
  239. for (offer in recieved) {
  240. manageOffer(offer);
  241. count++;
  242. }
  243. if(count===0)
  244. logger.info("No offers while offline");
  245. });
  246. }
  247.  
  248. //check prices
  249. function manageOffer (offer){
  250. // Accept any trade offer from the bot administrator, or where we're getting free stuff.
  251. /*if (offer.partner.getSteamID64() === Config.admin || offer.itemsToGive.length === 0) {
  252. logger.info("User "+ offer.partner.getSteam3RenderedID() +" offered a valid trade. Trying to accept offer.");
  253. offer.accept(function (err) {
  254. if (err) {
  255. logger.error("Unable to accept offer "+ offer.id +": " + err.message);
  256. }
  257. else if(offer.itemsToGive.length != 0) {
  258. community.acceptConfirmationForObject(Config.identity_secret, offer.id, function(err){
  259. if (err) {
  260. logger.error("Unable to accept offer "+ offer.id +": " + err.message);
  261. }
  262. else{
  263. logger.info("Offer accepted");
  264. }
  265. });
  266. }
  267. else{
  268. logger.info("Offer accepted");
  269. }
  270. });
  271. }
  272. */
  273. //else
  274. if(compareItems(offer)){
  275. logger.info("User "+ offer.partner.getSteam3RenderedID() +" offered a valid trade. Trying to accept offer.");
  276. offer.accept(function (err) {
  277. if (err) {
  278. logger.error("Unable to accept offer "+ offer.id +": " + err.message);
  279. }
  280. else if(offer.itemsToGive.length != 0) {
  281. community.acceptConfirmationForObject(Config.identity_secret, offer.id, function(err){
  282. if (err) {
  283. logger.error("Unable to accept offer "+ offer.id +": " + err.message);
  284. }
  285. else{
  286. logger.info("Offer accepted");
  287. }
  288. });
  289. }
  290. else{
  291. logger.info("Offer accepted");
  292. }
  293. });
  294. }
  295. else { // Otherwise deny it and message the user
  296. logger.info("User "+ offer.partner.getSteam3RenderedID() +" offered an invalid trade. Declining offer.");
  297. offer.decline(function (err) {
  298. if (err) {
  299. logger.error("Unable to decline offer "+ offer.id +": " + err.message);
  300. } else {
  301. logger.info("Offer declined");
  302. // Message the user
  303. client.chatMessage(offer.partner.getSteamID64(), "Please send a trade that follows the rules. Feel free to check my pricing in my profile.");
  304. }
  305. });
  306. }
  307. }
  308.  
  309. function compareItems(offer){
  310. var myItems=0;
  311. var yoItems=0;
  312. //need to get items "specialty" value and multiply by percent
  313. for (var item of offer.itemsToGive) {
  314. var x= item.market_hash_name;
  315. var price=list[x].safe_price;
  316. console.log(x);
  317. console.log(price);
  318. if(price!=0){
  319. myItems+=price;
  320. logger.info("Used v2 pricing");
  321. }
  322. else{
  323. // myItems+=list[x].7_days.average_price;
  324. steamlytics.csgo.prices(x, function(err, data){
  325. if(err)
  326. logger.error(err);
  327. else{
  328. myItems+=data.median_price;
  329. logger.info("Used regular price function");
  330. console.log(data.median_price);
  331. }
  332. });
  333. }
  334. }
  335. for (var item of offer.itemsToGive) {
  336. var x= item.market_hash_name;
  337. var price=list[x].safe_price;
  338. console.log(x);
  339. console.log(price);
  340. if(price!=0){
  341. yoItems+=price;
  342. logger.info("Used v2 pricing");
  343. }
  344. else{
  345. // myItems+=list[x].7_days.average_price;
  346. steamlytics.csgo.prices(x, function(err, data){
  347. if(err)
  348. logger.error(err);
  349. else{
  350. yoItems+=data.median_price;
  351. logger.info("Used regular price function");
  352. console.log(data.median_price);
  353. }
  354. });
  355. }
  356. }
  357.  
  358. return myItems < yoItems;
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement