servers/src/main.rs

89 lines
2.5 KiB
Rust
Raw Normal View History

2022-08-04 14:35:33 +00:00
mod cli;
2022-06-04 19:34:53 +00:00
use clap::Parser;
2022-06-17 11:43:23 +00:00
use servers::{
logger,
2022-06-17 11:43:23 +00:00
plugins::loader,
tcp::{handle_connection, handle_websocket, Client},
2022-06-17 11:43:23 +00:00
};
use tokio::net::TcpListener;
2022-07-29 10:12:13 +00:00
use tracing::{error, info};
2022-08-04 14:35:33 +00:00
use crate::cli::Cli;
2022-06-04 11:58:21 +00:00
#[tokio::main]
async fn main() -> anyhow::Result<()> {
logger::init();
// parse cli args
2022-07-29 10:12:13 +00:00
let args = Cli::parse();
2022-06-04 11:58:21 +00:00
// if enabled start WebSocket server
2022-08-04 14:35:33 +00:00
if args.ws_enable {
tokio::spawn(start_ws_server(
2022-07-29 10:12:13 +00:00
args.host.clone(),
args.ws_port,
args.port.clone(),
));
}
2022-06-04 19:34:53 +00:00
// start tcp server
start_tcp_server(args.host, args.port).await?;
2022-06-04 11:58:21 +00:00
Ok(())
}
2022-06-17 11:43:23 +00:00
/// Start tcp server
async fn start_tcp_server(host: String, port: String) -> anyhow::Result<()> {
2022-08-04 14:35:33 +00:00
// listen TCP server
let listener = TcpListener::bind(format!("{host}:{port}")).await?;
2022-06-17 11:43:23 +00:00
2022-08-04 14:35:33 +00:00
info!("TCP server started at: {}", listener.local_addr()?);
2022-06-17 11:43:23 +00:00
// load plugins, commands and events
let plugin_manager = loader()?;
2022-06-17 11:43:23 +00:00
// Accepts a new incoming connection from this listener.
while let Ok((stream, _address)) = listener.accept().await {
2022-06-17 11:43:23 +00:00
let client = Client::new(stream);
2022-06-26 10:59:48 +00:00
let plugin_manager = plugin_manager.clone();
2022-06-17 11:43:23 +00:00
// handle client connection in new thread
2022-06-26 10:59:48 +00:00
tokio::spawn(async move {
// get ip address of the client
2022-08-04 14:35:33 +00:00
let ip = client.peer_addr().expect("failed to get peer address");
if let Err(e) = handle_connection(client, plugin_manager).await {
error!("Client {ip}: {e}")
2022-06-26 10:59:48 +00:00
}
});
2022-06-17 11:43:23 +00:00
}
// server for a unexpectedly reason be terminated
2022-07-29 10:12:13 +00:00
panic!("TCP server unexpectedly terminated!")
2022-06-17 11:43:23 +00:00
}
/// 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();
2022-06-26 10:59:48 +00:00
tokio::spawn(async {
// get ip address of the client
let ip = stream.peer_addr().expect("failed to get peer address");
2022-06-26 10:59:48 +00:00
if let Err(e) = handle_websocket(stream, tcp_port).await {
error!("Client {ip}: {e}")
2022-06-26 10:59:48 +00:00
}
});
}
// server for a unexpectedly reason be terminated
2022-07-29 10:12:13 +00:00
panic!("WebSocket server unexpectedly terminated!")
}