Fix achievement icons in launcher, allow opening OAuth URLs, live map docs
- Shared achievement icon catalogue; launcher resolves icon/background/border ids - Tauri opener capability now allows http(s) URLs (fixes Discord sign-in) - Rewrite live map docs, admin guide progression section Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DjMbLQujBHunCCu5GpsHaT
This commit is contained in:
17 files changed
+511
-151
No files matched your search
@@ -60,15 +60,29 @@ pub async fn game_config_route(GameServer(server): GameServer) -> Json<Value> {
|
||||
}
|
||||
|
||||
/// Timestamp tables of the regions the panel already has, base64 per region.
|
||||
pub async fn game_manifest(GameServer(server): GameServer, State(state): State<AppState>, Query(q): Query<DimQuery>) -> AppResult<Json<Value>> {
|
||||
pub async fn game_manifest(
|
||||
GameServer(server): GameServer,
|
||||
State(state): State<AppState>,
|
||||
Query(q): Query<DimQuery>,
|
||||
) -> AppResult<Json<Value>> {
|
||||
require_enabled(server.live_map_enabled)?;
|
||||
let dim = dim_of(&q.dim)?;
|
||||
let b64 = base64::engine::general_purpose::STANDARD;
|
||||
let regions: Vec<Value> = state.livemap.manifest(server.id, dim).into_iter().map(|(x, z, ts)| json!({ "x": x, "z": z, "timestamps": b64.encode(ts) })).collect();
|
||||
let regions: Vec<Value> = state
|
||||
.livemap
|
||||
.manifest(server.id, dim)
|
||||
.into_iter()
|
||||
.map(|(x, z, ts)| json!({ "x": x, "z": z, "timestamps": b64.encode(ts) }))
|
||||
.collect();
|
||||
Ok(Json(json!({ "dimension": dim.slug(), "regions": regions })))
|
||||
}
|
||||
|
||||
pub async fn game_chunks(GameServer(server): GameServer, State(state): State<AppState>, Query(q): Query<DimQuery>, body: Bytes) -> AppResult<Json<Value>> {
|
||||
pub async fn game_chunks(
|
||||
GameServer(server): GameServer,
|
||||
State(state): State<AppState>,
|
||||
Query(q): Query<DimQuery>,
|
||||
body: Bytes,
|
||||
) -> AppResult<Json<Value>> {
|
||||
require_enabled(server.live_map_enabled)?;
|
||||
let dim = dim_of(&q.dim)?;
|
||||
let chunks = parse_chunks(&body).map_err(AppError::bad_request)?;
|
||||
@@ -102,7 +116,11 @@ fn sanitize(mut players: Vec<LivePlayer>) -> Vec<LivePlayer> {
|
||||
players
|
||||
}
|
||||
|
||||
pub async fn game_players(GameServer(server): GameServer, State(state): State<AppState>, Json(b): Json<PlayersBody>) -> AppResult<Json<Value>> {
|
||||
pub async fn game_players(
|
||||
GameServer(server): GameServer,
|
||||
State(state): State<AppState>,
|
||||
Json(b): Json<PlayersBody>,
|
||||
) -> AppResult<Json<Value>> {
|
||||
require_enabled(server.live_map_enabled)?;
|
||||
state.livemap.set_players(server.id, sanitize(b.players));
|
||||
Ok(Json(json!({ "ok": true })))
|
||||
@@ -140,7 +158,12 @@ async fn ws_loop(mut socket: WebSocket, state: AppState, id: i64) {
|
||||
}
|
||||
Message::Binary(b) => {
|
||||
let reply = match b.split_first() {
|
||||
Some((d, rest)) => match Dim::ALL.get(*d as usize).copied().ok_or("unknown dimension").and_then(|dim| parse_chunks(rest).map(|c| (dim, c))) {
|
||||
Some((d, rest)) => match Dim::ALL
|
||||
.get(*d as usize)
|
||||
.copied()
|
||||
.ok_or("unknown dimension")
|
||||
.and_then(|dim| parse_chunks(rest).map(|c| (dim, c)))
|
||||
{
|
||||
Ok((dim, chunks)) => match state.livemap.ingest_chunks(id, dim, chunks).await {
|
||||
Ok(n) => json!({ "type": "stored", "count": n }),
|
||||
Err(e) => json!({ "type": "error", "error": e.to_string() }),
|
||||
@@ -236,7 +259,12 @@ pub async fn admin_reset(_: AdminUser, State(state): State<AppState>, Path(id):
|
||||
/// Authenticated reverse proxy to the per-server Vantage sidecar. Clients
|
||||
/// use `…/api/livemap/{server}/{dimension}/v1/worlds/default/manifest.json`
|
||||
/// and everything the manifest references.
|
||||
pub async fn proxy(_: AuthUser, State(state): State<AppState>, Path((id, dim, path)): Path<(i64, String, String)>, headers: HeaderMap) -> AppResult<Response> {
|
||||
pub async fn proxy(
|
||||
_: AuthUser,
|
||||
State(state): State<AppState>,
|
||||
Path((id, dim, path)): Path<(i64, String, String)>,
|
||||
headers: HeaderMap,
|
||||
) -> AppResult<Response> {
|
||||
let server = get_server(&state, id).await?;
|
||||
require_enabled(server.live_map_enabled)?;
|
||||
let dim = dim_of(&dim)?;
|
||||
|
||||
Reference in new issue
Block a user