diff --git a/src/main/java/de/shiewk/smoderation/paper/SModerationPaper.java b/src/main/java/de/shiewk/smoderation/paper/SModerationPaper.java index 69a6fcd..d9f7168 100644 --- a/src/main/java/de/shiewk/smoderation/paper/SModerationPaper.java +++ b/src/main/java/de/shiewk/smoderation/paper/SModerationPaper.java @@ -95,6 +95,7 @@ public final class SModerationPaper extends JavaPlugin { @Override public void onEnable() { if (isFeatureEnabled("punishments")) listen(new PunishmentListener(punishmentManager)); + if (isFeatureEnabled("punishments")) listen(new CacheListener(punishmentManager)); if (isFeatureEnabled("invsee")) listen(new InvSeeListener()); if (isFeatureEnabled("enderchestsee")) listen(new EnderchestSeeListener()); if (isFeatureEnabled("socialspy")) listen(new SocialSpyListener()); diff --git a/src/main/java/de/shiewk/smoderation/paper/listener/CacheListener.java b/src/main/java/de/shiewk/smoderation/paper/listener/CacheListener.java new file mode 100644 index 0000000..7d97e0c --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/paper/listener/CacheListener.java @@ -0,0 +1,35 @@ +package de.shiewk.smoderation.paper.listener; + +import de.shiewk.smoderation.paper.punishments.PunishmentManager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import static de.shiewk.smoderation.paper.SModerationPaper.LOGGER; +import static net.kyori.adventure.text.Component.translatable; + +public class CacheListener implements Listener { + + private final PunishmentManager punishmentManager; + + public CacheListener(PunishmentManager punishmentManager) { + this.punishmentManager = punishmentManager; + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event){ + try { + punishmentManager.loadToCache(event.getPlayer().getUniqueId()); + } catch (Exception e) { + LOGGER.error("Failed to load punishments", e); + event.getPlayer().kick(translatable("mco.errorMessage.connectionFailure")); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event){ + punishmentManager.removeFromCache(event.getPlayer().getUniqueId()); + } + +} diff --git a/src/main/java/de/shiewk/smoderation/paper/punishments/PunishmentManager.java b/src/main/java/de/shiewk/smoderation/paper/punishments/PunishmentManager.java index cd5ee7d..ae8592b 100644 --- a/src/main/java/de/shiewk/smoderation/paper/punishments/PunishmentManager.java +++ b/src/main/java/de/shiewk/smoderation/paper/punishments/PunishmentManager.java @@ -22,6 +22,7 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.List; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; import java.util.stream.Stream; @@ -31,6 +32,7 @@ public final class PunishmentManager { private static final Logger log = LoggerFactory.getLogger(PunishmentManager.class); private final Object2ObjectArrayMap> typeRegistry = new Object2ObjectArrayMap<>(1); + private final ConcurrentHashMap> cache = new ConcurrentHashMap<>(1); private final Object ioLock = new Object(); private final Path dataDir; @@ -58,8 +60,13 @@ public final class PunishmentManager { } public List byTargetUUID(UUID target) { + List cached = cache.get(target); + if (cached != null) { + return cached; + } synchronized (ioLock) { Path file = getTargetFile(target); + if (!Files.exists(file)) { return List.of(); } @@ -129,6 +136,7 @@ public final class PunishmentManager { writer.append('\n'); } } + addToCachedList(punishment); } public @NotNull List getAll() throws IOException { @@ -165,4 +173,21 @@ public final class PunishmentManager { } } + public void loadToCache(UUID uuid) { + removeFromCache(uuid); + cache.put(uuid, byTargetUUID(uuid)); + } + + public void removeFromCache(UUID uuid) { + cache.remove(uuid); + } + + private void addToCachedList(Punishment punishment) { + cache.computeIfPresent(punishment.getTargetID(), (k, v) -> { + ObjectArrayList newList = new ObjectArrayList<>(v); + newList.add(punishment); + return List.copyOf(newList); + }); + } + }