Gossip/Lib/src/main/java/dev/wiing/gossip/lib/PacketHandler.java

79 lines
2.4 KiB
Java

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