package dev.wiing.gossip.lib; import dev.wiing.gossip.lib.packets.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; public class PacketHandler { private final Map, Packet> packetClassMap = new HashMap<>(); private final Map, Set>> listeners = new ConcurrentHashMap<>(); public void clearPacketMap() { packetClassMap.clear(); } public void addPacketToMap(Packet packet) { packetClassMap.put(packet.getClass(), packet); } public void addAllPacketsToMap(Collection packets) { packetClassMap.putAll(packets.stream() .collect(Collectors.toMap(Packet::getClass, o -> o))); } public void addListener(Class type, PacketListener listener) { if (!listeners.containsKey(type)) { listeners.put(type, new HashSet<>()); } listeners.get(type).add(listener); } public void removeListener(Class type, PacketListener listener) { if (!listeners.containsKey(type)) { return; } listeners.get(type).remove(listener); } public boolean runPacket(Class packetClass, T packet) { Set> result = getListeners(packetClass); if (result == null || result.isEmpty()) return false; for (PacketListener packetListener : result) { packetListener.onReceive(packet); } return true; } public boolean runPacket(Packet packet) { return runPacket((Class)packet.getClass(), packet); } public Set> getListeners(Class packetClass) { if (!listeners.containsKey(packetClass)) return null; return listeners.get(packetClass).stream() .map(listener -> (PacketListener) listener) .collect(Collectors.toSet()); } public List getListeningTypes() { return listeners.entrySet().stream() .filter(classSetEntry -> !classSetEntry.getValue().isEmpty()) .map(Map.Entry::getKey) .map(packetClassMap::get) .map(Packet::getType) .collect(Collectors.toList()); } }