From 2e31d7ff3938e5c544416d0540cd549190be46cb Mon Sep 17 00:00:00 2001 From: JustArchi Date: Thu, 27 Sep 2018 00:09:00 +0200 Subject: [PATCH] Improve rate limit of messaging --- ArchiSteamFarm/ArchiHandler.cs | 20 +++++----- ArchiSteamFarm/Bot.cs | 72 ++++++++++++++++++++++++---------- ArchiSteamFarm/GlobalConfig.cs | 5 --- ArchiSteamFarm/config/ASF.json | 1 - 4 files changed, 62 insertions(+), 36 deletions(-) diff --git a/ArchiSteamFarm/ArchiHandler.cs b/ArchiSteamFarm/ArchiHandler.cs index 8bc2b2e8b..3c884b0b1 100644 --- a/ArchiSteamFarm/ArchiHandler.cs +++ b/ArchiSteamFarm/ArchiHandler.cs @@ -372,10 +372,10 @@ namespace ArchiSteamFarm { Client.Send(request); } - internal async Task SendMessage(ulong steamID, string message) { + internal async Task SendMessage(ulong steamID, string message) { if ((steamID == 0) || string.IsNullOrEmpty(message)) { ArchiLogger.LogNullError(nameof(steamID) + " || " + nameof(message)); - return false; + return EResult.Fail; } CFriendMessages_SendMessage_Request request = new CFriendMessages_SendMessage_Request { @@ -391,21 +391,21 @@ namespace ArchiSteamFarm { response = await UnifiedFriendMessagesService.SendMessage(x => x.SendMessage(request)); } catch (Exception e) { ArchiLogger.LogGenericWarningException(e); - return false; + return EResult.Timeout; } if (response == null) { ArchiLogger.LogNullError(nameof(response)); - return false; + return EResult.Fail; } - return response.Result == EResult.OK; + return response.Result; } - internal async Task SendMessage(ulong chatGroupID, ulong chatID, string message) { + internal async Task SendMessage(ulong chatGroupID, ulong chatID, string message) { if ((chatGroupID == 0) || (chatID == 0) || string.IsNullOrEmpty(message)) { ArchiLogger.LogNullError(nameof(chatGroupID) + " || " + nameof(chatID) + " || " + nameof(message)); - return false; + return EResult.Fail; } CChatRoom_SendChatMessage_Request request = new CChatRoom_SendChatMessage_Request { @@ -420,15 +420,15 @@ namespace ArchiSteamFarm { response = await UnifiedChatRoomService.SendMessage(x => x.SendChatMessage(request)); } catch (Exception e) { ArchiLogger.LogGenericWarningException(e); - return false; + return EResult.Timeout; } if (response == null) { ArchiLogger.LogNullError(nameof(response)); - return false; + return EResult.Fail; } - return response.Result == EResult.OK; + return response.Result; } internal void SetCurrentMode(uint chatMode) { diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index b65a8e71a..8eba4e770 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -924,10 +924,33 @@ namespace ArchiSteamFarm { messagePart = Program.GlobalConfig.SteamMessagePrefix + (i > 0 ? "…" : "") + messagePart + (maxMessageLength < message.Length - i ? "…" : ""); - await LimitMessagingRequestsAsync().ConfigureAwait(false); + await MessagingSemaphore.WaitAsync().ConfigureAwait(false); - if (!await ArchiHandler.SendMessage(steamID, messagePart).ConfigureAwait(false)) { - return false; + try { + bool sent = false; + + for (byte j = 0; (j < WebBrowser.MaxTries) && !sent; j++) { + EResult result = await ArchiHandler.SendMessage(steamID, messagePart).ConfigureAwait(false); + + switch (result) { + case EResult.OK: + sent = true; + break; + case EResult.RateLimitExceeded: + await Task.Delay(1000).ConfigureAwait(false); + continue; + default: + ArchiLogger.LogGenericError(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(result), result)); + return false; + } + } + + if (!sent) { + ArchiLogger.LogGenericError(Strings.WarningFailed); + return false; + } + } finally { + MessagingSemaphore.Release(); } } @@ -963,10 +986,33 @@ namespace ArchiSteamFarm { messagePart = Program.GlobalConfig.SteamMessagePrefix + (i > 0 ? "…" : "") + messagePart + (maxMessageLength < message.Length - i ? "…" : ""); - await LimitMessagingRequestsAsync().ConfigureAwait(false); + await MessagingSemaphore.WaitAsync().ConfigureAwait(false); - if (!await ArchiHandler.SendMessage(chatGroupID, chatID, messagePart).ConfigureAwait(false)) { - return false; + try { + bool sent = false; + + for (byte j = 0; (j < WebBrowser.MaxTries) && !sent; j++) { + EResult result = await ArchiHandler.SendMessage(chatGroupID, chatID, messagePart).ConfigureAwait(false); + + switch (result) { + case EResult.OK: + sent = true; + break; + case EResult.RateLimitExceeded: + await Task.Delay(1000).ConfigureAwait(false); + continue; + default: + ArchiLogger.LogGenericError(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(result), result)); + return false; + } + } + + if (!sent) { + ArchiLogger.LogGenericError(Strings.WarningFailed); + return false; + } + } finally { + MessagingSemaphore.Release(); } } @@ -1481,20 +1527,6 @@ namespace ArchiSteamFarm { ); } - private async Task LimitMessagingRequestsAsync() { - if (Program.GlobalConfig.MessagingLimiterDelay == 0) { - return; - } - - await MessagingSemaphore.WaitAsync().ConfigureAwait(false); - Utilities.InBackground( - async () => { - await Task.Delay(Program.GlobalConfig.MessagingLimiterDelay).ConfigureAwait(false); - MessagingSemaphore.Release(); - } - ); - } - private async void OnConnected(SteamClient.ConnectedCallback callback) { if (callback == null) { ArchiLogger.LogNullError(nameof(callback)); diff --git a/ArchiSteamFarm/GlobalConfig.cs b/ArchiSteamFarm/GlobalConfig.cs index abfccaedd..3b1d257e5 100644 --- a/ArchiSteamFarm/GlobalConfig.cs +++ b/ArchiSteamFarm/GlobalConfig.cs @@ -49,7 +49,6 @@ namespace ArchiSteamFarm { private const byte DefaultLoginLimiterDelay = 10; private const byte DefaultMaxFarmingTime = 10; private const byte DefaultMaxTradeHoldDuration = 15; - private const ushort DefaultMessagingLimiterDelay = 1000; private const EOptimizationMode DefaultOptimizationMode = EOptimizationMode.MaxPerformance; private const bool DefaultStatistics = true; private const string DefaultSteamMessagePrefix = "/me "; @@ -118,9 +117,6 @@ namespace ArchiSteamFarm { [JsonProperty(Required = Required.DisallowNull)] internal readonly byte MaxTradeHoldDuration = DefaultMaxTradeHoldDuration; - [JsonProperty(Required = Required.DisallowNull)] - internal readonly ushort MessagingLimiterDelay = DefaultMessagingLimiterDelay; - [JsonProperty(Required = Required.DisallowNull)] internal readonly EOptimizationMode OptimizationMode = DefaultOptimizationMode; @@ -345,7 +341,6 @@ namespace ArchiSteamFarm { public bool ShouldSerializeLoginLimiterDelay() => ShouldSerializeEverything || (LoginLimiterDelay != DefaultLoginLimiterDelay); public bool ShouldSerializeMaxFarmingTime() => ShouldSerializeEverything || (MaxFarmingTime != DefaultMaxFarmingTime); public bool ShouldSerializeMaxTradeHoldDuration() => ShouldSerializeEverything || (MaxTradeHoldDuration != DefaultMaxTradeHoldDuration); - public bool ShouldSerializeMessagingLimiterDelay() => ShouldSerializeEverything || (MessagingLimiterDelay != DefaultMessagingLimiterDelay); public bool ShouldSerializeOptimizationMode() => ShouldSerializeEverything || (OptimizationMode != DefaultOptimizationMode); public bool ShouldSerializeSSteamOwnerID() => ShouldSerializeEverything; // We never serialize helper properties public bool ShouldSerializeStatistics() => ShouldSerializeEverything || (Statistics != DefaultStatistics); diff --git a/ArchiSteamFarm/config/ASF.json b/ArchiSteamFarm/config/ASF.json index f8123910f..2ea16cb29 100644 --- a/ArchiSteamFarm/config/ASF.json +++ b/ArchiSteamFarm/config/ASF.json @@ -16,7 +16,6 @@ "LoginLimiterDelay": 10, "MaxFarmingTime": 10, "MaxTradeHoldDuration": 15, - "MessagingLimiterDelay": 1000, "OptimizationMode": 0, "Statistics": true, "SteamMessagePrefix": "/me ",