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 } ;
@@ -18,6 +18,7 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6};
1818use std:: str:: FromStr ;
1919use std:: time:: { Duration , SystemTime } ;
2020use std:: thread;
21+ use crate :: easytier:: EasyTierMember ;
2122
2223static CHARS : & [ u8 ] = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ" . as_bytes ( ) ;
2324
@@ -146,7 +147,7 @@ pub fn start_host(room: Room, port: u16, player: Option<String>, capture: AppSta
146147 args. push ( Argument :: TcpWhitelist ( port) ) ;
147148 args. push ( Argument :: UdpWhitelist ( port) ) ;
148149
149- let easytier = easytier:: FACTORY . create ( args) ;
150+ let easytier = easytier:: create ( args) ;
150151 let capture = {
151152 let Some ( state) = capture. try_capture ( ) else {
152153 return ;
@@ -219,13 +220,13 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
219220 args. push ( Argument :: DHCP ) ;
220221 args. push ( Argument :: TcpWhitelist ( 0 ) ) ;
221222 args. push ( Argument :: UdpWhitelist ( 0 ) ) ;
222- let easytier = easytier:: FACTORY . create ( args) ;
223+ let easytier = easytier:: create ( args) ;
223224 let capture = {
224225 let Some ( state) = capture. try_capture ( ) else {
225226 return ;
226227 } ;
227228
228- state. set ( AppState :: GuestStarting { room, easytier } )
229+ state. set ( AppState :: GuestStarting { room, easytier, difficulty : ConnectionDifficulty :: Unknown } )
229230 } ;
230231
231232 let ( scaffolding_port, host_ip) = ' local_port: {
@@ -236,7 +237,7 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
236237 return ;
237238 } ;
238239 let mut state = state. into_slow ( ) ;
239- let AppState :: GuestStarting { easytier, .. } = state. as_mut_ref ( ) else {
240+ let AppState :: GuestStarting { easytier, difficulty , .. } = state. as_mut_ref ( ) else {
240241 unreachable ! ( ) ;
241242 } ;
242243 if !easytier. is_alive ( ) {
@@ -247,25 +248,46 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
247248 let Some ( players) = easytier. get_players ( ) else {
248249 continue ;
249250 } ;
250- for ( hostname, ip) in players {
251- if hostname. starts_with ( "scaffolding-mc-server-" ) && let Ok ( port) = u16:: from_str ( & hostname[ "scaffolding-mc-server-" . len ( ) ..] ) {
252- logging ! ( "RoomExperiment" , "Scaffolding Server is at {}:{}" , ip, port) ;
253-
254- let local_port = PortRequest :: Scaffolding . request ( ) ;
255-
256- if !easytier. add_port_forward ( & [ PortForward {
257- local : SocketAddrV4 :: new ( Ipv4Addr :: UNSPECIFIED , local_port) . into ( ) ,
258- remote : SocketAddrV4 :: new ( ip, port) . into ( ) ,
259- proto : Proto :: TCP ,
260- } ] ) {
261- logging ! ( "RoomExperiment" , "Cannot create a port-forward {} -> {} for Scaffolding Connection." , local_port, port) ;
262- state. set ( AppState :: Exception { kind : ExceptionType :: GuestEasytierCrash } ) ;
263- return ;
264- } ;
265251
266- break ' local_port ( local_port, ip) ;
252+ let Some ( local_nat) = players. iter ( ) . find_map ( |EasyTierMember { is_local, nat, ..} | {
253+ if * is_local {
254+ Some ( nat)
255+ } else {
256+ None
267257 }
268- }
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) ;
269291 }
270292
271293 logging ! ( "RoomExperiment" , "Cannot find scaffolding server." ) ;
@@ -303,10 +325,10 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
303325 }
304326 }
305327
306- let Some ( mut state) = capture. try_capture ( ) else {
328+ let Some ( state) = capture. try_capture ( ) else {
307329 return ;
308330 } ;
309- let AppState :: GuestStarting { easytier, .. } = state. as_mut_ref ( ) else {
331+ let AppState :: GuestStarting { easytier, .. } = state. as_ref ( ) else {
310332 unreachable ! ( ) ;
311333 } ;
312334 if !easytier. is_alive ( ) {
@@ -400,7 +422,7 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
400422 return ;
401423 } ;
402424 state. replace ( |state| {
403- let AppState :: GuestStarting { room, easytier } = state else {
425+ let AppState :: GuestStarting { room, easytier, .. } = state else {
404426 unreachable ! ( ) ;
405427 } ;
406428
0 commit comments