wip
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user