diff --git a/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/ExceptionRecorder.cs b/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/ExceptionRecorder.cs index fec24cb5..87514817 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/ExceptionRecorder.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/ExceptionService/ExceptionRecorder.cs @@ -31,7 +31,7 @@ internal sealed partial class ExceptionRecorder private void OnAppUnhandledException(object? sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e) { ValueTask task = serviceProvider - .GetRequiredService() + .GetRequiredService() .UploadLogAsync(e.Exception); if (!task.IsCompleted) diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 1f7e8c14..f6d73cbe 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -2249,6 +2249,12 @@ 设备 ID + + IP:{0},归属:{1} + + + 设备 IP + 在祈愿记录页面显示或隐藏无记录的历史祈愿活动 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoSpiralAbyssService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoSpiralAbyssService.cs index 0566c9a0..f8fb9434 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoSpiralAbyssService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoSpiralAbyssService.cs @@ -19,7 +19,7 @@ internal sealed partial class HutaoSpiralAbyssService : IHutaoSpiralAbyssService private readonly TimeSpan cacheExpireTime = TimeSpan.FromHours(4); private readonly IObjectCacheDbService objectCacheDbService; - private readonly HomaSpiralAbyssClient homaClient; + private readonly HutaoSpiralAbyssClient homaClient; private readonly JsonSerializerOptions options; private readonly IMemoryCache memoryCache; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs index 87074a42..71988df7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs @@ -63,7 +63,7 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions public HutaoUserOptions Value { get => this; } - public async ValueTask PostLoginSucceedAsync(HomaPassportClient passportClient, ITaskContext taskContext, string username, string password, string? token) + public async ValueTask PostLoginSucceedAsync(HutaoPassportClient passportClient, ITaskContext taskContext, string username, string password, string? token) { LocalSetting.Set(SettingKeys.PassportUserName, username); LocalSetting.Set(SettingKeys.PassportPassword, password); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserService.cs index 7d7638b6..1156614b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserService.cs @@ -15,7 +15,7 @@ internal sealed partial class HutaoUserService : IHutaoUserService, IHutaoUserSe { private readonly TaskCompletionSource initializeCompletionSource = new(); - private readonly HomaPassportClient passportClient; + private readonly HutaoPassportClient passportClient; private readonly ITaskContext taskContext; private readonly HutaoUserOptions options; diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportRegisterDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportRegisterDialog.xaml.cs index b2dbb09f..b3cffe51 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportRegisterDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportRegisterDialog.xaml.cs @@ -13,7 +13,7 @@ namespace Snap.Hutao.View.Dialog; [DependencyProperty("VerifyCode", typeof(string))] internal sealed partial class HutaoPassportRegisterDialog : ContentDialog { - private readonly HomaPassportClient homaPassportClient; + private readonly HutaoPassportClient homaPassportClient; private readonly IInfoBarService infoBarService; private readonly ITaskContext taskContext; @@ -22,7 +22,7 @@ internal sealed partial class HutaoPassportRegisterDialog : ContentDialog InitializeComponent(); taskContext = serviceProvider.GetRequiredService(); - homaPassportClient = serviceProvider.GetRequiredService(); + homaPassportClient = serviceProvider.GetRequiredService(); infoBarService = serviceProvider.GetRequiredService(); } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportResetPasswordDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportResetPasswordDialog.xaml.cs index 480a71ce..7d4a9406 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportResetPasswordDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportResetPasswordDialog.xaml.cs @@ -13,7 +13,7 @@ namespace Snap.Hutao.View.Dialog; [DependencyProperty("VerifyCode", typeof(string))] internal sealed partial class HutaoPassportResetPasswordDialog : ContentDialog { - private readonly HomaPassportClient homaPassportClient; + private readonly HutaoPassportClient homaPassportClient; private readonly IInfoBarService infoBarService; private readonly ITaskContext taskContext; @@ -22,7 +22,7 @@ internal sealed partial class HutaoPassportResetPasswordDialog : ContentDialog InitializeComponent(); taskContext = serviceProvider.GetRequiredService(); - homaPassportClient = serviceProvider.GetRequiredService(); + homaPassportClient = serviceProvider.GetRequiredService(); infoBarService = serviceProvider.GetRequiredService(); } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportUnregisterDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportUnregisterDialog.xaml.cs index b3c8b380..1707c24b 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportUnregisterDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/HutaoPassportUnregisterDialog.xaml.cs @@ -13,7 +13,7 @@ namespace Snap.Hutao.View.Dialog; [DependencyProperty("VerifyCode", typeof(string))] internal sealed partial class HutaoPassportUnregisterDialog : ContentDialog { - private readonly HomaPassportClient homaPassportClient; + private readonly HutaoPassportClient homaPassportClient; private readonly IInfoBarService infoBarService; private readonly ITaskContext taskContext; @@ -22,7 +22,7 @@ internal sealed partial class HutaoPassportUnregisterDialog : ContentDialog InitializeComponent(); taskContext = serviceProvider.GetRequiredService(); - homaPassportClient = serviceProvider.GetRequiredService(); + homaPassportClient = serviceProvider.GetRequiredService(); infoBarService = serviceProvider.GetRequiredService(); } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml index cfb744f6..55b61e25 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml @@ -6,7 +6,9 @@ xmlns:cwc="using:CommunityToolkit.WinUI.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mxi="using:Microsoft.Xaml.Interactivity" xmlns:shc="using:Snap.Hutao.Control" + xmlns:shcb="using:Snap.Hutao.Control.Behavior" xmlns:shch="using:Snap.Hutao.Control.Helper" xmlns:shcm="using:Snap.Hutao.Control.Markup" xmlns:shvc="using:Snap.Hutao.View.Control" @@ -14,6 +16,11 @@ d:DataContext="{d:DesignInstance shvs:SettingViewModel}" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" mc:Ignorable="d"> + + + + + @@ -103,6 +110,7 @@ Description="{Binding HutaoOptions.DeviceId}" Header="{shcm:ResourceString Name=ViewPageSettingDeviceIdHeader}" IsClickEnabled="True"/> + diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/HutaoPassportViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/HutaoPassportViewModel.cs index e889afc7..22ce7a2b 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/HutaoPassportViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/HutaoPassportViewModel.cs @@ -19,7 +19,7 @@ namespace Snap.Hutao.ViewModel.Setting; internal sealed partial class HutaoPassportViewModel : Abstraction.ViewModel { private readonly IContentDialogFactory contentDialogFactory; - private readonly HomaPassportClient homaPassportClient; + private readonly HutaoPassportClient homaPassportClient; private readonly HutaoUserOptions hutaoUserOptions; private readonly IInfoBarService infoBarService; private readonly ITaskContext taskContext; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs index 26fc68e6..24d3ba74 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs @@ -23,6 +23,7 @@ using Snap.Hutao.Service.Notification; using Snap.Hutao.Service.User; using Snap.Hutao.View.Dialog; using Snap.Hutao.ViewModel.Guide; +using Snap.Hutao.Web.Hutao; using System.Globalization; using System.IO; using System.Runtime.InteropServices; @@ -41,6 +42,7 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel private readonly HomeCardOptions homeCardOptions = new(); private readonly IFileSystemPickerInteraction fileSystemPickerInteraction; + private readonly HutaoInfrastructureClient hutaoInfrastructureClient; private readonly HutaoPassportViewModel hutaoPassportViewModel; private readonly IContentDialogFactory contentDialogFactory; private readonly IGameLocatorFactory gameLocatorFactory; @@ -57,6 +59,7 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel private NameValue? selectedBackdropType; private NameValue? selectedCulture; + private IPInformation? ipInformation; /// /// 应用程序设置 @@ -98,6 +101,18 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel } } + public IPInformation? IPInformation { get => ipInformation; private set => SetProperty(ref ipInformation, value); } + + protected override async ValueTask InitializeUIAsync() + { + IPInformation? information = await hutaoInfrastructureClient.GetIPInformationAsync().ConfigureAwait(false); + + await taskContext.SwitchToMainThreadAsync(); + IPInformation = information; + + return true; + } + [Command("ResetStaticResourceCommand")] private static void ResetStaticResource() { diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssRecordViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssRecordViewModel.cs index 301024dc..8a1fd9d9 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssRecordViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssRecordViewModel.cs @@ -24,7 +24,7 @@ namespace Snap.Hutao.ViewModel.SpiralAbyss; internal sealed partial class SpiralAbyssRecordViewModel : Abstraction.ViewModel, IRecipient { private readonly ISpiralAbyssRecordService spiralAbyssRecordService; - private readonly HomaSpiralAbyssClient spiralAbyssClient; + private readonly HutaoSpiralAbyssClient spiralAbyssClient; private readonly IInfoBarService infoBarService; private readonly ITaskContext taskContext; private readonly IUserService userService; diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoInfrastructureClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoInfrastructureClient.cs new file mode 100644 index 00000000..e3a5073a --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoInfrastructureClient.cs @@ -0,0 +1,31 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient; +using Snap.Hutao.Service.Hutao; +using Snap.Hutao.Web.Request.Builder; +using Snap.Hutao.Web.Request.Builder.Abstraction; +using System.Net.Http; +using System.Security.Cryptography; +using System.Text; + +namespace Snap.Hutao.Web.Hutao; + +[HttpClient(HttpClientConfiguration.Default)] +[ConstructorGenerated(ResolveHttpClient = true)] +internal sealed partial class HutaoInfrastructureClient +{ + private readonly IHttpRequestMessageBuilderFactory httpRequestMessageBuilderFactory; + private readonly ILogger logger; + private readonly HttpClient httpClient; + + public async ValueTask GetIPInformationAsync(CancellationToken token = default) + { + HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() + .SetRequestUri(HutaoEndpoints.Ip) + .Get(); + + IPInformation? resp = await builder.TryCatchSendAsync(httpClient, logger, token).ConfigureAwait(false); + return resp ?? IPInformation.Default; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoPassportClient.cs similarity index 98% rename from src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportClient.cs rename to src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoPassportClient.cs index 6e93e96a..80fb41b2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoPassportClient.cs @@ -17,7 +17,7 @@ namespace Snap.Hutao.Web.Hutao; [HighQuality] [HttpClient(HttpClientConfiguration.Default)] [ConstructorGenerated(ResolveHttpClient = true)] -internal sealed partial class HomaPassportClient +internal sealed partial class HutaoPassportClient { /// /// 通行证请求公钥 @@ -35,7 +35,7 @@ internal sealed partial class HomaPassportClient """; private readonly IHttpRequestMessageBuilderFactory httpRequestMessageBuilderFactory; - private readonly ILogger logger; + private readonly ILogger logger; private readonly HutaoUserOptions hutaoUserOptions; private readonly HttpClient httpClient; @@ -203,4 +203,4 @@ internal sealed partial class HomaPassportClient return Convert.ToBase64String(encryptedBytes); } } -} \ No newline at end of file +} diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportHttpRequestMessageBuilderExtension.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoPassportHttpRequestMessageBuilderExtension.cs similarity index 88% rename from src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportHttpRequestMessageBuilderExtension.cs rename to src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoPassportHttpRequestMessageBuilderExtension.cs index a99499b3..91d9edeb 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaPassportHttpRequestMessageBuilderExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoPassportHttpRequestMessageBuilderExtension.cs @@ -6,7 +6,7 @@ using Snap.Hutao.Web.Request.Builder; namespace Snap.Hutao.Web.Hutao; -internal static class HomaPassportHttpRequestMessageBuilderExtension +internal static class HutaoPassportHttpRequestMessageBuilderExtension { public static async ValueTask TrySetTokenAsync(this HttpRequestMessageBuilder builder, HutaoUserOptions hutaoUserOptions) { diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/IPInformation.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/IPInformation.cs new file mode 100644 index 00000000..1ce1379d --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/IPInformation.cs @@ -0,0 +1,24 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Web.Hutao; + +internal sealed class IPInformation +{ + public static IPInformation Default { get; } = new() + { + Ip = "Unknown", + Division = "Unknown" + }; + + [JsonPropertyName("ip")] + public string Ip { get; set; } = default!; + + [JsonPropertyName("division")] + public string Division { get; set; } = default!; + + public override string ToString() + { + return SH.FormatViewPageSettingDeviceIpDescription(Ip, Division); + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Log/HomaLogUploadClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Log/HutaoLogUploadClient.cs similarity index 93% rename from src/Snap.Hutao/Snap.Hutao/Web/Hutao/Log/HomaLogUploadClient.cs rename to src/Snap.Hutao/Snap.Hutao/Web/Hutao/Log/HutaoLogUploadClient.cs index 30d110e4..6f198105 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Log/HomaLogUploadClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Log/HutaoLogUploadClient.cs @@ -16,10 +16,10 @@ namespace Snap.Hutao.Web.Hutao.Log; [HighQuality] [ConstructorGenerated(ResolveHttpClient = true)] [HttpClient(HttpClientConfiguration.Default)] -internal sealed partial class HomaLogUploadClient +internal sealed partial class HutaoLogUploadClient { private readonly IHttpRequestMessageBuilderFactory httpRequestMessageBuilderFactory; - private readonly ILogger logger; + private readonly ILogger logger; private readonly RuntimeOptions runtimeOptions; private readonly HttpClient httpClient; diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/SpiralAbyss/HomaSpiralAbyssClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/SpiralAbyss/HutaoSpiralAbyssClient.cs similarity index 98% rename from src/Snap.Hutao/Snap.Hutao/Web/Hutao/SpiralAbyss/HomaSpiralAbyssClient.cs rename to src/Snap.Hutao/Snap.Hutao/Web/Hutao/SpiralAbyss/HutaoSpiralAbyssClient.cs index d4841cd1..5283549c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/SpiralAbyss/HomaSpiralAbyssClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/SpiralAbyss/HutaoSpiralAbyssClient.cs @@ -22,10 +22,10 @@ namespace Snap.Hutao.Web.Hutao.SpiralAbyss; [HighQuality] [ConstructorGenerated(ResolveHttpClient = true)] [HttpClient(HttpClientConfiguration.Default)] -internal sealed partial class HomaSpiralAbyssClient +internal sealed partial class HutaoSpiralAbyssClient { private readonly IHttpRequestMessageBuilderFactory httpRequestMessageBuilderFactory; - private readonly ILogger logger; + private readonly ILogger logger; private readonly IServiceProvider serviceProvider; private readonly HttpClient httpClient; diff --git a/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs index 1ee466fb..faf4cd2d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs @@ -248,6 +248,8 @@ internal static class HutaoEndpoints } #endregion + public const string Ip = $"{ApiSnapGenshin}/ip"; + public static string Website(string path) { return $"{HomaSnapGenshinApi}/{path}";