From be164ad72697c87cbc4f5cf3ce9d29772b8c1fe1 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Wed, 5 Apr 2017 15:03:27 +0200 Subject: [PATCH] Fix JSON failures with wallet code redeem --- ArchiSteamFarm/ArchiHandler.cs | 2 ++ ArchiSteamFarm/ArchiWebHandler.cs | 8 ++++---- ArchiSteamFarm/Bot.cs | 29 ++++++++++++++++++++++------- ArchiSteamFarm/JSON/Steam.cs | 9 +++++++-- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/ArchiSteamFarm/ArchiHandler.cs b/ArchiSteamFarm/ArchiHandler.cs index 6ea619789..2be4fcd5a 100644 --- a/ArchiSteamFarm/ArchiHandler.cs +++ b/ArchiSteamFarm/ArchiHandler.cs @@ -377,6 +377,7 @@ namespace ArchiSteamFarm { internal readonly Dictionary Items; internal EPurchaseResultDetail PurchaseResultDetail { get; set; } + internal EResult Result { get; set; } internal PurchaseResponseCallback(JobID jobID, CMsgClientPurchaseResponse msg) { if ((jobID == null) || (msg == null)) { @@ -385,6 +386,7 @@ namespace ArchiSteamFarm { JobID = jobID; PurchaseResultDetail = (EPurchaseResultDetail) msg.purchase_result_details; + Result = (EResult) msg.eresult; if (msg.purchase_receipt_info == null) { ASF.ArchiLogger.LogNullError(nameof(msg.purchase_receipt_info)); diff --git a/ArchiSteamFarm/ArchiWebHandler.cs b/ArchiSteamFarm/ArchiWebHandler.cs index b099ec8d7..e115b6fd8 100644 --- a/ArchiSteamFarm/ArchiWebHandler.cs +++ b/ArchiSteamFarm/ArchiWebHandler.cs @@ -956,14 +956,14 @@ namespace ArchiSteamFarm { SteamID = 0; } - internal async Task RedeemWalletKey(string key) { + internal async Task> RedeemWalletKey(string key) { if (string.IsNullOrEmpty(key)) { Bot.ArchiLogger.LogNullError(nameof(key)); - return EPurchaseResultDetail.Timeout; + return null; } if (!await RefreshSessionIfNeeded().ConfigureAwait(false)) { - return EPurchaseResultDetail.Timeout; + return null; } const string request = SteamStoreURL + "/account/validatewalletcode"; @@ -972,7 +972,7 @@ namespace ArchiSteamFarm { }; Steam.RedeemWalletResponse response = await WebBrowser.UrlPostToJsonResultRetry(request, data).ConfigureAwait(false); - return response?.PurchaseResultDetail ?? EPurchaseResultDetail.Timeout; + return response != null ? new Tuple(response.Result, response.PurchaseResultDetail) : null; } internal async Task SendTradeOffer(HashSet inventory, ulong partnerID, string token = null) { diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index dd1e9f6aa..6503b874f 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -2954,16 +2954,25 @@ namespace ArchiSteamFarm { if (result.PurchaseResultDetail == EPurchaseResultDetail.CannotRedeemCodeFromClient) { // If it's a wallet code, try to redeem it, and forward the result // The result is final, there is no place for forwarding - result.PurchaseResultDetail = await currentBot.ArchiWebHandler.RedeemWalletKey(key).ConfigureAwait(false); + Tuple walletResult = await currentBot.ArchiWebHandler.RedeemWalletKey(key).ConfigureAwait(false); + if (walletResult != null) { + result.Result = walletResult.Item1; + result.PurchaseResultDetail = walletResult.Item2.GetValueOrDefault(walletResult.Item1 == EResult.OK ? EPurchaseResultDetail.NoDetail : EPurchaseResultDetail.DuplicateActivationCode); + } else { + result.Result = EResult.Timeout; + result.PurchaseResultDetail = EPurchaseResultDetail.Timeout; + } } if ((result.Items != null) && (result.Items.Count > 0)) { response.Append(FormatBotResponse(string.Format(Strings.BotRedeemWithItems, key, result.PurchaseResultDetail, string.Join("", result.Items)), currentBot.BotName)); - } else { + } else if (result.Result == EResult.OK) { response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, result.PurchaseResultDetail), currentBot.BotName)); + } else { + response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, result.Result), currentBot.BotName)); } - if (result.PurchaseResultDetail != EPurchaseResultDetail.Timeout) { + if ((result.Result != EResult.Timeout) && (result.PurchaseResultDetail != EPurchaseResultDetail.Timeout)) { unusedKeys.Remove(key); } @@ -2981,8 +2990,10 @@ namespace ArchiSteamFarm { case EPurchaseResultDetail.RestrictedCountry: if ((result.Items != null) && (result.Items.Count > 0)) { response.Append(FormatBotResponse(string.Format(Strings.BotRedeemWithItems, key, result.PurchaseResultDetail, string.Join("", result.Items)), currentBot.BotName)); - } else { + } else if (result.Result == EResult.OK) { response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, result.PurchaseResultDetail), currentBot.BotName)); + } else { + response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, result.Result), currentBot.BotName)); } if (!forward || (keepMissingGames && (result.PurchaseResultDetail != EPurchaseResultDetail.AlreadyPurchased))) { @@ -3001,7 +3012,7 @@ namespace ArchiSteamFarm { foreach (Bot bot in Bots.Where(bot => (bot.Value != previousBot) && (!redeemFlags.HasFlag(ERedeemFlags.SkipInitial) || (bot.Value != this)) && bot.Value.IsConnectedAndLoggedOn && ((items.Count == 0) || items.Keys.Any(packageID => !bot.Value.OwnedPackageIDs.Contains(packageID)))).OrderBy(bot => bot.Key).Select(bot => bot.Value)) { ArchiHandler.PurchaseResponseCallback otherResult = await bot.ArchiHandler.RedeemKey(key).ConfigureAwait(false); if (otherResult == null) { - response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, EResult.Timeout), bot.BotName)); + response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, EPurchaseResultDetail.Timeout), bot.BotName)); continue; } @@ -3016,8 +3027,10 @@ namespace ArchiSteamFarm { if ((otherResult.Items != null) && (otherResult.Items.Count > 0)) { response.Append(FormatBotResponse(string.Format(Strings.BotRedeemWithItems, key, otherResult.PurchaseResultDetail, string.Join("", otherResult.Items)), bot.BotName)); - } else { + } else if (otherResult.Result == EResult.OK) { response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, otherResult.PurchaseResultDetail), bot.BotName)); + } else { + response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, otherResult.Result), bot.BotName)); } if (alreadyHandled) { @@ -3040,8 +3053,10 @@ namespace ArchiSteamFarm { if ((result.Items != null) && (result.Items.Count > 0)) { response.Append(FormatBotResponse(string.Format(Strings.BotRedeemWithItems, key, result.PurchaseResultDetail, string.Join("", result.Items)), currentBot.BotName)); - } else { + } else if (result.Result == EResult.OK) { response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, result.PurchaseResultDetail), currentBot.BotName)); + } else { + response.Append(FormatBotResponse(string.Format(Strings.BotRedeem, key, result.Result), currentBot.BotName)); } unusedKeys.Remove(key); diff --git a/ArchiSteamFarm/JSON/Steam.cs b/ArchiSteamFarm/JSON/Steam.cs index 31020c66f..afec86233 100644 --- a/ArchiSteamFarm/JSON/Steam.cs +++ b/ArchiSteamFarm/JSON/Steam.cs @@ -391,8 +391,13 @@ namespace ArchiSteamFarm.JSON { [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] internal sealed class RedeemWalletResponse { #pragma warning disable 649 - [JsonProperty(PropertyName = "detail", Required = Required.Always)] - internal readonly EPurchaseResultDetail PurchaseResultDetail; + [JsonProperty(PropertyName = "detail", Required = Required.DisallowNull)] + internal readonly EPurchaseResultDetail? PurchaseResultDetail; +#pragma warning restore 649 + +#pragma warning disable 649 + [JsonProperty(PropertyName = "success", Required = Required.Always)] + internal readonly EResult Result; #pragma warning restore 649 // Deserialized from JSON