From 4b8a361b9a80b18ff77f669cd8eac35388dd03a7 Mon Sep 17 00:00:00 2001 From: ddidderr Date: Thu, 13 Nov 2025 20:42:05 +0100 Subject: [PATCH] wip --- crates/lanspread-peer/src/lib.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/lanspread-peer/src/lib.rs b/crates/lanspread-peer/src/lib.rs index ffaa9e7..2454c34 100644 --- a/crates/lanspread-peer/src/lib.rs +++ b/crates/lanspread-peer/src/lib.rs @@ -1158,12 +1158,14 @@ struct Ctx { game_dir: Arc>>, local_game_db: Arc>>, peer_game_db: Arc>, + local_peer_addr: Arc>>, } #[derive(Clone)] struct PeerCtx { game_dir: Arc>>, local_game_db: Arc>>, + local_peer_addr: Arc>>, } impl std::fmt::Debug for PeerCtx { @@ -1171,6 +1173,7 @@ impl std::fmt::Debug for PeerCtx { f.debug_struct("PeerCtx") .field("game_dir", &"...") .field("local_game_db", &"...") + .field("local_peer_addr", &"...") .finish() } } @@ -1190,11 +1193,13 @@ pub async fn run_peer( game_dir: Arc::new(RwLock::new(None)), local_game_db: Arc::new(RwLock::new(None)), peer_game_db: Arc::new(RwLock::new(PeerGameDB::new())), + local_peer_addr: Arc::new(RwLock::new(None)), }; let peer_ctx = PeerCtx { game_dir: ctx.game_dir.clone(), local_game_db: ctx.local_game_db.clone(), + local_peer_addr: ctx.local_peer_addr.clone(), }; // Start server component @@ -1212,8 +1217,14 @@ pub async fn run_peer( // Start peer discovery task let tx_notify_ui_discovery = tx_notify_ui.clone(); let peer_game_db_discovery = ctx.peer_game_db.clone(); + let local_peer_addr = ctx.local_peer_addr.clone(); tokio::spawn(async move { - run_peer_discovery(tx_notify_ui_discovery, peer_game_db_discovery).await; + run_peer_discovery( + tx_notify_ui_discovery, + peer_game_db_discovery, + local_peer_addr, + ) + .await; }); // Start ping service task @@ -1273,6 +1284,10 @@ async fn run_server_component( let advertise_ip = select_advertise_ip()?; let advertise_addr = SocketAddr::new(advertise_ip, server_addr.port()); log::info!("Advertising peer via mDNS from {advertise_addr}"); + { + let mut guard = ctx.local_peer_addr.write().await; + *guard = Some(advertise_addr); + } // Start mDNS advertising for peer discovery let peer_id = Uuid::now_v7().simple().to_string(); @@ -1680,6 +1695,7 @@ async fn handle_peer_stream( async fn run_peer_discovery( tx_notify_ui: UnboundedSender, peer_game_db: Arc>, + local_peer_addr: Arc>>, ) { log::info!("Starting peer discovery task"); @@ -1688,6 +1704,15 @@ async fn run_peer_discovery( match discovery_result { Ok(peer_addr) => { + let is_self = { + let guard = local_peer_addr.read().await; + guard.as_ref().is_some_and(|addr| *addr == peer_addr) + }; + if is_self { + log::trace!("Ignoring self advertisement at {peer_addr}"); + continue; + } + log::info!("Discovered peer at: {peer_addr}"); // Add peer to database