diff options
| author | 1992414357@qq.com <1992414357@qq.com> | 2025-06-11 18:32:48 +0800 |
|---|---|---|
| committer | 1992414357@qq.com <1992414357@qq.com> | 2025-06-11 18:32:48 +0800 |
| commit | aa326e69b18a4390ffbc97268eaec4793761f083 (patch) | |
| tree | a2a517083dc3ef71d2adbb0013b0b923ad4d7c93 /core/src | |
| parent | e5cbc548a7d8ba62a76421057d6b281a9277646f (diff) | |
.
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/data/controller/cli/cli_command.rs | 6 | ||||
| -rw-r--r-- | core/src/service/cli_addition/runtime_consoles.rs | 64 | ||||
| -rw-r--r-- | core/src/service/tcp_network/long_connection.rs | 4 |
3 files changed, 53 insertions, 21 deletions
diff --git a/core/src/data/controller/cli/cli_command.rs b/core/src/data/controller/cli/cli_command.rs index b918d47..9fee0b0 100644 --- a/core/src/data/controller/cli/cli_command.rs +++ b/core/src/data/controller/cli/cli_command.rs @@ -111,9 +111,9 @@ pub fn process_controller_cli(runtime: Arc<Mutex<ControllerRuntime>>, cmd: Contr Commands::Pop => { entry_mutex!(runtime, |guard| { if let Some(msg) = guard.pop() { - info!("Pop: {:?}", msg); + info!("{:?}", msg); } else { - info!("None!"); + info!("None"); } }); } @@ -121,7 +121,7 @@ pub fn process_controller_cli(runtime: Arc<Mutex<ControllerRuntime>>, cmd: Contr Commands::PopAll => { entry_mutex!(runtime, |guard| { while let Some(msg) = guard.pop() { - info!("Pop: {:?}", msg); + info!("{:?}", msg); } }); } diff --git a/core/src/service/cli_addition/runtime_consoles.rs b/core/src/service/cli_addition/runtime_consoles.rs index 38d8404..c96c0f2 100644 --- a/core/src/service/cli_addition/runtime_consoles.rs +++ b/core/src/service/cli_addition/runtime_consoles.rs @@ -1,30 +1,37 @@ +use std::process::exit; use crate::service::cli_addition::utils::read_cli; use clap::{Command, FromArgMatches}; use std::sync::{Arc, Mutex}; -use log::info; -use tokio::{join, spawn}; +use std::time::Duration; +use log::{info, warn}; +use tokio::{count, join, select, spawn}; +use tokio::signal::ctrl_c; +use tokio::time::sleep; use crate::service::service_runner::NoGamepadsService; -pub struct RuntimeConsole<PadService, Cmd> -where Cmd: FromArgMatches { +pub struct RuntimeConsole<PadService, Cmd> where Cmd: FromArgMatches { command: Command, prefix: String, service: Arc<Mutex<PadService>>, process_command: fn(Arc<Mutex<PadService>>, Cmd) -> bool, + check_close: fn(rt: Arc<Mutex<PadService>>) -> bool, + close: fn(rt: Arc<Mutex<PadService>>), } -impl<PadService: Send + 'static, Cmd: FromArgMatches + 'static> RuntimeConsole<PadService, Cmd> { +impl<PadService, Cmd> RuntimeConsole<PadService, Cmd> +where PadService: Send + 'static, Cmd: FromArgMatches + 'static { pub fn build(command: Command, prefix: String, service: Arc<Mutex<PadService>>, process_command: fn(Arc<Mutex<PadService>>, Cmd) -> bool, + check_close: fn(rt: Arc<Mutex<PadService>>) -> bool, + close: fn(rt: Arc<Mutex<PadService>>), ) -> RuntimeConsole<PadService, Cmd> { - RuntimeConsole { command, prefix, service, process_command } + RuntimeConsole { command, prefix, service, process_command, check_close, close } } pub fn build_entry(self) -> NoGamepadsService { let arc = Arc::new(self); - let entry = async move { let console_main = spawn({ let console = Arc::clone(&arc); @@ -43,22 +50,47 @@ impl<PadService: Send + 'static, Cmd: FromArgMatches + 'static> RuntimeConsole<P async fn console_main(self: Arc<RuntimeConsole<PadService, Cmd>>) { let prefix_uppercase = self.prefix.to_uppercase(); let prefix_lowercase = self.prefix.to_lowercase(); + let mut confirm_close = false; loop { - let option : Option<Cmd> = read_cli( - format!("{}> ", prefix_uppercase), - &prefix_lowercase, - self.command.clone() - ).await; - match option { - None => {} - Some(cmd) => { - if !(self.process_command)(Arc::clone(&self.service), cmd) { + select! { + // Auto check + _ = Self::auto_check_close(self.clone()) => { break; }, + + // Ctrl + C + _ = ctrl_c() => { + if !confirm_close { + warn!("To close the process, press Ctrl + C again."); + confirm_close = true; + } else { + (self.close)(self.service.clone()); break; } } + + // Command Line + option = read_cli( + format!("{}> ", prefix_uppercase), + &prefix_lowercase, + self.command.clone() + ) => { + match option { + None => {} + Some(cmd) => { + confirm_close = false; + if !(self.process_command)(Arc::clone(&self.service), cmd) { break; } + } + } + } } } info!("[Console] Shutdown.") } + + async fn auto_check_close(self: Arc<RuntimeConsole<PadService, Cmd>>) { + loop { + sleep(Duration::from_secs(1)).await; + if (self.check_close)(Arc::clone(&self.service)) { break; } + } + } }
\ No newline at end of file diff --git a/core/src/service/tcp_network/long_connection.rs b/core/src/service/tcp_network/long_connection.rs index 1bac6a2..200cf61 100644 --- a/core/src/service/tcp_network/long_connection.rs +++ b/core/src/service/tcp_network/long_connection.rs @@ -44,7 +44,7 @@ impl PadServerNetwork { ControlMessage::Exit => { info!("[TCP Server] [Runtime] Player {} exited.", player.account.id); entry_mutex!(self.runtime, |guard| { - guard.send((player.account.clone(), End), player.account.clone(), ServiceType::TCPConnection); + guard.send((player.account.clone(), End), player.account.clone(), TCPConnection); }); break; } @@ -56,7 +56,7 @@ impl PadServerNetwork { } else { warn!("[TCP Server] [Runtime] Too many error messages! Connection closed."); entry_mutex!(self.runtime, |guard| { - guard.send((player.account.clone(), End), player.account.clone(), ServiceType::TCPConnection); + guard.send((player.account.clone(), End), player.account.clone(), TCPConnection); }); break; } |
