From dce6951262da192d6936951abab18f271f6ff9b8 Mon Sep 17 00:00:00 2001 From: applenick Date: Thu, 20 Jun 2024 12:11:03 -0700 Subject: [PATCH] Resolve data type issues for network updates Signed-off-by: applenick --- .../moderation/commands/MuteCommand.java | 2 +- .../commands/PunishmentCommand.java | 2 +- .../moderation/feature/ModerationFeature.java | 8 +-- .../feature/ModerationFeatureBase.java | 14 +++-- .../feature/types/SQLModerationFeature.java | 7 ++- .../moderation/punishments/Punishment.java | 55 ++++++++++--------- .../punishments/types/BanPunishment.java | 11 ++-- .../types/ExpirablePunishment.java | 9 ++- .../punishments/types/KickPunishment.java | 11 ++-- .../punishments/types/MutePunishment.java | 10 ++-- .../punishments/types/TempBanPunishment.java | 11 ++-- .../types/UsernameBanPunishment.java | 11 ++-- .../punishments/types/WarnPunishment.java | 10 ++-- .../services/SQLModerationService.java | 27 ++++----- .../network/subs/NetworkSubscriber.java | 3 +- .../network/updates/NetworkUpdateBase.java | 3 +- .../dev/pgm/community/utils/ImportUtils.java | 12 ++-- .../community/utils/gson/GsonProvider.java | 13 +++++ .../utils/gson/types/DurationConverter.java | 25 +++++++++ 19 files changed, 143 insertions(+), 101 deletions(-) create mode 100644 src/main/java/dev/pgm/community/utils/gson/GsonProvider.java create mode 100644 src/main/java/dev/pgm/community/utils/gson/types/DurationConverter.java diff --git a/src/main/java/dev/pgm/community/moderation/commands/MuteCommand.java b/src/main/java/dev/pgm/community/moderation/commands/MuteCommand.java index 527f2648..484d454b 100644 --- a/src/main/java/dev/pgm/community/moderation/commands/MuteCommand.java +++ b/src/main/java/dev/pgm/community/moderation/commands/MuteCommand.java @@ -86,7 +86,7 @@ public void unMutePlayer(CommandAudience audience, @Argument("target") TargetPla name -> { if (isMuted.isPresent()) { moderation - .unmute(id.get(), audience.getId()) + .unmute(id.get(), audience.getId().orElse(null)) .thenAcceptAsync( pardon -> { if (!pardon) { diff --git a/src/main/java/dev/pgm/community/moderation/commands/PunishmentCommand.java b/src/main/java/dev/pgm/community/moderation/commands/PunishmentCommand.java index 773a2fad..2a49e629 100644 --- a/src/main/java/dev/pgm/community/moderation/commands/PunishmentCommand.java +++ b/src/main/java/dev/pgm/community/moderation/commands/PunishmentCommand.java @@ -127,7 +127,7 @@ public void unbanPlayer(CommandAudience audience, @Argument("target") TargetPlay isBanned -> { if (isBanned) { moderation - .pardon(target.getIdentifier(), audience.getId()) + .pardon(target.getIdentifier(), audience.getId().orElse(null)) .thenAcceptAsync( pardon -> { if (!pardon) { diff --git a/src/main/java/dev/pgm/community/moderation/feature/ModerationFeature.java b/src/main/java/dev/pgm/community/moderation/feature/ModerationFeature.java index 9148f60d..18a044a8 100644 --- a/src/main/java/dev/pgm/community/moderation/feature/ModerationFeature.java +++ b/src/main/java/dev/pgm/community/moderation/feature/ModerationFeature.java @@ -55,10 +55,10 @@ Punishment punish( * Pardon target for past punishments (Ban/Tempban) * * @param target A username or UUID string - * @param issuer An optional UUID of the command sender (console is empty) + * @param issuer A UUID of the command sender (null for console) * @return True if any ban infractions were lifted, false if none */ - CompletableFuture pardon(String target, Optional issuer); + CompletableFuture pardon(String target, @Nullable UUID issuer); /** * Deactivate an active punishment @@ -97,10 +97,10 @@ Punishment punish( * Unmutes any active mutes for the provided target * * @param target A player UUID - * @param issuer The person lifting the infraction + * @param issuer The UUID of the player lifting the mute (null for console) * @return true if unmute was removed, false if no mute existed */ - CompletableFuture unmute(UUID target, Optional issuer); + CompletableFuture unmute(UUID target, @Nullable UUID issuer); /** * Gets a set of online players who are muted diff --git a/src/main/java/dev/pgm/community/moderation/feature/ModerationFeatureBase.java b/src/main/java/dev/pgm/community/moderation/feature/ModerationFeatureBase.java index 89105eaf..d26c537b 100644 --- a/src/main/java/dev/pgm/community/moderation/feature/ModerationFeatureBase.java +++ b/src/main/java/dev/pgm/community/moderation/feature/ModerationFeatureBase.java @@ -138,11 +138,11 @@ public Punishment punish( target, getSenderId(issuer.getSender()), reason, - time, + time.toEpochMilli(), duration, type, active, - time, + time.toEpochMilli(), getSenderId(issuer.getSender()), getModerationConfig().getService()); Bukkit.getPluginManager().callEvent(new PlayerPunishmentEvent(issuer, punishment, silent)); @@ -157,7 +157,7 @@ public ModerationTools getTools() { @Override public Optional getLastPunishment(UUID issuer) { return recents.stream() - .filter(p -> p.getIssuerId().isPresent() && p.getIssuerId().get().equals(issuer)) + .filter(p -> !p.isConsole() && p.getIssuerId().equals(issuer)) .sorted() .findFirst(); } @@ -343,8 +343,12 @@ public Optional getCachedMute(UUID playerId) { } // ETC. - private Optional getSenderId(CommandSender sender) { - return Optional.ofNullable(sender instanceof Player ? ((Player) sender).getUniqueId() : null); + @Nullable + private UUID getSenderId(CommandSender sender) { + if (!(sender instanceof Player)) return null; + + Player player = (Player) sender; + return player.getUniqueId(); } private Optional isBanEvasion(String address) { diff --git a/src/main/java/dev/pgm/community/moderation/feature/types/SQLModerationFeature.java b/src/main/java/dev/pgm/community/moderation/feature/types/SQLModerationFeature.java index c42d9ba2..b25645e1 100644 --- a/src/main/java/dev/pgm/community/moderation/feature/types/SQLModerationFeature.java +++ b/src/main/java/dev/pgm/community/moderation/feature/types/SQLModerationFeature.java @@ -22,6 +22,7 @@ import java.util.concurrent.TimeoutException; import java.util.logging.Logger; import java.util.stream.Collectors; +import javax.annotation.Nullable; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.configuration.Configuration; @@ -96,7 +97,7 @@ public CompletableFuture> query(String target) { } @Override - public CompletableFuture pardon(String target, Optional issuer) { + public CompletableFuture pardon(String target, @Nullable UUID issuer) { CompletableFuture> playerId = NameUtils.isMinecraftName(target) ? getUsers().getStoredId(target) @@ -179,7 +180,7 @@ public void onPreLogin(AsyncPlayerPreLoginEvent event) { if (punishment.getType() == PunishmentType.NAME_BAN) { String bannedName = punishment.getReason(); if (!event.getName().equalsIgnoreCase(bannedName)) { - pardon(punishment.getTargetId().toString(), Optional.empty()); + pardon(punishment.getTargetId().toString(), null); event.setLoginResult(Result.ALLOWED); logger.info( String.format( @@ -305,7 +306,7 @@ public CompletableFuture> isMuted(UUID target) { } @Override - public CompletableFuture unmute(UUID id, Optional issuer) { + public CompletableFuture unmute(UUID id, @Nullable UUID issuer) { return service .unmute(id, issuer) .thenApplyAsync( diff --git a/src/main/java/dev/pgm/community/moderation/punishments/Punishment.java b/src/main/java/dev/pgm/community/moderation/punishments/Punishment.java index b3cee6d9..629c769a 100644 --- a/src/main/java/dev/pgm/community/moderation/punishments/Punishment.java +++ b/src/main/java/dev/pgm/community/moderation/punishments/Punishment.java @@ -49,14 +49,14 @@ public class Punishment implements Comparable { private UUID punishmentId; private UUID targetId; - private Optional issuerId; + private @Nullable UUID issuerId; private String reason; - private Instant timeIssued; + private long timeIssued; private boolean active; private @Nullable Duration duration; - private Instant lastUpdated; - private Optional lastUpdatedBy; + private long lastUpdated; + private @Nullable UUID lastUpdatedBy; private String service; @@ -66,13 +66,13 @@ public Punishment( PunishmentType type, UUID punishmentId, UUID targetId, - Optional issuerId, + @Nullable UUID issuerId, String reason, Duration duration, - Instant timeIssued, + long timeIssued, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { this.type = type; this.punishmentId = punishmentId; @@ -103,16 +103,21 @@ public UUID getTargetId() { return targetId; } - public Optional getIssuerId() { + @Nullable + public UUID getIssuerId() { return issuerId; } + public boolean isConsole() { + return getIssuerId() == null; + } + public String getReason() { return reason; } public Instant getTimeIssued() { - return timeIssued; + return Instant.ofEpochMilli(timeIssued); } public boolean isActive() { @@ -124,10 +129,10 @@ public void setActive(boolean active) { } public Instant getLastUpdated() { - return lastUpdated; + return Instant.ofEpochMilli(lastUpdated); } - public Optional getLastUpdatedBy() { + public @Nullable UUID getLastUpdatedBy() { return lastUpdatedBy; } @@ -169,9 +174,9 @@ public boolean kick(boolean silent) { .kickPlayer( formatPunishmentScreen( getConfig(), - getIssuerId().isPresent() - ? PlayerComponent.player(getIssuerId().get(), NameStyle.FANCY) - : UsernameFormatUtils.CONSOLE_NAME, + isConsole() + ? UsernameFormatUtils.CONSOLE_NAME + : PlayerComponent.player(getIssuerId(), NameStyle.FANCY), silent)); return true; } @@ -187,11 +192,11 @@ public void sendWarning(Audience target, String reason) { Component titleWord = translatable("misc.warning", NamedTextColor.DARK_RED); Component title = text().append(WARN_SYMBOL).append(titleWord).append(WARN_SYMBOL).build(); Component subtitle; - if (Duration.between(timeIssued, Instant.now()).getSeconds() >= 60) { + if (Duration.between(getTimeIssued(), Instant.now()).getSeconds() >= 60) { subtitle = text() .append( - TemporalComponent.relativePastApproximate(timeIssued) + TemporalComponent.relativePastApproximate(getTimeIssued()) .color(NamedTextColor.YELLOW) .append(text(": ", NamedTextColor.YELLOW))) .append(text(reason, NamedTextColor.GOLD)) @@ -265,10 +270,10 @@ public String formatPunishmentScreen( lines.add( getType() .getScreenComponent( - Duration.between(timeIssued, Instant.now()).getSeconds() >= 60 + Duration.between(getTimeIssued(), Instant.now()).getSeconds() >= 60 ? text() .append( - TemporalComponent.relativePastApproximate(timeIssued) + TemporalComponent.relativePastApproximate(getTimeIssued()) .color(NamedTextColor.YELLOW) .append(text(": ", NamedTextColor.YELLOW))) .append(text(reason, NamedTextColor.RED)) @@ -331,11 +336,11 @@ public static Punishment of(Punishment punishment) { punishment.getTargetId(), punishment.getIssuerId(), punishment.getReason(), - punishment.getTimeIssued(), + punishment.getTimeIssued().toEpochMilli(), punishment.getDuration(), punishment.getType(), punishment.isActive(), - punishment.getLastUpdated(), + punishment.getLastUpdated().toEpochMilli(), punishment.getLastUpdatedBy(), punishment.getService()); } @@ -343,14 +348,14 @@ public static Punishment of(Punishment punishment) { public static Punishment of( UUID id, UUID target, - Optional issuer, + @Nullable UUID issuer, String reason, - Instant time, + long time, @Nullable Duration length, PunishmentType type, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { switch (type) { case WARN: diff --git a/src/main/java/dev/pgm/community/moderation/punishments/types/BanPunishment.java b/src/main/java/dev/pgm/community/moderation/punishments/types/BanPunishment.java index ca352ba0..f7459a8f 100644 --- a/src/main/java/dev/pgm/community/moderation/punishments/types/BanPunishment.java +++ b/src/main/java/dev/pgm/community/moderation/punishments/types/BanPunishment.java @@ -2,21 +2,20 @@ import dev.pgm.community.moderation.punishments.Punishment; import dev.pgm.community.moderation.punishments.PunishmentType; -import java.time.Instant; -import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; public class BanPunishment extends Punishment { public BanPunishment( UUID punishmentId, UUID targetId, - Optional issuerId, + @Nullable UUID issuerId, String reason, - Instant timeIssued, + long timeIssued, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { super( PunishmentType.BAN, diff --git a/src/main/java/dev/pgm/community/moderation/punishments/types/ExpirablePunishment.java b/src/main/java/dev/pgm/community/moderation/punishments/types/ExpirablePunishment.java index 93b23dec..70064a40 100644 --- a/src/main/java/dev/pgm/community/moderation/punishments/types/ExpirablePunishment.java +++ b/src/main/java/dev/pgm/community/moderation/punishments/types/ExpirablePunishment.java @@ -4,7 +4,6 @@ import dev.pgm.community.moderation.punishments.PunishmentType; import java.time.Duration; import java.time.Instant; -import java.util.Optional; import java.util.UUID; import javax.annotation.Nullable; @@ -15,13 +14,13 @@ public ExpirablePunishment( PunishmentType type, UUID id, UUID targetId, - Optional issuerId, + @Nullable UUID issuerId, String reason, - Instant timeIssued, + long timeIssued, Duration length, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { super( type, diff --git a/src/main/java/dev/pgm/community/moderation/punishments/types/KickPunishment.java b/src/main/java/dev/pgm/community/moderation/punishments/types/KickPunishment.java index 5519c010..809ab1d4 100644 --- a/src/main/java/dev/pgm/community/moderation/punishments/types/KickPunishment.java +++ b/src/main/java/dev/pgm/community/moderation/punishments/types/KickPunishment.java @@ -2,21 +2,20 @@ import dev.pgm.community.moderation.punishments.Punishment; import dev.pgm.community.moderation.punishments.PunishmentType; -import java.time.Instant; -import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; public class KickPunishment extends Punishment { public KickPunishment( UUID id, UUID targetId, - Optional issuerId, + @Nullable UUID issuerId, String reason, - Instant timeIssued, + long timeIssued, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { super( PunishmentType.KICK, diff --git a/src/main/java/dev/pgm/community/moderation/punishments/types/MutePunishment.java b/src/main/java/dev/pgm/community/moderation/punishments/types/MutePunishment.java index badb931a..e5fa31f7 100644 --- a/src/main/java/dev/pgm/community/moderation/punishments/types/MutePunishment.java +++ b/src/main/java/dev/pgm/community/moderation/punishments/types/MutePunishment.java @@ -7,8 +7,8 @@ import dev.pgm.community.moderation.punishments.PunishmentType; import java.time.Duration; import java.time.Instant; -import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import tc.oc.pgm.util.Audience; @@ -18,13 +18,13 @@ public class MutePunishment extends ExpirablePunishment { public MutePunishment( UUID id, UUID targetId, - Optional issuerId, + @Nullable UUID issuerId, String reason, - Instant timeIssued, + long timeIssued, Duration length, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { super( PunishmentType.MUTE, diff --git a/src/main/java/dev/pgm/community/moderation/punishments/types/TempBanPunishment.java b/src/main/java/dev/pgm/community/moderation/punishments/types/TempBanPunishment.java index c3667a93..70bfd19a 100644 --- a/src/main/java/dev/pgm/community/moderation/punishments/types/TempBanPunishment.java +++ b/src/main/java/dev/pgm/community/moderation/punishments/types/TempBanPunishment.java @@ -2,22 +2,21 @@ import dev.pgm.community.moderation.punishments.PunishmentType; import java.time.Duration; -import java.time.Instant; -import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; public class TempBanPunishment extends ExpirablePunishment { public TempBanPunishment( UUID id, UUID targetId, - Optional issuerId, + @Nullable UUID issuerId, String reason, - Instant timeIssued, + long timeIssued, Duration length, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { super( PunishmentType.TEMP_BAN, diff --git a/src/main/java/dev/pgm/community/moderation/punishments/types/UsernameBanPunishment.java b/src/main/java/dev/pgm/community/moderation/punishments/types/UsernameBanPunishment.java index dd7e6e30..8bbbddb2 100644 --- a/src/main/java/dev/pgm/community/moderation/punishments/types/UsernameBanPunishment.java +++ b/src/main/java/dev/pgm/community/moderation/punishments/types/UsernameBanPunishment.java @@ -2,21 +2,20 @@ import dev.pgm.community.moderation.punishments.Punishment; import dev.pgm.community.moderation.punishments.PunishmentType; -import java.time.Instant; -import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; public class UsernameBanPunishment extends Punishment { public UsernameBanPunishment( UUID punishmentId, UUID targetId, - Optional issuerId, + @Nullable UUID issuerId, String reason, - Instant timeIssued, + long timeIssued, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { super( PunishmentType.NAME_BAN, diff --git a/src/main/java/dev/pgm/community/moderation/punishments/types/WarnPunishment.java b/src/main/java/dev/pgm/community/moderation/punishments/types/WarnPunishment.java index c81cafe9..c7808199 100644 --- a/src/main/java/dev/pgm/community/moderation/punishments/types/WarnPunishment.java +++ b/src/main/java/dev/pgm/community/moderation/punishments/types/WarnPunishment.java @@ -2,9 +2,9 @@ import dev.pgm.community.moderation.punishments.Punishment; import dev.pgm.community.moderation.punishments.PunishmentType; -import java.time.Instant; import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; import org.bukkit.entity.Player; import tc.oc.pgm.util.Audience; @@ -13,12 +13,12 @@ public class WarnPunishment extends Punishment { public WarnPunishment( UUID id, UUID targetId, - Optional issuerId, + @Nullable UUID issuerId, String reason, - Instant timeIssued, + long timeIssued, boolean active, - Instant lastUpdated, - Optional lastUpdatedBy, + long lastUpdated, + @Nullable UUID lastUpdatedBy, String service) { super( PunishmentType.WARN, diff --git a/src/main/java/dev/pgm/community/moderation/services/SQLModerationService.java b/src/main/java/dev/pgm/community/moderation/services/SQLModerationService.java index 25234266..655a1d29 100644 --- a/src/main/java/dev/pgm/community/moderation/services/SQLModerationService.java +++ b/src/main/java/dev/pgm/community/moderation/services/SQLModerationService.java @@ -17,6 +17,7 @@ import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import javax.annotation.Nullable; public class SQLModerationService extends SQLFeatureBase implements ModerationQuery { @@ -85,12 +86,10 @@ public CompletableFuture> queryList(String target) { String type = row.getString("type"); long time = Long.parseLong(row.getString("time")); long expires = Long.parseLong(row.getString("expires")); - Instant timeIssued = Instant.ofEpochMilli(time); Duration length = Duration.between(Instant.ofEpochMilli(time), Instant.ofEpochMilli(expires)); boolean active = row.get("active"); long lastUpdateTime = Long.parseLong(row.getString("last_updated")); - Instant lastUpdate = Instant.ofEpochMilli(lastUpdateTime); String lastUpdateBy = row.getString("updated_by"); String service = row.getString("service"); @@ -102,11 +101,11 @@ public CompletableFuture> queryList(String target) { playerId, parseIssuer(issuer), reason, - timeIssued, + time, length, PunishmentType.valueOf(type.toUpperCase()), active, - lastUpdate, + lastUpdateTime, parseIssuer(lastUpdateBy), service)); } @@ -143,16 +142,16 @@ private boolean isConsole(String data) { return data.equalsIgnoreCase(CONSOLE_DB_NAME); } - private Optional parseIssuer(String issuer) { - if (isConsole(issuer)) return Optional.empty(); - return Optional.of(UUID.fromString(issuer)); + private UUID parseIssuer(String issuer) { + if (isConsole(issuer)) return null; + return UUID.fromString(issuer); } - private String convertIssuer(Optional issuer) { - return issuer.isPresent() ? issuer.get().toString() : CONSOLE_DB_NAME; + private String convertIssuer(@Nullable UUID issuer) { + return issuer != null ? issuer.toString() : CONSOLE_DB_NAME; } - public CompletableFuture pardon(UUID id, Optional issuer) { + public CompletableFuture pardon(UUID id, @Nullable UUID issuer) { punishmentCache.invalidate(id); return DB.executeUpdateAsync( PARDON_QUERY + MULTI_PARDON_TYPE, @@ -178,7 +177,7 @@ public CompletableFuture deactivate(UUID id, PunishmentType punishmentT .thenApplyAsync(result -> result != 0); } - public CompletableFuture unmute(UUID id, Optional issuer) { + public CompletableFuture unmute(UUID id, @Nullable UUID issuer) { punishmentCache.invalidate(id); return DB.executeUpdateAsync( @@ -247,12 +246,10 @@ public CompletableFuture> getRecentPunishments(Duration period) String type = row.getString("type"); long time = Long.parseLong(row.getString("time")); long expires = Long.parseLong(row.getString("expires")); - Instant timeIssued = Instant.ofEpochMilli(time); Duration length = Duration.between(Instant.ofEpochMilli(time), Instant.ofEpochMilli(expires)); boolean active = row.get("active"); long lastUpdateTime = Long.parseLong(row.getString("last_updated")); - Instant lastUpdate = Instant.ofEpochMilli(lastUpdateTime); String lastUpdateBy = row.getString("updated_by"); String service = row.getString("service"); punishments.add( @@ -261,11 +258,11 @@ public CompletableFuture> getRecentPunishments(Duration period) UUID.fromString(target), parseIssuer(issuer), reason, - timeIssued, + time, length, PunishmentType.valueOf(type.toUpperCase()), active, - lastUpdate, + lastUpdateTime, parseIssuer(lastUpdateBy), service)); } diff --git a/src/main/java/dev/pgm/community/network/subs/NetworkSubscriber.java b/src/main/java/dev/pgm/community/network/subs/NetworkSubscriber.java index 37951ba3..4a6e88e7 100644 --- a/src/main/java/dev/pgm/community/network/subs/NetworkSubscriber.java +++ b/src/main/java/dev/pgm/community/network/subs/NetworkSubscriber.java @@ -1,6 +1,7 @@ package dev.pgm.community.network.subs; import com.google.gson.Gson; +import dev.pgm.community.utils.gson.GsonProvider; import java.util.logging.Logger; import redis.clients.jedis.JedisPubSub; @@ -15,7 +16,7 @@ public NetworkSubscriber(String channel, String networkId, Logger logger) { this.channel = channel; this.networkId = networkId; this.logger = logger; - this.gson = new Gson(); + this.gson = GsonProvider.get(); } public String getNetworkId() { diff --git a/src/main/java/dev/pgm/community/network/updates/NetworkUpdateBase.java b/src/main/java/dev/pgm/community/network/updates/NetworkUpdateBase.java index ef8a8891..a83eec07 100644 --- a/src/main/java/dev/pgm/community/network/updates/NetworkUpdateBase.java +++ b/src/main/java/dev/pgm/community/network/updates/NetworkUpdateBase.java @@ -1,6 +1,7 @@ package dev.pgm.community.network.updates; import com.google.gson.Gson; +import dev.pgm.community.utils.gson.GsonProvider; public abstract class NetworkUpdateBase implements NetworkUpdate { @@ -11,7 +12,7 @@ public abstract class NetworkUpdateBase implements NetworkUpdate { public NetworkUpdateBase(T item, String channel) { this.item = item; this.channel = channel; - this.gson = new Gson(); + this.gson = GsonProvider.get(); } @Override diff --git a/src/main/java/dev/pgm/community/utils/ImportUtils.java b/src/main/java/dev/pgm/community/utils/ImportUtils.java index ef00d5ba..c961a04e 100644 --- a/src/main/java/dev/pgm/community/utils/ImportUtils.java +++ b/src/main/java/dev/pgm/community/utils/ImportUtils.java @@ -8,6 +8,7 @@ import dev.pgm.community.moderation.punishments.Punishment; import dev.pgm.community.moderation.punishments.PunishmentType; import dev.pgm.community.users.feature.UsersFeature; +import dev.pgm.community.utils.gson.GsonProvider; import java.io.File; import java.io.FileNotFoundException; import java.nio.charset.Charset; @@ -18,14 +19,13 @@ import java.util.Arrays; import java.util.Date; import java.util.List; -import java.util.Optional; import java.util.UUID; import javax.annotation.Nullable; import tc.oc.pgm.util.text.TextException; public class ImportUtils { - private static final Gson GSON = new Gson(); + private static final Gson GSON = GsonProvider.get(); public static List getBukkitBans() throws TextException { File file = new File("banned-players.json"); @@ -105,14 +105,14 @@ public Punishment toPunishment(ModerationConfig config, UsersFeature users) { return Punishment.of( UUID.randomUUID(), getUUID(), - Optional.empty(), + null, getReason(), - getCreated(), + getCreated().toEpochMilli(), getDuration(), getDuration() != null ? PunishmentType.TEMP_BAN : PunishmentType.BAN, true, - getCreated(), - Optional.empty(), + getCreated().toEpochMilli(), + null, config.getService()); } } diff --git a/src/main/java/dev/pgm/community/utils/gson/GsonProvider.java b/src/main/java/dev/pgm/community/utils/gson/GsonProvider.java new file mode 100644 index 00000000..269e8daa --- /dev/null +++ b/src/main/java/dev/pgm/community/utils/gson/GsonProvider.java @@ -0,0 +1,13 @@ +package dev.pgm.community.utils.gson; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import dev.pgm.community.utils.gson.types.DurationConverter; +import java.time.Duration; + +public class GsonProvider { + + public static Gson get() { + return new GsonBuilder().registerTypeAdapter(Duration.class, new DurationConverter()).create(); + } +} diff --git a/src/main/java/dev/pgm/community/utils/gson/types/DurationConverter.java b/src/main/java/dev/pgm/community/utils/gson/types/DurationConverter.java new file mode 100644 index 00000000..d2e087d6 --- /dev/null +++ b/src/main/java/dev/pgm/community/utils/gson/types/DurationConverter.java @@ -0,0 +1,25 @@ +package dev.pgm.community.utils.gson.types; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Type; +import java.time.Duration; + +public class DurationConverter implements JsonSerializer, JsonDeserializer { + + @Override + public JsonElement serialize(Duration src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(src.toString()); + } + + @Override + public Duration deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return Duration.parse(json.getAsString()); + } +}