diff options
Diffstat (limited to 'src/main/java/de/hype/bbsentials/packets')
17 files changed, 519 insertions, 0 deletions
diff --git a/src/main/java/de/hype/bbsentials/packets/AbstractPacket.java b/src/main/java/de/hype/bbsentials/packets/AbstractPacket.java new file mode 100644 index 0000000..116c9b2 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/AbstractPacket.java @@ -0,0 +1,67 @@ +package de.hype.bbsentials.packets; + +import de.hype.bbsentials.chat.Chat; +import de.hype.bbsentials.client.BBsentials; +import de.hype.bbsentials.client.Config; +import de.hype.bbsentials.communication.BBsentialConnection; +import de.hype.bbsentials.packets.packets.InvalidCommandFeedbackPacket; + +import java.lang.reflect.Field; + +public class AbstractPacket { + public final int apiVersionMin; + public final int apiVersionMax; + + protected AbstractPacket(int apiVersionMin, int apiVersionMax) { + this.apiVersionMax = apiVersionMax; + this.apiVersionMin = apiVersionMin; + + } + + public boolean isValid(BBsentialConnection connection, String[] allowedNullFields) { + if (isApiSupported(BBsentials.config)) { + Chat.sendPrivateMessageToSelf("You are using an outdated version of the mod"); + } + return true; + } + + public boolean isApiSupported(Config config) { + //int version = Core.getConfig().getVersion(); + int version = config.getApiVersion(); + if (version >= apiVersionMin && version <= apiVersionMax) { + return true; + } + return false; + } + + public String hasNullFields(String[] allowedNullFields) { + Field[] fields = this.getClass().getDeclaredFields(); + if (!this.getClass().getSimpleName().equals(InvalidCommandFeedbackPacket.class.getSimpleName())) { + for (Field field : fields) { + field.setAccessible(true); + try { + if (field.get(this) == null) { + if (allowedNullFields == null) return field.getName(); + if (isAllowedNull(allowedNullFields, field.getName())) { + return field.getName(); + } + } + } catch (IllegalAccessException e) { + // Handle the exception if needed + e.printStackTrace(); + } + } + } + return null; + + } + + public boolean isAllowedNull(String[] allowedFields, String fieldName) { + for (String allowedField : allowedFields) { + if (allowedField.equals(fieldName)) { + return true; + } + } + return false; + } +}
\ No newline at end of file diff --git a/src/main/java/de/hype/bbsentials/packets/EnviromentPacketConfig.java b/src/main/java/de/hype/bbsentials/packets/EnviromentPacketConfig.java new file mode 100644 index 0000000..da05704 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/EnviromentPacketConfig.java @@ -0,0 +1,7 @@ +package de.hype.bbsentials.packets; + +public class EnviromentPacketConfig { + public static final String enviroment = "Client"; + public static final String notEnviroment = "Server"; + public static final int apiVersion = 1; +} diff --git a/src/main/java/de/hype/bbsentials/packets/Packet.java b/src/main/java/de/hype/bbsentials/packets/Packet.java new file mode 100644 index 0000000..6a4ecbf --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/Packet.java @@ -0,0 +1,26 @@ +package de.hype.bbsentials.packets; + +import java.util.function.Consumer; + +public class Packet<T extends AbstractPacket> { + + private final Class<T> clazz; + private final Consumer<T> consumer; + + public Packet(Class<T> clazz, Consumer<T> consumer) { + this.clazz = clazz; + this.consumer = consumer; + } + + public String getName() { + return clazz.getSimpleName(); + } + + public Class<T> getClazz() { + return clazz; + } + + public Consumer<T> getConsumer() { + return consumer; + } +} diff --git a/src/main/java/de/hype/bbsentials/packets/PacketManager.java b/src/main/java/de/hype/bbsentials/packets/PacketManager.java new file mode 100644 index 0000000..a6d94d4 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/PacketManager.java @@ -0,0 +1,48 @@ +package de.hype.bbsentials.packets; + +import de.hype.bbsentials.communication.BBsentialConnection; +import de.hype.bbsentials.packets.packets.*; + +import java.util.ArrayList; +import java.util.List; + +public class PacketManager { + private static List<Packet<? extends AbstractPacket>> packets = new ArrayList<>(); + + public List<Packet<? extends AbstractPacket>> getPackets() { + return packets; + } + + // Define a map to store packet classes and their associated actions + BBsentialConnection connection; + + // Method to initialize packet actions + public PacketManager(BBsentialConnection connection) { + this.connection = connection; + initializePacketActions(connection); + } + + public static void initializePacketActions(BBsentialConnection connection) { + packets.add(new Packet<>(SplashNotifyPacket.class, connection::onSplashNotify)); + packets.add(new Packet<>(BingoChatMessagePacket.class, connection::onBingoChatMessagePacket)); + packets.add(new Packet<>(ChChestPackage.class, connection::onChChestPackage)); +// packets.add(new Packet<>(DisconnectPacket.class, connection::dummy)); +// packets.add(new Packet<>(InternalCommandPacket.class, connection::dummy)); + packets.add(new Packet<>(MiningEventPacket.class, connection::onMiningEventPacket)); +// packets.add(new Packet<>(RequestConnectPacket.class, connection::dummy)); + packets.add(new Packet<>(WelcomeClientPacket.class, connection::onWelcomePacket)); + } + + // Method to handle a received packet + + + // method to get a list of all packets + public static List<Class<? extends AbstractPacket>> getAllPacketClasses() { + initializePacketActions(null); + List<Class<? extends AbstractPacket>> allPackets = new ArrayList<>(); + for (int i = 0; i < allPackets.size(); i++) { + allPackets.add(packets.get(i).getClazz()); + } + return allPackets; + } +} diff --git a/src/main/java/de/hype/bbsentials/packets/PacketUtils.java b/src/main/java/de/hype/bbsentials/packets/PacketUtils.java new file mode 100644 index 0000000..2c6d8a5 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/PacketUtils.java @@ -0,0 +1,122 @@ +package de.hype.bbsentials.packets; + +import com.google.gson.Gson; +import de.hype.bbsentials.client.CustomGson; +import de.hype.bbsentials.communication.BBsentialConnection; + +import java.util.function.Consumer; + + +public class PacketUtils { + public static final Gson gson = CustomGson.create(); + + public static String parsePacketToJson(AbstractPacket packet) { + return gson.toJson(packet); + } + + public static <T extends AbstractPacket> void tryToProcessPacket(Packet<T> packet, String rawJson) { + Class<T> clazz = packet.getClazz(); + Consumer<T> consumer = packet.getConsumer(); + T abstractPacket = gson.fromJson(rawJson, clazz); + consumer.accept(abstractPacket); + } + + private static void showError(Throwable t, String errorMessage) { + System.out.println(errorMessage + " because of: " + t.getClass().getSimpleName() + ": " + t.getMessage()); + new Error(errorMessage, t).printStackTrace(); + } + + public static class APIException extends Error { + + public APIException(String errorMessage, Throwable t) { + super(errorMessage, t); + } + + public APIException(String errorMessage) { + super(errorMessage); + } + } + + public static <T extends AbstractPacket> T getAsPacket(String message, Class<T> clazz) { + if (!message.contains(".")) return null; + String packetName = message.split("\\.")[0]; + String rawJson = message.substring(packetName.length() + 1); + if (!packetName.equals(clazz.getSimpleName())) { + try { + T parsedPacket = gson.fromJson(rawJson, clazz); + return parsedPacket; + } catch (Throwable t) { + showError(t, "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment); + } + } + String errorMessage = "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment; + + showError(new APIException("Found unknown packet: " + packetName + "'"), errorMessage); + return null; + } + +// public static <T extends AbstractPacket> T getAsPacket(String message) { +// if (!message.contains(".")) return null; +// String packetName = message.split("\\.")[0]; +// String rawJson = message.substring(packetName.length() + 1); +// +// for (Class<? extends AbstractPacket> clazz : PacketManager.getAllPacketClasses()) { +// if (packetName.equals(clazz.getSimpleName())) { +// try { +// if (clazz.isAssignableFrom(clazz)) { +// //TODO the problem +// T parsedPacket = (T) gson.fromJson(rawJson, clazz); +// return parsedPacket; +// } +// else { +// return null; +// } +// } catch (Throwable t) { +// showError(t, "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment); +// } +// } +// } +// return null; +// } + + public static boolean isPacket(String message, Class<? extends AbstractPacket> clazz) { + if (!message.contains(".")) return false; + String packetName = message.split("\\.")[0]; + if (packetName.equals(clazz.getSimpleName())) { + return true; + } + return false; + } + + public static boolean isPacket(String message) { + if (!message.contains(".")) return false; + String packetName = message.split("\\.")[0]; + for (Class<? extends AbstractPacket> packetClass : PacketManager.getAllPacketClasses()) { + if (!packetName.equals(packetClass.getSimpleName())) { + return true; + } + } + return false; + } + + public static <T extends AbstractPacket> boolean handleIfPacket(BBsentialConnection connection, String message) { + //Return = is Packet + if (!message.contains(".")) return false; + String packetName = message.split("\\.")[0]; + String rawJson = message.substring(packetName.length() + 1); + PacketManager manager = new PacketManager(connection); + for (Packet<? extends AbstractPacket> packet : manager.getPackets()) { + if (!packetName.equals(packet.getClazz().getSimpleName())) continue; + try { + tryToProcessPacket(packet, rawJson); + return true; + } catch (Throwable t) { + showError(t, "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment); + } + } + String errorMessage = "Could not process packet '" + packetName + "' from " + EnviromentPacketConfig.notEnviroment; + + showError(new APIException("Found unknown packet: " + packetName + "'"), errorMessage); + return false; + } +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/BingoChatMessagePacket.java b/src/main/java/de/hype/bbsentials/packets/packets/BingoChatMessagePacket.java new file mode 100644 index 0000000..56a7152 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/BingoChatMessagePacket.java @@ -0,0 +1,26 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.packets.AbstractPacket; + +public class BingoChatMessagePacket extends AbstractPacket { + + public BingoChatMessagePacket(String prefix, String username, String message, int bingo_cards) { + super(1, 1); //Min and Max supported Version + this.message = message; + this.username = username; + this.prefix = prefix; + this.bingo_cards = bingo_cards; + } + + public final String message; + public final String username; + public final String prefix; + public final int bingo_cards; + + public boolean baseCheck() { + boolean cancelPacket = false; + + return !cancelPacket; + } +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/BroadcastMessagePacket.java b/src/main/java/de/hype/bbsentials/packets/packets/BroadcastMessagePacket.java new file mode 100644 index 0000000..2e507c7 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/BroadcastMessagePacket.java @@ -0,0 +1,17 @@ +package de.hype.bbsentials.packets.packets; + +import de.hype.bbsentials.packets.AbstractPacket; + +public class BroadcastMessagePacket extends AbstractPacket { + + public final String message; + public final String username; + public final String prefix; + + public BroadcastMessagePacket(String prefix, String username, String message) { + super(1, 1); //Min and Max supported Version + this.message = message; + this.username = username; + this.prefix = prefix; + } +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/ChChestPackage.java b/src/main/java/de/hype/bbsentials/packets/packets/ChChestPackage.java new file mode 100644 index 0000000..e2252e8 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/ChChestPackage.java @@ -0,0 +1,24 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.constants.enviromentShared.ChChestItem; +import de.hype.bbsentials.packets.AbstractPacket; + +public class ChChestPackage extends AbstractPacket { + + public ChChestPackage(String announcerUsername, ChChestItem[] items, String locationCoords, String bbcommand, String extraMessage) { + super(1, 1); //Min and Max supported Version + this.announcerUsername = announcerUsername; + this.locationCoords = locationCoords; + this.bbcommand = bbcommand; + this.extraMessage = extraMessage; + this.items = items; + } + + public final String announcerUsername; + public final String locationCoords; + public final String bbcommand; + public final String extraMessage; + public final ChChestItem[] items; + +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/DisconnectPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/DisconnectPacket.java new file mode 100644 index 0000000..4a37693 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/DisconnectPacket.java @@ -0,0 +1,20 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.packets.AbstractPacket; + +public class DisconnectPacket extends AbstractPacket { + + public DisconnectPacket(String internalReason, int[] waitBeforeReconnect, String displayReason, String displayMessage) { + super(1, 1); //Min and Max supportet Version + this.internalReason = internalReason; + this.waitBeforeReconnect = waitBeforeReconnect; + this.displayReason = displayReason; + this.displayMessage = displayMessage; + } + public final String internalReason; + public final int[] waitBeforeReconnect; + public final String displayReason; + public final String displayMessage; + +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/DisplayMessagePacket.java b/src/main/java/de/hype/bbsentials/packets/packets/DisplayMessagePacket.java new file mode 100644 index 0000000..da99a99 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/DisplayMessagePacket.java @@ -0,0 +1,14 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.packets.AbstractPacket; + +public class DisplayMessagePacket extends AbstractPacket { + + public final String message; + + public DisplayMessagePacket(String message) { + super(1, 1); //Min and Max supported Version + this.message = message; + } +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/DisplayTellrawMessagePacket.java b/src/main/java/de/hype/bbsentials/packets/packets/DisplayTellrawMessagePacket.java new file mode 100644 index 0000000..9329878 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/DisplayTellrawMessagePacket.java @@ -0,0 +1,13 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.packets.AbstractPacket; + +public class DisplayTellrawMessagePacket extends AbstractPacket { + public final String rawJson; + + public DisplayTellrawMessagePacket(String rawJson) { + super(1, 1); //Min and Max supported Version + this.rawJson = rawJson; + } +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/InternalCommandPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/InternalCommandPacket.java new file mode 100644 index 0000000..cf8c8f7 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/InternalCommandPacket.java @@ -0,0 +1,18 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.packets.AbstractPacket; + +//Only used for small things which don't really need an own Packet. +public class InternalCommandPacket extends AbstractPacket { + + public InternalCommandPacket(String command, String[] parameters) { + super(1, 1); //Min and Max supported Version + this.command = command; + this.parameters = parameters; + } + + public final String command; + public final String[] parameters; + +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/InvalidCommandFeedbackPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/InvalidCommandFeedbackPacket.java new file mode 100644 index 0000000..b57be4a --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/InvalidCommandFeedbackPacket.java @@ -0,0 +1,25 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.packets.AbstractPacket; + +public class InvalidCommandFeedbackPacket extends AbstractPacket { + + public InvalidCommandFeedbackPacket(String internalReason, String command, String displayMessage, String argument, String permissionNeeded, String[] userPermissions) { + super(1, 1); //Min and Max supportet Version + this.internalReason = internalReason; + this.argument = argument; + this.permissionNeeded = permissionNeeded; + this.userPermissions = userPermissions; + this.command = command; + this.displayMessage = displayMessage; + } + + public final String internalReason; + public final String argument; + public final String permissionNeeded; + public final String[] userPermissions; + public final String command; + public final String displayMessage; + +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/MiningEventPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/MiningEventPacket.java new file mode 100644 index 0000000..5dd383f --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/MiningEventPacket.java @@ -0,0 +1,26 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.constants.enviromentShared.Islands; +import de.hype.bbsentials.constants.enviromentShared.MiningEvents; +import de.hype.bbsentials.packets.AbstractPacket; + +public class MiningEventPacket extends AbstractPacket { + + + public final MiningEvents event; + public final String username; + public final Islands island; + + public MiningEventPacket(MiningEvents event, String username, Islands island) throws Exception { + super(1, 1); //Min and Max supported Version + this.event = event; + this.username = username; + if (island.equals(Islands.CRYSTAL_HOLLOWS)) { + if (event.equals(MiningEvents.MITHRIL_GOURMAND) || event.equals(MiningEvents.RAFFLE) || event.equals(MiningEvents.GOBLIN_RAID)) { + throw new Exception("The specified event can not happen on this Server"); + } + } + this.island = island; + } +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/RequestConnectPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/RequestConnectPacket.java new file mode 100644 index 0000000..62bac83 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/RequestConnectPacket.java @@ -0,0 +1,21 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.packets.AbstractPacket; + +public class RequestConnectPacket extends AbstractPacket { + + + public RequestConnectPacket(String mcuuid, String key, int clientApiVersion, String authType ) { + super(1, 1); //Min and Max supported Version + this.mcuuid = mcuuid; + this.key = key; + this.authType = authType; + this.clientApiVersion = clientApiVersion; + } + + public final String mcuuid; + public final String key; + public final String authType; + public final int clientApiVersion; +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/SplashNotifyPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/SplashNotifyPacket.java new file mode 100644 index 0000000..bfdc275 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/SplashNotifyPacket.java @@ -0,0 +1,26 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.constants.enviromentShared.Islands; +import de.hype.bbsentials.packets.AbstractPacket; + +public class SplashNotifyPacket extends AbstractPacket { + + + public SplashNotifyPacket(int hub, String splasherUsername, String location, Islands hubType, String extraMessage, boolean lessWaste) { + super(1, 1); //Min and Max supported Version + this.hub = hub; + this.lessWaste = lessWaste; + this.splasherUsername = splasherUsername; + this.location = location; + this.hubType = hubType; + this.extraMessage = extraMessage; + } + + public final int hub; + public final boolean lessWaste; + public final String splasherUsername; + public final String location; + public final Islands hubType; + public final String extraMessage; +} diff --git a/src/main/java/de/hype/bbsentials/packets/packets/WelcomeClientPacket.java b/src/main/java/de/hype/bbsentials/packets/packets/WelcomeClientPacket.java new file mode 100644 index 0000000..4b2f7c3 --- /dev/null +++ b/src/main/java/de/hype/bbsentials/packets/packets/WelcomeClientPacket.java @@ -0,0 +1,19 @@ +package de.hype.bbsentials.packets.packets; + + +import de.hype.bbsentials.packets.AbstractPacket; + +public class WelcomeClientPacket extends AbstractPacket { + + public WelcomeClientPacket(String[] roles, String motd, boolean success) { + super(1, 1); //Min and Max supportet Version + this.roles = roles; + this.motd = motd; + this.success = success; + } + + public final String[] roles; + public final String motd; + public final boolean success; + +}
\ No newline at end of file |
