aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
author1992414357@qq.com <1992414357@qq.com>2025-06-11 18:32:48 +0800
committer1992414357@qq.com <1992414357@qq.com>2025-06-11 18:32:48 +0800
commitaa326e69b18a4390ffbc97268eaec4793761f083 (patch)
treea2a517083dc3ef71d2adbb0013b0b923ad4d7c93 /core
parente5cbc548a7d8ba62a76421057d6b281a9277646f (diff)
.
Diffstat (limited to 'core')
-rw-r--r--core/src/data/controller/cli/cli_command.rs6
-rw-r--r--core/src/service/cli_addition/runtime_consoles.rs64
-rw-r--r--core/src/service/tcp_network/long_connection.rs4
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;
}