aboutsummaryrefslogtreecommitdiff
path: root/src/game/server.rs
blob: 1775bd16b70ba2e058bd2d8b91fec5bcb4a59618 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use super::{
    protocol::{Direction, Packet},
    Config,
};
use crate::State;
use anyhow::{bail, Result};
use glam::IVec2;
use log::{error, info};
use std::sync::Arc;
use tokio::{
    io::{AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter},
    net::{TcpListener, TcpStream},
    spawn,
};

pub async fn game_server(config: Config, state: Arc<State>) -> Result<()> {
    let listener = TcpListener::bind(config.bind).await?;
    info!("listening on {}", listener.local_addr()?);
    while let Ok((sock, addr)) = listener.accept().await {
        spawn(async move {
            info!("connected {addr}");
            if let Err(e) = handle_client(sock).await {
                error!("client error: {e}")
            }
            info!("disconnected {addr}");
        });
    }
    bail!("accept failure")
}

async fn handle_client(sock: TcpStream) -> Result<()> {
    let (rx, tx) = sock.into_split();
    let rx = BufReader::new(rx);
    let mut tx = BufWriter::new(tx);

    let mut lines = rx.lines();

    while let Some(line) = lines.next_line().await? {
        let packet = Packet::parse(&line)?;

        tx.write_all(packet.dump().as_bytes()).await?;
        tx.flush().await?;
    }

    Ok(())
}