diff --git a/Cargo.toml b/Cargo.toml index ae95b37..a0339e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,4 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" base64 = "0.21.5" rand = "0.8.5" +lazy_static = "1.4" diff --git a/src/status_handle.rs b/src/status_handle.rs index f79a4d0..a188810 100644 --- a/src/status_handle.rs +++ b/src/status_handle.rs @@ -2,12 +2,14 @@ use std::fs::{self, File}; use std::io::Read; +use std::sync::{Arc, Mutex}; use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf}; use tokio::io::AsyncWriteExt; use serde_json::Value; use base64::{Engine as _, engine::general_purpose}; use rand::Rng; +use lazy_static::lazy_static; use purple_cello_mc_protocol::{ mc_types::{self, Result, Packet}, @@ -22,20 +24,49 @@ async fn online_players( Ok(get_upstream_status(server_reader, server_writer).await?.players) } -fn motd() -> String { - let default = "A Minecraft Server Proxy".to_string(); +fn load_motds() -> Value { let file_path = "./motd.json"; let data = match fs::read_to_string(file_path) { Ok(data) => data, - Err(_) => return default, + Err(_) => return Value::Null, }; let motd_data: Value = match serde_json::from_str(&data) { Ok(value) => value, - Err(_) => return default, + Err(_) => return Value::Null, }; + motd_data +} + +fn get_motds() -> Value { + lazy_static! { + static ref MOTDS_CACHE: Arc> = + Arc::new(Mutex::new(load_motds())); + } + + let motds_guard = match MOTDS_CACHE.lock() { + Ok(guard) => guard, + Err(_) => { return Value::Null; } + }; + + let motds = (*motds_guard).clone(); + + std::mem::drop(motds_guard); + + motds +} + +fn motd() -> String { + let default = "A Minecraft Server Proxy".to_string(); + + let motd_data = get_motds(); + + if motd_data == Value::Null { + return default; + } + let length1 = motd_data["line1"].as_array().map_or(0, |v| v.len()); let length2 = motd_data["line2"].as_array().map_or(0, |v| v.len());