From 128f53998bb2c57eb9c2666cb4584323e7f93846 Mon Sep 17 00:00:00 2001 From: Ethan O'Brien Date: Fri, 3 Jul 2026 18:56:18 -0500 Subject: [PATCH] Refactor lp_modification function --- src/router/items.rs | 52 +++++++++++++++++++++----------------- src/router/tutorial.rs | 2 +- src/router/userdata/mod.rs | 9 ++++--- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/router/items.rs b/src/router/items.rs index 53941d5..aecf5ad 100644 --- a/src/router/items.rs +++ b/src/router/items.rs @@ -267,31 +267,38 @@ pub fn gift_item_basic(id: i32, value: i64, ty_pe: i32, reason: &str, user: &mut }, reason, user) } -pub fn lp_modification(user: &mut JsonValue, change_amount: u64, remove: bool) { +pub fn lp_modification(user: &mut JsonValue, change_amount: u64, remove: bool) -> bool { + let now = global::set_time(global::timestamp(), user["user"]["id"].as_i64().unwrap_or(0), false); let max = get_user_rank_data(user["user"]["exp"].as_i64().unwrap())["maxLp"].as_u64().unwrap(); - - let speed = 285; //4 mins, 45 sec - let since_last = global::timestamp() - user["stamina"]["last_updated_time"].as_u64().unwrap(); - - let diff = since_last % speed; - let restored = (since_last - diff) / speed; - user["stamina"]["last_updated_time"] = (global::timestamp() - diff).into(); - - let mut stamina = user["stamina"]["stamina"].as_u64().unwrap(); - if stamina < max { - stamina += restored; - if stamina > max { - stamina = max; + + let orig_stamina = user["stamina"]["stamina"].as_u64().unwrap(); + let orig_anchor = user["stamina"]["last_updated_time"].as_u64().unwrap(); + + let mut stamina = orig_stamina; + let mut anchor = orig_anchor; + + if stamina < max && now > anchor { + let restored = (now - anchor) / 300; + stamina = (stamina + restored).min(max); + anchor += restored * 300; + } + + if change_amount > 0 { + if remove { + let was_full = stamina >= max; + stamina -= change_amount; + if was_full { + anchor = now; + } + } else { + stamina += change_amount; } } - - if remove { - stamina -= change_amount; - } else { - stamina += change_amount; - } - + user["stamina"]["stamina"] = stamina.into(); + user["stamina"]["last_updated_time"] = anchor.into(); + + stamina != orig_stamina || anchor != orig_anchor } pub fn get_rarity(id: i64) -> i32 { @@ -360,8 +367,7 @@ pub fn give_exp(amount: i32, user: &mut JsonValue, mission: &mut JsonValue, rv: let new_rank = get_user_rank_data(user["user"]["exp"].as_i64().unwrap()); if current_rank["rank"] != new_rank["rank"] { user["stamina"]["stamina"] = (user["stamina"]["stamina"].as_i64().unwrap() + new_rank["maxLp"].as_i64().unwrap()).into(); - user["stamina"]["last_updated_time"] = global::timestamp().into(); - + let status = get_mission_status(get_variable_mission_num(1101001, 1101030, mission), mission); if status.is_empty() { return; diff --git a/src/router/tutorial.rs b/src/router/tutorial.rs index 98a7da6..6f0a94f 100644 --- a/src/router/tutorial.rs +++ b/src/router/tutorial.rs @@ -16,7 +16,7 @@ async fn tutorial(req: HttpRequest, body: String) -> impl Responder { if user["tutorial_step"].as_i32().unwrap() < 130 { user["tutorial_step"] = body["step"].clone(); user["stamina"]["stamina"] = (100).into(); - user["stamina"]["last_updated_time"] = global::timestamp().into(); + user["stamina"]["last_updated_time"] = global::set_time(global::timestamp(), user["user"]["id"].as_i64().unwrap(), false).into(); userdata::save_acc(&key, user); } diff --git a/src/router/userdata/mod.rs b/src/router/userdata/mod.rs index 3210f36..09759d1 100644 --- a/src/router/userdata/mod.rs +++ b/src/router/userdata/mod.rs @@ -268,11 +268,14 @@ fn remove_deleted_custom_songs(user: &mut JsonValue) -> bool { pub fn get_acc(auth_key: &str) -> JsonValue { let mut user = get_data(auth_key, "userdata"); cleanup_account(&mut user); - if remove_deleted_custom_songs(&mut user) { + let mut changed = remove_deleted_custom_songs(&mut user); + + if items::lp_modification(&mut user, 0, false) { + changed = true; + } + if changed { save_data(auth_key, "userdata", user.clone()); } - - items::lp_modification(&mut user, 0, false); user }