veloren_server/sys/msg/
mod.rs

1pub mod character_screen;
2pub mod general;
3pub mod gizmos;
4pub mod in_game;
5pub mod network_events;
6pub mod ping;
7pub mod register;
8pub mod terrain;
9
10use crate::{
11    client::Client,
12    sys::{loot, pets},
13};
14use common_ecs::{System, dispatch};
15use serde::de::DeserializeOwned;
16use specs::DispatcherBuilder;
17
18pub fn add_server_systems(dispatch_builder: &mut DispatcherBuilder) {
19    //run ping after general, as its super fast anyway. also don't get duplicate
20    // disconnect then.
21    dispatch::<gizmos::Sys>(dispatch_builder, &[]);
22    dispatch::<character_screen::Sys>(dispatch_builder, &[]);
23    dispatch::<general::Sys>(dispatch_builder, &[]);
24    dispatch::<in_game::Sys>(dispatch_builder, &[]);
25    dispatch::<ping::Sys>(dispatch_builder, &[&general::Sys::sys_name()]);
26    dispatch::<register::Sys>(dispatch_builder, &[]);
27    dispatch::<terrain::Sys>(dispatch_builder, &[]);
28    dispatch::<pets::Sys>(dispatch_builder, &[]);
29    dispatch::<loot::Sys>(dispatch_builder, &[]);
30    dispatch::<network_events::Sys>(dispatch_builder, &[]);
31}
32
33/// handles all send msg and calls a handle fn
34/// Aborts when a error occurred returns cnt of successful msg otherwise
35pub(crate) fn try_recv_all<M, F>(
36    client: &mut Client,
37    stream_id: u8,
38    mut f: F,
39) -> Result<u64, crate::error::Error>
40where
41    M: DeserializeOwned,
42    F: FnMut(&Client, M) -> Result<(), crate::error::Error>,
43{
44    let mut cnt = 0u64;
45    loop {
46        let msg = match client.recv(stream_id) {
47            Ok(Some(msg)) => msg,
48            Ok(None) => break Ok(cnt),
49            Err(e) => break Err(e.into()),
50        };
51        if let Err(e) = f(client, msg) {
52            break Err(e);
53        }
54        cnt += 1;
55    }
56}