package io.github.lucaseasedup.logit.common; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; public final class PlayerCollections implements Listener { private PlayerCollections() { validateMaps(); validateCollections(); } @EventHandler(priority = EventPriority.NORMAL) private void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); for (Map<Player, ?> map : maps) { map.remove(player); } for (Collection<Player> collection : collections) { collection.remove(player); } } private void validateMaps() { for (Map<Player, ?> map : maps) { Iterator<Player> it = map.keySet().iterator(); while (it.hasNext()) { Player player = it.next(); if (!player.isOnline()) { it.remove(); } } } } private void validateCollections() { for (Collection<Player> collection : collections) { Iterator<Player> it = collection.iterator(); while (it.hasNext()) { Player player = it.next(); if (!player.isOnline()) { it.remove(); } } } } public static synchronized <T extends Map<Player, U>, U> T monitoredMap(T map) { if (map == null) throw new IllegalArgumentException(); maps.add(map); return map; } public static synchronized <T extends Collection<Player>> T monitoredCollection(T collection) { if (collection == null) throw new IllegalArgumentException(); collections.add(collection); return collection; } public static synchronized void registerListener(JavaPlugin plugin) { if (plugin == null) throw new IllegalArgumentException(); Bukkit.getPluginManager().registerEvents(new PlayerCollections(), plugin); } private static final Set<Map<Player, ?>> maps = new HashSet<>(); private static final Set<Collection<Player>> collections = new HashSet<>(); }