Add central live map backend: chunk/player ingest, Vantage sidecar supervisor and proxy

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-09-30 17:09:31 +00:00
1 parent 004862ea88
commit 8acb4a64e6
13 files changed
+1255 -7

No files matched your search

+10 -3
View File
@@ -62,6 +62,7 @@ fn clip(s: &str, max: usize) -> String {
pub struct ServerRow {
pub instance_id: String,
pub map_url: String,
pub live_map_enabled: bool,
pub id: i64,
pub name: String,
#[serde(skip)]
@@ -168,6 +169,7 @@ pub async fn hello(
"sync_interval_secs": SYNC_INTERVAL_SECS,
"access": server.access,
"require_launcher": server.require_launcher,
"live_map": super::livemap::game_config(server.live_map_enabled),
})))
}
@@ -835,6 +837,8 @@ pub struct ServerInput {
require_launcher: bool,
#[serde(default)]
map_url: String,
#[serde(default)]
live_map_enabled: bool,
}
fn default_access() -> String {
@@ -868,7 +872,7 @@ impl ServerInput {
}
}
async fn get_server(state: &AppState, id: i64) -> AppResult<ServerRow> {
pub async fn get_server(state: &AppState, id: i64) -> AppResult<ServerRow> {
sqlx::query_as("SELECT * FROM game_servers WHERE id = ?")
.bind(id)
.fetch_optional(&state.db)
@@ -880,7 +884,7 @@ pub async fn create(_: AdminUser, State(state): State<AppState>, Json(input): Js
input.validate()?;
let token = new_token();
let id: i64 = sqlx::query_scalar(
"INSERT INTO game_servers (name, token_hash, token_hint, access, allowed_groups, require_launcher, created_at, instance_id, map_url) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING id",
"INSERT INTO game_servers (name, token_hash, token_hint, access, allowed_groups, require_launcher, created_at, instance_id, map_url, live_map_enabled) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING id",
)
.bind(input.name.trim())
.bind(hash_token(&token))
@@ -891,6 +895,7 @@ pub async fn create(_: AdminUser, State(state): State<AppState>, Json(input): Js
.bind(now())
.bind(&input.instance_id)
.bind(input.map_url.trim())
.bind(input.live_map_enabled)
.fetch_one(&state.db)
.await?;
let server = get_server(&state, id).await?;
@@ -905,13 +910,14 @@ pub async fn update(
) -> AppResult<Json<ServerView>> {
input.validate()?;
get_server(&state, id).await?;
sqlx::query("UPDATE game_servers SET name = ?, access = ?, allowed_groups = ?, require_launcher = ?, instance_id = ?, map_url = ? WHERE id = ?")
sqlx::query("UPDATE game_servers SET name = ?, access = ?, allowed_groups = ?, require_launcher = ?, instance_id = ?, map_url = ?, live_map_enabled = ? WHERE id = ?")
.bind(input.name.trim())
.bind(&input.access)
.bind(serde_json::to_string(&input.allowed_groups).unwrap_or_else(|_| "[]".into()))
.bind(input.require_launcher)
.bind(&input.instance_id)
.bind(input.map_url.trim())
.bind(input.live_map_enabled)
.bind(id)
.execute(&state.db)
.await?;
@@ -1096,6 +1102,7 @@ pub async fn public_servers(State(state): State<AppState>) -> AppResult<Json<Val
"name": s.name,
"instance_id": s.instance_id,
"map_url": s.map_url,
"live_map": s.live_map_enabled,
"online": is_online,
"players_online": if is_online { s.online_count } else { 0 },
"players_max": s.max_players,