@@ -89,28 +89,7 @@ public NetworkCheckControlViewModel()
89
89
{
90
90
SelectedSTUNAddress = STUNAddress [ 0 ] ;
91
91
92
- NATCheckCommand = ReactiveCommand . CreateFromTask ( async ( ) =>
93
- {
94
- var natCheckResult = await _networkTestService . TestStunClient3489Async ( testServerHostName : SelectedSTUNAddress ) ?? new ClassicStunResult { NatType = NatType . Unknown } ;
95
- var ( netSucc , _) = await _networkTestService . TestOpenUrlAsync ( "https://www.baidu.com" ) ;
96
-
97
- var publicEndPoint = natCheckResult . PublicEndPoint ? . Address . ToString ( ) ?? "Unknown" ;
98
- var localEndPoint = natCheckResult . LocalEndPoint ? . Address . ToString ( ) ?? "Unknown" ;
99
-
100
- var ( natLevel , natTypeTip ) = natCheckResult . NatType switch
101
- {
102
- // Open
103
- NatType . OpenInternet or NatType . FullCone => ( "开放 NAT" , "您可与在其网络上具有任意 NAT 类型的用户玩多人游戏和发起多人游戏。" ) ,
104
- // Moderate
105
- NatType . RestrictedCone or NatType . PortRestrictedCone or NatType . SymmetricUdpFirewall => ( "中等 NAT" , "您可与一些用户玩多人游戏;但是,并且通常你将不会被选为比赛的主持人。" ) ,
106
- // Strict
107
- NatType . Symmetric or NatType . UdpBlocked => ( "严格 NAT" , "您只能与具有开放 NAT 类型的用户玩多人游戏。您不能被选为比赛的主持人。" ) ,
108
- // Unknown
109
- NatType . Unknown or NatType . UnsupportedServer or _ => ( "不可用 NAT" , "如果 NAT 不可用,您将无法使用群聊天或连接到某些 Xbox 游戏的多人游戏。" ) ,
110
- } ;
111
-
112
- return new NATFetchResult ( publicEndPoint , localEndPoint , natLevel , natTypeTip , netSucc ) ;
113
- } ) ;
92
+ NATCheckCommand = ReactiveCommand . CreateFromTask ( NATCheckAsync ) ;
114
93
NATCheckCommand
115
94
. IsExecuting
116
95
. ToPropertyEx ( this , x => x . IsNATChecking ) ;
@@ -144,36 +123,7 @@ public NetworkCheckControlViewModel()
144
123
145
124
var canDNSCheck = this . WhenAnyValue ( x => x . DomainPendingTest )
146
125
. Select ( domain => domain == string . Empty || DomainRegExp ( ) . IsMatch ( domain ) ) ;
147
- DNSCheckCommand = ReactiveCommand . CreateFromTask ( async ( ) =>
148
- {
149
- var testDomain = DomainPendingTest == string . Empty ? DefaultTestDomain : DomainPendingTest ;
150
- try
151
- {
152
- long delayMs ;
153
- IPAddress [ ] address ;
154
- if ( ProxySettings . UseDoh )
155
- {
156
- var configDoh = ProxySettings . CustomDohAddres2 . Value ?? ProxySettingsWindowViewModel . DohAddress . FirstOrDefault ( ) ?? string . Empty ;
157
- ( delayMs , address ) = await _networkTestService . TestDNSOverHttpsAsync ( testDomain , configDoh ) ;
158
- }
159
- else
160
- {
161
- var configDns = ProxySettings . ProxyMasterDns . Value ?? string . Empty ;
162
- ( delayMs , address ) = await _networkTestService . TestDNSAsync ( testDomain , configDns , 53 ) ;
163
- }
164
- if ( address . Length == 0 )
165
- throw new Exception ( "Parsing failed. Return empty ip address." ) ;
166
-
167
- DNSTestDelay = delayMs + "ms " ;
168
- DNSTestResult = string . Empty + address . FirstOrDefault ( ) ;
169
- }
170
- catch ( Exception ex )
171
- {
172
- Log . Error ( nameof ( AcceleratorPageViewModel ) , ex . ToString ( ) ) ;
173
- DNSTestDelay = string . Empty ;
174
- DNSTestResult = "error" ;
175
- }
176
- } , canDNSCheck ) ;
126
+ DNSCheckCommand = ReactiveCommand . CreateFromTask ( DNSCheckAsync , canDNSCheck ) ;
177
127
DNSCheckCommand
178
128
. IsExecuting
179
129
. ToPropertyEx ( this , x => x . IsDNSChecking ) ;
@@ -198,4 +148,70 @@ public NetworkCheckControlViewModel()
198
148
199
149
IPv6CheckCommand . Execute ( ) . Subscribe ( ) ;
200
150
}
151
+
152
+ async Task < NATFetchResult > NATCheckAsync ( )
153
+ {
154
+ try
155
+ {
156
+ return await NATCheckCoreAsync ( ) ;
157
+ }
158
+ catch
159
+ {
160
+ return new ( "" , "" , "" , "" , false ) ;
161
+ }
162
+ }
163
+
164
+ async Task < NATFetchResult > NATCheckCoreAsync ( )
165
+ {
166
+ var natCheckResult = await _networkTestService . TestStunClient3489Async ( testServerHostName : SelectedSTUNAddress ) ?? new ClassicStunResult { NatType = NatType . Unknown } ;
167
+ var ( netSucc , _) = await _networkTestService . TestOpenUrlAsync ( "https://www.baidu.com" ) ;
168
+
169
+ var publicEndPoint = natCheckResult . PublicEndPoint ? . Address . ToString ( ) ?? "Unknown" ;
170
+ var localEndPoint = natCheckResult . LocalEndPoint ? . Address . ToString ( ) ?? "Unknown" ;
171
+
172
+ var ( natLevel , natTypeTip ) = natCheckResult . NatType switch
173
+ {
174
+ // Open
175
+ NatType . OpenInternet or NatType . FullCone => ( "开放 NAT" , "您可与在其网络上具有任意 NAT 类型的用户玩多人游戏和发起多人游戏。" ) ,
176
+ // Moderate
177
+ NatType . RestrictedCone or NatType . PortRestrictedCone or NatType . SymmetricUdpFirewall => ( "中等 NAT" , "您可与一些用户玩多人游戏;但是,并且通常你将不会被选为比赛的主持人。" ) ,
178
+ // Strict
179
+ NatType . Symmetric or NatType . UdpBlocked => ( "严格 NAT" , "您只能与具有开放 NAT 类型的用户玩多人游戏。您不能被选为比赛的主持人。" ) ,
180
+ // Unknown
181
+ NatType . Unknown or NatType . UnsupportedServer or _ => ( "不可用 NAT" , "如果 NAT 不可用,您将无法使用群聊天或连接到某些 Xbox 游戏的多人游戏。" ) ,
182
+ } ;
183
+
184
+ return new NATFetchResult ( publicEndPoint , localEndPoint , natLevel , natTypeTip , netSucc ) ;
185
+ }
186
+
187
+ async Task DNSCheckAsync ( )
188
+ {
189
+ var testDomain = DomainPendingTest == string . Empty ? DefaultTestDomain : DomainPendingTest ;
190
+ try
191
+ {
192
+ long delayMs ;
193
+ IPAddress [ ] address ;
194
+ if ( ProxySettings . UseDoh )
195
+ {
196
+ var configDoh = ProxySettings . CustomDohAddres2 . Value ?? ProxySettingsWindowViewModel . DohAddress . FirstOrDefault ( ) ?? string . Empty ;
197
+ ( delayMs , address ) = await _networkTestService . TestDNSOverHttpsAsync ( testDomain , configDoh ) ;
198
+ }
199
+ else
200
+ {
201
+ var configDns = ProxySettings . ProxyMasterDns . Value ?? string . Empty ;
202
+ ( delayMs , address ) = await _networkTestService . TestDNSAsync ( testDomain , configDns , 53 ) ;
203
+ }
204
+ if ( address . Length == 0 )
205
+ throw new Exception ( "Parsing failed. Return empty ip address." ) ;
206
+
207
+ DNSTestDelay = delayMs + "ms " ;
208
+ DNSTestResult = string . Empty + address . FirstOrDefault ( ) ;
209
+ }
210
+ catch ( Exception ex )
211
+ {
212
+ Log . Error ( nameof ( AcceleratorPageViewModel ) , ex . ToString ( ) ) ;
213
+ DNSTestDelay = string . Empty ;
214
+ DNSTestResult = "error" ;
215
+ }
216
+ }
201
217
}
0 commit comments