diff --git a/ArchiSteamFarm/ArchiHandler.cs b/ArchiSteamFarm/ArchiHandler.cs index 5c9abaaea..48310af3a 100644 --- a/ArchiSteamFarm/ArchiHandler.cs +++ b/ArchiSteamFarm/ArchiHandler.cs @@ -1,4 +1,4 @@ -// _ _ _ ____ _ _____ +// _ _ _ ____ _ _____ // / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___ // / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \ // / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | | @@ -40,6 +40,7 @@ namespace ArchiSteamFarm { private readonly ArchiLogger ArchiLogger; private readonly SteamUnifiedMessages.UnifiedService UnifiedChatRoomService; private readonly SteamUnifiedMessages.UnifiedService UnifiedClanChatRoomsService; + private readonly SteamUnifiedMessages.UnifiedService UnifiedEconService; private readonly SteamUnifiedMessages.UnifiedService UnifiedFriendMessagesService; private readonly SteamUnifiedMessages.UnifiedService UnifiedPlayerService; @@ -53,6 +54,7 @@ namespace ArchiSteamFarm { ArchiLogger = archiLogger; UnifiedChatRoomService = steamUnifiedMessages.CreateService(); UnifiedClanChatRoomsService = steamUnifiedMessages.CreateService(); + UnifiedEconService = steamUnifiedMessages.CreateService(); UnifiedFriendMessagesService = steamUnifiedMessages.CreateService(); UnifiedPlayerService = steamUnifiedMessages.CreateService(); } @@ -218,7 +220,7 @@ namespace ArchiSteamFarm { return null; } - CPlayer_GetGameBadgeLevels_Request request = new CPlayer_GetGameBadgeLevels_Request { }; + CPlayer_GetGameBadgeLevels_Request request = new CPlayer_GetGameBadgeLevels_Request(); SteamUnifiedMessages.ServiceMethodResponse response; try { @@ -270,6 +272,35 @@ namespace ArchiSteamFarm { return body.chat_room_groups.Select(chatRoom => chatRoom.group_summary.chat_group_id).ToHashSet(); } + internal async Task GetTradeToken() { + if (!Client.IsConnected) { + return null; + } + + CEcon_GetTradeOfferAccessToken_Request request = new CEcon_GetTradeOfferAccessToken_Request(); + + SteamUnifiedMessages.ServiceMethodResponse response; + + try { + response = await UnifiedEconService.SendMessage(x => x.GetTradeOfferAccessToken(request)); + } catch (Exception e) { + ArchiLogger.LogGenericWarningException(e); + return null; + } + + if (response == null) { + ArchiLogger.LogNullError(nameof(response)); + return null; + } + + if (response.Result != EResult.OK) { + return null; + } + + CEcon_GetTradeOfferAccessToken_Response body = response.GetDeserializedResponse(); + return body.trade_offer_access_token; + } + internal async Task JoinChatRoomGroup(ulong chatGroupID) { if (chatGroupID == 0) { ArchiLogger.LogNullError(nameof(chatGroupID)); diff --git a/ArchiSteamFarm/ArchiWebHandler.cs b/ArchiSteamFarm/ArchiWebHandler.cs index 28a6a2635..9be465b96 100644 --- a/ArchiSteamFarm/ArchiWebHandler.cs +++ b/ArchiSteamFarm/ArchiWebHandler.cs @@ -1,4 +1,4 @@ -// _ _ _ ____ _ _____ +// _ _ _ ____ _ _____ // / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___ // / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \ // / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | | @@ -61,12 +61,10 @@ namespace ArchiSteamFarm { private readonly Bot Bot; private readonly SemaphoreSlim PublicInventorySemaphore = new SemaphoreSlim(1, 1); private readonly SemaphoreSlim SessionSemaphore = new SemaphoreSlim(1, 1); - private readonly SemaphoreSlim TradeTokenSemaphore = new SemaphoreSlim(1, 1); private readonly WebBrowser WebBrowser; private string CachedApiKey; private bool? CachedPublicInventory; - private string CachedTradeToken; private DateTime LastSessionCheck; private DateTime LastSessionRefresh; private bool MarkingInventoryScheduled; @@ -82,7 +80,6 @@ namespace ArchiSteamFarm { ApiKeySemaphore.Dispose(); PublicInventorySemaphore.Dispose(); SessionSemaphore.Dispose(); - TradeTokenSemaphore.Dispose(); WebBrowser.Dispose(); } @@ -889,56 +886,6 @@ namespace ArchiSteamFarm { return resultInSeconds == 0 ? (byte) 0 : (byte) (resultInSeconds / 86400); } - internal async Task GetTradeToken() { - if (CachedTradeToken != null) { - return CachedTradeToken; - } - - await TradeTokenSemaphore.WaitAsync().ConfigureAwait(false); - - try { - if (CachedTradeToken != null) { - return CachedTradeToken; - } - - const string request = "/my/tradeoffers/privacy?l=english"; - HtmlDocument htmlDocument = await UrlGetToHtmlDocumentWithSession(SteamCommunityURL, request, false).ConfigureAwait(false); - - if (htmlDocument == null) { - return null; - } - - HtmlNode tokenNode = htmlDocument.DocumentNode.SelectSingleNode("//input[@class='trade_offer_access_url']"); - if (tokenNode == null) { - Bot.ArchiLogger.LogNullError(nameof(tokenNode)); - return null; - } - - string value = tokenNode.GetAttributeValue("value", null); - if (string.IsNullOrEmpty(value)) { - Bot.ArchiLogger.LogNullError(nameof(value)); - return null; - } - - int index = value.IndexOf("token=", StringComparison.Ordinal); - if (index < 0) { - Bot.ArchiLogger.LogNullError(nameof(index)); - return null; - } - - index += 6; - if (index + 8 < value.Length) { - Bot.ArchiLogger.LogNullError(nameof(index)); - return null; - } - - CachedTradeToken = value.Substring(index, 8); - return CachedTradeToken; - } finally { - TradeTokenSemaphore.Release(); - } - } - internal async Task HandleConfirmation(string deviceID, string confirmationHash, uint time, ulong confirmationID, ulong confirmationKey, bool accept) { if (string.IsNullOrEmpty(deviceID) || string.IsNullOrEmpty(confirmationHash) || (time == 0) || (confirmationID == 0) || (confirmationKey == 0)) { Bot.ArchiLogger.LogNullError(nameof(deviceID) + " || " + nameof(confirmationHash) + " || " + nameof(time) + " || " + nameof(confirmationID) + " || " + nameof(confirmationKey)); @@ -1177,7 +1124,7 @@ namespace ArchiSteamFarm { } internal void OnDisconnected() { - CachedApiKey = CachedTradeToken = null; + CachedApiKey = null; CachedPublicInventory = null; SteamID = 0; } diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 17dfa15f2..871207b38 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -1,4 +1,4 @@ -// _ _ _ ____ _ _____ +// _ _ _ ____ _ _____ // / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___ // / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \ // / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | | @@ -629,7 +629,7 @@ namespace ArchiSteamFarm { Bot targetBot = Bots.Values.FirstOrDefault(bot => bot.SteamID == steamID); if (targetBot != null) { - string targetTradeToken = await targetBot.ArchiWebHandler.GetTradeToken().ConfigureAwait(false); + string targetTradeToken = await targetBot.ArchiHandler.GetTradeToken().ConfigureAwait(false); if (!string.IsNullOrEmpty(targetTradeToken)) { return await ArchiWebHandler.GetTradeHoldDurationForUser(steamID, targetTradeToken).ConfigureAwait(false); } diff --git a/ArchiSteamFarm/Statistics.cs b/ArchiSteamFarm/Statistics.cs index 73553fbc2..347310aca 100644 --- a/ArchiSteamFarm/Statistics.cs +++ b/ArchiSteamFarm/Statistics.cs @@ -1,4 +1,4 @@ -// _ _ _ ____ _ _____ +// _ _ _ ____ _ _____ // / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___ // / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \ // / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | | @@ -103,7 +103,7 @@ namespace ArchiSteamFarm { // Don't announce if we don't meet conditions string tradeToken; - if (!await ShouldAnnounce().ConfigureAwait(false) || string.IsNullOrEmpty(tradeToken = await Bot.ArchiWebHandler.GetTradeToken().ConfigureAwait(false))) { + if (!await ShouldAnnounce().ConfigureAwait(false) || string.IsNullOrEmpty(tradeToken = await Bot.ArchiHandler.GetTradeToken().ConfigureAwait(false))) { LastAnnouncementCheck = DateTime.UtcNow; ShouldSendHeartBeats = false; return;