M client/src/plugins/networking/systems/events/receive/mod.rs => client/src/plugins/networking/systems/events/receive/mod.rs +26 -2
@@ 28,6 28,8 @@ use crate::{
Global,
};
+use super::send::user::PubUserDetailsEvent;
+
pub fn connect_events(mut ev: EventReader<ConnectEvent>, client: Client) {
for _ in ev.iter() {
if let Ok(server_address) = client.server_address() {
@@ 58,6 60,7 @@ pub fn disconnect_events(mut ev: EventReader<DisconnectEvent>) {
pub fn message_events(
mut commands: Commands,
mut ev: EventReader<MessageEvents>,
+ mut pud_ev_w: EventWriter<PubUserDetailsEvent>,
mut global: ResMut<Global>,
mut cfg_user: ResMut<CfgUser>,
mut connect_data: ResMut<ConnectScreenData>,
@@ 93,12 96,33 @@ pub fn message_events(
}
DataRequestType::GameAllForming => {
// TODO: handle possible error
- play_data.all_forming = response.games.unwrap();
+ let all_forming = response.games.unwrap();
+
+ for game in &all_forming {
+ pud_ev_w.send(PubUserDetailsEvent {
+ id: game.host_id.clone(),
+ });
+ }
+
+ play_data.all_forming = all_forming;
play_data.waiting_for_all_forming = false;
}
DataRequestType::GameMyGames => {
// TODO: handle possible error
- play_data.my_games = response.games.unwrap();
+ let my_games = response.games.unwrap();
+
+ for game in &my_games {
+ pud_ev_w.send(PubUserDetailsEvent {
+ id: game.host_id.clone(),
+ });
+ if let Some(guest_id) = &game.guest_id {
+ pud_ev_w.send(PubUserDetailsEvent {
+ id: guest_id.clone(),
+ });
+ }
+ }
+
+ play_data.my_games = my_games;
play_data.waiting_for_my_games = false;
}
DataRequestType::PubUserDetails => {
M client/src/plugins/networking/systems/events/send/user.rs => client/src/plugins/networking/systems/events/send/user.rs +48 -11
@@ 6,21 6,58 @@
* See LICENSE for licensing information.
*/
-use bevy::prelude::EventReader;
-use laurelin_shared::server::{
- channels::DataRequestChannel,
- messages::{DataRequest, DataRequestType},
+use bevy::prelude::{EventReader, ResMut};
+use laurelin_shared::{
+ server::{
+ channels::DataRequestChannel,
+ messages::{DataRequest, DataRequestType},
+ },
+ types::user::UserPub,
};
use naia_bevy_client::Client;
-use super::data_request;
+use crate::Global;
pub struct PubUserDetailsEvent {
pub id: String,
}
-data_request!(
- pub_user_details_event,
- PubUserDetailsEvent,
- DataRequestType::PubUserDetails,
- |ev| Some(ev.id.clone())
-);
+
+pub fn pub_user_details_event(
+ mut ev: EventReader<PubUserDetailsEvent>,
+ mut client: Client,
+ mut global: ResMut<Global>,
+) {
+ for ev in ev.iter() {
+ // check if already in cache OR in cache queue
+ if !global
+ .users_cache
+ .iter()
+ .filter(|&u| u.id == ev.id)
+ .cloned()
+ .collect::<Vec<UserPub>>()
+ .is_empty()
+ {
+ return;
+ }
+
+ if !global
+ .users_cache_queue
+ .iter()
+ .filter(|&id| id == &ev.id)
+ .cloned()
+ .collect::<Vec<String>>()
+ .is_empty()
+ {
+ return;
+ }
+
+ // add to cache queue
+ global.users_cache_queue.push(ev.id.clone());
+
+ // send request
+ client.send_message::<DataRequestChannel, DataRequest>(&DataRequest::new(
+ DataRequestType::PubUserDetails as u8,
+ Some(ev.id.clone()),
+ ));
+ }
+}