use super::router::{IncomingMessages, OutgoingMessages};
use crate::protocol::Protocol;
use bevy::{ecs::system::SystemParam, prelude::*};
use bevy_matchbox::prelude::PeerId;
#[derive(SystemParam, Debug)]
pub struct RtcServer<'w, M: Protocol> {
pub(crate) incoming: Option<ResMut<'w, IncomingMessages<M>>>,
pub(crate) outgoing: Option<ResMut<'w, OutgoingMessages<M>>>,
}
impl<'w, M: Protocol> RtcServer<'w, M> {
pub fn capacity(&self) -> usize {
self.incoming.as_ref().map(|v| v.bound).unwrap_or(0)
}
pub fn len(&self) -> usize {
self.incoming
.as_ref()
.map(|v| v.messages.len())
.unwrap_or(0)
}
pub fn is_empty(&self) -> bool {
self.incoming
.as_ref()
.map(|v| v.messages.is_empty())
.unwrap_or(true)
}
pub fn clear(&mut self) {
if let Some(ref mut incoming) = self.incoming {
incoming.messages.clear()
}
}
pub fn read(&mut self) -> Vec<(PeerId, M)> {
if let Some(ref mut incoming) = self.incoming {
incoming
.messages
.drain()
.fold(vec![], |mut v, (peer, payloads)| {
v.extend(payloads.into_iter().map(|p| (peer, p)));
v
})
} else {
panic!(
"Attempting to read from `{}` is not allowed, it is registered write only.",
M::reflect_name()
);
}
}
pub fn reliable_to_all(&mut self, message: M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.reliable_to_all.push(message);
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn unreliable_to_all(&mut self, message: M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.reliable_to_all.push(message);
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn reliable_to_peer(&mut self, peer_id: PeerId, message: M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.reliable_to_peer.push((peer_id, message));
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn unreliable_to_peer(&mut self, peer_id: PeerId, message: M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.unreliable_to_peer.push((peer_id, message));
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn reliable_to_all_except(&mut self, peer_id: PeerId, message: M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.reliable_to_all_except.push((peer_id, message));
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn unreliable_to_all_except(&mut self, peer_id: PeerId, message: M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.unreliable_to_all_except.push((peer_id, message));
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn reliable_to_all_with(&mut self, message_fn: impl Fn() -> M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.reliable_to_all.push(message_fn());
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn unreliable_to_all_with(&mut self, message_fn: impl Fn() -> M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.unreliable_to_all.push(message_fn());
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn reliable_to_peer_with(&mut self, peer_id: PeerId, message_fn: impl Fn() -> M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.reliable_to_peer.push((peer_id, message_fn()));
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn unreliable_to_peer_with(&mut self, peer_id: PeerId, message_fn: impl Fn() -> M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing.unreliable_to_peer.push((peer_id, message_fn()));
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn reliable_to_all_except_with(&mut self, peer_id: PeerId, message_fn: impl Fn() -> M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing
.reliable_to_all_except
.push((peer_id, message_fn()));
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
pub fn unreliable_to_all_except_with(&mut self, peer_id: PeerId, message_fn: impl Fn() -> M) {
if let Some(ref mut outgoing) = self.outgoing {
outgoing
.unreliable_to_all_except
.push((peer_id, message_fn()));
} else {
panic!(
"Attempting to write `{}` is not allowed, it is registered read only.",
M::reflect_name()
);
}
}
}