From 12e32692cb4a9c59192d505a6244650d8ca8bf4a Mon Sep 17 00:00:00 2001 From: JustArchi Date: Fri, 1 Apr 2016 20:18:21 +0200 Subject: [PATCH] Code review --- ArchiSteamFarm/ArchiWebHandler.cs | 30 --------------------------- ArchiSteamFarm/Bot.cs | 4 ++-- ArchiSteamFarm/CardsFarmer.cs | 17 ++++++++-------- ArchiSteamFarm/Trading.cs | 34 ++++++++++++++++++++++--------- ArchiSteamFarm/Utilities.cs | 15 ++++++++++++-- 5 files changed, 47 insertions(+), 53 deletions(-) diff --git a/ArchiSteamFarm/ArchiWebHandler.cs b/ArchiSteamFarm/ArchiWebHandler.cs index 5e005af28..7eca96411 100644 --- a/ArchiSteamFarm/ArchiWebHandler.cs +++ b/ArchiSteamFarm/ArchiWebHandler.cs @@ -352,36 +352,6 @@ namespace ArchiSteamFarm { return true; } - internal bool DeclineTradeOffer(ulong tradeID) { - if (tradeID == 0 || string.IsNullOrEmpty(Bot.BotConfig.SteamApiKey)) { - return false; - } - - KeyValue response = null; - using (dynamic iEconService = WebAPI.GetInterface("IEconService", Bot.BotConfig.SteamApiKey)) { - iEconService.Timeout = Timeout; - - for (byte i = 0; i < WebBrowser.MaxRetries && response == null; i++) { - try { - response = iEconService.DeclineTradeOffer( - tradeofferid: tradeID.ToString(), - method: WebRequestMethods.Http.Post, - secure: !Program.GlobalConfig.ForceHttp - ); - } catch (Exception e) { - Logging.LogGenericException(e, Bot.BotName); - } - } - } - - if (response == null) { - Logging.LogGenericWTF("Request failed even after " + WebBrowser.MaxRetries + " tries", Bot.BotName); - return false; - } - - return true; - } - internal async Task> GetMyTradableInventory() { if (!await RefreshSessionIfNeeded().ConfigureAwait(false)) { return null; diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 6d742c571..5be68b6f7 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -197,7 +197,7 @@ namespace ArchiSteamFarm { CardsFarmer = new CardsFarmer(this); Trading = new Trading(this); - if (BotConfig.AcceptConfirmationsPeriod > 0) { + if (AcceptConfirmationsTimer == null && BotConfig.AcceptConfirmationsPeriod > 0) { AcceptConfirmationsTimer = new Timer( async e => await AcceptConfirmations().ConfigureAwait(false), null, @@ -206,7 +206,7 @@ namespace ArchiSteamFarm { ); } - if (BotConfig.SendTradePeriod > 0) { + if (SendItemsTimer == null && BotConfig.SendTradePeriod > 0) { SendItemsTimer = new Timer( async e => await ResponseSendTrade(BotConfig.SteamMasterID).ConfigureAwait(false), null, diff --git a/ArchiSteamFarm/CardsFarmer.cs b/ArchiSteamFarm/CardsFarmer.cs index a133a121c..bb5854041 100755 --- a/ArchiSteamFarm/CardsFarmer.cs +++ b/ArchiSteamFarm/CardsFarmer.cs @@ -53,7 +53,7 @@ namespace ArchiSteamFarm { Bot = bot; - if (Program.GlobalConfig.IdleFarmingPeriod > 0) { + if (Timer == null && Program.GlobalConfig.IdleFarmingPeriod > 0) { Timer = new Timer( async e => await CheckGamesForFarming().ConfigureAwait(false), null, @@ -225,8 +225,11 @@ namespace ArchiSteamFarm { HtmlNodeCollection htmlNodeCollection = htmlDocument.DocumentNode.SelectNodes("//a[@class='pagelink']"); if (htmlNodeCollection != null && htmlNodeCollection.Count > 0) { HtmlNode htmlNode = htmlNodeCollection[htmlNodeCollection.Count - 1]; - if (!byte.TryParse(htmlNode.InnerText, out maxPages)) { - maxPages = 1; // Should never happen + string lastPage = htmlNode.InnerText; + if (!string.IsNullOrEmpty(lastPage)) { + if (!byte.TryParse(lastPage, out maxPages)) { + maxPages = 1; // Should never happen + } } } @@ -238,17 +241,13 @@ namespace ArchiSteamFarm { Logging.LogGenericInfo("Checking other pages...", Bot.BotName); List tasks = new List(maxPages - 1); for (byte page = 2; page <= maxPages; page++) { - byte currentPage = page; // We need a copy of variable being passed when in for loops + byte currentPage = page; // We need a copy of variable being passed when in for loops, as loop will proceed before task is launched tasks.Add(CheckPage(currentPage)); } await Task.WhenAll(tasks).ConfigureAwait(false); } - if (GamesToFarm.Count == 0) { - return false; - } - - return true; + return GamesToFarm.Count != 0; } private void CheckPage(HtmlDocument htmlDocument) { diff --git a/ArchiSteamFarm/Trading.cs b/ArchiSteamFarm/Trading.cs index d398f90a6..8b4345e67 100644 --- a/ArchiSteamFarm/Trading.cs +++ b/ArchiSteamFarm/Trading.cs @@ -84,19 +84,12 @@ namespace ArchiSteamFarm { return; } - List tasks = new List(); - foreach (Steam.TradeOffer tradeOffer in tradeOffers) { - if (tradeOffer.trade_offer_state == Steam.TradeOffer.ETradeOfferState.Active) { - tasks.Add(Task.Run(async () => await ParseTrade(tradeOffer).ConfigureAwait(false))); - } - } - - await Task.WhenAll(tasks).ConfigureAwait(false); + await tradeOffers.ForEachAsync(ParseTrade).ConfigureAwait(false); await Bot.AcceptConfirmations(Confirmation.ConfirmationType.Trade).ConfigureAwait(false); } private async Task ParseTrade(Steam.TradeOffer tradeOffer) { - if (tradeOffer == null) { + if (tradeOffer == null || tradeOffer.trade_offer_state != Steam.TradeOffer.ETradeOfferState.Active) { return; } @@ -105,12 +98,33 @@ namespace ArchiSteamFarm { return; } - if (tradeOffer.items_to_give.Count == 0 || tradeOffer.OtherSteamID64 == Bot.BotConfig.SteamMasterID) { + if (ShouldAcceptTrade(tradeOffer)) { Logging.LogGenericInfo("Accepting trade: " + tradeID, Bot.BotName); await Bot.ArchiWebHandler.AcceptTradeOffer(tradeID).ConfigureAwait(false); } else { Logging.LogGenericInfo("Ignoring trade: " + tradeID, Bot.BotName); } } + + private bool ShouldAcceptTrade(Steam.TradeOffer tradeOffer) { + if (tradeOffer == null) { + return false; + } + + // Always accept trades when we're not losing anything + if (tradeOffer.items_to_give.Count == 0) { + return true; + } + + // Always accept trades from SteamMasterID + if (tradeOffer.OtherSteamID64 != 0 && tradeOffer.OtherSteamID64 == Bot.BotConfig.SteamMasterID) { + return true; + } + + // TODO: Add optional SteamTradeMatcher integration here + + // If no rule above matched this trade, reject it + return false; + } } } diff --git a/ArchiSteamFarm/Utilities.cs b/ArchiSteamFarm/Utilities.cs index e370c6377..db79ebf80 100644 --- a/ArchiSteamFarm/Utilities.cs +++ b/ArchiSteamFarm/Utilities.cs @@ -22,14 +22,25 @@ */ +using System; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; namespace ArchiSteamFarm { internal static class Utilities { internal static void Forget(this Task task) { } - internal static async Task SleepAsync(int miliseconds) { - await Task.Delay(miliseconds).ConfigureAwait(false); + internal static Task ForEachAsync(this IEnumerable sequence, Func action) { + return Task.WhenAll(sequence.Select(action)); + } + + internal static Task SleepAsync(int miliseconds) { + if (miliseconds < 0) { + return Task.FromResult(true); + } + + return Task.Delay(miliseconds); } internal static uint GetCharCountInString(string s, char c) {