From c2db9c64077bcff84a7df7bd4cdb9f31ec8b9618 Mon Sep 17 00:00:00 2001 From: Ethan O'Brien <77750390+ethanaobrien@users.noreply.github.com> Date: Thu, 9 May 2024 19:07:26 -0500 Subject: [PATCH] Compress included files to conserve disk space --- Cargo.toml | 2 + src/main.rs | 25 +++++++++- .../json}/user_rank.json | 0 src/router/databases/mod.rs | 47 ++++++++++--------- src/router/items.rs | 8 ++-- src/router/userdata/mod.rs | 11 +++-- src/router/webui.rs | 3 +- 7 files changed, 62 insertions(+), 34 deletions(-) rename src/router/{userdata => databases/json}/user_rank.json (100%) diff --git a/Cargo.toml b/Cargo.toml index 140b71a..54f5585 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,3 +22,5 @@ uuid = { version = "1.8.0", features = ["v7"] } rsa = "0.9.6" mime = "0.3.17" sha2 = "0.10.8" +include-flate-codegen = "0.3.0" +libflate = "2.1.0" diff --git a/src/main.rs b/src/main.rs index 9fb0dbe..ed6770a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -140,13 +140,13 @@ async fn request(req: HttpRequest, body: String) -> HttpResponse { async fn css(_req: HttpRequest) -> HttpResponse { HttpResponse::Ok() .insert_header(ContentType(mime::TEXT_CSS)) - .body(include_str!("../webui/dist/index.css")) + .body(include_file!("webui/dist/index.css")) } #[get("/index.js")] async fn js(_req: HttpRequest) -> HttpResponse { HttpResponse::Ok() .insert_header(ContentType(mime::APPLICATION_JAVASCRIPT_UTF_8)) - .body(include_str!("../webui/dist/index.js")) + .body(include_file!("webui/dist/index.js")) } #[actix_web::main] @@ -164,3 +164,24 @@ async fn main() -> std::io::Result<()> { println!("Server started: http://127.0.0.1:{}", 8080); rv.await } + + + +#[macro_export] +macro_rules! include_file { + ( $s:expr ) => { + { + let file = include_flate_codegen::deflate_file!($s); + let ret = crate::decode(file); + std::string::String::from_utf8(ret).unwrap() + } + }; +} +pub fn decode(bytes: &[u8]) -> Vec { + use std::io::{Cursor, Read}; + + let mut dec = libflate::deflate::Decoder::new(Cursor::new(bytes)); + let mut ret = Vec::new(); + dec.read_to_end(&mut ret).unwrap(); + ret +} diff --git a/src/router/userdata/user_rank.json b/src/router/databases/json/user_rank.json similarity index 100% rename from src/router/userdata/user_rank.json rename to src/router/databases/json/user_rank.json diff --git a/src/router/databases/mod.rs b/src/router/databases/mod.rs index 4c8b61b..0ad31d1 100644 --- a/src/router/databases/mod.rs +++ b/src/router/databases/mod.rs @@ -1,10 +1,12 @@ use json::{array, object, JsonValue}; use lazy_static::lazy_static; +use crate::include_file; + lazy_static! { pub static ref LOGIN_REWARDS: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/login_bonus_reward.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/login_bonus_reward.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } @@ -12,7 +14,7 @@ lazy_static! { }; pub static ref SHOP_INFO: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/shop_item.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/shop_item.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } @@ -20,7 +22,7 @@ lazy_static! { }; pub static ref CHATS: JsonValue = { let mut chats = object!{}; - let items = json::parse(include_str!("json/chat_room.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/chat_room.json")).unwrap(); for (_i, data) in items.members().enumerate() { if chats[data["masterChatId"].to_string()].is_null() { chats[data["masterChatId"].to_string()] = object!{}; @@ -31,7 +33,7 @@ lazy_static! { }; pub static ref CHAPTERS: JsonValue = { let mut chats = object!{}; - let items = json::parse(include_str!("json/chat_chapter.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/chat_chapter.json")).unwrap(); for (_i, data) in items.members().enumerate() { if chats[data["masterChatId"].to_string()].is_null() { chats[data["masterChatId"].to_string()] = object!{}; @@ -42,7 +44,7 @@ lazy_static! { }; pub static ref EXCHANGE_LIST: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/exchange_item.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/exchange_item.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } @@ -50,7 +52,7 @@ lazy_static! { }; pub static ref EXCHANGE_REWARD: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/exchange_item_reward.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/exchange_item_reward.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } @@ -58,18 +60,18 @@ lazy_static! { }; pub static ref LIVE_LIST: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/live.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/live.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } info }; pub static ref MISSION_DATA: JsonValue = { - json::parse(include_str!("json/live_mission.json")).unwrap() + json::parse(&include_file!("src/router/databases/json/live_mission.json")).unwrap() }; pub static ref MISSION_COMBO_DATA: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/live_mission_combo.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/live_mission_combo.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["masterMusicId"].to_string()] = data.clone(); } @@ -77,7 +79,7 @@ lazy_static! { }; pub static ref MISSION_REWARD_DATA: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/live_mission_reward.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/live_mission_reward.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } @@ -85,7 +87,7 @@ lazy_static! { }; pub static ref CARD_LIST: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/card.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/card.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } @@ -93,7 +95,7 @@ lazy_static! { }; pub static ref LOTTERY_INFO: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/login_bonus.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/login_bonus.json")).unwrap(); for (_i, data) in items.members().enumerate() { if info[data["id"].to_string()].is_null() { info[data["id"].to_string()] = object!{ @@ -102,7 +104,7 @@ lazy_static! { }; } } - let days = json::parse(include_str!("json/login_bonus_reward_setting.json")).unwrap(); + let days = json::parse(&include_file!("src/router/databases/json/login_bonus_reward_setting.json")).unwrap(); for (_i, data) in days.members().enumerate() { if info[data["masterLoginBonusId"].to_string()].is_null() { continue; @@ -117,7 +119,7 @@ lazy_static! { }; pub static ref CARDS: JsonValue = { let mut cardz = object!{}; - let items = json::parse(include_str!("json/lottery_item.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/lottery_item.json")).unwrap(); for (_i, data) in items.members().enumerate() { if cardz[data["id"].to_string()].is_null() { cardz[data["id"].to_string()] = object!{}; @@ -128,7 +130,7 @@ lazy_static! { }; pub static ref POOL: JsonValue = { let mut cardz = object!{}; - let items = json::parse(include_str!("json/lottery_item.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/lottery_item.json")).unwrap(); for (_i, data) in items.members().enumerate() { if cardz[data["id"].to_string()].is_null() { cardz[data["id"].to_string()] = array![]; @@ -139,7 +141,7 @@ lazy_static! { }; pub static ref RARITY: JsonValue = { let mut cardz = object!{}; - let items = json::parse(include_str!("json/lottery_rarity.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/lottery_rarity.json")).unwrap(); for (_i, data) in items.members().enumerate() { if cardz[data["id"].to_string()].is_null() { cardz[data["id"].to_string()] = array![]; @@ -150,7 +152,7 @@ lazy_static! { }; pub static ref LOTTERY: JsonValue = { let mut cardz = object!{}; - let items = json::parse(include_str!("json/lottery.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/lottery.json")).unwrap(); for (_i, data) in items.members().enumerate() { cardz[data["id"].to_string()] = data.clone(); } @@ -158,7 +160,7 @@ lazy_static! { }; pub static ref PRICE: JsonValue = { let mut cardz = object!{}; - let items = json::parse(include_str!("json/lottery_price.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/lottery_price.json")).unwrap(); for (_i, data) in items.members().enumerate() { if cardz[data["id"].to_string()].is_null() { cardz[data["id"].to_string()] = object!{}; @@ -169,7 +171,7 @@ lazy_static! { }; pub static ref MISSION_LIST: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/mission.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/mission.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } @@ -177,7 +179,7 @@ lazy_static! { }; pub static ref MISSION_REWARD: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/mission_reward.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/mission_reward.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } @@ -185,10 +187,13 @@ lazy_static! { }; pub static ref ITEM_INFO: JsonValue = { let mut info = object!{}; - let items = json::parse(include_str!("json/item.json")).unwrap(); + let items = json::parse(&include_file!("src/router/databases/json/item.json")).unwrap(); for (_i, data) in items.members().enumerate() { info[data["id"].to_string()] = data.clone(); } info }; + pub static ref RANKS: JsonValue = { + json::parse(&include_file!("src/router/databases/json/user_rank.json")).unwrap() + }; } diff --git a/src/router/items.rs b/src/router/items.rs index 1b33d1c..d38ac9e 100644 --- a/src/router/items.rs +++ b/src/router/items.rs @@ -259,14 +259,12 @@ pub fn give_character(id: String, user: &mut JsonValue, missions: &mut JsonValue } pub fn get_user_rank_data(exp: i64) -> JsonValue { - let ranks = json::parse(include_str!("userdata/user_rank.json")).unwrap(); - - for (i, rank) in ranks.members().enumerate() { + for (i, rank) in databases::RANKS.members().enumerate() { if exp < rank["exp"].as_i64().unwrap() { - return ranks[i - 1].clone(); + return databases::RANKS[i - 1].clone(); } } - return ranks[ranks.len() - 1].clone(); + return databases::RANKS[databases::RANKS.len() - 1].clone(); } pub fn give_exp(amount: i32, user: &mut JsonValue, mission: &mut JsonValue, rv: &mut JsonValue) { diff --git a/src/router/userdata/mod.rs b/src/router/userdata/mod.rs index 9372ce5..5829e94 100644 --- a/src/router/userdata/mod.rs +++ b/src/router/userdata/mod.rs @@ -8,11 +8,12 @@ use base64::{Engine as _, engine::general_purpose}; use crate::router::global; use crate::router::items; use crate::sql::SQLite; +use crate::include_file; lazy_static! { static ref DATABASE: SQLite = SQLite::new("userdata.db", setup_tables); static ref NEW_USER: JsonValue = { - json::parse(include_str!("new_user.json")).unwrap() + json::parse(&include_file!("src/router/userdata/new_user.json")).unwrap() }; } @@ -110,11 +111,11 @@ fn add_user_to_database(uid: i64, user: JsonValue, user_home: JsonValue, user_mi )); DATABASE.lock_and_exec("INSERT INTO userhome (user_id, userhome) VALUES (?1, ?2)", params!( uid, - if user_home.is_empty() {include_str!("new_user_home.json")} else {&home} + if user_home.is_empty() {include_file!("src/router/userdata/new_user_home.json")} else {home} )); DATABASE.lock_and_exec("INSERT INTO missions (user_id, missions) VALUES (?1, ?2)", params!( uid, - if user_missions.is_empty() {include_str!("missions.json")} else {&missions} + if user_missions.is_empty() {include_file!("src/router/userdata/missions.json")} else {missions} )); DATABASE.lock_and_exec("INSERT INTO loginbonus (user_id, loginbonus) VALUES (?1, ?2)", params!( uid, @@ -130,7 +131,7 @@ fn add_user_to_database(uid: i64, user: JsonValue, user_home: JsonValue, user_mi )); DATABASE.lock_and_exec("INSERT INTO event (user_id, event) VALUES (?1, ?2)", params!( uid, - include_str!("new_user_event.json") + include_file!("src/router/userdata/new_user_event.json") )); DATABASE.lock_and_exec("INSERT INTO eventloginbonus (user_id, eventloginbonus) VALUES (?1, ?2)", params!( uid, @@ -248,7 +249,7 @@ pub fn get_acc_chats(auth_key: &str) -> JsonValue { pub fn get_acc_event(auth_key: &str) -> JsonValue { let event = get_data(auth_key, "event"); if event.is_empty() { - return json::parse(include_str!("new_user_event.json")).unwrap(); + return json::parse(&include_file!("src/router/userdata/new_user_event.json")).unwrap(); } event } diff --git a/src/router/webui.rs b/src/router/webui.rs index 1bb9823..4fdfac4 100644 --- a/src/router/webui.rs +++ b/src/router/webui.rs @@ -6,6 +6,7 @@ use actix_web::{ }; use json::object; +use crate::include_file; use crate::router::{userdata, items}; fn get_login_token(req: &HttpRequest) -> Option { @@ -148,5 +149,5 @@ pub fn main(req: HttpRequest) -> HttpResponse { } HttpResponse::Ok() .insert_header(ContentType::html()) - .body(include_str!("../../webui/dist/index.html")) + .body(include_file!("webui/dist/index.html")) }