diff --git a/server/src/main/java/dev/plex/punishment/Punishment.java b/server/src/main/java/dev/plex/punishment/Punishment.java index 41a2b9b..a38bc18 100644 --- a/server/src/main/java/dev/plex/punishment/Punishment.java +++ b/server/src/main/java/dev/plex/punishment/Punishment.java @@ -26,6 +26,10 @@ public class Punishment @NotNull private final UUID punished; private final UUID punisher; + // Optional display attribution for punishers without a Minecraft UUID + // (e.g. web staff signed in via XenForo). When non-null, render this in + // place of the UUID-based name lookup. + private String punisherName; private String ip; private String punishedUsername; private PunishmentType type; @@ -42,12 +46,27 @@ public class Punishment public static Component generateBanMessage(Punishment punishment) { - return PlexUtils.messageComponent("banMessage", banUrl, punishment.getReason(), TimeUtils.useTimezone(punishment.getEndDate()), punishment.getPunisher() == null ? "CONSOLE" : Plex.get().getSqlPlayerData().getNameByUUID(punishment.getPunisher())); + return PlexUtils.messageComponent("banMessage", banUrl, punishment.getReason(), TimeUtils.useTimezone(punishment.getEndDate()), punisherDisplayName(punishment)); } public static Component generateKickMessage(Punishment punishment) { - return PlexUtils.messageComponent("kickMessage", punishment.getReason(), punishment.getPunisher() == null ? "CONSOLE" : Plex.get().getSqlPlayerData().getNameByUUID(punishment.getPunisher())); + return PlexUtils.messageComponent("kickMessage", punishment.getReason(), punisherDisplayName(punishment)); + } + + /** + * Resolves the human-readable punisher attribution for display. + * Prefers the explicit {@link #punisherName} (used for off-server + * sources such as XenForo staff acting via the web HTTPD), falling + * back to a UUID lookup, and finally "CONSOLE" when the punisher is + * truly unknown. + */ + public static String punisherDisplayName(Punishment punishment) + { + String explicit = punishment.getPunisherName(); + if (explicit != null && !explicit.isEmpty()) return explicit; + if (punishment.getPunisher() == null) return "CONSOLE"; + return Plex.get().getSqlPlayerData().getNameByUUID(punishment.getPunisher()); } public static Component generateIndefBanMessageWithReason(String type, String reason) diff --git a/server/src/main/java/dev/plex/storage/SQLConnection.java b/server/src/main/java/dev/plex/storage/SQLConnection.java index 0ae3337..f4e25e1 100644 --- a/server/src/main/java/dev/plex/storage/SQLConnection.java +++ b/server/src/main/java/dev/plex/storage/SQLConnection.java @@ -82,6 +82,7 @@ public class SQLConnection implements PlexBase con.prepareStatement("CREATE TABLE IF NOT EXISTS `punishments` (" + "`punished` VARCHAR(46) NOT NULL, " + "`punisher` VARCHAR(46), " + + "`punisherName` VARCHAR(64), " + "`punishedUsername` VARCHAR(16), " + "`ip` VARCHAR(2000), " + "`type` VARCHAR(30), " + diff --git a/server/src/main/java/dev/plex/storage/punishment/SQLPunishment.java b/server/src/main/java/dev/plex/storage/punishment/SQLPunishment.java index 40c0ef6..826fe88 100644 --- a/server/src/main/java/dev/plex/storage/punishment/SQLPunishment.java +++ b/server/src/main/java/dev/plex/storage/punishment/SQLPunishment.java @@ -24,7 +24,7 @@ public class SQLPunishment private static final String SELECT_BY_IP = "SELECT * FROM `punishments` WHERE ip=?"; private static final String SELECT_BY = "SELECT * FROM `punishments` WHERE punisher=?"; - private static final String INSERT = "INSERT INTO `punishments` (`punished`, `punisher`, `punishedUsername`, `ip`, `type`, `reason`, `customTime`, `active`, `endDate`) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)"; + private static final String INSERT = "INSERT INTO `punishments` (`punished`, `punisher`, `punisherName`, `punishedUsername`, `ip`, `type`, `reason`, `customTime`, `active`, `endDate`) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; private static final String UPDATE_PUNISHMENT = "UPDATE `punishments` SET active=? WHERE punished=? AND type=?"; public CompletableFuture> getPunishments() @@ -43,6 +43,7 @@ public class SQLPunishment punishment.setType(PunishmentType.valueOf(set.getString("type"))); punishment.setCustomTime(set.getBoolean("customTime")); punishment.setPunishedUsername(set.getString("punishedUsername")); + punishment.setPunisherName(set.getString("punisherName")); punishment.setEndDate(ZonedDateTime.ofInstant(Instant.ofEpochMilli(set.getLong("endDate")), ZoneId.of(TimeUtils.TIMEZONE))); punishment.setReason(set.getString("reason")); punishment.setIp(set.getString("ip")); @@ -125,13 +126,14 @@ public class SQLPunishment PreparedStatement statement = con.prepareStatement(INSERT); statement.setString(1, punishment.getPunished().toString()); statement.setString(2, punishment.getPunisher() == null ? null : punishment.getPunisher().toString()); - statement.setString(3, punishment.getPunishedUsername()); - statement.setString(4, punishment.getIp()); - statement.setString(5, punishment.getType().name()); - statement.setString(6, punishment.getReason()); - statement.setBoolean(7, punishment.isCustomTime()); - statement.setBoolean(8, punishment.isActive()); - statement.setLong(9, punishment.getEndDate().toInstant().toEpochMilli()); + statement.setString(3, punishment.getPunisherName()); + statement.setString(4, punishment.getPunishedUsername()); + statement.setString(5, punishment.getIp()); + statement.setString(6, punishment.getType().name()); + statement.setString(7, punishment.getReason()); + statement.setBoolean(8, punishment.isCustomTime()); + statement.setBoolean(9, punishment.isActive()); + statement.setLong(10, punishment.getEndDate().toInstant().toEpochMilli()); PlexLog.debug("Executing punishment"); statement.execute(); }