]> git.lizzy.rs Git - dragonblocks-rs.git/blob - src/server.rs
Create LICENSE
[dragonblocks-rs.git] / src / server.rs
1 pub mod pkts;
2 mod remote_client;
3
4 use crate::quit::Quit;
5 use connect::{tcp::TcpListener, StreamExt};
6 use log::*;
7 use remote_client::Client;
8 use std::{
9     collections::HashMap,
10     sync::{Arc, RwLock},
11 };
12
13 #[derive(Debug)]
14 pub struct ServerData {
15     players: RwLock<HashMap<String, Arc<Client>>>,
16 }
17
18 pub struct Server {
19     listener: TcpListener,
20     data: Arc<ServerData>,
21     quit: Quit,
22 }
23
24 impl Server {
25     pub async fn new(addr: &str, quit: Quit) -> Self {
26         Self {
27             quit,
28             listener: TcpListener::bind(addr).await.unwrap(),
29             data: Arc::new(ServerData {
30                 players: RwLock::new(HashMap::new()),
31             }),
32         }
33     }
34
35     pub async fn run(mut self) {
36         let mut quit = self.quit.subscribe();
37
38         loop {
39             tokio::select! {
40                 conn = self.listener.next() => Client::create(
41                         conn.expect("listener interrupted"),
42                         Arc::downgrade(&self.data),
43                         self.quit.clone()
44                     ).await,
45                 _ = quit.recv() => {
46                     trace!("quit signal received");
47                     break;
48                 },
49                 else => unreachable!("quit channel broke"),
50             }
51         }
52
53         info!("stopped server");
54     }
55 }