geng_net_simple/
lib.rs

1use geng::net::{Message, Traffic};
2use geng::prelude::*;
3
4mod app;
5mod lobby;
6
7pub use app::run;
8pub use lobby::*;
9#[cfg(not(target_arch = "wasm32"))]
10pub mod server;
11#[cfg(not(target_arch = "wasm32"))]
12pub use server::*;
13
14pub trait Model: Diff + Message {
15    type PlayerId: Message + Clone;
16    type Message: Message;
17    type Event: Message + Clone;
18    const TICKS_PER_SECOND: f32;
19    fn new_player(&mut self, events: &mut Vec<Self::Event>) -> Self::PlayerId;
20    fn drop_player(&mut self, events: &mut Vec<Self::Event>, player_id: &Self::PlayerId);
21    fn handle_message(
22        &mut self,
23        events: &mut Vec<Self::Event>,
24        player_id: &Self::PlayerId,
25        message: Self::Message,
26    ) -> Vec<Self::Event>;
27    fn tick(&mut self, events: &mut Vec<Self::Event>);
28}
29
30#[derive(Serialize, Deserialize, Debug)]
31pub enum ServerMessage<T: Model> {
32    PlayerId(T::PlayerId),
33    Delta(#[serde(bound = "")] <T as Diff>::Delta),
34    Full(#[serde(bound = "")] T),
35    Events(Vec<T::Event>),
36}
37
38pub struct Remote<T: Model> {
39    connection: RefCell<geng::net::client::Connection<ServerMessage<T>, T::Message>>,
40    model: RefCell<T>,
41}
42
43impl<T: Model> Remote<T> {
44    pub fn update(&self) -> Vec<T::Event> {
45        let mut model = self.model.borrow_mut();
46        let mut events = Vec::new();
47        for message in self.connection.borrow_mut().new_messages() {
48            match message.unwrap() {
49                ServerMessage::Full(state) => *model = state,
50                ServerMessage::Delta(delta) => model.update(&delta),
51                ServerMessage::PlayerId(_) => unreachable!(),
52                ServerMessage::Events(e) => events.extend(e),
53            }
54        }
55        events
56    }
57    pub fn get(&self) -> Ref<T> {
58        self.model.borrow()
59    }
60    pub fn send(&self, message: T::Message) {
61        self.connection.borrow_mut().send(message);
62    }
63    pub fn traffic(&self) -> Traffic {
64        self.connection.borrow().traffic()
65    }
66}