Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1480b5d

Browse files
committed
🐛 新增启用时检查 DNS 可用性
1 parent 9ae326c commit 1480b5d

7 files changed

Lines changed: 198 additions & 39 deletions

File tree

build/settings_v4_app.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,15 @@
997997
"Summary": "加速后自动唤起 Watt 加速器界面",
998998
"IsRegionOrEndregion": null,
999999
"IsValueType": null
1000+
},
1001+
{
1002+
"TypeName": "bool",
1003+
"PropertyName": "ProxyBeforeDNSCheck",
1004+
"DefaultValue": "true",
1005+
"DefaultValueIsConst": true,
1006+
"Summary": "加速前进行 DNS 可用性检查",
1007+
"IsRegionOrEndregion": null,
1008+
"IsValueType": null
10001009
}
10011010
],
10021011
"Usings": ""

src/BD.WTTS.Client.Plugins.Accelerator/Services.Implementation/NetworkTestService.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,8 @@ private async ValueTask<IStunClient5389> GetStunClient5389Async(TransportProtoco
345345
)
346346
{
347347
using UdpClient udpClient = new UdpClient(dnsServerIp, dnsServerPort);
348-
348+
udpClient.Client.SendTimeout = 3000;
349+
udpClient.Client.ReceiveTimeout = 3000;
349350
var query = new DnsQueryUdpRequest(testDomain, dnsRecordType);
350351

351352
Stopwatch watch = Stopwatch.StartNew();
@@ -382,7 +383,7 @@ private async ValueTask<IStunClient5389> GetStunClient5389Async(TransportProtoco
382383
Proxy = HttpNoProxy.Instance,
383384
};
384385
using HttpClient client = new HttpClient(handler);
385-
386+
client.Timeout = TimeSpan.FromSeconds(3);
386387
string queryUrl = $"{dohServer}?name={testDomain}&type={dnsRecordType}";
387388

388389
Stopwatch watch = Stopwatch.StartNew();

src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/GameAcceleratorService.cs

Lines changed: 80 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ async void SetGameStatus(XunYouGameViewModel game, int areaId = 0, int serverId
307307
Games.AddOrUpdate(CurrentAcceleratorGame);
308308

309309
//加速后
310+
TracepointHelper.TrackEvent("AcceleratorGameSuccess");
310311
Toast.Show(ToastIcon.Success, "加速成功");
311312
if (ProxySettings.AutoShowWattAcceleratorWindow.Value)
312313
{
@@ -628,44 +629,45 @@ public static async Task InstallAccelerator()
628629
};
629630
var install = Ioc.Get<IAcceleratorService>().XY_Install(GameAcceleratorSettings.WattAcceleratorDirPath.Value!);
630631

631-
td.Opened += async (s, e) =>
632+
td.Opened += (s, e) =>
632633
{
633-
await foreach (var item in install)
634-
{
635-
if (item.HandleUI(out var content))
636-
{
637-
switch (content)
638-
{
639-
case < 100:
640-
Dispatcher.UIThread.Post(() => { td.Content = $"正在下载 {item.Content}%"; });
641-
td.SetProgressBarState(item.Content, TaskDialogProgressState.Normal);
642-
break;
643-
case 100:
644-
td.SetProgressBarState(item.Content, TaskDialogProgressState.Indeterminate);
645-
Dispatcher.UIThread.Post(() => { td.Content = $"下载完成,正在安装..."; });
646-
break;
647-
case (int)XunYouDownLoadCode.安装成功:
648-
//处理成功
649-
//Dispatcher.UIThread.Post(() => { td.Content = $"安装完成"; });
650-
Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
651-
td.Hide();
652-
break;
653-
case int n when n > 101 && n < (int)XunYouDownLoadCode.启动安装程序失败:
654-
//处理失败
655-
break;
656-
// Code 和进度重叠 递进 1000 XunYouInstallOrStartCode.默认 XunYouInstallOrStartCode.已安装
657-
case 1000:
658-
Dispatcher.UIThread.Post(() => { td.Content = $"默认"; });
659-
// XunYouInstallOrStartCode.默认
660-
break;
661-
case 1001:
662-
Dispatcher.UIThread.Post(() => { td.Content = $"已安装"; });
663-
// XunYouInstallOrStartCode.已安装
664-
Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
665-
break;
666-
}
667-
}
668-
}
634+
DownloadCallbackAsync(td, install).Wait();
635+
//await foreach (var item in install)
636+
//{
637+
// if (item.HandleUI(out var content))
638+
// {
639+
// switch (content)
640+
// {
641+
// case < 100:
642+
// Dispatcher.UIThread.Post(() => { td.Content = $"正在下载 {item.Content}%"; });
643+
// td.SetProgressBarState(item.Content, TaskDialogProgressState.Normal);
644+
// break;
645+
// case 100:
646+
// td.SetProgressBarState(item.Content, TaskDialogProgressState.Indeterminate);
647+
// Dispatcher.UIThread.Post(() => { td.Content = $"下载完成,正在安装..."; });
648+
// break;
649+
// case (int)XunYouDownLoadCode.安装成功:
650+
// //处理成功
651+
// //Dispatcher.UIThread.Post(() => { td.Content = $"安装完成"; });
652+
// Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
653+
// td.Hide();
654+
// break;
655+
// case int n when n > 101 && n < (int)XunYouDownLoadCode.启动安装程序失败:
656+
// //处理失败
657+
// break;
658+
// // Code 和进度重叠 递进 1000 XunYouInstallOrStartCode.默认 XunYouInstallOrStartCode.已安装
659+
// case 1000:
660+
// Dispatcher.UIThread.Post(() => { td.Content = $"默认"; });
661+
// // XunYouInstallOrStartCode.默认
662+
// break;
663+
// case 1001:
664+
// Dispatcher.UIThread.Post(() => { td.Content = $"已安装"; });
665+
// // XunYouInstallOrStartCode.已安装
666+
// Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
667+
// break;
668+
// }
669+
// }
670+
//}
669671
};
670672

671673
//_ = Task.Run(() => { XunYouSDK.InstallAsync(progress, Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "WattAccelerator")); });
@@ -674,6 +676,47 @@ public static async Task InstallAccelerator()
674676
}
675677
}
676678

