wip
This commit is contained in:
@@ -1158,12 +1158,14 @@ struct Ctx {
|
|||||||
game_dir: Arc<RwLock<Option<String>>>,
|
game_dir: Arc<RwLock<Option<String>>>,
|
||||||
local_game_db: Arc<RwLock<Option<GameDB>>>,
|
local_game_db: Arc<RwLock<Option<GameDB>>>,
|
||||||
peer_game_db: Arc<RwLock<PeerGameDB>>,
|
peer_game_db: Arc<RwLock<PeerGameDB>>,
|
||||||
|
local_peer_addr: Arc<RwLock<Option<SocketAddr>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct PeerCtx {
|
struct PeerCtx {
|
||||||
game_dir: Arc<RwLock<Option<String>>>,
|
game_dir: Arc<RwLock<Option<String>>>,
|
||||||
local_game_db: Arc<RwLock<Option<GameDB>>>,
|
local_game_db: Arc<RwLock<Option<GameDB>>>,
|
||||||
|
local_peer_addr: Arc<RwLock<Option<SocketAddr>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Debug for PeerCtx {
|
impl std::fmt::Debug for PeerCtx {
|
||||||
@@ -1171,6 +1173,7 @@ impl std::fmt::Debug for PeerCtx {
|
|||||||
f.debug_struct("PeerCtx")
|
f.debug_struct("PeerCtx")
|
||||||
.field("game_dir", &"...")
|
.field("game_dir", &"...")
|
||||||
.field("local_game_db", &"...")
|
.field("local_game_db", &"...")
|
||||||
|
.field("local_peer_addr", &"...")
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1190,11 +1193,13 @@ pub async fn run_peer(
|
|||||||
game_dir: Arc::new(RwLock::new(None)),
|
game_dir: Arc::new(RwLock::new(None)),
|
||||||
local_game_db: Arc::new(RwLock::new(None)),
|
local_game_db: Arc::new(RwLock::new(None)),
|
||||||
peer_game_db: Arc::new(RwLock::new(PeerGameDB::new())),
|
peer_game_db: Arc::new(RwLock::new(PeerGameDB::new())),
|
||||||
|
local_peer_addr: Arc::new(RwLock::new(None)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let peer_ctx = PeerCtx {
|
let peer_ctx = PeerCtx {
|
||||||
game_dir: ctx.game_dir.clone(),
|
game_dir: ctx.game_dir.clone(),
|
||||||
local_game_db: ctx.local_game_db.clone(),
|
local_game_db: ctx.local_game_db.clone(),
|
||||||
|
local_peer_addr: ctx.local_peer_addr.clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Start server component
|
// Start server component
|
||||||
@@ -1212,8 +1217,14 @@ pub async fn run_peer(
|
|||||||
// Start peer discovery task
|
// Start peer discovery task
|
||||||
let tx_notify_ui_discovery = tx_notify_ui.clone();
|
let tx_notify_ui_discovery = tx_notify_ui.clone();
|
||||||
let peer_game_db_discovery = ctx.peer_game_db.clone();
|
let peer_game_db_discovery = ctx.peer_game_db.clone();
|
||||||
|
let local_peer_addr = ctx.local_peer_addr.clone();
|
||||||
tokio::spawn(async move {
|
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
|
// Start ping service task
|
||||||
@@ -1273,6 +1284,10 @@ async fn run_server_component(
|
|||||||
let advertise_ip = select_advertise_ip()?;
|
let advertise_ip = select_advertise_ip()?;
|
||||||
let advertise_addr = SocketAddr::new(advertise_ip, server_addr.port());
|
let advertise_addr = SocketAddr::new(advertise_ip, server_addr.port());
|
||||||
log::info!("Advertising peer via mDNS from {advertise_addr}");
|
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
|
// Start mDNS advertising for peer discovery
|
||||||
let peer_id = Uuid::now_v7().simple().to_string();
|
let peer_id = Uuid::now_v7().simple().to_string();
|
||||||
@@ -1680,6 +1695,7 @@ async fn handle_peer_stream(
|
|||||||
async fn run_peer_discovery(
|
async fn run_peer_discovery(
|
||||||
tx_notify_ui: UnboundedSender<PeerEvent>,
|
tx_notify_ui: UnboundedSender<PeerEvent>,
|
||||||
peer_game_db: Arc<RwLock<PeerGameDB>>,
|
peer_game_db: Arc<RwLock<PeerGameDB>>,
|
||||||
|
local_peer_addr: Arc<RwLock<Option<SocketAddr>>>,
|
||||||
) {
|
) {
|
||||||
log::info!("Starting peer discovery task");
|
log::info!("Starting peer discovery task");
|
||||||
|
|
||||||
@@ -1688,6 +1704,15 @@ async fn run_peer_discovery(
|
|||||||
|
|
||||||
match discovery_result {
|
match discovery_result {
|
||||||
Ok(peer_addr) => {
|
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}");
|
log::info!("Discovered peer at: {peer_addr}");
|
||||||
|
|
||||||
// Add peer to database
|
// Add peer to database
|
||||||
|
|||||||
Reference in New Issue
Block a user