package dev.plex.request.impl; import dev.plex.HTTPDModule; import dev.plex.api.player.PlexPlayerView; import dev.plex.authentication.AuthenticatedUser; import dev.plex.request.AbstractServlet; import dev.plex.request.GetMapping; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.UUID; import org.bukkit.Bukkit; public class PlayerAdminEndpoint extends AbstractServlet { private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm z"); @GetMapping(endpoint = "/player/") public String getPlayer(HttpServletRequest request, HttpServletResponse response) { AuthenticatedUser staff = currentStaff(request); if (staff == null) { return errorPage(signInPrompt(request, "to access player admin tools")); } String path = request.getPathInfo(); String query = path == null ? "" : path.replace("/", "").trim(); if (query.isEmpty()) { return errorPage("No player specified."); } PlexPlayerView player = lookupPlayer(query); if (player == null) { return errorPage("No player found matching " + escapeHtml(query) + "."); } String file = readFile(this.getClass().getResourceAsStream("/httpd/player.html")); file = file.replace("${player_uuid}", player.uuid().toString()); file = file.replace("${player_name}", escapeHtml(player.name())); file = file.replace("${player_ip}", lastIp(player)); file = file.replace("${player_first_played}", firstPlayed(player.uuid())); file = file.replace("${player_namemc}", "https://namemc.com/profile/" + player.uuid()); return file; } private static PlexPlayerView lookupPlayer(String query) { try { return HTTPDModule.plexApi().players().byUuid(UUID.fromString(query)).orElse(null); } catch (IllegalArgumentException ignored) { return HTTPDModule.plexApi().players().byName(query).orElse(null); } } private static String lastIp(PlexPlayerView player) { List ips = player.ips(); if (ips == null || ips.isEmpty()) return ""; return escapeHtml(ips.getLast()); } private static String firstPlayed(UUID uuid) { try { long ms = Bukkit.getOfflinePlayer(uuid).getFirstPlayed(); if (ms <= 0) return "Never"; ZonedDateTime when = ZonedDateTime.ofInstant(Instant.ofEpochMilli(ms), ZoneId.systemDefault()); return escapeHtml(DATE_FMT.format(when)); } catch (Throwable t) { return ""; } } private String errorPage(String message) { String content = """ Player PLAYERS

Player

%s

← Back to players
""".formatted(message); return readFile(new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))); } private static String escapeHtml(String s) { if (s == null) return ""; return s.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """); } }