This commit is contained in:
2025-11-13 20:42:05 +01:00
parent 651e3db988
commit 4b8a361b9a
+26 -1
View File
@@ -1158,12 +1158,14 @@ struct Ctx {
game_dir: Arc<RwLock<Option<String>>>,
local_game_db: Arc<RwLock<Option<GameDB>>>,
peer_game_db: Arc<RwLock<PeerGameDB>>,
local_peer_addr: Arc<RwLock<Option<SocketAddr>>>,
}
#[derive(Clone)]
struct PeerCtx {
game_dir: Arc<RwLock<Option<String>>>,
local_game_db: Arc<RwLock<Option<GameDB>>>,
local_peer_addr: Arc<RwLock<Option<SocketAddr>>>,
}
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<PeerEvent>,
peer_game_db: Arc<RwLock<PeerGameDB>>,
local_peer_addr: Arc<RwLock<Option<SocketAddr>>>,
) {
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