Skip to content

Commit

Permalink
Merge branch 'BeyondDimension:develop' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
4Darmygeometry authored Jan 23, 2025
2 parents 80bdae0 + c0e757d commit aa712fb
Show file tree
Hide file tree
Showing 13 changed files with 222 additions and 52 deletions.
9 changes: 9 additions & 0 deletions build/settings_v4_app.json
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,15 @@
"Summary": "加速后自动唤起 Watt 加速器界面",
"IsRegionOrEndregion": null,
"IsValueType": null
},
{
"TypeName": "bool",
"PropertyName": "ProxyBeforeDNSCheck",
"DefaultValue": "true",
"DefaultValueIsConst": true,
"Summary": "加速前进行 DNS 可用性检查",
"IsRegionOrEndregion": null,
"IsValueType": null
}
],
"Usings": ""
Expand Down
2 changes: 1 addition & 1 deletion ref/DirectoryPackages
2 changes: 1 addition & 1 deletion src/AssemblyInfo.Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public static partial class AssemblyInfo
/// <summary>
/// RC 版本号,范围 0~9,只增不减
/// </summary>
const string ver_for_rc = "13";
const string ver_for_rc = "14";

public const string FileVersion = $"{Version2}.{ver_for_rc}2{ver_for_preview}.0";

Expand Down
9 changes: 9 additions & 0 deletions src/BD.WTTS.Client.Avalonia/UI/Styling/Controls.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ms="https://steampp.net/settings"
xmlns:sys="using:System"
xmlns:ui="using:FluentAvalonia.UI.Controls"
x:CompileBindings="True">
<Styles.Resources>
<ResourceDictionary>
Expand Down Expand Up @@ -39,6 +40,14 @@
<Setter Property="FontFamily" Value="{Binding Source={x:Static ms:UISettings.FontName}, Path=Value, Mode=OneWay, Converter={StaticResource NameToFontFamilyConverter}}" />
</Style>

<Style Selector="ui|FontIcon">
<Setter Property="MinWidth" Value="16" />
</Style>

<Style Selector="ui|SymbolIcon">
<Setter Property="MinWidth" Value="16" />
</Style>

