Rank title renames now reach every player (server ranks recomputed too)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DjMbLQujBHunCCu5GpsHaT
This commit is contained in:
Claude committed 2026-10-01 00:47:10 +00:00
1 parent 5346b1f560
commit f428bd210f
2 files changed
+52 -3

No files matched your search

+19 -3
View File
@@ -297,14 +297,25 @@ fn validate_rank_mapping(data: &serde_json::Map<String, Value>) -> AppResult<()>
Ok(())
}
/// Titles and rank names are shown from a copy kept on each player, so they must be recomputed whenever a reward is
/// created, renamed, moved or deleted. Otherwise a rename on the admin page never reaches the launcher.
async fn refresh_global_titles(state: &AppState) -> AppResult<()> {
let players: Vec<(String, i64)> = sqlx::query_as("SELECT uuid, global_xp FROM user_levels").fetch_all(&state.db).await?;
let mut tx = state.db.begin().await?;
let players: Vec<(String, i64)> = sqlx::query_as("SELECT uuid, global_xp FROM user_levels").fetch_all(&mut *tx).await?;
for (uuid, xp) in players {
let level = level_from_xp(xp).0;
let title: Option<String> = sqlx::query_scalar("SELECT reward_name FROM level_rewards WHERE level_type='global' AND reward_type='title' AND level_req<=? ORDER BY level_req DESC,id DESC LIMIT 1")
.bind(level).fetch_optional(&state.db).await?;
sqlx::query("UPDATE user_levels SET title=? WHERE uuid=?").bind(title).bind(uuid).execute(&state.db).await?;
.bind(level).fetch_optional(&mut *tx).await?;
sqlx::query("UPDATE user_levels SET title=? WHERE uuid=?").bind(title).bind(uuid).execute(&mut *tx).await?;
}
let members: Vec<(i64, String, i64)> = sqlx::query_as("SELECT server_id, uuid, server_xp FROM server_levels").fetch_all(&mut *tx).await?;
for (server_id, uuid, xp) in members {
let level = level_from_xp(xp).0;
let rank: Option<String> = sqlx::query_scalar("SELECT reward_name FROM level_rewards WHERE level_type='server' AND server_id=? AND reward_type='title' AND level_req<=? ORDER BY level_req DESC,id DESC LIMIT 1")
.bind(server_id).bind(level).fetch_optional(&mut *tx).await?;
sqlx::query("UPDATE server_levels SET rank_name=? WHERE server_id=? AND uuid=?").bind(rank).bind(server_id).bind(uuid).execute(&mut *tx).await?;
}
tx.commit().await?;
Ok(())
}
@@ -379,12 +390,17 @@ pub async fn admin_update_reward(
sqlx::query(
"UPDATE level_rewards SET
level_type = COALESCE(?, level_type),
server_id = CASE WHEN ? = 1 THEN ? ELSE server_id END,
level_req = ?,
reward_type = ?,
reward_name = ?,
reward_data = ?
WHERE id = ?",
)
.bind(payload.level_type.clone())
.bind(payload.level_type.is_some() as i64)
.bind(payload.server_id)
.bind(level_req)
.bind(payload.reward_type)
.bind(reward_name)