diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/Http/DynamicProxy/DynamicHttpProxy.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/Http/DynamicProxy/DynamicHttpProxy.cs index 3485479c..3d96b263 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/IO/Http/DynamicProxy/DynamicHttpProxy.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/Http/DynamicProxy/DynamicHttpProxy.cs @@ -1,6 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using CommunityToolkit.Mvvm.ComponentModel; using Snap.Hutao.Win32.Registry; using System.Net; using System.Reflection; @@ -8,7 +9,7 @@ using System.Reflection; namespace Snap.Hutao.Core.IO.Http.DynamicProxy; [Injection(InjectAs.Singleton)] -internal sealed partial class DynamicHttpProxy : IWebProxy, IDisposable +internal sealed partial class DynamicHttpProxy : ObservableObject, IWebProxy, IDisposable { private const string ProxySettingPath = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections"; @@ -32,7 +33,7 @@ internal sealed partial class DynamicHttpProxy : IWebProxy, IDisposable { UpdateProxy(); - watcher = new(ProxySettingPath, UpdateProxy); + watcher = new(ProxySettingPath, OnProxyChanged); watcher.Start(); } @@ -43,6 +44,17 @@ internal sealed partial class DynamicHttpProxy : IWebProxy, IDisposable set => InnerProxy.Credentials = value; } + public string CurrentProxy + { + get + { + Uri? proxyUri = GetProxy("https://hut.ao".ToUri()); + return proxyUri is null + ? SH.ViewPageFeedbackCurrentProxyNoProxyDescription + : proxyUri.AbsoluteUri; + } + } + private IWebProxy InnerProxy { get => innerProxy; @@ -60,15 +72,6 @@ internal sealed partial class DynamicHttpProxy : IWebProxy, IDisposable } } - [MemberNotNull(nameof(innerProxy))] - public void UpdateProxy() - { - IWebProxy? proxy = ConstructSystemProxyMethod.Invoke(default, default) as IWebProxy; - ArgumentNullException.ThrowIfNull(proxy); - - InnerProxy = proxy; - } - public Uri? GetProxy(Uri destination) { return InnerProxy.GetProxy(destination); @@ -84,4 +87,20 @@ internal sealed partial class DynamicHttpProxy : IWebProxy, IDisposable (innerProxy as IDisposable)?.Dispose(); watcher.Dispose(); } + + public void OnProxyChanged() + { + UpdateProxy(); + + Ioc.Default.GetRequiredService().InvokeOnMainThread(() => OnPropertyChanged(nameof(CurrentProxy))); + } + + [MemberNotNull(nameof(innerProxy))] + private void UpdateProxy() + { + IWebProxy? proxy = ConstructSystemProxyMethod.Invoke(default, default) as IWebProxy; + ArgumentNullException.ThrowIfNull(proxy); + + InnerProxy = proxy; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.en.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.en.resx index 6de46966..ea9f5e3e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.en.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.en.resx @@ -1862,6 +1862,12 @@ Useful Links + + Current Proxy + + + No Proxy + Keep in touch with us diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index a8a9a30a..28c18dc2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -1862,6 +1862,12 @@ 常用链接 + + 当前代理 + + + 无代理 + 与我们密切联系 diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/FeedbackPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/FeedbackPage.xaml index 36fe06e1..2f1d560b 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/FeedbackPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/FeedbackPage.xaml @@ -45,6 +45,7 @@ Header="{shcm:ResourceString Name=ViewPageSettingDeviceIdHeader}" IsClickEnabled="True"/> + diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Feedback/FeedbackViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Feedback/FeedbackViewModel.cs index aa5b5b65..38df7dd0 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Feedback/FeedbackViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Feedback/FeedbackViewModel.cs @@ -3,6 +3,7 @@ using Snap.Hutao.Core; using Snap.Hutao.Core.IO.DataTransfer; +using Snap.Hutao.Core.IO.Http.DynamicProxy; using Snap.Hutao.Service; using Snap.Hutao.Service.Notification; using Snap.Hutao.Web.Hutao; @@ -20,6 +21,7 @@ internal sealed partial class FeedbackViewModel : Abstraction.ViewModel private readonly HutaoInfrastructureClient hutaoInfrastructureClient; private readonly HutaoDocumentationClient hutaoDocumentationClient; private readonly IClipboardProvider clipboardProvider; + private readonly DynamicHttpProxy dynamicHttpProxy; private readonly IInfoBarService infoBarService; private readonly CultureOptions cultureOptions; private readonly RuntimeOptions runtimeOptions; @@ -31,6 +33,8 @@ internal sealed partial class FeedbackViewModel : Abstraction.ViewModel public RuntimeOptions RuntimeOptions { get => runtimeOptions; } + public DynamicHttpProxy DynamicHttpProxy { get => dynamicHttpProxy; } + public string? SearchText { get => searchText; set => SetProperty(ref searchText, value); } public List? SearchResults { get => searchResults; set => SetProperty(ref searchResults, value); }