From df083f56f6ebebf7b027b671559704cbfbca9ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Mart=C3=ADnez=20Rinc=C3=B3n?= Date: Sat, 7 Oct 2017 20:38:02 +0200 Subject: [PATCH] Plugin message helper for the spigot plugin --- .circleci/config.yml | 4 +- Main Plugin/pom.xml | 8 ++ .../listener/PluginMessageListener.java | 23 +++ Spigot Addon/pom.xml | 28 +++- .../playerbalanceraddon/MainCommand.java | 18 +++ .../PlayerBalancerAddon.java | 9 +- .../PluginMessageManager.java | 136 ++++++++++++++++++ 7 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/MainCommand.java create mode 100644 Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/PluginMessageManager.java diff --git a/.circleci/config.yml b/.circleci/config.yml index 3bb6575..ef8aa30 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -44,4 +44,6 @@ jobs: path: target/surefire-reports - store_artifacts: - path: target/PlayerBalancer.jar \ No newline at end of file + paths: + - target/PlayerBalancer.jar + - target/PlayerBalancerAddon.jar \ No newline at end of file diff --git a/Main Plugin/pom.xml b/Main Plugin/pom.xml index 397e0a3..75ab495 100644 --- a/Main Plugin/pom.xml +++ b/Main Plugin/pom.xml @@ -36,6 +36,14 @@ + + org.apache.maven.plugins + maven-jar-plugin + 2.3.1 + + ../target + + diff --git a/Main Plugin/src/main/java/com/jaimemartz/playerbalancer/listener/PluginMessageListener.java b/Main Plugin/src/main/java/com/jaimemartz/playerbalancer/listener/PluginMessageListener.java index 5b7e2ff..8da4558 100644 --- a/Main Plugin/src/main/java/com/jaimemartz/playerbalancer/listener/PluginMessageListener.java +++ b/Main Plugin/src/main/java/com/jaimemartz/playerbalancer/listener/PluginMessageListener.java @@ -111,6 +111,29 @@ public class PluginMessageListener implements Listener { sender.sendData("PlayerBalancer", stream.toByteArray()); break; } + + case "GetSectionOfPlayer": { + if (event.getReceiver() instanceof ProxiedPlayer) { + ProxiedPlayer player = (ProxiedPlayer) event.getReceiver(); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(stream); + + ServerSection section = plugin.getSectionManager().getByPlayer(player); + if (section == null) { + return; + } + + try { + String output = gson.toJson(section); + out.writeUTF(output); + } catch (IOException e) { + e.printStackTrace(); + } + + sender.sendData("PlayerBalancer", stream.toByteArray()); + } + break; + } } } } diff --git a/Spigot Addon/pom.xml b/Spigot Addon/pom.xml index 1d7908f..52db725 100644 --- a/Spigot Addon/pom.xml +++ b/Spigot Addon/pom.xml @@ -12,17 +12,31 @@ PlayerBalancer Addon playerbalancer-addon + + PlayerBalancerAddon + + + org.apache.maven.plugins + maven-jar-plugin + 2.3.1 + + ../target + + + + + spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + placeholderapi + http://repo.extendedclip.com/content/repositories/placeholderapi/ + - - PlayerBalancerAddon - - org.spigotmc @@ -30,5 +44,11 @@ 1.12.2-R0.1-SNAPSHOT provided + + me.clip + placeholderapi + 2.8.2 + provided + \ No newline at end of file diff --git a/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/MainCommand.java b/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/MainCommand.java new file mode 100644 index 0000000..fc9ffdc --- /dev/null +++ b/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/MainCommand.java @@ -0,0 +1,18 @@ +package com.jaimemartz.playerbalanceraddon; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +public class MainCommand implements CommandExecutor { + private final PlayerBalancerAddon plugin; + + public MainCommand(PlayerBalancerAddon plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + return false; + } +} diff --git a/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/PlayerBalancerAddon.java b/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/PlayerBalancerAddon.java index 12c24cb..abd3ca3 100644 --- a/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/PlayerBalancerAddon.java +++ b/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/PlayerBalancerAddon.java @@ -3,13 +3,20 @@ package com.jaimemartz.playerbalanceraddon; import org.bukkit.plugin.java.JavaPlugin; public class PlayerBalancerAddon extends JavaPlugin { + private PluginMessageManager manager; + @Override public void onDisable() { - + manager = new PluginMessageManager(this); + getCommand("balancer").setExecutor(new MainCommand(this)); } @Override public void onEnable() { } + + public PluginMessageManager getManager() { + return manager; + } } diff --git a/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/PluginMessageManager.java b/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/PluginMessageManager.java new file mode 100644 index 0000000..5dd7176 --- /dev/null +++ b/Spigot Addon/src/main/java/com/jaimemartz/playerbalanceraddon/PluginMessageManager.java @@ -0,0 +1,136 @@ +package com.jaimemartz.playerbalanceraddon; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Iterables; +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Multimap; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.Messenger; +import org.bukkit.plugin.messaging.PluginMessageListener; + +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.util.*; +import java.util.function.Consumer; + +public class PluginMessageManager implements PluginMessageListener { + private final Multimap> contexts = LinkedListMultimap.create(); + private final PlayerBalancerAddon plugin; + + public PluginMessageManager(PlayerBalancerAddon plugin) { + this.plugin = plugin; + + plugin.getServer().getMessenger().registerIncomingPluginChannel(plugin, "PlayerBalancer", this); + plugin.getServer().getMessenger().registerOutgoingPluginChannel(plugin, "PlayerBalancer"); + + //In case we need to use BungeeCord channels + plugin.getServer().getMessenger().registerIncomingPluginChannel(plugin, "BungeeCord", this); + plugin.getServer().getMessenger().registerOutgoingPluginChannel(plugin, "BungeeCord"); + } + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] message) { + if (channel.equals("PlayerBalancer")) { + ByteArrayDataInput in = ByteStreams.newDataInput(message); + String subchannel = in.readUTF(); + + contexts.get(new MessageContext(channel, subchannel, player)) + .stream().findFirst().ifPresent(a -> a.accept(in)); + } + } + + public void connectPlayer(Player player, String section) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("Connect"); + out.writeUTF(section); + player.sendPluginMessage(plugin, "PlayerBalancer", out.toByteArray()); + } + + public boolean getSectionByName(String section, Consumer consumer) { + Player player = Iterables.getFirst(plugin.getServer().getOnlinePlayers(), null); + if (player == null) { + return false; + } + + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("GetSectionByName"); + out.writeUTF(section); + player.sendPluginMessage(plugin, "PlayerBalancer", out.toByteArray()); + + contexts.put(new MessageContext( + "PlayerBalancer", + "GetSectionByName", + player + ), ByteArrayDataInput::readUTF); + + return true; + } + + public boolean getSectionByServer(String server, Consumer consumer) { + Player player = Iterables.getFirst(plugin.getServer().getOnlinePlayers(), null); + if (player == null) { + return false; + } + + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("GetSectionByServer"); + out.writeUTF(server); + player.sendPluginMessage(plugin, "PlayerBalancer", out.toByteArray()); + + contexts.put(new MessageContext( + "PlayerBalancer", + "GetSectionByServer", + player + ), ByteArrayDataInput::readUTF); + return true; + } + + public void getSectionOfPlayer(Player player, Consumer consumer) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("GetSectionOfPlayer"); + out.writeUTF(player.getName()); + player.sendPluginMessage(plugin, "PlayerBalancer", out.toByteArray()); + + contexts.put(new MessageContext( + "PlayerBalancer", + "GetSectionOfPlayer", + player + ), ByteArrayDataInput::readUTF); + } + + private final class MessageContext { + private final String channel; + private final String subchannel; + private final Player player; + + public MessageContext(String channel, String subchannel, Player player) { + this.channel = channel; + this.subchannel = subchannel; + this.player = player; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MessageContext that = (MessageContext) o; + + if (channel != null ? !channel.equals(that.channel) : that.channel != null) return false; + if (subchannel != null ? !subchannel.equals(that.subchannel) : that.subchannel != null) return false; + return player != null ? player.equals(that.player) : that.player == null; + } + + @Override + public int hashCode() { + int result = channel != null ? channel.hashCode() : 0; + result = 31 * result + (subchannel != null ? subchannel.hashCode() : 0); + result = 31 * result + (player != null ? player.hashCode() : 0); + return result; + } + } +}