From a4999a28a1d7c9f116f3b96475af0c7ebf1904f5 Mon Sep 17 00:00:00 2001 From: aro Date: Mon, 13 Feb 2023 18:08:45 +0100 Subject: [PATCH] feat: bungeecord support on proxy and some optimizations --- .gitignore | 5 ++- core/dependency-reduced-pom.xml | 13 ++++++ core/pom.xml | 12 +++++ .../main/java/net/artelnatif/nicko/Nicko.java | 4 ++ .../artelnatif/nicko/bukkit/NickoBukkit.java | 42 ++++++++---------- .../artelnatif/nicko/bungee/NickoBungee.java | 11 ++++- .../nicko/bungee/PluginMessageSender.java | 17 +++++++ .../nicko/bungee/in/MessageHandler.java | 44 +++++++++++++++++++ 8 files changed, 122 insertions(+), 26 deletions(-) create mode 100644 core/src/main/java/net/artelnatif/nicko/bungee/in/MessageHandler.java diff --git a/.gitignore b/.gitignore index 53ad6af..785cb64 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,7 @@ v1_19_R1/target .idea # Build folder -target \ No newline at end of file +target + +# Maven Dependency Reduced Pom +core/dependency-reduced-pom.xml \ No newline at end of file diff --git a/core/dependency-reduced-pom.xml b/core/dependency-reduced-pom.xml index cb568d5..31583cc 100644 --- a/core/dependency-reduced-pom.xml +++ b/core/dependency-reduced-pom.xml @@ -160,8 +160,21 @@ + + org.cache2k + cache2k-api + 2.6.1.Final + compile + + + org.cache2k + cache2k-core + 2.6.1.Final + runtime + + 2.6.1.Final UTF-8 diff --git a/core/pom.xml b/core/pom.xml index 8cf7eec..b939201 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -15,6 +15,7 @@ UTF-8 + 2.6.1.Final @@ -114,6 +115,17 @@ jackson-dataformat-yaml 2.14.0-rc1 + + org.cache2k + cache2k-api + ${cache2k-version} + + + org.cache2k + cache2k-core + ${cache2k-version} + runtime + diff --git a/core/src/main/java/net/artelnatif/nicko/Nicko.java b/core/src/main/java/net/artelnatif/nicko/Nicko.java index 4f4c1d1..4711c1f 100644 --- a/core/src/main/java/net/artelnatif/nicko/Nicko.java +++ b/core/src/main/java/net/artelnatif/nicko/Nicko.java @@ -12,6 +12,10 @@ import java.io.IOException; import java.util.logging.Logger; public class Nicko { + public static final String CHANNEL = "nicko:"; + public static final String MESSAGE_UPDATE = CHANNEL + "update"; + public static final String MESSAGE_FETCH = CHANNEL + "fetch"; + private ConfigurationManager configManager; private Logger logger; private File dataFolder; diff --git a/core/src/main/java/net/artelnatif/nicko/bukkit/NickoBukkit.java b/core/src/main/java/net/artelnatif/nicko/bukkit/NickoBukkit.java index c5cccbf..f35c424 100644 --- a/core/src/main/java/net/artelnatif/nicko/bukkit/NickoBukkit.java +++ b/core/src/main/java/net/artelnatif/nicko/bukkit/NickoBukkit.java @@ -11,8 +11,6 @@ import net.artelnatif.nicko.bukkit.gui.items.main.ExitGUI; import net.artelnatif.nicko.bukkit.i18n.Locale; import net.artelnatif.nicko.bukkit.i18n.LocaleFileManager; import net.artelnatif.nicko.bukkit.placeholder.PlaceHolderHook; -import net.artelnatif.nicko.bukkit.messaging.PluginMessageEvent; -import net.artelnatif.nicko.bungee.NickoBungee; import net.artelnatif.nicko.config.Configuration; import net.artelnatif.nicko.impl.Internals; import net.artelnatif.nicko.impl.InternalsProvider; @@ -50,31 +48,22 @@ public class NickoBukkit extends JavaPlugin { plugin = this; nicko.initBukkit(this); - if (unitTesting) onUnitTestingStartup(); - else onPluginStartup(); - } - - public void onUnitTestingStartup() { - if (!nicko.getDataStore().getStorage().getProvider().init()) { - nicko.getDataStore().getStorage().setError(true); - getLogger().severe("Failed to open persistence, data will NOT be saved!"); - } - } - - public void onPluginStartup() { - getLogger().info("Loading internals..."); - if (getInternals() == null) { - getLogger().severe("Nicko could not find a valid implementation for this server version. Is your server supported?"); - nicko.getDataStore().getStorage().setError(true); - getServer().getPluginManager().disablePlugin(this); - } - - if (getServer().getPluginManager().isPluginEnabled(this) && !nicko.getDataStore().getStorage().isError()) { + if (!nicko.getDataStore().getStorage().isError()) { getLogger().info("Loading persistence..."); if (!nicko.getDataStore().getStorage().getProvider().init()) { nicko.getDataStore().getStorage().setError(true); getLogger().severe("Failed to open persistence, data will NOT be saved!"); } + } + + if (!unitTesting) { + getLogger().info("Loading internals..."); + if (getInternals() == null) { + getLogger().severe("Nicko could not find a valid implementation for this server version. Is your server supported?"); + nicko.getDataStore().getStorage().setError(true); + getServer().getPluginManager().disablePlugin(this); + } + localeFileManager = new LocaleFileManager(); if (nicko.getConfig().isCustomLocale()) { @@ -104,7 +93,7 @@ public class NickoBukkit extends JavaPlugin { if (nicko.getConfig().isBungeecord()) { if (support.stopIfBungeeCordIsNotEnabled()) { getLogger().info("Enabling BungeeCord support..."); - getServer().getMessenger().registerIncomingPluginChannel(this, NickoBungee.PROXY_UPDATE, new PluginMessageEvent()); + //TODO: Enable BungeeCord } } @@ -112,6 +101,13 @@ public class NickoBukkit extends JavaPlugin { } } + public void onUnitTestingStartup() { + if (!nicko.getDataStore().getStorage().getProvider().init()) { + nicko.getDataStore().getStorage().setError(true); + getLogger().severe("Failed to open persistence, data will NOT be saved!"); + } + } + @Override public void onDisable() { if (!nicko.getDataStore().getStorage().isError()) { diff --git a/core/src/main/java/net/artelnatif/nicko/bungee/NickoBungee.java b/core/src/main/java/net/artelnatif/nicko/bungee/NickoBungee.java index 19fca8c..39adf0b 100644 --- a/core/src/main/java/net/artelnatif/nicko/bungee/NickoBungee.java +++ b/core/src/main/java/net/artelnatif/nicko/bungee/NickoBungee.java @@ -3,12 +3,13 @@ package net.artelnatif.nicko.bungee; import net.artelnatif.nicko.Nicko; import net.artelnatif.nicko.disguise.NickoProfile; import net.md_5.bungee.api.plugin.Plugin; +import org.cache2k.Cache; +import org.cache2k.Cache2kBuilder; -import java.util.HashMap; import java.util.UUID; public class NickoBungee extends Plugin { - private final HashMap profiles = new HashMap<>(); + private final Cache profileCache = Cache2kBuilder.of(UUID.class, NickoProfile.class).build(); private final Nicko nicko = new Nicko(); private static NickoBungee plugin; @@ -29,6 +30,8 @@ public class NickoBungee extends Plugin { return; } + getProxy().registerChannel(Nicko.MESSAGE_FETCH); + getProxy().registerChannel(Nicko.MESSAGE_UPDATE); getLogger().info("Nicko (Bungee) has been enabled."); } } @@ -36,10 +39,14 @@ public class NickoBungee extends Plugin { @Override public void onDisable() { if (!nicko.getDataStore().getStorage().isError()) { + getProxy().unregisterChannel(Nicko.MESSAGE_FETCH); + getProxy().unregisterChannel(Nicko.MESSAGE_UPDATE); getLogger().info("Nicko (Bungee) has been disabled."); } } + public Cache getProfileCache() { return profileCache; } + public Nicko getNicko() { return nicko; } diff --git a/core/src/main/java/net/artelnatif/nicko/bungee/PluginMessageSender.java b/core/src/main/java/net/artelnatif/nicko/bungee/PluginMessageSender.java index b75baef..b75c179 100644 --- a/core/src/main/java/net/artelnatif/nicko/bungee/PluginMessageSender.java +++ b/core/src/main/java/net/artelnatif/nicko/bungee/PluginMessageSender.java @@ -4,6 +4,9 @@ import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import net.md_5.bungee.api.config.ServerInfo; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; import java.util.ArrayList; public class PluginMessageSender { @@ -17,4 +20,18 @@ public class PluginMessageSender { } info.sendData(channel, output.toByteArray(), true); } + + public static void sendObject(final ServerInfo info, final String channel, final Object payload) { + if (info == null) { return; } + + try { + final ByteArrayDataOutput output = ByteStreams.newDataOutput(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream os = new ObjectOutputStream(out); + os.writeObject(payload); + info.sendData(channel, output.toByteArray(), true); + } catch (IOException exception) { + System.out.println("massive f"); + } + } } diff --git a/core/src/main/java/net/artelnatif/nicko/bungee/in/MessageHandler.java b/core/src/main/java/net/artelnatif/nicko/bungee/in/MessageHandler.java new file mode 100644 index 0000000..c7455c7 --- /dev/null +++ b/core/src/main/java/net/artelnatif/nicko/bungee/in/MessageHandler.java @@ -0,0 +1,44 @@ +package net.artelnatif.nicko.bungee.in; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; +import net.artelnatif.nicko.Nicko; +import net.artelnatif.nicko.bungee.NickoBungee; +import net.artelnatif.nicko.bungee.PluginMessageSender; +import net.artelnatif.nicko.disguise.NickoProfile; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.event.PluginMessageEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import org.cache2k.Cache; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.util.UUID; + +public class MessageHandler implements Listener { + @EventHandler + public void onMessage(PluginMessageEvent event) { + final Cache cache = NickoBungee.getInstance().getProfileCache(); + if (event.getTag().equalsIgnoreCase(Nicko.MESSAGE_UPDATE)) { + try { + final ByteArrayInputStream inputStream = new ByteArrayInputStream(event.getData()); + final ObjectInputStream objectStream = new ObjectInputStream(inputStream); + + final String uuid = objectStream.readUTF(); + final NickoProfile profile = (NickoProfile) objectStream.readObject(); + cache.put(UUID.fromString(uuid), profile); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } else if (event.getTag().equalsIgnoreCase(Nicko.MESSAGE_FETCH)) { + final ByteArrayDataInput input = ByteStreams.newDataInput(event.getData()); + final String stringUuid = input.readUTF(); + final UUID uuid = UUID.fromString(stringUuid); + final ServerInfo info = NickoBungee.getInstance().getProxy().getPlayer(uuid).getServer().getInfo(); + final NickoProfile profile = cache.peekAndRemove(uuid); + PluginMessageSender.sendObject(info, Nicko.MESSAGE_FETCH, profile); + } + } +}