From 85605774cfe01392c2bf9f41b50d75a4ad5645bd Mon Sep 17 00:00:00 2001 From: Taah Date: Sat, 23 Mar 2024 08:14:36 -0700 Subject: [PATCH] fix mute & freeze not staying after relog add configurable timers for mute and freeze --- .../java/dev/plex/command/impl/FreezeCMD.java | 3 +- .../java/dev/plex/command/impl/MuteCMD.java | 3 +- .../dev/plex/command/impl/UnfreezeCMD.java | 17 +++++-- .../java/dev/plex/command/impl/UnmuteCMD.java | 17 +++++-- .../plex/menu/impl/PunishedPlayerMenu.java | 2 +- .../main/java/dev/plex/player/PlexPlayer.java | 8 +++ .../plex/punishment/PunishmentManager.java | 27 +++++++--- .../storage/punishment/SQLPunishment.java | 51 ++++++++++++------- .../main/java/dev/plex/util/sql/SQLUtil.java | 23 ++++++--- .../main/java/dev/plex/util/sql/Table.java | 3 +- server/src/main/resources/config.yml | 4 ++ 11 files changed, 117 insertions(+), 41 deletions(-) diff --git a/server/src/main/java/dev/plex/command/impl/FreezeCMD.java b/server/src/main/java/dev/plex/command/impl/FreezeCMD.java index 22ce9a5..3819a83 100644 --- a/server/src/main/java/dev/plex/command/impl/FreezeCMD.java +++ b/server/src/main/java/dev/plex/command/impl/FreezeCMD.java @@ -41,11 +41,12 @@ public class FreezeCMD extends PlexCommand Punishment punishment = new Punishment(punishedPlayer.getUuid(), getUUID(sender)); punishment.setCustomTime(false); ZonedDateTime date = ZonedDateTime.now(ZoneId.of(TimeUtils.TIMEZONE)); - punishment.setEndDate(date.plusMinutes(5)); + punishment.setEndDate(date.plusSeconds(plugin.config.getInt("punishments.freeze-timer", 300))); punishment.setType(PunishmentType.FREEZE); punishment.setPunishedUsername(player.getName()); punishment.setIp(player.getAddress().getAddress().getHostAddress().trim()); punishment.setReason(""); + punishment.setActive(true); plugin.getPunishmentManager().punish(punishedPlayer, punishment); PlexUtils.broadcast(messageComponent("frozePlayer", sender.getName(), player.getName())); diff --git a/server/src/main/java/dev/plex/command/impl/MuteCMD.java b/server/src/main/java/dev/plex/command/impl/MuteCMD.java index 5b6f185..06313e1 100644 --- a/server/src/main/java/dev/plex/command/impl/MuteCMD.java +++ b/server/src/main/java/dev/plex/command/impl/MuteCMD.java @@ -47,11 +47,12 @@ public class MuteCMD extends PlexCommand Punishment punishment = new Punishment(punishedPlayer.getUuid(), getUUID(sender)); punishment.setCustomTime(false); ZonedDateTime date = ZonedDateTime.now(ZoneId.of(TimeUtils.TIMEZONE)); - punishment.setEndDate(date.plusMinutes(5)); + punishment.setEndDate(date.plusSeconds(plugin.config.getInt("punishments.mute-timer", 300))); punishment.setType(PunishmentType.MUTE); punishment.setPunishedUsername(player.getName()); punishment.setIp(player.getAddress().getAddress().getHostAddress().trim()); punishment.setReason(""); + punishment.setActive(true); plugin.getPunishmentManager().punish(punishedPlayer, punishment); PlexUtils.broadcast(messageComponent("mutedPlayer", sender.getName(), player.getName())); diff --git a/server/src/main/java/dev/plex/command/impl/UnfreezeCMD.java b/server/src/main/java/dev/plex/command/impl/UnfreezeCMD.java index a0d2e98..2b0b492 100644 --- a/server/src/main/java/dev/plex/command/impl/UnfreezeCMD.java +++ b/server/src/main/java/dev/plex/command/impl/UnfreezeCMD.java @@ -1,11 +1,14 @@ package dev.plex.command.impl; import com.google.common.collect.ImmutableList; +import dev.plex.cache.DataUtils; import dev.plex.command.PlexCommand; import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.exception.CommandFailException; +import dev.plex.command.exception.PlayerNotFoundException; import dev.plex.player.PlexPlayer; +import dev.plex.punishment.PunishmentType; import dev.plex.util.PlexUtils; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; @@ -26,14 +29,22 @@ public class UnfreezeCMD extends PlexCommand { return usage(); } - Player player = getNonNullPlayer(args[0]); - PlexPlayer punishedPlayer = getOfflinePlexPlayer(player.getUniqueId()); + PlexPlayer punishedPlayer = DataUtils.getPlayer(args[0]); + if (punishedPlayer == null) + { + throw new PlayerNotFoundException(); + } + if (!punishedPlayer.isFrozen()) { throw new CommandFailException(PlexUtils.messageString("playerNotFrozen")); } punishedPlayer.setFrozen(false); - PlexUtils.broadcast(messageComponent("unfrozePlayer", sender.getName(), player.getName())); + punishedPlayer.getPunishments().stream().filter(punishment -> punishment.getType() == PunishmentType.FREEZE && punishment.isActive()).forEach(punishment -> { + punishment.setActive(false); + plugin.getSqlPunishment().updatePunishment(punishment.getType(), false, punishment.getPunished()); + }); + PlexUtils.broadcast(messageComponent("unfrozePlayer", sender.getName(), punishedPlayer.getName())); return null; } diff --git a/server/src/main/java/dev/plex/command/impl/UnmuteCMD.java b/server/src/main/java/dev/plex/command/impl/UnmuteCMD.java index 8261d1a..ca73e0f 100644 --- a/server/src/main/java/dev/plex/command/impl/UnmuteCMD.java +++ b/server/src/main/java/dev/plex/command/impl/UnmuteCMD.java @@ -1,11 +1,14 @@ package dev.plex.command.impl; import com.google.common.collect.ImmutableList; +import dev.plex.cache.DataUtils; import dev.plex.command.PlexCommand; import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.exception.CommandFailException; +import dev.plex.command.exception.PlayerNotFoundException; import dev.plex.player.PlexPlayer; +import dev.plex.punishment.PunishmentType; import dev.plex.util.PlexUtils; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; @@ -26,14 +29,22 @@ public class UnmuteCMD extends PlexCommand { return usage(); } - Player player = getNonNullPlayer(args[0]); - PlexPlayer punishedPlayer = getOfflinePlexPlayer(player.getUniqueId()); + PlexPlayer punishedPlayer = DataUtils.getPlayer(args[0]); + if (punishedPlayer == null) + { + throw new PlayerNotFoundException(); + } + if (!punishedPlayer.isMuted()) { throw new CommandFailException(PlexUtils.messageString("playerNotMuted")); } punishedPlayer.setMuted(false); - PlexUtils.broadcast(messageComponent("unmutedPlayer", sender.getName(), player.getName())); + punishedPlayer.getPunishments().stream().filter(punishment -> punishment.getType() == PunishmentType.MUTE && punishment.isActive()).forEach(punishment -> { + punishment.setActive(false); + plugin.getSqlPunishment().updatePunishment(punishment.getType(), false, punishment.getPunished()); + }); + PlexUtils.broadcast(messageComponent("unmutedPlayer", sender.getName(), punishedPlayer.getName())); return null; } diff --git a/server/src/main/java/dev/plex/menu/impl/PunishedPlayerMenu.java b/server/src/main/java/dev/plex/menu/impl/PunishedPlayerMenu.java index 256edd6..7a9f758 100644 --- a/server/src/main/java/dev/plex/menu/impl/PunishedPlayerMenu.java +++ b/server/src/main/java/dev/plex/menu/impl/PunishedPlayerMenu.java @@ -26,7 +26,7 @@ public class PunishedPlayerMenu extends PageableMenu @Override protected ItemStack toItem(Punishment object) { - return new ItemBuilder(Material.PAPER).displayName("" + object.getType().name()).lore("By: " + (object.getPunisher() == null ? "CONSOLE" : Plex.get().getSqlPlayerData().getNameByUUID(object.getPunished())), "Expire(d/s): " + TimeUtils.useTimezone(object.getEndDate()), "Reason: " + object.getReason()).build(); + return new ItemBuilder(Material.PAPER).displayName("" + object.getType().name()).lore("By: " + (object.getPunisher() == null ? "CONSOLE" : Plex.get().getSqlPlayerData().getNameByUUID(object.getPunisher())), "Expire(d/s): " + TimeUtils.useTimezone(object.getEndDate()), "Reason: " + object.getReason()).build(); } @Override diff --git a/server/src/main/java/dev/plex/player/PlexPlayer.java b/server/src/main/java/dev/plex/player/PlexPlayer.java index 0b6dc8a..015e75c 100644 --- a/server/src/main/java/dev/plex/player/PlexPlayer.java +++ b/server/src/main/java/dev/plex/player/PlexPlayer.java @@ -4,6 +4,7 @@ import com.google.common.collect.Lists; import com.google.gson.GsonBuilder; import dev.plex.Plex; import dev.plex.punishment.Punishment; +import dev.plex.punishment.PunishmentType; import dev.plex.punishment.extra.Note; import dev.plex.storage.annotation.MapObjectList; import dev.plex.storage.annotation.PrimaryKey; @@ -79,6 +80,7 @@ public class PlexPlayer if (loadPunishments) { this.loadPunishments(); + this.checkMutesAndFreeze(); // this.permissions.addAll(Plex.get().getSqlPermissions().getPermissions(this.uuid)); } } @@ -93,6 +95,12 @@ public class PlexPlayer return PlainTextComponentSerializer.plainText().serialize(getPlayer().displayName()); } + public void checkMutesAndFreeze() { + final ZonedDateTime now = ZonedDateTime.now(); + this.muted = this.punishments.stream().filter(punishment -> punishment.getType() == PunishmentType.MUTE).anyMatch(punishment -> punishment.isActive() && now.isBefore(punishment.getEndDate())); + this.frozen = this.punishments.stream().filter(punishment -> punishment.getType() == PunishmentType.FREEZE).anyMatch(punishment -> punishment.isActive() && now.isBefore(punishment.getEndDate())); + } + public void loadPunishments() { this.setPunishments(Plex.get().getSqlPunishment().getPunishments(this.getUuid())); diff --git a/server/src/main/java/dev/plex/punishment/PunishmentManager.java b/server/src/main/java/dev/plex/punishment/PunishmentManager.java index 40ab6b5..5df1ff9 100644 --- a/server/src/main/java/dev/plex/punishment/PunishmentManager.java +++ b/server/src/main/java/dev/plex/punishment/PunishmentManager.java @@ -147,7 +147,6 @@ public class PunishmentManager implements PlexBase public Punishment getBanByIP(String ip) { - final Gson gson = new GsonBuilder().registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeAdapter()).setPrettyPrinting().create(); return plugin.getSqlPunishment().getPunishments(ip).stream().filter(punishment -> punishment.getType() == PunishmentType.TEMPBAN || punishment.getType() == PunishmentType.BAN).filter(Punishment::isActive).filter(punishment -> punishment.getIp().equals(ip)).findFirst().orElse(null); } @@ -180,6 +179,11 @@ public class PunishmentManager implements PlexBase return Plex.get().getSqlPunishment().removeBan(uuid); } + public void updateOutdatedPunishments(PlexPlayer player) + { + + } + private void doPunishment(PlexPlayer player, Punishment punishment) { if (punishment.getType() == PunishmentType.FREEZE) @@ -193,13 +197,18 @@ public class PunishmentManager implements PlexBase @Override public void run() { - if (!player.isFrozen()) + PlexPlayer afterPlayer = DataUtils.getPlayer(player.getUuid()); + if (!afterPlayer.isFrozen()) { this.cancel(); return; } - player.setFrozen(false); - Bukkit.broadcast(PlexUtils.messageComponent("unfrozePlayer", "Plex", Bukkit.getOfflinePlayer(player.getUuid()).getName())); + afterPlayer.setFrozen(false); + punishment.setActive(false); + plugin.getSqlPunishment().updatePunishment(punishment.getType(), false, punishment.getPunished()); + + DataUtils.update(afterPlayer); + Bukkit.broadcast(PlexUtils.messageComponent("unfrozePlayer", "Plex", Bukkit.getOfflinePlayer(afterPlayer.getUuid()).getName())); } }.runTaskLater(Plex.get(), 20 * seconds); } @@ -214,13 +223,17 @@ public class PunishmentManager implements PlexBase @Override public void run() { - if (!player.isMuted()) + PlexPlayer afterPlayer = DataUtils.getPlayer(player.getUuid()); + if (!afterPlayer.isMuted()) { this.cancel(); return; } - player.setMuted(false); - Bukkit.broadcast(PlexUtils.messageComponent("unmutedPlayer", "Plex", Bukkit.getOfflinePlayer(player.getUuid()).getName())); + afterPlayer.setMuted(false); + punishment.setActive(false); + plugin.getSqlPunishment().updatePunishment(punishment.getType(), false, punishment.getPunished()); + + Bukkit.broadcast(PlexUtils.messageComponent("unmutedPlayer", "Plex", Bukkit.getOfflinePlayer(afterPlayer.getUuid()).getName())); } }.runTaskLater(Plex.get(), 20 * seconds); } 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 cd83920..0e9ac5d 100644 --- a/server/src/main/java/dev/plex/storage/punishment/SQLPunishment.java +++ b/server/src/main/java/dev/plex/storage/punishment/SQLPunishment.java @@ -25,7 +25,7 @@ public class SQLPunishment 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 UPDATE_BAN = "UPDATE `punishments` SET active=? WHERE active=? AND punished=? AND type=?"; + private static final String UPDATE_PUNISHMENT = "UPDATE `punishments` SET active=? WHERE punished=? AND type=?"; public CompletableFuture> getPunishments() { @@ -145,17 +145,16 @@ public class SQLPunishment { try (Connection con = Plex.get().getSqlConnection().getCon()) { - PreparedStatement statement = con.prepareStatement(UPDATE_BAN); + PreparedStatement statement = con.prepareStatement(UPDATE_PUNISHMENT); statement.setBoolean(1, false); - statement.setBoolean(2, true); - statement.setString(3, uuid.toString()); - statement.setString(4, PunishmentType.BAN.name()); + statement.setString(2, uuid.toString()); + statement.setString(3, PunishmentType.BAN.name()); + statement.executeUpdate(); - PreparedStatement statement1 = con.prepareStatement(UPDATE_BAN); + PreparedStatement statement1 = con.prepareStatement(UPDATE_PUNISHMENT); statement1.setBoolean(1, false); - statement1.setBoolean(2, true); - statement1.setString(3, uuid.toString()); - statement1.setString(4, PunishmentType.TEMPBAN.name()); + statement1.setString(2, uuid.toString()); + statement1.setString(3, PunishmentType.TEMPBAN.name()); statement1.executeUpdate(); } catch (SQLException e) @@ -164,24 +163,41 @@ public class SQLPunishment } } + public CompletableFuture updatePunishment(PunishmentType type, boolean active, UUID punished) + { + return CompletableFuture.runAsync(() -> + { + try (Connection con = Plex.get().getSqlConnection().getCon()) + { + PreparedStatement statement = con.prepareStatement(UPDATE_PUNISHMENT); + statement.setBoolean(1, active); + statement.setString(2, punished.toString()); + statement.setString(3, type.name()); + statement.executeUpdate(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + }); + } + public CompletableFuture removeBan(UUID uuid) { return CompletableFuture.runAsync(() -> { try (Connection con = Plex.get().getSqlConnection().getCon()) { - PreparedStatement statement = con.prepareStatement(UPDATE_BAN); + PreparedStatement statement = con.prepareStatement(UPDATE_PUNISHMENT); statement.setBoolean(1, false); - statement.setBoolean(2, true); - statement.setString(3, uuid.toString()); - statement.setString(4, PunishmentType.BAN.name()); + statement.setString(2, uuid.toString()); + statement.setString(3, PunishmentType.BAN.name()); statement.executeUpdate(); - PreparedStatement statement1 = con.prepareStatement(UPDATE_BAN); + PreparedStatement statement1 = con.prepareStatement(UPDATE_PUNISHMENT); statement1.setBoolean(1, false); - statement1.setBoolean(2, true); - statement1.setString(3, uuid.toString()); - statement1.setString(4, PunishmentType.TEMPBAN.name()); + statement1.setString(2, uuid.toString()); + statement1.setString(3, PunishmentType.TEMPBAN.name()); statement1.executeUpdate(); } catch (SQLException e) @@ -190,4 +206,5 @@ public class SQLPunishment } }); } + } diff --git a/server/src/main/java/dev/plex/util/sql/SQLUtil.java b/server/src/main/java/dev/plex/util/sql/SQLUtil.java index aa50fac..54d61db 100644 --- a/server/src/main/java/dev/plex/util/sql/SQLUtil.java +++ b/server/src/main/java/dev/plex/util/sql/SQLUtil.java @@ -2,6 +2,7 @@ package dev.plex.util.sql; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import dev.plex.punishment.PunishmentType; import dev.plex.storage.annotation.*; import dev.plex.util.PlexLog; @@ -13,10 +14,7 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.time.ZonedDateTime; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; /** @@ -25,7 +23,7 @@ import java.util.stream.Collectors; */ public class SQLUtil { - public static final List TABLES = Lists.newArrayList(); + public static final Map TABLES = Maps.newHashMap(); public static List createTable(List result, Class clazz) { @@ -83,7 +81,7 @@ public class SQLUtil mainResult.append(");"); result.add(mainResult.toString()); - TABLES.add(table); + TABLES.put(table.name(), table); if (primaryKey == null && !collectionFields.isEmpty()) { @@ -113,11 +111,22 @@ public class SQLUtil writeFieldToSQL(listTable, sql, Mapper.getByClass(finalPrimaryKey.getType()), finalPrimaryKey); sql.append(");"); result.add(sql.toString()); - table.mappedTables().add(listTable); + table.mappedTables().put(field, listTable); }); return result; } + public static void update(String tableName, Object object) + { + final Table table = TABLES.get(tableName); + if (table == null) + { + PlexLog.error("Table {0} was not found", tableName); + return; + } + + } + private static void writeFieldToSQL(Table table, StringBuilder sb, Mapper mapped, Field field) { diff --git a/server/src/main/java/dev/plex/util/sql/Table.java b/server/src/main/java/dev/plex/util/sql/Table.java index a1534bd..3c02668 100644 --- a/server/src/main/java/dev/plex/util/sql/Table.java +++ b/server/src/main/java/dev/plex/util/sql/Table.java @@ -5,6 +5,7 @@ import com.google.common.collect.Maps; import lombok.Data; import lombok.experimental.Accessors; +import java.lang.reflect.Field; import java.util.List; import java.util.Map; @@ -19,5 +20,5 @@ public class Table { private final String name; private final Map columns = Maps.newHashMap(); - private final List
mappedTables = Lists.newArrayList(); + private final Map mappedTables = Maps.newHashMap(); } diff --git a/server/src/main/resources/config.yml b/server/src/main/resources/config.yml index 6de6b0a..7d3c2f0 100644 --- a/server/src/main/resources/config.yml +++ b/server/src/main/resources/config.yml @@ -14,6 +14,10 @@ server: banning: ban_url: "https://forum.plex.us.org" +punishments: + mute-timer: 300 + freeze-timer: 300 + chat: # Should the server use Plex's chat system? It is recommended to keep this on if you are using ranks. # If you are using permissions, you should turn this off and use Vault to handle prefixes with a different chat plugin