From f7d822be995f0591d15a5a4c96cfa1c6512d07e8 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Wed, 12 Oct 2016 22:56:19 +0200 Subject: [PATCH] Add support for steam wallet keys, #239 --- ArchiSteamFarm/ArchiHandler.cs | 7 +++++-- ArchiSteamFarm/ArchiWebHandler.cs | 19 +++++++++++++++++++ ArchiSteamFarm/Bot.cs | 11 ++++++++++- ArchiSteamFarm/JSON/Steam.cs | 11 +++++++++++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/ArchiSteamFarm/ArchiHandler.cs b/ArchiSteamFarm/ArchiHandler.cs index d411165ef..639649a42 100644 --- a/ArchiSteamFarm/ArchiHandler.cs +++ b/ArchiSteamFarm/ArchiHandler.cs @@ -120,19 +120,22 @@ namespace ArchiSteamFarm { internal sealed class PurchaseResponseCallback : CallbackMsg { internal enum EPurchaseResult : sbyte { [SuppressMessage("ReSharper", "UnusedMember.Global")] - Unknown = -1, + Unknown = -2, + Timeout = -1, OK = 0, AlreadyOwned = 9, RegionLocked = 13, InvalidKey = 14, DuplicatedKey = 15, BaseGameRequired = 24, + SteamWalletCode = 50, OnCooldown = 53 } - internal readonly EPurchaseResult PurchaseResult; internal readonly Dictionary Items; + internal EPurchaseResult PurchaseResult { get; set; } + internal PurchaseResponseCallback(JobID jobID, CMsgClientPurchaseResponse msg) { if ((jobID == null) || (msg == null)) { throw new ArgumentNullException(nameof(jobID) + " || " + nameof(msg)); diff --git a/ArchiSteamFarm/ArchiWebHandler.cs b/ArchiSteamFarm/ArchiWebHandler.cs index fa69b7d26..aaacafdc3 100644 --- a/ArchiSteamFarm/ArchiWebHandler.cs +++ b/ArchiSteamFarm/ArchiWebHandler.cs @@ -554,6 +554,25 @@ namespace ArchiSteamFarm { return null; } + internal async Task RedeemWalletKey(string key) { + if (string.IsNullOrEmpty(key)) { + Logging.LogNullError(nameof(key), Bot.BotName); + return ArchiHandler.PurchaseResponseCallback.EPurchaseResult.Unknown; + } + + if (!await RefreshSessionIfNeeded().ConfigureAwait(false)) { + return ArchiHandler.PurchaseResponseCallback.EPurchaseResult.Timeout; + } + + string request = SteamStoreURL + "/account/validatewalletcode"; + Dictionary data = new Dictionary(1) { + { "wallet_code", key } + }; + + Steam.RedeemWalletResponse response = await WebBrowser.UrlPostToJsonResultRetry(request, data).ConfigureAwait(false); + return response?.PurchaseResult ?? ArchiHandler.PurchaseResponseCallback.EPurchaseResult.Timeout; + } + internal HashSet GetActiveTradeOffers() { if (string.IsNullOrEmpty(Bot.BotConfig.SteamApiKey)) { Logging.LogNullError(nameof(Bot.BotConfig.SteamApiKey), Bot.BotName); diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index d432bb3bb..1c03b401a 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -1186,13 +1186,22 @@ namespace ArchiSteamFarm { } else { ArchiHandler.PurchaseResponseCallback result = await currentBot.ArchiHandler.RedeemKey(key).ConfigureAwait(false); if (result == null) { - response.Append(Environment.NewLine + "<" + currentBot.BotName + "> Key: " + key + " | Status: Timeout!"); + response.Append(Environment.NewLine + "<" + currentBot.BotName + "> Key: " + key + " | Status: " + ArchiHandler.PurchaseResponseCallback.EPurchaseResult.Timeout); currentBot = null; // Either bot will be changed, or loop aborted } else { switch (result.PurchaseResult) { case ArchiHandler.PurchaseResponseCallback.EPurchaseResult.DuplicatedKey: case ArchiHandler.PurchaseResponseCallback.EPurchaseResult.InvalidKey: case ArchiHandler.PurchaseResponseCallback.EPurchaseResult.OK: + case ArchiHandler.PurchaseResponseCallback.EPurchaseResult.SteamWalletCode: + case ArchiHandler.PurchaseResponseCallback.EPurchaseResult.Timeout: + case ArchiHandler.PurchaseResponseCallback.EPurchaseResult.Unknown: + if (result.PurchaseResult == ArchiHandler.PurchaseResponseCallback.EPurchaseResult.SteamWalletCode) { + // 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.PurchaseResult = await currentBot.ArchiWebHandler.RedeemWalletKey(key).ConfigureAwait(false); + } + response.Append(Environment.NewLine + "<" + currentBot.BotName + "> Key: " + key + " | Status: " + result.PurchaseResult + ((result.Items != null) && (result.Items.Count > 0) ? " | Items: " + string.Join("", result.Items) : "")); key = reader.ReadLine(); // Next key diff --git a/ArchiSteamFarm/JSON/Steam.cs b/ArchiSteamFarm/JSON/Steam.cs index 1ecc33720..607c06093 100644 --- a/ArchiSteamFarm/JSON/Steam.cs +++ b/ArchiSteamFarm/JSON/Steam.cs @@ -311,6 +311,17 @@ namespace ArchiSteamFarm.JSON { } } + [SuppressMessage("ReSharper", "ClassCannotBeInstantiated")] + [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] + internal sealed class RedeemWalletResponse { // Deserialized from JSON +#pragma warning disable 649 + [JsonProperty(PropertyName = "detail", Required = Required.Always)] + internal readonly ArchiHandler.PurchaseResponseCallback.EPurchaseResult PurchaseResult; +#pragma warning restore 649 + + private RedeemWalletResponse() { } + } + [SuppressMessage("ReSharper", "UnusedMember.Global")] internal sealed class TradeOfferRequest { // Constructed from code internal sealed class ItemList {