beetmash_net/networking/
transport_plugin.rs1use crate::prelude::*;
2use bevy::prelude::*;
3use bevy::time::common_conditions::on_timer;
4use forky::prelude::ResultTEExt;
5use std::time::Duration;
6
7pub const DEFAULT_TRANSPORT_INTERVAL: Duration = Duration::from_millis(100);
8
9#[extend::ext(name=AppExtTransport)]
10pub impl App {
11 fn add_transport<T: 'static + Transport>(
18 &mut self,
19 transport: T,
20 ) -> &mut Self {
21 self.add_transport_with_duration(transport, DEFAULT_TRANSPORT_INTERVAL)
22 }
23 fn add_transport_with_duration<T: 'static + Transport>(
24 &mut self,
25 transport: T,
26 interval: Duration,
27 ) -> &mut Self {
28 self.insert_non_send_resource(transport).add_systems(
29 Update,
30 (
31 transport_incoming::<T>
32 .run_if(on_timer(interval))
33 .before(MessageIncomingSet),
34 transport_outgoing::<T>
35 .run_if(on_timer(interval))
36 .after(MessageOutgoingSet),
37 ),
38 );
39 self
40 }
41}
42
43pub(crate) fn transport_incoming<T: Transport>(
44 mut events: ResMut<MessageIncoming>,
45 mut transport: NonSendMut<T>,
46) {
47 if let Some(messages) = transport.recv().ok_or(|e| log::error!("foo {e}")) {
48 for message in messages {
49 events.push(message);
51 }
52 }
53}
54
55pub(crate) fn transport_outgoing<T: Transport>(
56 mut outgoing: ResMut<MessageOutgoing>,
57 mut transport: NonSendMut<T>,
58) {
59 if outgoing.is_empty() {
60 return;
61 }
62
63 let messages = outgoing.drain(..).collect();
64 transport.send(&messages).ok_or(|e| log::error!("{e}"));
65 }
79
80