29 lines
908 B
Rust
29 lines
908 B
Rust
use anyhow::Result;
|
|
use common::log_error;
|
|
use tokio::net::TcpListener;
|
|
use tracing::{info_span, Instrument};
|
|
|
|
use crate::net::PlayerSession;
|
|
|
|
pub async fn listen(host: &str, port: u16) -> Result<()> {
|
|
let listener = TcpListener::bind(format!("{host}:{port}")).await?;
|
|
tracing::info!("Listening at {host}:{port}");
|
|
|
|
loop {
|
|
let Ok((client_socket, client_addr)) = listener.accept().await else {
|
|
continue;
|
|
};
|
|
|
|
let mut session = PlayerSession::new(client_socket);
|
|
tokio::spawn(
|
|
async move {
|
|
log_error!(
|
|
"Session from {client_addr} disconnected",
|
|
format!("An error occurred while processing session ({client_addr})"),
|
|
Box::pin(session.run()).await
|
|
);
|
|
}
|
|
.instrument(info_span!("session", addr = %client_addr)),
|
|
);
|
|
}
|
|
}
|