679+
private static async Task DownloadCallbackAsync(TaskDialog td, IAsyncEnumerable<ApiRsp<int>> install)
680+
{
681+
await foreach (var item in install)
682+
{
683+
if (item.HandleUI(out var content))
684+
{
685+
switch (content)
686+
{
687+
case < 100:
688+
Dispatcher.UIThread.Post(() => { td.Content = $"正在下载 {item.Content}%"; });
689+
td.SetProgressBarState(item.Content, TaskDialogProgressState.Normal);
690+
break;
691+
case 100:
692+
td.SetProgressBarState(item.Content, TaskDialogProgressState.Indeterminate);
693+
Dispatcher.UIThread.Post(() => { td.Content = $"下载完成,正在安装..."; });
694+
break;
695+
case (int)XunYouDownLoadCode.安装成功:
696+
//处理成功
697+
//Dispatcher.UIThread.Post(() => { td.Content = $"安装完成"; });
698+
TracepointHelper.TrackEvent("DownloadInstallSuccess");
699+
Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
700+
td.Hide();
701+
break;
702+
case int n when n > 101 && n < (int)XunYouDownLoadCode.启动安装程序失败:
703+
//处理失败
704+
break;
705+
// Code 和进度重叠 递进 1000 XunYouInstallOrStartCode.默认 XunYouInstallOrStartCode.已安装
706+
case 1000:
707+
Dispatcher.UIThread.Post(() => { td.Content = $"默认"; });
708+
// XunYouInstallOrStartCode.默认
709+
break;
710+
case 1001:
711+
Dispatcher.UIThread.Post(() => { td.Content = $"已安装"; });
712+
// XunYouInstallOrStartCode.已安装
713+
Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
714+
break;
715+
}
716+
}
717+
}
718+
}
719+
677720
public static async void UninstallAccelerator()
678721
{
679722
var xunYouIsInstall = await Ioc.Get<IAcceleratorService>().XY_IsInstall();

src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.Operate.cs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// ReSharper disable once CheckNamespace
22
using BD.WTTS.Helpers;
3+
using BD.WTTS.Services.Implementation;
34

45
namespace BD.WTTS.Services;
56

@@ -73,6 +74,18 @@ async Task<OperateProxyServiceResult> StartProxyServiceCoreAsync()
7374
bool useDoh = ProxySettings.UseDoh.Value;
7475
string? customDohAddres = ProxySettings.CustomDohAddres2.Value;
7576

77+
if (ProxySettings.ProxyBeforeDNSCheck.Value)
78+
{
79+
if (useDoh)
80+
{
81+
customDohAddres = await GetFastestDNSAsync(ProxySettingsWindowViewModel.DohAddress);
82+
}
83+
else
84+
{
85+
proxyDNS = await GetFastestDNSAsync(ProxySettingsWindowViewModel.ProxyDNSs.Skip(1));
86+
}
87+
}
88+
7689
Lazy<IPAddress> proxyIp_ = new(() => ReverseProxySettings.GetProxyIp(proxyIp));
7790
void SetProxyIp(IPAddress proxyIPAddress)
7891
{
@@ -463,4 +476,69 @@ public bool OnStopedShowToastReturnProxyStatus()
463476
return proxyStatus;
464477
}
465478
}
479+
480+
async Task<(long delayMs, string dns)> GetValidDNSAsync(string dns, CancellationToken cancellationToken = default)
481+
{
482+
var testDomain = "dnscheck-test.steampp.net";
483+
try
484+
{
485+
long delayMs;
486+
IPAddress[] address;
487+
if (ProxySettings.UseDoh.Value)
488+
{
489+
(delayMs, address) = await INetworkTestService.Instance.TestDNSOverHttpsAsync(testDomain, dns, cancellationToken: cancellationToken);
490+
}
491+
else
492+
{
493+
(delayMs, address) = await INetworkTestService.Instance.TestDNSAsync(testDomain, dns, 53, cancellationToken: cancellationToken);
494+
}
495+
if (address.Length == 0)
496+
throw new Exception("Parsing failed. Return empty ip address.");
497+
498+
return (delayMs, dns);
499+
}
500+
catch (Exception ex)
501+
{
502+
Log.Error(nameof(StartOrStopProxyService), ex.ToString(), "DNS检测出错");
503+
return (0, dns);
504+
}
505+
}
506+
507+
async Task<string?> GetFastestDNSAsync(IEnumerable<string> dnsAddresses, CancellationToken cancellationToken = default)
508+
{
509+
var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
510+
var tasks = new List<Task<(long delayMs, string dns)>>();
511+
512+
foreach (var dns in dnsAddresses)
513+
{
514+
tasks.Add(GetValidDNSAsync(dns, cts.Token));
515+
}
516+
517+
try
518+
{
519+
// 等待任意一个任务完成
520+
var completedTask = await Task.WhenAny(tasks);
521+
522+
// 获取任务结果
523+
var (delayMs, dns) = await completedTask;
524+
_ = cts.CancelAsync(); // 取消其他任务
525+
526+
// 如果任务成功完成(假设 delayMs > 0 表示成功)
527+
if (delayMs > 0)
528+
{
529+
return dns; // 返回第一个成功的 DNS 地址
530+
}
531+
}
532+
catch (OperationCanceledException)
533+
{
534+
// 任务被取消,忽略
535+
}
536+
catch (Exception ex)
537+
{
538+
Log.Error(nameof(StartOrStopProxyService), ex.ToString(), "DNS检测出错");
539+
}
540+
541+
// 如果没有有效结果,返回默认值
542+
return null;
543+
}
466544
}

