]> git.lizzy.rs Git - dragonblocks-rs.git/blob - src/main.rs
Logging
[dragonblocks-rs.git] / src / main.rs
1 #![feature(if_let_guard)]
2
3 mod client;
4 mod pkt;
5 mod quit;
6 mod server;
7
8 use clap::{Parser, Subcommand};
9 use client::Client;
10 use quit::Quit;
11 use server::Server;
12 use tokio::{signal, task};
13
14 #[derive(Parser)]
15 #[clap(version, about, long_about = None)]
16 struct Args {
17     /// Select client/server/multiplayer mode
18     #[clap(subcommand)]
19     mode: Mode,
20 }
21
22 #[derive(Subcommand)]
23 enum Mode {
24     /// Connect to a remote server
25     Client {
26         /// Address to connect to
27         #[clap(value_parser)]
28         address: String,
29     },
30     /// Host a server
31     Server {
32         /// Address to listen to
33         #[clap(value_parser)]
34         address: String,
35     },
36     /// Host a local server and connect to it
37     Singleplayer {
38         /// Optionally open the game to LAN
39         #[clap(value_parser, default_value_t = String::from("127.0.0.1:49120"))]
40         address: String,
41     },
42 }
43
44 #[tokio::main(flavor = "multi_thread")]
45 async fn main() {
46     env_logger::init();
47
48     let args = Args::parse();
49
50     let (quit, mut quit_confirm) = Quit::new();
51
52     let quit_ctrl_c = quit.clone();
53     task::spawn(async move {
54         signal::ctrl_c().await.unwrap();
55         quit_ctrl_c.quit();
56     });
57
58     match args.mode {
59         Mode::Server { address } => Server::new(&address, quit).await.run().await,
60         Mode::Client { address } => Client::run(&address, quit).await,
61         Mode::Singleplayer { address } => {
62             let server = Server::new(&address, quit.clone()).await;
63             tokio::join!(server.run(), Client::run(&address, quit));
64         }
65     }
66
67     let _ = quit_confirm.recv().await;
68 }