naia_client/
events.rs

1use std::{collections::HashMap, marker::PhantomData, mem, net::SocketAddr, vec::IntoIter};
2
3use naia_shared::{
4    Channel, ChannelKind, ComponentKind, EntityEvent, EntityResponseEvent, GlobalResponseId,
5    Message, MessageContainer, MessageKind, Replicate, Request, ResponseSendKey, Tick,
6};
7
8use crate::NaiaClientError;
9
10pub struct Events<E: Copy> {
11    connections: Vec<SocketAddr>,
12    rejections: Vec<SocketAddr>,
13    disconnections: Vec<SocketAddr>,
14    client_ticks: Vec<Tick>,
15    server_ticks: Vec<Tick>,
16    errors: Vec<NaiaClientError>,
17    messages: HashMap<ChannelKind, HashMap<MessageKind, Vec<MessageContainer>>>,
18    requests: HashMap<ChannelKind, HashMap<MessageKind, Vec<(GlobalResponseId, MessageContainer)>>>,
19    spawns: Vec<E>,
20    despawns: Vec<E>,
21    publishes: Vec<E>,
22    unpublishes: Vec<E>,
23    auth_grants: Vec<E>,
24    auth_denies: Vec<E>,
25    auth_resets: Vec<E>,
26    inserts: HashMap<ComponentKind, Vec<E>>,
27    removes: HashMap<ComponentKind, Vec<(E, Box<dyn Replicate>)>>,
28    updates: HashMap<ComponentKind, Vec<(Tick, E)>>,
29    empty: bool,
30}
31
32impl<E: Copy> Default for Events<E> {
33    fn default() -> Self {
34        Events::new()
35    }
36}
37
38impl<E: Copy> Events<E> {
39    pub(crate) fn new() -> Self {
40        Self {
41            connections: Vec::new(),
42            rejections: Vec::new(),
43            disconnections: Vec::new(),
44            client_ticks: Vec::new(),
45            server_ticks: Vec::new(),
46            errors: Vec::new(),
47            messages: HashMap::new(),
48            requests: HashMap::new(),
49            spawns: Vec::new(),
50            despawns: Vec::new(),
51            publishes: Vec::new(),
52            unpublishes: Vec::new(),
53            auth_grants: Vec::new(),
54            auth_denies: Vec::new(),
55            auth_resets: Vec::new(),
56            inserts: HashMap::new(),
57            removes: HashMap::new(),
58            updates: HashMap::new(),
59            empty: true,
60        }
61    }
62
63    pub fn is_empty(&self) -> bool {
64        self.empty
65    }
66
67    pub fn read<V: Event<E>>(&mut self) -> V::Iter {
68        return V::iter(self);
69    }
70
71    pub fn has<V: Event<E>>(&self) -> bool {
72        return V::has(self);
73    }
74
75    // This method is exposed for adapter crates ... prefer using Events.read::<SomeEvent>() instead.
76    pub fn has_messages(&self) -> bool {
77        !self.messages.is_empty()
78    }
79    pub fn take_messages(
80        &mut self,
81    ) -> HashMap<ChannelKind, HashMap<MessageKind, Vec<MessageContainer>>> {
82        mem::take(&mut self.messages)
83    }
84
85    // This method is exposed for adapter crates ... prefer using Events.read::<SomeEvent>() instead.
86    pub fn has_requests(&self) -> bool {
87        !self.requests.is_empty()
88    }
89    pub fn take_requests(
90        &mut self,
91    ) -> HashMap<ChannelKind, HashMap<MessageKind, Vec<(GlobalResponseId, MessageContainer)>>> {
92        mem::take(&mut self.requests)
93    }
94
95    // These methods are exposed for adapter crates ... prefer using Events.read::<SomeEvent>() instead.
96    pub fn has_inserts(&self) -> bool {
97        !self.inserts.is_empty()
98    }
99    pub fn take_inserts(&mut self) -> Option<HashMap<ComponentKind, Vec<E>>> {
100        if self.inserts.is_empty() {
101            return None;
102        } else {
103            return Some(mem::take(&mut self.inserts));
104        }
105    }
106
107    // These methods are exposed for adapter crates ... prefer using Events.read::<SomeEvent>() instead.
108    pub fn has_updates(&self) -> bool {
109        !self.updates.is_empty()
110    }
111    pub fn take_updates(&mut self) -> Option<HashMap<ComponentKind, Vec<(Tick, E)>>> {
112        if self.updates.is_empty() {
113            return None;
114        } else {
115            return Some(mem::take(&mut self.updates));
116        }
117    }
118
119    // These method are exposed for adapter crates ... prefer using Events.read::<SomeEvent>() instead.
120    pub fn has_removes(&self) -> bool {
121        !self.removes.is_empty()
122    }
123    pub fn take_removes(&mut self) -> Option<HashMap<ComponentKind, Vec<(E, Box<dyn Replicate>)>>> {
124        if self.removes.is_empty() {
125            return None;
126        } else {
127            return Some(mem::take(&mut self.removes));
128        }
129    }
130
131    // Crate-public
132
133    pub(crate) fn push_connection(&mut self, socket_addr: &SocketAddr) {
134        self.connections.push(*socket_addr);
135        self.empty = false;
136    }
137
138    pub(crate) fn push_rejection(&mut self, socket_addr: &SocketAddr) {
139        self.rejections.push(*socket_addr);
140        self.empty = false;
141    }
142
143    pub(crate) fn push_disconnection(&mut self, socket_addr: &SocketAddr) {
144        self.disconnections.push(*socket_addr);
145        self.empty = false;
146    }
147
148    pub(crate) fn push_message(&mut self, channel_kind: &ChannelKind, message: MessageContainer) {
149        if !self.messages.contains_key(&channel_kind) {
150            self.messages.insert(*channel_kind, HashMap::new());
151        }
152        let channel_map = self.messages.get_mut(&channel_kind).unwrap();
153
154        let message_kind: MessageKind = message.kind();
155        if !channel_map.contains_key(&message_kind) {
156            channel_map.insert(message_kind, Vec::new());
157        }
158        let list = channel_map.get_mut(&message_kind).unwrap();
159        list.push(message);
160        self.empty = false;
161    }
162
163    pub(crate) fn push_request(
164        &mut self,
165        channel_kind: &ChannelKind,
166        global_response_id: GlobalResponseId,
167        request: MessageContainer,
168    ) {
169        if !self.requests.contains_key(&channel_kind) {
170            self.requests.insert(*channel_kind, HashMap::new());
171        }
172        let channel_map = self.requests.get_mut(&channel_kind).unwrap();
173
174        let message_kind: MessageKind = request.kind();
175        if !channel_map.contains_key(&message_kind) {
176            channel_map.insert(message_kind, Vec::new());
177        }
178        let list = channel_map.get_mut(&message_kind).unwrap();
179        list.push((global_response_id, request));
180
181        self.empty = false;
182    }
183
184    pub(crate) fn push_client_tick(&mut self, tick: Tick) {
185        self.client_ticks.push(tick);
186        self.empty = false;
187    }
188
189    pub(crate) fn push_server_tick(&mut self, tick: Tick) {
190        self.server_ticks.push(tick);
191        self.empty = false;
192    }
193
194    pub(crate) fn push_error(&mut self, error: NaiaClientError) {
195        self.errors.push(error);
196        self.empty = false;
197    }
198
199    pub(crate) fn push_spawn(&mut self, entity: E) {
200        self.spawns.push(entity);
201        self.empty = false;
202    }
203
204    pub(crate) fn push_despawn(&mut self, entity: E) {
205        self.despawns.push(entity);
206        self.empty = false;
207    }
208
209    pub(crate) fn push_publish(&mut self, entity: E) {
210        self.publishes.push(entity);
211        self.empty = false;
212    }
213
214    pub(crate) fn push_unpublish(&mut self, entity: E) {
215        self.unpublishes.push(entity);
216        self.empty = false;
217    }
218
219    pub(crate) fn push_auth_grant(&mut self, entity: E) {
220        self.auth_grants.push(entity);
221        self.empty = false;
222    }
223
224    pub(crate) fn push_auth_deny(&mut self, entity: E) {
225        self.auth_denies.push(entity);
226        self.empty = false;
227    }
228
229    pub(crate) fn push_auth_reset(&mut self, entity: E) {
230        self.auth_resets.push(entity);
231        self.empty = false;
232    }
233
234    pub(crate) fn push_insert(&mut self, entity: E, component_kind: ComponentKind) {
235        if !self.inserts.contains_key(&component_kind) {
236            self.inserts.insert(component_kind, Vec::new());
237        }
238        let list = self.inserts.get_mut(&component_kind).unwrap();
239        list.push(entity);
240        self.empty = false;
241    }
242
243    pub(crate) fn push_update(&mut self, tick: Tick, entity: E, component_kind: ComponentKind) {
244        if !self.updates.contains_key(&component_kind) {
245            self.updates.insert(component_kind, Vec::new());
246        }
247        let list = self.updates.get_mut(&component_kind).unwrap();
248        list.push((tick, entity));
249        self.empty = false;
250    }
251
252    pub(crate) fn push_remove(&mut self, entity: E, component: Box<dyn Replicate>) {
253        let component_kind: ComponentKind = component.kind();
254        if !self.removes.contains_key(&component_kind) {
255            self.removes.insert(component_kind, Vec::new());
256        }
257        let list = self.removes.get_mut(&component_kind).unwrap();
258        list.push((entity, component));
259        self.empty = false;
260    }
261
262    pub(crate) fn receive_world_events(
263        &mut self,
264        entity_events: Vec<EntityEvent<E>>,
265    ) -> Vec<EntityResponseEvent<E>> {
266        let mut response_events = Vec::new();
267        for event in entity_events {
268            match event {
269                EntityEvent::SpawnEntity(entity) => {
270                    self.push_spawn(entity);
271                    response_events.push(EntityResponseEvent::SpawnEntity(entity));
272                }
273                EntityEvent::DespawnEntity(entity) => {
274                    self.push_despawn(entity);
275                    response_events.push(EntityResponseEvent::DespawnEntity(entity));
276                }
277                EntityEvent::InsertComponent(entity, component_kind) => {
278                    self.push_insert(entity, component_kind);
279                    response_events
280                        .push(EntityResponseEvent::InsertComponent(entity, component_kind));
281                }
282                EntityEvent::RemoveComponent(entity, component_box) => {
283                    let kind = component_box.kind();
284                    self.push_remove(entity, component_box);
285                    response_events.push(EntityResponseEvent::RemoveComponent(entity, kind));
286                }
287                EntityEvent::UpdateComponent(tick, entity, component_kind) => {
288                    self.push_update(tick, entity, component_kind);
289                }
290            }
291        }
292        response_events
293    }
294
295    pub(crate) fn clear(&mut self) {
296        self.connections.clear();
297        self.rejections.clear();
298        self.disconnections.clear();
299        self.client_ticks.clear();
300        self.server_ticks.clear();
301        self.errors.clear();
302        self.messages.clear();
303        self.requests.clear();
304        self.spawns.clear();
305        self.despawns.clear();
306        self.publishes.clear();
307        self.unpublishes.clear();
308        self.auth_grants.clear();
309        self.auth_denies.clear();
310        self.auth_resets.clear();
311        self.inserts.clear();
312        self.removes.clear();
313        self.updates.clear();
314        self.empty = true;
315    }
316}
317
318// Event Trait
319pub trait Event<E: Copy> {
320    type Iter;
321
322    fn iter(events: &mut Events<E>) -> Self::Iter;
323
324    fn has(events: &Events<E>) -> bool;
325}
326
327// ConnectEvent
328pub struct ConnectEvent;
329impl<E: Copy> Event<E> for ConnectEvent {
330    type Iter = IntoIter<SocketAddr>;
331
332    fn iter(events: &mut Events<E>) -> Self::Iter {
333        let list = std::mem::take(&mut events.connections);
334        return IntoIterator::into_iter(list);
335    }
336
337    fn has(events: &Events<E>) -> bool {
338        !events.connections.is_empty()
339    }
340}
341
342// RejectEvent
343pub struct RejectEvent;
344impl<E: Copy> Event<E> for RejectEvent {
345    type Iter = IntoIter<SocketAddr>;
346
347    fn iter(events: &mut Events<E>) -> Self::Iter {
348        let list = std::mem::take(&mut events.rejections);
349        return IntoIterator::into_iter(list);
350    }
351
352    fn has(events: &Events<E>) -> bool {
353        !events.rejections.is_empty()
354    }
355}
356
357// DisconnectEvent
358pub struct DisconnectEvent;
359impl<E: Copy> Event<E> for DisconnectEvent {
360    type Iter = IntoIter<SocketAddr>;
361
362    fn iter(events: &mut Events<E>) -> Self::Iter {
363        let list = std::mem::take(&mut events.disconnections);
364        return IntoIterator::into_iter(list);
365    }
366
367    fn has(events: &Events<E>) -> bool {
368        !events.disconnections.is_empty()
369    }
370}
371
372// Client Tick Event
373pub struct ClientTickEvent;
374impl<E: Copy> Event<E> for ClientTickEvent {
375    type Iter = IntoIter<Tick>;
376
377    fn iter(events: &mut Events<E>) -> Self::Iter {
378        let list = std::mem::take(&mut events.client_ticks);
379        return IntoIterator::into_iter(list);
380    }
381
382    fn has(events: &Events<E>) -> bool {
383        !events.client_ticks.is_empty()
384    }
385}
386
387// Server Tick Event
388pub struct ServerTickEvent;
389impl<E: Copy> Event<E> for ServerTickEvent {
390    type Iter = IntoIter<Tick>;
391
392    fn iter(events: &mut Events<E>) -> Self::Iter {
393        let list = std::mem::take(&mut events.server_ticks);
394        return IntoIterator::into_iter(list);
395    }
396
397    fn has(events: &Events<E>) -> bool {
398        !events.server_ticks.is_empty()
399    }
400}
401
402// Error Event
403pub struct ErrorEvent;
404impl<E: Copy> Event<E> for ErrorEvent {
405    type Iter = IntoIter<NaiaClientError>;
406
407    fn iter(events: &mut Events<E>) -> Self::Iter {
408        let list = std::mem::take(&mut events.errors);
409        return IntoIterator::into_iter(list);
410    }
411
412    fn has(events: &Events<E>) -> bool {
413        !events.errors.is_empty()
414    }
415}
416
417// Message Event
418pub struct MessageEvent<C: Channel, M: Message> {
419    phantom_c: PhantomData<C>,
420    phantom_m: PhantomData<M>,
421}
422impl<E: Copy, C: Channel, M: Message> Event<E> for MessageEvent<C, M> {
423    type Iter = IntoIter<M>;
424
425    fn iter(events: &mut Events<E>) -> Self::Iter {
426        let channel_kind: ChannelKind = ChannelKind::of::<C>();
427        if let Some(channel_map) = events.messages.get_mut(&channel_kind) {
428            let message_kind: MessageKind = MessageKind::of::<M>();
429            if let Some(boxed_list) = channel_map.remove(&message_kind) {
430                let mut output_list: Vec<M> = Vec::new();
431
432                for boxed_message in boxed_list {
433                    let boxed_any = boxed_message.to_boxed_any();
434                    let message = boxed_any.downcast::<M>().unwrap();
435                    output_list.push(*message);
436                }
437
438                return IntoIterator::into_iter(output_list);
439            }
440        }
441        return IntoIterator::into_iter(Vec::new());
442    }
443
444    fn has(events: &Events<E>) -> bool {
445        let channel_kind: ChannelKind = ChannelKind::of::<C>();
446        if let Some(channel_map) = events.messages.get(&channel_kind) {
447            let message_kind: MessageKind = MessageKind::of::<M>();
448            return channel_map.contains_key(&message_kind);
449        }
450        return false;
451    }
452}
453
454// Request Event
455pub struct RequestEvent<C: Channel, Q: Request> {
456    phantom_c: PhantomData<C>,
457    phantom_m: PhantomData<Q>,
458}
459impl<E: Copy, C: Channel, Q: Request> Event<E> for RequestEvent<C, Q> {
460    type Iter = IntoIter<(ResponseSendKey<Q::Response>, Q)>;
461
462    fn iter(events: &mut Events<E>) -> Self::Iter {
463        let channel_kind: ChannelKind = ChannelKind::of::<C>();
464        let Some(channel_map) = events.requests.get_mut(&channel_kind) else {
465            return IntoIterator::into_iter(Vec::new());
466        };
467        let message_kind: MessageKind = MessageKind::of::<Q>();
468        let Some(requests) = channel_map.remove(&message_kind) else {
469            return IntoIterator::into_iter(Vec::new());
470        };
471        let mut output_list = Vec::new();
472
473        for (global_response_id, boxed_request) in requests {
474            let boxed_any = boxed_request.to_boxed_any();
475            let request = boxed_any.downcast::<Q>().unwrap();
476            let response_send_key = ResponseSendKey::<Q::Response>::new(global_response_id);
477            output_list.push((response_send_key, *request));
478        }
479
480        return IntoIterator::into_iter(output_list);
481    }
482
483    fn has(events: &Events<E>) -> bool {
484        let channel_kind: ChannelKind = ChannelKind::of::<C>();
485        if let Some(channel_map) = events.requests.get(&channel_kind) {
486            let message_kind: MessageKind = MessageKind::of::<Q>();
487            return channel_map.contains_key(&message_kind);
488        }
489        return false;
490    }
491}
492
493// Spawn Entity Event
494pub struct SpawnEntityEvent;
495impl<E: Copy> Event<E> for SpawnEntityEvent {
496    type Iter = IntoIter<E>;
497
498    fn iter(events: &mut Events<E>) -> Self::Iter {
499        let list = std::mem::take(&mut events.spawns);
500        return IntoIterator::into_iter(list);
501    }
502
503    fn has(events: &Events<E>) -> bool {
504        !events.spawns.is_empty()
505    }
506}
507
508// Despawn Entity Event
509pub struct DespawnEntityEvent;
510impl<E: Copy> Event<E> for DespawnEntityEvent {
511    type Iter = IntoIter<E>;
512
513    fn iter(events: &mut Events<E>) -> Self::Iter {
514        let list = std::mem::take(&mut events.despawns);
515        return IntoIterator::into_iter(list);
516    }
517
518    fn has(events: &Events<E>) -> bool {
519        !events.despawns.is_empty()
520    }
521}
522
523// Publish Entity Event
524pub struct PublishEntityEvent;
525impl<E: Copy> Event<E> for PublishEntityEvent {
526    type Iter = IntoIter<E>;
527
528    fn iter(events: &mut Events<E>) -> Self::Iter {
529        let list = std::mem::take(&mut events.publishes);
530        return IntoIterator::into_iter(list);
531    }
532
533    fn has(events: &Events<E>) -> bool {
534        !events.publishes.is_empty()
535    }
536}
537
538// Unpublish Entity Event
539pub struct UnpublishEntityEvent;
540impl<E: Copy> Event<E> for UnpublishEntityEvent {
541    type Iter = IntoIter<E>;
542
543    fn iter(events: &mut Events<E>) -> Self::Iter {
544        let list = std::mem::take(&mut events.unpublishes);
545        return IntoIterator::into_iter(list);
546    }
547
548    fn has(events: &Events<E>) -> bool {
549        !events.unpublishes.is_empty()
550    }
551}
552
553// Auth Grant Entity Event
554pub struct EntityAuthGrantedEvent;
555impl<E: Copy> Event<E> for EntityAuthGrantedEvent {
556    type Iter = IntoIter<E>;
557
558    fn iter(events: &mut Events<E>) -> Self::Iter {
559        let list = std::mem::take(&mut events.auth_grants);
560        return IntoIterator::into_iter(list);
561    }
562
563    fn has(events: &Events<E>) -> bool {
564        !events.auth_grants.is_empty()
565    }
566}
567
568// Auth Reset Entity Event
569pub struct EntityAuthResetEvent;
570impl<E: Copy> Event<E> for EntityAuthResetEvent {
571    type Iter = IntoIter<E>;
572
573    fn iter(events: &mut Events<E>) -> Self::Iter {
574        let list = std::mem::take(&mut events.auth_resets);
575        return IntoIterator::into_iter(list);
576    }
577
578    fn has(events: &Events<E>) -> bool {
579        !events.auth_resets.is_empty()
580    }
581}
582
583// Auth Deny Entity Event
584pub struct EntityAuthDeniedEvent;
585impl<E: Copy> Event<E> for EntityAuthDeniedEvent {
586    type Iter = IntoIter<E>;
587
588    fn iter(events: &mut Events<E>) -> Self::Iter {
589        let list = std::mem::take(&mut events.auth_denies);
590        return IntoIterator::into_iter(list);
591    }
592
593    fn has(events: &Events<E>) -> bool {
594        !events.auth_denies.is_empty()
595    }
596}
597
598// Insert Component Event
599pub struct InsertComponentEvent<C: Replicate> {
600    phantom_c: PhantomData<C>,
601}
602impl<E: Copy, C: Replicate> Event<E> for InsertComponentEvent<C> {
603    type Iter = IntoIter<E>;
604
605    fn iter(events: &mut Events<E>) -> Self::Iter {
606        let component_kind: ComponentKind = ComponentKind::of::<C>();
607        if let Some(boxed_list) = events.inserts.remove(&component_kind) {
608            return IntoIterator::into_iter(boxed_list);
609        }
610
611        return IntoIterator::into_iter(Vec::new());
612    }
613
614    fn has(events: &Events<E>) -> bool {
615        let component_kind: ComponentKind = ComponentKind::of::<C>();
616        events.inserts.contains_key(&component_kind)
617    }
618}
619
620// Update Component Event
621pub struct UpdateComponentEvent<C: Replicate> {
622    phantom_c: PhantomData<C>,
623}
624impl<E: Copy, C: Replicate> Event<E> for UpdateComponentEvent<C> {
625    type Iter = IntoIter<(Tick, E)>;
626
627    fn iter(events: &mut Events<E>) -> Self::Iter {
628        let component_kind: ComponentKind = ComponentKind::of::<C>();
629        if let Some(boxed_list) = events.updates.remove(&component_kind) {
630            return IntoIterator::into_iter(boxed_list);
631        }
632
633        return IntoIterator::into_iter(Vec::new());
634    }
635
636    fn has(events: &Events<E>) -> bool {
637        let component_kind: ComponentKind = ComponentKind::of::<C>();
638        events.updates.contains_key(&component_kind)
639    }
640}
641
642// Remove Component Event
643pub struct RemoveComponentEvent<C: Replicate> {
644    phantom_c: PhantomData<C>,
645}
646impl<E: Copy, C: Replicate> Event<E> for RemoveComponentEvent<C> {
647    type Iter = IntoIter<(E, C)>;
648
649    fn iter(events: &mut Events<E>) -> Self::Iter {
650        let component_kind: ComponentKind = ComponentKind::of::<C>();
651        if let Some(boxed_list) = events.removes.remove(&component_kind) {
652            let mut output_list: Vec<(E, C)> = Vec::new();
653
654            for (entity, boxed_component) in boxed_list {
655                let boxed_any = boxed_component.to_boxed_any();
656                let component = boxed_any.downcast::<C>().unwrap();
657                output_list.push((entity, *component));
658            }
659
660            return IntoIterator::into_iter(output_list);
661        }
662
663        return IntoIterator::into_iter(Vec::new());
664    }
665
666    fn has(events: &Events<E>) -> bool {
667        let component_kind: ComponentKind = ComponentKind::of::<C>();
668        events.removes.contains_key(&component_kind)
669    }
670}