Re-enable RCON

This commit is contained in:
Snowiiii 2024-08-25 14:07:49 +02:00
parent 8cff0b4b76
commit 268fc19b7b
2 changed files with 27 additions and 20 deletions

View File

@ -1,4 +1,5 @@
#![allow(clippy::await_holding_refcell_ref)] #![allow(clippy::await_holding_refcell_ref)]
#![allow(clippy::await_holding_lock)]
use mio::net::TcpListener; use mio::net::TcpListener;
use mio::{Events, Interest, Poll, Token}; use mio::{Events, Interest, Poll, Token};
@ -8,7 +9,7 @@ use client::Client;
use commands::handle_command; use commands::handle_command;
use config::AdvancedConfiguration; use config::AdvancedConfiguration;
use std::{collections::HashMap, thread}; use std::collections::HashMap;
use client::interrupted; use client::interrupted;
use config::BasicConfiguration; use config::BasicConfiguration;
@ -35,6 +36,7 @@ fn main() -> io::Result<()> {
use entity::player::Player; use entity::player::Player;
use pumpkin_core::text::{color::NamedColor, TextComponent}; use pumpkin_core::text::{color::NamedColor, TextComponent};
use rcon::RCONServer;
#[cfg(feature = "dhat-heap")] #[cfg(feature = "dhat-heap")]
let _profiler = dhat::Profiler::new_heap(); let _profiler = dhat::Profiler::new_heap();
@ -61,8 +63,6 @@ fn main() -> io::Result<()> {
const SERVER: Token = Token(0); const SERVER: Token = Token(0);
use std::time::Instant; use std::time::Instant;
let time = Instant::now(); let time = Instant::now();
let basic_config = BasicConfiguration::load("configuration.toml"); let basic_config = BasicConfiguration::load("configuration.toml");
@ -99,7 +99,7 @@ fn main() -> io::Result<()> {
let mut clients: HashMap<Token, Client> = HashMap::new(); let mut clients: HashMap<Token, Client> = HashMap::new();
let mut players: HashMap<Arc<Token>, Arc<Mutex<Player>>> = HashMap::new(); let mut players: HashMap<Arc<Token>, Arc<Mutex<Player>>> = HashMap::new();
let server = Arc::new(Mutex::new(Server::new(( let server = Arc::new(tokio::sync::Mutex::new(Server::new((
basic_config, basic_config,
advanced_configuration, advanced_configuration,
)))); ))));
@ -108,7 +108,7 @@ fn main() -> io::Result<()> {
let server1 = server.clone(); let server1 = server.clone();
if use_console { if use_console {
thread::spawn(move || { tokio::spawn(async move {
let stdin = std::io::stdin(); let stdin = std::io::stdin();
loop { loop {
let mut out = String::new(); let mut out = String::new();
@ -117,7 +117,7 @@ fn main() -> io::Result<()> {
.expect("Failed to read console line"); .expect("Failed to read console line");
if !out.is_empty() { if !out.is_empty() {
let mut server = server1.lock().unwrap(); let mut server = server1.lock().await;
handle_command(&mut commands::CommandSender::Console, &mut server, &out); handle_command(&mut commands::CommandSender::Console, &mut server, &out);
} }
} }
@ -125,9 +125,9 @@ fn main() -> io::Result<()> {
} }
if rcon.enabled { if rcon.enabled {
let server = server.clone(); let server = server.clone();
// tokio::spawn(async move { tokio::spawn(async move {
// RCONServer::new(&rcon, &server).await.unwrap(); RCONServer::new(&rcon, server).await.unwrap();
// }); });
} }
loop { loop {
if let Err(err) = poll.poll(&mut events, None) { if let Err(err) = poll.poll(&mut events, None) {
@ -179,7 +179,7 @@ fn main() -> io::Result<()> {
let done = if let Some(player) = players.get_mut(&token) { let done = if let Some(player) = players.get_mut(&token) {
let mut player = player.lock().unwrap(); let mut player = player.lock().unwrap();
player.client.poll(event).await; player.client.poll(event).await;
let mut server = server.lock().unwrap(); let mut server = server.lock().await;
player.process_packets(&mut server); player.process_packets(&mut server);
player.client.closed player.client.closed
} else { } else {
@ -188,7 +188,7 @@ fn main() -> io::Result<()> {
if done { if done {
if let Some(player) = players.remove(&token) { if let Some(player) = players.remove(&token) {
let mut server = server.lock().unwrap(); let mut server = server.lock().await;
server.remove_player(&token); server.remove_player(&token);
let mut player = player.lock().unwrap(); let mut player = player.lock().unwrap();
poll.registry().deregister(&mut player.client.connection)?; poll.registry().deregister(&mut player.client.connection)?;
@ -199,7 +199,7 @@ fn main() -> io::Result<()> {
// Maybe received an event for a TCP connection. // Maybe received an event for a TCP connection.
let (done, make_player) = if let Some(client) = clients.get_mut(&token) { let (done, make_player) = if let Some(client) = clients.get_mut(&token) {
client.poll(event).await; client.poll(event).await;
let mut server = server.lock().unwrap(); let mut server = server.lock().await;
client.process_packets(&mut server).await; client.process_packets(&mut server).await;
(client.closed, client.make_player) (client.closed, client.make_player)
} else { } else {
@ -212,7 +212,7 @@ fn main() -> io::Result<()> {
poll.registry().deregister(&mut client.connection)?; poll.registry().deregister(&mut client.connection)?;
} else if make_player { } else if make_player {
let token = client.token.clone(); let token = client.token.clone();
let mut server = server.lock().unwrap(); let mut server = server.lock().await;
let player = server.add_player(token.clone(), client); let player = server.add_player(token.clone(), client);
players.insert(token, player.clone()); players.insert(token, player.clone());
let mut player = player.lock().unwrap(); let mut player = player.lock().unwrap();

View File

@ -1,7 +1,7 @@
use std::{ use std::{
collections::HashMap, collections::HashMap,
io::{self, Read}, io::{self, Read},
sync::{Arc, Mutex}, sync::Arc,
}; };
use mio::{ use mio::{
@ -30,7 +30,10 @@ const SERVER: Token = Token(0);
pub struct RCONServer {} pub struct RCONServer {}
impl RCONServer { impl RCONServer {
pub async fn new(config: &RCONConfig, server: &Arc<Mutex<Server>>) -> Result<Self, io::Error> { pub async fn new(
config: &RCONConfig,
server: Arc<tokio::sync::Mutex<Server>>,
) -> Result<Self, io::Error> {
assert!(config.enabled, "RCON is not enabled"); assert!(config.enabled, "RCON is not enabled");
let addr = format!("{}:{}", config.ip, config.port) let addr = format!("{}:{}", config.ip, config.port)
.parse() .parse()
@ -44,7 +47,7 @@ impl RCONServer {
let mut unique_token = Token(SERVER.0 + 1); let mut unique_token = Token(SERVER.0 + 1);
let mut events = Events::with_capacity(128); let mut events = Events::with_capacity(20);
let mut connections: HashMap<Token, RCONClient> = HashMap::new(); let mut connections: HashMap<Token, RCONClient> = HashMap::new();
@ -88,7 +91,7 @@ impl RCONServer {
token => { token => {
let done = if let Some(client) = connections.get_mut(&token) { let done = if let Some(client) = connections.get_mut(&token) {
client.handle(server, &password).await client.handle(&server, &password).await
} else { } else {
false false
}; };
@ -127,7 +130,11 @@ impl RCONClient {
} }
} }
pub async fn handle(&mut self, server: &Arc<Mutex<Server>>, password: &str) -> bool { pub async fn handle(
&mut self,
server: &Arc<tokio::sync::Mutex<Server>>,
password: &str,
) -> bool {
if !self.closed { if !self.closed {
loop { loop {
match self.read_bytes() { match self.read_bytes() {
@ -155,7 +162,7 @@ impl RCONClient {
async fn poll( async fn poll(
&mut self, &mut self,
server: &Arc<Mutex<Server>>, server: &Arc<tokio::sync::Mutex<Server>>,
password: &str, password: &str,
) -> Result<(), PacketError> { ) -> Result<(), PacketError> {
loop { loop {
@ -188,7 +195,7 @@ impl RCONClient {
PacketType::ExecCommand => { PacketType::ExecCommand => {
if self.logged_in { if self.logged_in {
let mut output = Vec::new(); let mut output = Vec::new();
let mut server = server.lock().unwrap(); let mut server = server.lock().await;
handle_command( handle_command(
&mut crate::commands::CommandSender::Rcon(&mut output), &mut crate::commands::CommandSender::Rcon(&mut output),
&mut server, &mut server,