<!--<Style Selector="TextBlock">
<Setter Property="FontFamily" Value="{Binding Source={x:Static ms:UISettings.FontName}, Path=Value, Mode=OneWay, Converter={StaticResource NameToFontFamilyConverter}}" />
</Style>-->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,8 @@ private async ValueTask<IStunClient5389> GetStunClient5389Async(TransportProtoco
)
{
using UdpClient udpClient = new UdpClient(dnsServerIp, dnsServerPort);

udpClient.Client.SendTimeout = 3000;
udpClient.Client.ReceiveTimeout = 3000;
var query = new DnsQueryUdpRequest(testDomain, dnsRecordType);

Stopwatch watch = Stopwatch.StartNew();
Expand Down Expand Up @@ -382,7 +383,7 @@ private async ValueTask<IStunClient5389> GetStunClient5389Async(TransportProtoco
Proxy = HttpNoProxy.Instance,
};
using HttpClient client = new HttpClient(handler);

client.Timeout = TimeSpan.FromSeconds(3);
string queryUrl = $"{dohServer}?name={testDomain}&type={dnsRecordType}";

Stopwatch watch = Stopwatch.StartNew();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,7 @@ async void SetGameStatus(XunYouGameViewModel game, int areaId = 0, int serverId
Games.AddOrUpdate(CurrentAcceleratorGame);

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

td.Opened += async (s, e) =>
td.Opened += (s, e) =>
{
await foreach (var item in install)
{
if (item.HandleUI(out var content))
{
switch (content)
{
case < 100:
Dispatcher.UIThread.Post(() => { td.Content = $"正在下载 {item.Content}%"; });
td.SetProgressBarState(item.Content, TaskDialogProgressState.Normal);
break;
case 100:
td.SetProgressBarState(item.Content, TaskDialogProgressState.Indeterminate);
Dispatcher.UIThread.Post(() => { td.Content = $"下载完成,正在安装..."; });
break;
case (int)XunYouDownLoadCode.安装成功:
//处理成功
//Dispatcher.UIThread.Post(() => { td.Content = $"安装完成"; });
Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
td.Hide();
break;
case int n when n > 101 && n < (int)XunYouDownLoadCode.启动安装程序失败:
//处理失败
break;
// Code 和进度重叠 递进 1000 XunYouInstallOrStartCode.默认 XunYouInstallOrStartCode.已安装
case 1000:
Dispatcher.UIThread.Post(() => { td.Content = $"默认"; });
// XunYouInstallOrStartCode.默认
break;
case 1001:
Dispatcher.UIThread.Post(() => { td.Content = $"已安装"; });
// XunYouInstallOrStartCode.已安装
Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
break;
}
}
}
DownloadCallbackAsync(td, install).Wait();
//await foreach (var item in install)
//{
// if (item.HandleUI(out var content))
// {
// switch (content)
// {
// case < 100:
// Dispatcher.UIThread.Post(() => { td.Content = $"正在下载 {item.Content}%"; });
// td.SetProgressBarState(item.Content, TaskDialogProgressState.Normal);
// break;
// case 100:
// td.SetProgressBarState(item.Content, TaskDialogProgressState.Indeterminate);
// Dispatcher.UIThread.Post(() => { td.Content = $"下载完成,正在安装..."; });
// break;
// case (int)XunYouDownLoadCode.安装成功:
// //处理成功
// //Dispatcher.UIThread.Post(() => { td.Content = $"安装完成"; });
// Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
// td.Hide();
// break;
// case int n when n > 101 && n < (int)XunYouDownLoadCode.启动安装程序失败:
// //处理失败
// break;
// // Code 和进度重叠 递进 1000 XunYouInstallOrStartCode.默认 XunYouInstallOrStartCode.已安装
// case 1000:
// Dispatcher.UIThread.Post(() => { td.Content = $"默认"; });
// // XunYouInstallOrStartCode.默认
// break;
// case 1001:
// Dispatcher.UIThread.Post(() => { td.Content = $"已安装"; });
// // XunYouInstallOrStartCode.已安装
// Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
// break;
// }
// }
//}
};

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

private static async Task DownloadCallbackAsync(TaskDialog td, IAsyncEnumerable<ApiRsp<int>> install)
{
await foreach (var item in install)
{
if (item.HandleUI(out var content))
{
switch (content)
{
case < 100:
Dispatcher.UIThread.Post(() => { td.Content = $"正在下载 {item.Content}%"; });
td.SetProgressBarState(item.Content, TaskDialogProgressState.Normal);
break;
case 100:
td.SetProgressBarState(item.Content, TaskDialogProgressState.Indeterminate);
Dispatcher.UIThread.Post(() => { td.Content = $"下载完成,正在安装..."; });
break;
case (int)XunYouDownLoadCode.安装成功:
//处理成功
//Dispatcher.UIThread.Post(() => { td.Content = $"安装完成"; });
TracepointHelper.TrackEvent("DownloadInstallSuccess");
Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
td.Hide();
break;
case int n when n > 101 && n < (int)XunYouDownLoadCode.启动安装程序失败:
//处理失败
break;
// Code 和进度重叠 递进 1000 XunYouInstallOrStartCode.默认 XunYouInstallOrStartCode.已安装
case 1000:
Dispatcher.UIThread.Post(() => { td.Content = $"默认"; });
// XunYouInstallOrStartCode.默认
break;
case 1001:
Dispatcher.UIThread.Post(() => { td.Content = $"已安装"; });
// XunYouInstallOrStartCode.已安装
Dispatcher.UIThread.Post(() => { td.Hide(TaskDialogStandardResult.OK); });
break;
}
}
}
}

public static async void UninstallAccelerator()
{
var xunYouIsInstall = await Ioc.Get<IAcceleratorService>().XY_IsInstall();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// ReSharper disable once CheckNamespace
using BD.WTTS.Helpers;
using BD.WTTS.Services.Implementation;

namespace BD.WTTS.Services;

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

if (ProxySettings.ProxyBeforeDNSCheck.Value)
{
if (useDoh)
{
customDohAddres = await GetFastestDNSAsync(ProxySettingsWindowViewModel.DohAddress);
}
else
{
proxyDNS = await GetFastestDNSAsync(ProxySettingsWindowViewModel.ProxyDNSs.Skip(1));
}
}

Lazy<IPAddress> proxyIp_ = new(() => ReverseProxySettings.GetProxyIp(proxyIp));
void SetProxyIp(IPAddress proxyIPAddress)
{
Expand Down Expand Up @@ -463,4 +476,69 @@ public bool OnStopedShowToastReturnProxyStatus()
return proxyStatus;
}
}

async Task<(long delayMs, string dns)> GetValidDNSAsync(string dns, CancellationToken cancellationToken = default)
{
var testDomain = "dnscheck-test.steampp.net";
try
{
long delayMs;
IPAddress[] address;
if (ProxySettings.UseDoh.Value)
{
(delayMs, address) = await INetworkTestService.Instance.TestDNSOverHttpsAsync(testDomain, dns, cancellationToken: cancellationToken);
}
else
{
(delayMs, address) = await INetworkTestService.Instance.TestDNSAsync(testDomain, dns, 53, cancellationToken: cancellationToken);
}
if (address.Length == 0)
throw new Exception("Parsing failed. Return empty ip address.");

return (delayMs, dns);
}
catch (Exception ex)
{
Log.Error(nameof(StartOrStopProxyService), ex.ToString(), "DNS检测出错");
return (0, dns);
}
}

async Task<string?> GetFastestDNSAsync(IEnumerable<string> dnsAddresses, CancellationToken cancellationToken = default)
{
var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
var tasks = new List<Task<(long delayMs, string dns)>>();

foreach (var dns in dnsAddresses)
{
tasks.Add(GetValidDNSAsync(dns, cts.Token));
}

try
{
// 等待任意一个任务完成
var completedTask = await Task.WhenAny(tasks);

// 获取任务结果
var (delayMs, dns) = await completedTask;
_ = cts.CancelAsync(); // 取消其他任务

// 如果任务成功完成(假设 delayMs > 0 表示成功)
if (delayMs > 0)
{
return dns; // 返回第一个成功的 DNS 地址
}
}
catch (OperationCanceledException)
{
// 任务被取消,忽略
}
catch (Exception ex)
{
Log.Error(nameof(StartOrStopProxyService), ex.ToString(), "DNS检测出错");
}

// 如果没有有效结果,返回默认值
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,11 @@ static IProxySettings? Instance
/// </summary>
bool AutoShowWattAcceleratorWindow { get; set; }

/// <summary>
/// 加速前进行 DNS 可用性检查
/// </summary>
bool ProxyBeforeDNSCheck { get; set; }

/// <summary>
/// 启用脚本自动检查更新的默认值
/// </summary>
Expand Down Expand Up @@ -290,4 +295,9 @@ static IProxySettings? Instance
/// </summary>
const bool DefaultAutoShowWattAcceleratorWindow = true;

/// <summary>
/// 加速前进行 DNS 可用性检查的默认值
/// </summary>
const bool DefaultProxyBeforeDNSCheck = true;

}
12 changes: 12 additions & 0 deletions src/BD.WTTS.Client.Plugins.Accelerator/Settings/ProxySettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,12 @@ static JsonTypeInfo<ProxySettings_> ISettings<ProxySettings_>.JsonTypeInfo
[MPKey(24), MP2Key(24), JsonPropertyOrder(24)]
public bool AutoShowWattAcceleratorWindow { get; set; } = IProxySettings.DefaultAutoShowWattAcceleratorWindow;

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

}

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

/// <summary>
/// 加速前进行 DNS 可用性检查
/// </summary>
public static SettingsStructProperty<bool, ProxySettings_> ProxyBeforeDNSCheck { get; }
= new(DefaultProxyBeforeDNSCheck);

}
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@
</ui:SettingsExpanderItem.Footer>
</ui:SettingsExpanderItem>

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

0 comments on commit aa712fb

Please sign in to comment.