Added caching motds

This commit is contained in:
Kyler 2024-01-23 21:25:18 -07:00
parent 927e29bb43
commit 8413e4d864
2 changed files with 36 additions and 4 deletions

View File

@ -14,3 +14,4 @@ serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
base64 = "0.21.5" base64 = "0.21.5"
rand = "0.8.5" rand = "0.8.5"
lazy_static = "1.4"

View File

@ -2,12 +2,14 @@
use std::fs::{self, File}; use std::fs::{self, File};
use std::io::Read; use std::io::Read;
use std::sync::{Arc, Mutex};
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf}; use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
use tokio::io::AsyncWriteExt; use tokio::io::AsyncWriteExt;
use serde_json::Value; use serde_json::Value;
use base64::{Engine as _, engine::general_purpose}; use base64::{Engine as _, engine::general_purpose};
use rand::Rng; use rand::Rng;
use lazy_static::lazy_static;
use purple_cello_mc_protocol::{ use purple_cello_mc_protocol::{
mc_types::{self, Result, Packet}, mc_types::{self, Result, Packet},
@ -22,20 +24,49 @@ async fn online_players(
Ok(get_upstream_status(server_reader, server_writer).await?.players) Ok(get_upstream_status(server_reader, server_writer).await?.players)
} }
fn motd() -> String { fn load_motds() -> Value {
let default = "A Minecraft Server Proxy".to_string();
let file_path = "./motd.json"; let file_path = "./motd.json";
let data = match fs::read_to_string(file_path) { let data = match fs::read_to_string(file_path) {
Ok(data) => data, Ok(data) => data,
Err(_) => return default, Err(_) => return Value::Null,
}; };
let motd_data: Value = match serde_json::from_str(&data) { let motd_data: Value = match serde_json::from_str(&data) {
Ok(value) => value, Ok(value) => value,
Err(_) => return default, Err(_) => return Value::Null,
}; };
motd_data
}
fn get_motds() -> Value {
lazy_static! {
static ref MOTDS_CACHE: Arc<Mutex<Value>> =
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 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()); let length2 = motd_data["line2"].as_array().map_or(0, |v| v.len());