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:
2 files changed
+52
-3
No files matched your search
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user