src/BD.WTTS.Client.Plugins.Accelerator/Settings/Abstractions/IProxySettings.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ static IProxySettings? Instance
165165
/// </summary>
166166
bool AutoShowWattAcceleratorWindow { get; set; }
167167

168+
/// <summary>
169+
/// 加速前进行 DNS 可用性检查
170+
/// </summary>
171+
bool ProxyBeforeDNSCheck { get; set; }
172+
168173
/// <summary>
169174
/// 启用脚本自动检查更新的默认值
170175
/// </summary>
@@ -290,4 +295,9 @@ static IProxySettings? Instance
290295
/// </summary>
291296
const bool DefaultAutoShowWattAcceleratorWindow = true;
292297

298+
/// <summary>
299+
/// 加速前进行 DNS 可用性检查的默认值
300+
/// </summary>
301+
const bool DefaultProxyBeforeDNSCheck = true;
302+
293303
}

src/BD.WTTS.Client.Plugins.Accelerator/Settings/ProxySettings.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,12 @@ static JsonTypeInfo<ProxySettings_> ISettings<ProxySettings_>.JsonTypeInfo
209209
[MPKey(24), MP2Key(24), JsonPropertyOrder(24)]
210210
public bool AutoShowWattAcceleratorWindow { get; set; } = IProxySettings.DefaultAutoShowWattAcceleratorWindow;
211211

212+
/// <summary>
213+
/// 加速前进行 DNS 可用性检查
214+
/// </summary>
215+
[MPKey(25), MP2Key(25), JsonPropertyOrder(25)]
216+
public bool ProxyBeforeDNSCheck { get; set; } = IProxySettings.DefaultProxyBeforeDNSCheck;
217+
212218
}
213219

214220
public static partial class ProxySettings
@@ -383,4 +389,10 @@ public static partial class ProxySettings
383389
public static SettingsStructProperty<bool, ProxySettings_> AutoShowWattAcceleratorWindow { get; }
384390
= new(DefaultAutoShowWattAcceleratorWindow);
385391

392+
/// <summary>
393+
/// 加速前进行 DNS 可用性检查
394+
/// </summary>
395+
public static SettingsStructProperty<bool, ProxySettings_> ProxyBeforeDNSCheck { get; }
396+
= new(DefaultProxyBeforeDNSCheck);
397+
386398
}

src/BD.WTTS.Client.Plugins.Accelerator/UI/Views/Pages/ProxySettingsPage.axaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@
8888
</ui:SettingsExpanderItem.Footer>
8989
</ui:SettingsExpanderItem>
9090

91+
<ui:SettingsExpanderItem>
92+
<TextBlock Text="启动加速时检查 DNS 可用性" />
93+
<ui:SettingsExpanderItem.Footer>
94+
<ToggleSwitch Classes="LeftContent" IsChecked="{Binding Source={x:Static ms:ProxySettings.ProxyBeforeDNSCheck}, Path=Value, Mode=TwoWay}" />
95+
</ui:SettingsExpanderItem.Footer>
96+
</ui:SettingsExpanderItem>
9197
<!--<DockPanel>
9298
<Label Content="自定义根证书密码"></Label>
9399
<TextBox></TextBox>

0 commit comments

Comments
 (0)