From f2ef6ff8ec07eacd929f95c27d43ffdedb0b4c66 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Sat, 25 Nov 2023 10:10:16 +0800 Subject: [PATCH] fix #1099 again --- .../IncomingFeature/GeniusInvokationDecoding.cs | 1 - src/Snap.Hutao/Snap.Hutao/App.xaml | 1 + .../Control/Layout/UniformStaggeredLayout.cs | 9 +-------- .../Layout/UniformStaggeredLayoutState.cs | 15 +++++++++++++++ .../Control/SizeRestrictedContentControl.cs | 12 ++++++++---- .../Snap.Hutao/Control/Theme/ComboBox.xaml | 11 +++++++++++ .../IocHttpClientConfiguration.cs | 2 ++ .../Service/Discord/DiscordController.cs | 17 ++++++++++++++--- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 6 ++++++ .../Snap.Hutao/View/Page/AchievementPage.xaml | 7 +++---- .../Snap.Hutao/View/Page/CultivationPage.xaml | 7 +++---- .../Snap.Hutao/View/Page/GachaLogPage.xaml | 7 +++---- .../Snap.Hutao/View/Page/LaunchGamePage.xaml | 4 +--- .../Web/Hoyolab/Takumi/GameRecord/CardClient.cs | 2 +- .../Takumi/GameRecord/GameRecordClient.cs | 16 ++++++++++++++++ 15 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Control/Theme/ComboBox.xaml diff --git a/src/Snap.Hutao/Snap.Hutao.Test/IncomingFeature/GeniusInvokationDecoding.cs b/src/Snap.Hutao/Snap.Hutao.Test/IncomingFeature/GeniusInvokationDecoding.cs index 7307d894..aaa2b7ce 100644 --- a/src/Snap.Hutao/Snap.Hutao.Test/IncomingFeature/GeniusInvokationDecoding.cs +++ b/src/Snap.Hutao/Snap.Hutao.Test/IncomingFeature/GeniusInvokationDecoding.cs @@ -1,7 +1,6 @@ using System; using System.Buffers.Binary; using System.Globalization; -using System.Runtime.InteropServices; using System.Text; namespace Snap.Hutao.Test.IncomingFeature; diff --git a/src/Snap.Hutao/Snap.Hutao/App.xaml b/src/Snap.Hutao/Snap.Hutao/App.xaml index b15eeb24..a7c38922 100644 --- a/src/Snap.Hutao/Snap.Hutao/App.xaml +++ b/src/Snap.Hutao/Snap.Hutao/App.xaml @@ -10,6 +10,7 @@ + diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayout.cs b/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayout.cs index e9e17beb..58b31d1a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayout.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayout.cs @@ -128,15 +128,8 @@ internal sealed partial class UniformStaggeredLayout : VirtualizingLayout UniformStaggeredItem item = state.GetItemAt(i); if (item.Height == 0) { - // https://github.com/DGP-Studio/Snap.Hutao/issues/1079 - // The first element must be force refreshed otherwise - // it will use the old one realized - // https://github.com/DGP-Studio/Snap.Hutao/issues/1099 - // Now we need to refresh the first element of each column - ElementRealizationOptions options = i < numberOfColumns ? ElementRealizationOptions.ForceCreate : ElementRealizationOptions.None; - // Item has not been measured yet. Get the element and store the values - UIElement element = context.GetOrCreateElementAt(i, options); + UIElement element = context.GetOrCreateElementAt(i); element.Measure(new Size(state.ColumnWidth, availableHeight)); item.Height = element.DesiredSize.Height; item.Element = element; diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayoutState.cs b/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayoutState.cs index bd191648..e39662f3 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayoutState.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayoutState.cs @@ -74,6 +74,21 @@ internal sealed class UniformStaggeredLayoutState /// internal void Clear() { + // https://github.com/DGP-Studio/Snap.Hutao/issues/1079 + // The first element must be force refreshed otherwise + // it will use the old one realized + // https://github.com/DGP-Studio/Snap.Hutao/issues/1099 + // Now we need to refresh the first element of each column + // https://github.com/DGP-Studio/Snap.Hutao/issues/1099 + // Finally we need to refresh the whole layout when we reset + if (context.ItemCount > 0) + { + for (int i = 0; i < context.ItemCount; i++) + { + RecycleElementAt(i); + } + } + columnLayout.Clear(); items.Clear(); } diff --git a/src/Snap.Hutao/Snap.Hutao/Control/SizeRestrictedContentControl.cs b/src/Snap.Hutao/Snap.Hutao/Control/SizeRestrictedContentControl.cs index 48e89b61..986de656 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/SizeRestrictedContentControl.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/SizeRestrictedContentControl.cs @@ -3,6 +3,7 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Snap.Hutao.Core; using Windows.Foundation; namespace Snap.Hutao.Control; @@ -20,12 +21,15 @@ internal sealed partial class SizeRestrictedContentControl : ContentControl { element.Measure(availableSize); Size contentDesiredSize = element.DesiredSize; + Size contentActualOrDesiredSize = new( + Math.Max(element.ActualWidth, contentDesiredSize.Width), + Math.Max(element.ActualHeight, contentDesiredSize.Height)); if (IsWidthRestricted) { - if (contentDesiredSize.Width > minContentWidth) + if (contentActualOrDesiredSize.Width > minContentWidth) { - minContentWidth = contentDesiredSize.Width; + minContentWidth = contentActualOrDesiredSize.Width; } element.MinWidth = minContentWidth; @@ -33,9 +37,9 @@ internal sealed partial class SizeRestrictedContentControl : ContentControl if (IsHeightRestricted) { - if (contentDesiredSize.Height > minContentHeight) + if (contentActualOrDesiredSize.Height > minContentHeight) { - minContentHeight = contentDesiredSize.Height; + minContentHeight = contentActualOrDesiredSize.Height; } element.MinHeight = minContentHeight; diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Theme/ComboBox.xaml b/src/Snap.Hutao/Snap.Hutao/Control/Theme/ComboBox.xaml new file mode 100644 index 00000000..babd8d20 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Control/Theme/ComboBox.xaml @@ -0,0 +1,11 @@ + + + + 0 + diff --git a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocHttpClientConfiguration.cs b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocHttpClientConfiguration.cs index d9b10b3a..4f975aa0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocHttpClientConfiguration.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/DependencyInjection/IocHttpClientConfiguration.cs @@ -63,8 +63,10 @@ internal static partial class IocHttpClientConfiguration client.DefaultRequestHeaders.Add("x-rpc-app_version", SaltConstants.CNVersion); client.DefaultRequestHeaders.Add("x-rpc-client_type", "2"); client.DefaultRequestHeaders.Add("x-rpc-device_id", HoyolabOptions.DeviceId); + client.DefaultRequestHeaders.Add("x-rpc-device_name", string.Empty); client.DefaultRequestHeaders.Add("x-rpc-game_biz", "bbs_cn"); client.DefaultRequestHeaders.Add("x-rpc-sdk_version", "2.16.0"); + //client.DefaultRequestHeaders.Add("x-rpc-tool_verison", "v4.2.2-ys"); } /// diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs index df269176..f45d2dbb 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs @@ -78,7 +78,13 @@ internal static class DiscordController lock (SyncRoot) { StopTokenSource.Cancel(); - discordManager?.Dispose(); + try + { + discordManager?.Dispose(); + } + catch (SEHException) + { + } } } @@ -135,13 +141,18 @@ internal static class DiscordController } catch (ResultException ex) { - System.Diagnostics.Debug.WriteLine($"[Discord.GameSDK]:[ERROR]:{ex.Result}"); + // If result is Ok + // Maybe the connection is reset. + if (ex.Result is not Result.Ok) + { + System.Diagnostics.Debug.WriteLine($"[Discord.GameSDK ERROR]:{ex.Result:D} {ex.Result}"); + } } catch (SEHException ex) { // Known error codes: // 0x80004005 E_FAIL - System.Diagnostics.Debug.WriteLine($"[Discord.GameSDK]:[ERROR]:0x{ex.ErrorCode:X}"); + System.Diagnostics.Debug.WriteLine($"[Discord.GameSDK ERROR]:0x{ex.ErrorCode:X}"); } } } diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 71d0bc9e..55b4bf4e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -83,6 +83,7 @@ + @@ -317,6 +318,11 @@ + + + MSBuild:Compile + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml index 8ec0dd69..7677b0e1 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml @@ -247,13 +247,12 @@ - + + SelectedItem="{Binding SelectedArchive, Mode=TwoWay}" + Style="{ThemeResource CommandBarComboBoxStyle}"/> - + + SelectedItem="{Binding SelectedProject, Mode=TwoWay}" + Style="{ThemeResource CommandBarComboBoxStyle}"/> diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml index 48da2f6e..9f079fb2 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml @@ -231,13 +231,12 @@ IsHitTestVisible="False"/> - + + SelectedItem="{Binding SelectedArchive, Mode=TwoWay}" + Style="{ThemeResource CommandBarComboBoxStyle}"/> diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml index 8d340d31..c01951f2 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml @@ -218,9 +218,8 @@ - + @@ -252,7 +251,6 @@ > CreateVerificationAsync(User user, CancellationToken token) { HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() - .SetRequestUri(ApiEndpoints.CardCreateVerification(false)) + .SetRequestUri(ApiEndpoints.CardCreateVerification(true)) .SetUserCookieAndFpHeader(user, CookieType.LToken) .Get(); diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs index dcd36a43..e7b21cac 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs @@ -40,6 +40,7 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordDailyNote(userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .Get(); await builder.SignDataAsync(DataSignAlgorithmVersion.Gen2, SaltType.X4, false).ConfigureAwait(false); @@ -60,6 +61,7 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder verifiedbuilder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordDailyNote(userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .SetXrpcChallenge(challenge) .Get(); @@ -86,6 +88,8 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordIndex(userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .Get(); await builder.SignDataAsync(DataSignAlgorithmVersion.Gen2, SaltType.X4, false).ConfigureAwait(false); @@ -106,6 +110,8 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder verifiedbuilder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordIndex(userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .SetXrpcChallenge(challenge) .Get(); @@ -133,6 +139,8 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordSpiralAbyss(schedule, userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .Get(); await builder.SignDataAsync(DataSignAlgorithmVersion.Gen2, SaltType.X4, false).ConfigureAwait(false); @@ -153,6 +161,8 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder verifiedbuilder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordSpiralAbyss(schedule, userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .SetXrpcChallenge(challenge) .Get(); @@ -179,6 +189,8 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordRoleBasicInfo(userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .Get(); await builder.SignDataAsync(DataSignAlgorithmVersion.Gen2, SaltType.X4, false).ConfigureAwait(false); @@ -203,6 +215,8 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordCharacter) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .PostJson(new CharacterData(userAndUid.Uid, playerInfo.Avatars.Select(x => x.Id))); await builder.SignDataAsync(DataSignAlgorithmVersion.Gen2, SaltType.X4, false).ConfigureAwait(false); @@ -223,6 +237,8 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder verifiedBuilder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordCharacter) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) + .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") + .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .SetXrpcChallenge(challenge) .PostJson(new CharacterData(userAndUid.Uid, playerInfo.Avatars.Select(x => x.Id)));