servers/src/main.rs

69 lines
1.6 KiB
Rust
Raw Normal View History

2022-06-17 11:43:23 +00:00
use std::net::TcpListener;
2022-06-04 19:34:53 +00:00
use clap::Parser;
2022-06-17 11:43:23 +00:00
use servers::{
plugins::loader,
tcp::{handle_connection, Client},
};
use simple_logger::SimpleLogger;
2022-06-04 19:34:53 +00:00
#[derive(Parser)]
#[clap(
name = "servers",
2022-06-17 11:43:23 +00:00
about = "A simple TCP server for client which can be extended with plugins."
2022-06-04 19:34:53 +00:00
)]
struct Cli {
#[clap(
short = 'h',
long = "host",
default_value = "0.0.0.0",
help = "Tcp server host",
display_order = 1
)]
host: String,
#[clap(
short = 'p',
long = "port",
default_value = "9999",
help = "Tcp server port [set 0 to random]",
display_order = 2
)]
port: String,
2022-06-04 11:58:21 +00:00
}
2022-06-04 19:34:53 +00:00
fn main() -> anyhow::Result<()> {
2022-06-05 20:10:23 +00:00
// init logger
SimpleLogger::new().init()?;
// parse cli args
2022-06-04 19:34:53 +00:00
let cli = Cli::parse();
2022-06-04 11:58:21 +00:00
2022-06-04 19:34:53 +00:00
// start tcp server
2022-06-17 11:43:23 +00:00
start_server(&cli.host, &cli.port)?;
2022-06-04 11:58:21 +00:00
Ok(())
}
2022-06-17 11:43:23 +00:00
/// Start tcp server
#[tokio::main]
async fn start_server(host: &str, port: &str) -> anyhow::Result<()> {
// listen Tcp server
let listener = TcpListener::bind(format!("{host}:{port}"))?;
println!("Tcp server started at: {}", listener.local_addr()?);
// 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() {
let client = Client::new(stream);
// handle client connection in new thread
tokio::spawn(handle_connection(client, plugin_manager.clone()));
2022-06-17 11:43:23 +00:00
}
// server for a unexpectedly reason be terminated
panic!("Server unexpectedly terminated!")
}