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