Handle all available messages

This commit is contained in:
Michael Bradley 2025-05-25 20:03:12 -04:00
parent ba7737671e
commit c005a4dbb9
Signed by: MichaelBradley
SSH key fingerprint: SHA256:o/aaeYtRubILK7OYYjYP12DmU7BsPUhKji1AgaQ+ge4

View file

@ -4,7 +4,7 @@ use std::{
};
use bevy::{prelude::*, tasks::futures_lite::io};
use crossbeam_channel::{Receiver, Sender, unbounded};
use crossbeam_channel::{Receiver, Sender, TrySendError, unbounded};
use crate::game::seed::Seed;
@ -68,8 +68,35 @@ fn setup_socket(port: u16) -> Result<(Sender<NetworkMessage>, Receiver<NetworkMe
#[derive(Resource)]
pub struct NetworkSend(Sender<NetworkMessage>);
#[derive(Resource)]
pub struct NetworkReceive(Receiver<NetworkMessage>);
impl NetworkSend {
/// Send the message, erroring if the queue is full or disconnected
pub fn send(
&self,
value: Vec<u8>,
address: SocketAddr,
) -> Result<(), TrySendError<NetworkMessage>> {
self.0.try_send((value, address))
}
}
#[derive(Resource, Clone)]
struct NetworkReceive(Receiver<NetworkMessage>);
impl NetworkReceive {
fn iter(&self) -> Iter {
Iter(self.0.clone())
}
}
struct Iter(Receiver<NetworkMessage>);
impl Iterator for Iter {
type Item = NetworkMessage;
fn next(&mut self) -> Option<Self::Item> {
self.0.try_recv().ok()
}
}
fn handle_network_io(
receive: Res<NetworkReceive>,
@ -77,14 +104,14 @@ fn handle_network_io(
seed: Option<Res<Seed>>,
mut commands: Commands,
) -> Result {
let Ok((message, address)) = receive.0.try_recv() else {
return Ok(());
};
if let Some(value) = seed {
send.0.try_send(((*value).into(), address))?;
for (message, address) in receive.iter() {
if let Some(ref value) = seed {
send.send((**value).into(), address)?;
} else {
commands.insert_resource::<Seed>(message.try_into()?);
}
}
Ok(())
}