servers/src/main.rs

90 lines
2.5 KiB
Rust

use clap::Parser;
use cli::Cli;
use servers::{
plugins::loader,
tcp::{handle_connection, handle_websocket, Client},
};
use tokio::net::TcpListener;
use tracing::{error, info};
mod cli;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// init better panic
better_panic::install();
// init logger
tracing_subscriber::fmt().init();
// parse cli args
let args = Cli::parse();
// if enabled start WebSocket server
if !args.ws_disable {
tokio::spawn(start_ws_server(
args.host.clone(),
args.ws_port,
args.port.clone(),
));
}
// start tcp server
start_tcp_server(&args.host, &args.port).await?;
Ok(())
}
/// Start tcp server
async fn start_tcp_server(host: &str, port: &str) -> anyhow::Result<()> {
// listen Tcp server
let listener = TcpListener::bind(format!("{host}:{port}")).await?;
info!("Tcp server started at: {}", listener.local_addr()?);
// load plugins, commands and events
let plugin_manager = loader()?;
// Accepts a new incoming connection from this listener.
while let Ok((stream, _address)) = listener.accept().await {
let client = Client::new(stream);
let plugin_manager = plugin_manager.clone();
// handle client connection in new thread
tokio::spawn(async move {
let ip = client.stream.peer_addr().unwrap();
match handle_connection(client, plugin_manager).await {
Ok(_) => (),
Err(err) => error!("Client {}, {}", ip, err),
}
});
}
// server for a unexpectedly reason be terminated
panic!("TCP server unexpectedly terminated!")
}
/// Start WebSocket server
async fn start_ws_server(host: String, port: String, tcp_port: String) -> anyhow::Result<()> {
// listen Tcp server
let listener = tokio::net::TcpListener::bind(format!("{host}:{port}")).await?;
info!("WebSocket server started at: {}", listener.local_addr()?);
// Accepts a new incoming connection from this listener.
while let Ok((stream, _address)) = listener.accept().await {
let tcp_port = tcp_port.clone();
tokio::spawn(async {
let ip = stream.peer_addr().unwrap();
match handle_websocket(stream, tcp_port).await {
Ok(_) => (),
Err(err) => error!("Client {}, {}", ip, err),
}
});
}
// server for a unexpectedly reason be terminated
panic!("WebSocket server unexpectedly terminated!")
}