11use crate :: controller:: experimental:: { MACHINE_ID , VENDOR } ;
22use crate :: controller:: rooms:: legacy;
33use crate :: controller:: states:: { AppState , AppStateCapture } ;
4- use crate :: controller:: { ExceptionType , Room , RoomKind , SCAFFOLDING_PORT } ;
4+ use crate :: controller:: { ConnectionDifficulty , ExceptionType , Room , RoomKind , SCAFFOLDING_PORT } ;
55use crate :: easytier;
66use crate :: easytier:: argument:: { Argument , PortForward , Proto } ;
77use crate :: easytier:: publics:: { fetch_public_nodes, PublicServers } ;
@@ -226,7 +226,7 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
226226 return ;
227227 } ;
228228
229- state. set ( AppState :: GuestStarting { room, easytier } )
229+ state. set ( AppState :: GuestStarting { room, easytier, difficulty : ConnectionDifficulty :: Unknown } )
230230 } ;
231231
232232 let ( scaffolding_port, host_ip) = ' local_port: {
@@ -237,7 +237,7 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
237237 return ;
238238 } ;
239239 let mut state = state. into_slow ( ) ;
240- let AppState :: GuestStarting { easytier, .. } = state. as_mut_ref ( ) else {
240+ let AppState :: GuestStarting { easytier, difficulty , .. } = state. as_mut_ref ( ) else {
241241 unreachable ! ( ) ;
242242 } ;
243243 if !easytier. is_alive ( ) {
@@ -248,25 +248,46 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
248248 let Some ( players) = easytier. get_players ( ) else {
249249 continue ;
250250 } ;
251- for EasyTierMember { hostname, address } in players {
252- if hostname. starts_with ( "scaffolding-mc-server-" ) && let Ok ( port) = u16:: from_str ( & hostname[ "scaffolding-mc-server-" . len ( ) ..] ) {
253- logging ! ( "RoomExperiment" , "Scaffolding Server is at {}:{}" , address, port) ;
254-
255- let local_port = PortRequest :: Scaffolding . request ( ) ;
256-
257- if !easytier. add_port_forward ( & [ PortForward {
258- local : SocketAddrV4 :: new ( Ipv4Addr :: UNSPECIFIED , local_port) . into ( ) ,
259- remote : SocketAddrV4 :: new ( address, port) . into ( ) ,
260- proto : Proto :: TCP ,
261- } ] ) {
262- logging ! ( "RoomExperiment" , "Cannot create a port-forward {} -> {} for Scaffolding Connection." , local_port, port) ;
263- state. set ( AppState :: Exception { kind : ExceptionType :: GuestEasytierCrash } ) ;
264- return ;
265- } ;
266251
267- break ' local_port ( local_port, address) ;
252+ let Some ( local_nat) = players. iter ( ) . find_map ( |EasyTierMember { is_local, nat, ..} | {
253+ if * is_local {
254+ Some ( nat)
255+ } else {
256+ None
268257 }
269- }
258+ } ) else {
259+ continue ;
260+ } ;
261+
262+ let Some ( ( server_address, server_port, server_nat) ) = players. iter ( ) . find_map ( |
263+ EasyTierMember { hostname, address, is_local, nat, .. }
264+ | {
265+ static PREFIX : & str = "scaffolding-mc-server-" ;
266+
267+ if let Some ( address) = address && !is_local && hostname. starts_with ( PREFIX ) && let Ok ( port) = u16:: from_str ( & hostname[ PREFIX . len ( ) ..] ) {
268+ Some ( ( address, port, nat) )
269+ } else {
270+ None
271+ }
272+ } ) else {
273+ continue ;
274+ } ;
275+
276+ logging ! ( "RoomExperiment" , "Scaffolding Server is at {}:{}" , server_address, server_port) ;
277+ let local_port = PortRequest :: Scaffolding . request ( ) ;
278+ if !easytier. add_port_forward ( & [ PortForward {
279+ local : SocketAddrV4 :: new ( Ipv4Addr :: UNSPECIFIED , local_port) . into ( ) ,
280+ remote : SocketAddrV4 :: new ( * server_address, server_port) . into ( ) ,
281+ proto : Proto :: TCP ,
282+ } ] ) {
283+ logging ! ( "RoomExperiment" , "Cannot create a port-forward {} -> {} for Scaffolding Connection." , local_port, server_port) ;
284+ state. set ( AppState :: Exception { kind : ExceptionType :: GuestEasytierCrash } ) ;
285+ return ;
286+ } ;
287+
288+ * difficulty = easytier:: calc_conn_difficulty ( local_nat, server_nat) ;
289+ logging ! ( "RoomExperiment" , "Current NAT status: {:?} -> {:?}, difficulty = {:?}" , local_nat, server_nat, difficulty) ;
290+ break ' local_port ( local_port, * server_address) ;
270291 }
271292
272293 logging ! ( "RoomExperiment" , "Cannot find scaffolding server." ) ;
@@ -401,7 +422,7 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
401422 return ;
402423 } ;
403424 state. replace ( |state| {
404- let AppState :: GuestStarting { room, easytier } = state else {
425+ let AppState :: GuestStarting { room, easytier, .. } = state else {
405426 unreachable ! ( ) ;
406427 } ;
407428
0 commit comments