From 2d8dc128f1044ad8bec7ae0cf133fa0c5e5727c1 Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Thu, 28 May 2026 13:14:58 -0400 Subject: [PATCH] Update for new API --- .../lib/pages/PunishmentsDetailPage.svelte | 19 ++++++++++--------- src/main/frontend/src/lib/types/api.ts | 17 ++++++++++++++++- .../dev/plex/request/PlayerActionServlet.java | 7 ++++--- .../request/impl/PlayerAdminEndpoint.java | 2 +- .../request/impl/PunishmentsEndpoint.java | 15 ++++++++------- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/main/frontend/src/lib/pages/PunishmentsDetailPage.svelte b/src/main/frontend/src/lib/pages/PunishmentsDetailPage.svelte index 8fc7382..f423497 100644 --- a/src/main/frontend/src/lib/pages/PunishmentsDetailPage.svelte +++ b/src/main/frontend/src/lib/pages/PunishmentsDetailPage.svelte @@ -7,7 +7,7 @@ import {Button} from '$lib/components/ui/button'; import {Card} from '$lib/components/ui/card'; import {Input} from '$lib/components/ui/input'; - import type {PunishmentsPayload} from '$lib/types/api'; + import type {PunishmentSummary, PunishmentsPayload} from '$lib/types/api'; import {lowerSearch, titleCase} from '$lib/utils'; interface Props { @@ -22,13 +22,13 @@ let type = $state('all'); let status = $state('all'); - const punishments = $derived>>(data?.punishments ?? []); - const types = $derived(Array.from(new Set(punishments.map((item) => String(item.type ?? item.kind ?? '')).filter(Boolean))).sort()); + const punishments = $derived(data?.punishments ?? []); + const types = $derived(Array.from(new Set(punishments.map((item) => item.type).filter(Boolean))).sort()); const visible = $derived.by(() => { const q = filter.toLowerCase().trim(); return punishments.filter((item) => { - const itemType = String(item.type ?? item.kind ?? ''); - const active = Boolean(item.active ?? item.isActive ?? item.current); + const itemType = item.type; + const active = item.active; const itemStatus = active ? 'active' : 'expired'; return (!q || lowerSearch(item).includes(q)) && (type === 'all' || itemType === type) && (status === 'all' || itemStatus === status); }); @@ -41,7 +41,7 @@ return String(value); } - function entries(item: Record) { + function entries(item: PunishmentSummary) { return Object.entries(item).filter(([key]) => !['id', 'uuid'].includes(key)); } @@ -105,14 +105,15 @@

No punishments match those filters.

{:else}
- {#each visible as punishment, index (String(punishment.id ?? index))} - {@const itemType = String(punishment.type ?? punishment.kind ?? 'punishment')} - {@const active = Boolean(punishment.active ?? punishment.isActive ?? punishment.current)} + {#each visible as punishment, index (`${punishment.type}:${punishment.issueDate}:${index}`)} + {@const itemType = punishment.type} + {@const active = punishment.active}

{titleCase(itemType)}

{displayValue(punishment.reason)}

+

{displayValue(punishment.punisherDisplayName)} ยท {displayValue(punishment.source)}

{active ? 'active' : 'expired'}
diff --git a/src/main/frontend/src/lib/types/api.ts b/src/main/frontend/src/lib/types/api.ts index ef29808..bce21ae 100644 --- a/src/main/frontend/src/lib/types/api.ts +++ b/src/main/frontend/src/lib/types/api.ts @@ -50,10 +50,25 @@ export interface CommandGroup { export interface PunishmentsPayload { player: { uuid: string; name: string }; - punishments: Array>; + punishments: PunishmentSummary[]; canViewIps: boolean; } +export interface PunishmentSummary { + punished: string; + punisher?: string | null; + source: 'PLAYER' | 'CONSOLE' | 'WEB'; + punisherReference?: string | null; + punisherDisplayName: string; + ip: string; + type: string; + reason: string; + customTime: boolean; + active: boolean; + issueDate: string; + endDate?: string | null; +} + export interface Schematic { name: string; size: number; diff --git a/src/main/java/dev/plex/request/PlayerActionServlet.java b/src/main/java/dev/plex/request/PlayerActionServlet.java index f7287ce..c7ccbf0 100644 --- a/src/main/java/dev/plex/request/PlayerActionServlet.java +++ b/src/main/java/dev/plex/request/PlayerActionServlet.java @@ -3,6 +3,7 @@ package dev.plex.request; import dev.plex.HTTPDModule; import dev.plex.api.player.PlexPlayerView; import dev.plex.api.punishment.PunishmentRequest; +import dev.plex.api.punishment.PunishmentSource; import dev.plex.api.punishment.PunishmentType; import dev.plex.authentication.AuthenticatedUser; import dev.plex.logging.Log; @@ -73,7 +74,7 @@ public class PlayerActionServlet extends HttpServlet return; } - PlexPlayerView target = module.api().players().byUuid(uuid).orElse(null); + PlexPlayerView target = module.api().players().player(uuid).orElse(null); if (target == null) { response.getWriter().write(JsonResponse.error(response, HttpServletResponse.SC_NOT_FOUND, "Player not found.")); @@ -100,9 +101,9 @@ public class PlayerActionServlet extends HttpServlet PunishmentRequest punishment = new PunishmentRequest( uuid, null, - "xf:" + staff.username(), + PunishmentSource.WEB, + "xf:" + staff.userId() + ":" + staff.username(), ip, - target.name(), type, safeReason, TEMP_ACTIONS.contains(action), diff --git a/src/main/java/dev/plex/request/impl/PlayerAdminEndpoint.java b/src/main/java/dev/plex/request/impl/PlayerAdminEndpoint.java index 987725d..47e11c5 100644 --- a/src/main/java/dev/plex/request/impl/PlayerAdminEndpoint.java +++ b/src/main/java/dev/plex/request/impl/PlayerAdminEndpoint.java @@ -67,7 +67,7 @@ public class PlayerAdminEndpoint extends AbstractServlet { try { - return module.api().players().byUuid(UUID.fromString(query)).orElse(null); + return module.api().players().player(UUID.fromString(query)).orElse(null); } catch (IllegalArgumentException ignored) { diff --git a/src/main/java/dev/plex/request/impl/PunishmentsEndpoint.java b/src/main/java/dev/plex/request/impl/PunishmentsEndpoint.java index d2f58a8..9f0734f 100644 --- a/src/main/java/dev/plex/request/impl/PunishmentsEndpoint.java +++ b/src/main/java/dev/plex/request/impl/PunishmentsEndpoint.java @@ -37,7 +37,7 @@ public class PunishmentsEndpoint extends AbstractServlet try { UUID pathUUID = UUID.fromString(request.getPathInfo().replace("/", "")); - punishedPlayer = module.api().players().byUuid(pathUUID).orElse(null); + punishedPlayer = module.api().players().player(pathUUID).orElse(null); } catch (IllegalArgumentException ignored) { @@ -53,11 +53,11 @@ public class PunishmentsEndpoint extends AbstractServlet List punishments; if (viewer == null) { - punishments = punishedPlayer.punishments().stream().map(PunishmentsEndpoint::hideIp).toList(); + punishments = punishedPlayer.punishments().stream().map(punishment -> serialize(punishment, true)).toList(); } else { - punishments = punishedPlayer.punishments().stream().toList(); + punishments = punishedPlayer.punishments().stream().map(punishment -> serialize(punishment, false)).toList(); } Map player = new LinkedHashMap<>(); @@ -71,15 +71,16 @@ public class PunishmentsEndpoint extends AbstractServlet return JsonResponse.json(response, body); } - private static Object hideIp(PunishmentView punishment) + private static Object serialize(PunishmentView punishment, boolean hideIp) { return new Object() { public final UUID punished = punishment.punished(); public final UUID punisher = punishment.punisher(); - public final String punisherName = punishment.punisherName(); - public final String ip = ""; - public final String punishedUsername = punishment.punishedUsername(); + public final Object source = punishment.source(); + public final String punisherReference = punishment.punisherReference(); + public final String punisherDisplayName = punishment.punisherDisplayName(); + public final String ip = hideIp ? "" : punishment.ip(); public final Object type = punishment.type(); public final String reason = punishment.reason(); public final boolean customTime = punishment.customTime();