Java tutorial
/* * NetworkLib - A Spigot/BungeeCord plugin messaging Library * Copyright (C) 2015 Pascal Zarrad * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package tk.playerforcehd.networklib.bukkit.connection; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.plugin.messaging.PluginMessageListener; import tk.playerforcehd.networklib.bukkit.Main; import tk.playerforcehd.networklib.bukkit.api.DefaultAPI; import tk.playerforcehd.networklib.bukkit.api.DefaultBungeeLib; import tk.playerforcehd.networklib.bukkit.api.ResultSet; import tk.playerforcehd.networklib.bukkit.event.PluginMessageIncomingEvent; import tk.playerforcehd.networklib.shared.utils.Callback; import java.io.*; /** * The DefaultManager has not his own Docs! * Please look at: {@link DefaultBungeeLib} * * @author PlayerForceHD */ public class DefaultManager implements DefaultBungeeLib, DefaultAPI { /** * Latest result of a request method */ protected static ResultSet latestResult; /** * The network manager which will access the API */ private NetworkManager networkManager; /** * The main instance of the NetworkLib */ private Main instance; public DefaultManager(Main instance, NetworkManager defaultManager) { this.instance = instance; this.instance.getServer().getPluginManager().registerEvents(new DefaultIncomingEventHandler(), this.instance); this.networkManager = defaultManager; } /** * @param player The player which will be send to another Server * @param server The server where the player will be after the send * @see DefaultBungeeLib#connect(Player, String) */ @Override public void connect(Player player, String server) { this.networkManager.sendMessageToProxy("ConnectOther", player.getName(), server); } /** * @param player The player where you will gget the IP * @see DefaultBungeeLib#requestIP(Player) */ @Override public void requestIP(Player player) { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("IP"); this.networkManager.sendMessageToPlayer(player, stream); } /** * @param player The player from who you will get the IP * @param result The result of the request (When reading the stream fails, null will be given) * @see DefaultBungeeLib#getIP(Player, Callback) */ @Override public void getIP(Player player, Callback<String> result) { PluginMessageListener pluginMessageListener = null; final PluginMessageListener[] finalPluginMessageListener = { null }; pluginMessageListener = (s, player1, bytes) -> { try { if (s.equalsIgnoreCase("BungeeCord")) { DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); String subChannel = dataInputStream.readUTF(); if (subChannel.equals("IP")) { String host = dataInputStream.readUTF(); int port = dataInputStream.readInt(); String ip = host + ":" + port; result.invoke(ip); } } } catch (IOException e) { e.printStackTrace(); result.invoke(null); } finally { Bukkit.getMessenger().unregisterIncomingPluginChannel(instance, "BungeeCord", finalPluginMessageListener[0]); } }; Bukkit.getMessenger().registerIncomingPluginChannel(this.instance, "BungeeCord", pluginMessageListener); finalPluginMessageListener[0] = pluginMessageListener; ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("IP"); this.networkManager.sendMessageToPlayer(player, stream); } /** * @param serverName The name of the server from which you will get the player count * @see DefaultBungeeLib#requestPlayerCount(String) */ @Override public void requestPlayerCount(String serverName) { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("PlayerCount"); stream.writeUTF(serverName); this.networkManager.sendMessageToProxy(stream); } /** * @param serverName The name of the server from which you will get the player count * @param result The result of the request (Will give -1 if an error occurs while communicating) * @see DefaultBungeeLib#getPlayerCount(String, Callback) */ @Override public void getPlayerCount(String serverName, Callback<Integer> result) { PluginMessageListener pluginMessageListener = null; final PluginMessageListener[] finalPluginMessageListener = { null }; pluginMessageListener = (s, player1, bytes) -> { try { if (s.equals("BungeeCord")) { DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); String subChannel = dataInputStream.readUTF(); if (subChannel.equals("PlayerCount")) { String receivedServerName = dataInputStream.readUTF(); if (receivedServerName.equals(serverName)) { int count = dataInputStream.readInt(); result.invoke(count); } } } } catch (IOException e) { e.printStackTrace(); result.invoke(-1); } finally { Bukkit.getMessenger().unregisterIncomingPluginChannel(instance, "BungeeCord", finalPluginMessageListener[0]); } }; Bukkit.getMessenger().registerIncomingPluginChannel(instance, "BungeeCord", pluginMessageListener); finalPluginMessageListener[0] = pluginMessageListener; ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("PlayerCount"); stream.writeUTF(serverName); this.networkManager.sendMessageToProxy(stream); } /** * @param serverName the Name of the server * @see DefaultBungeeLib#requestPlayerList(String) */ @Override public void requestPlayerList(String serverName) { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("PlayerList"); stream.writeUTF(serverName); this.networkManager.sendMessageToProxy(stream); } /** * Get a list of all players from a server * * @param serverName The server from who you want to collect the players * @param result The result of the request (Will give null if an error occurs while communicating */ @Override public void getPlayerList(String serverName, Callback<String[]> result) { PluginMessageListener pluginMessageListener = null; final PluginMessageListener[] finalPluginMessageListener = { null }; pluginMessageListener = (s, player1, bytes) -> { try { if (s.equals("BungeeCord")) { DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); String subChannel = dataInputStream.readUTF(); if (subChannel.equals("PlayerList")) { String receivedServerName = dataInputStream.readUTF(); if (receivedServerName.equals(serverName)) { String players = dataInputStream.readUTF(); result.invoke(players.split(", ")); } } } } catch (IOException e) { e.printStackTrace(); result.invoke(null); } finally { Bukkit.getMessenger().unregisterIncomingPluginChannel(instance, "BungeeCord", finalPluginMessageListener[0]); } }; Bukkit.getMessenger().registerIncomingPluginChannel(instance, "BungeeCord", pluginMessageListener); finalPluginMessageListener[0] = pluginMessageListener; ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("PlayerList"); stream.writeUTF(serverName); this.networkManager.sendMessageToProxy(stream); } /** * @see DefaultBungeeLib#requestServers() */ @Override public void requestServers() { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("GetServers"); this.networkManager.sendMessageToProxy(stream); } /** * Get a list of all registered BungeeCord Server's (The names) * * @param result The result of the request (Will give null if an error occurs while communicating) * @see DefaultBungeeLib#getServers(Callback) */ @Override public void getServers(Callback<String[]> result) { PluginMessageListener pluginMessageListener = null; final PluginMessageListener[] finalPluginMessageListener = { null }; pluginMessageListener = (s, player1, bytes) -> { try { if (s.equals("BungeeCord")) { DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); String subChannel = dataInputStream.readUTF(); if (subChannel.equals("GetServers")) { String players = dataInputStream.readUTF(); result.invoke(players.split(", ")); } } } catch (IOException e) { e.printStackTrace(); result.invoke(null); } finally { Bukkit.getMessenger().unregisterIncomingPluginChannel(instance, "BungeeCord", finalPluginMessageListener[0]); } }; Bukkit.getMessenger().registerIncomingPluginChannel(instance, "BungeeCord", pluginMessageListener); finalPluginMessageListener[0] = pluginMessageListener; ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("GetServers"); this.networkManager.sendMessageToProxy(stream); } /** * @param name The name of the player which will recieve the message * @param msg The Message which will be send * @see DefaultBungeeLib#sendMessage(String, String) */ @Override public void sendMessage(String name, String msg) { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("Message"); stream.writeUTF(name); stream.writeUTF(msg); this.networkManager.sendMessageToProxy(stream); } /** * @see DefaultBungeeLib#requestGlobalName() */ @Override public void requestGlobalName() { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("GetServer"); this.networkManager.sendMessageToProxy(stream); } /** * Get the name of your Server which is defined in the BungeeCord config * * @param result The result of the request (When reading the stream fails, null will be given) * @see DefaultBungeeLib#getGlobalName(Callback) */ @Override public void getGlobalName(Callback<String> result) { PluginMessageListener pluginMessageListener = null; final PluginMessageListener[] finalPluginMessageListener = { null }; pluginMessageListener = (s, player1, bytes) -> { try { if (s.equals("BungeeCord")) { DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); String subChannel = dataInputStream.readUTF(); if (subChannel.equals("GetServer")) { String serverName = dataInputStream.readUTF(); result.invoke(serverName); } } } catch (IOException e) { e.printStackTrace(); result.invoke(null); } finally { Bukkit.getMessenger().unregisterIncomingPluginChannel(instance, "BungeeCord", finalPluginMessageListener[0]); } }; Bukkit.getMessenger().registerIncomingPluginChannel(instance, "BungeeCord", pluginMessageListener); finalPluginMessageListener[0] = pluginMessageListener; ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("GetServer"); this.networkManager.sendMessageToProxy(stream); } /** * @param server The server which recieves the message * @param channel The channel where the message will be send (subchannel) * @param msg The messages will be written to the server * @see DefaultBungeeLib#forward(String, String, Object...) */ @Override public void forward(String server, String channel, Object... msg) throws IOException { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("Forward"); stream.writeUTF(server); stream.writeUTF(channel); ByteArrayOutputStream msgbytes = new ByteArrayOutputStream(); DataOutputStream dataout = new DataOutputStream(msgbytes); for (Object o : msg) { dataout.writeUTF(o.toString()); } stream.writeShort(msgbytes.toByteArray().length); stream.write(msgbytes.toByteArray()); this.networkManager.sendMessageToProxy(stream); } /** * @param player The player which recieves the message * @param channel The channel where the message will be send (subchannel) * @param msg The message which will be send * @see DefaultBungeeLib#forwardToPlayer(Player, String, Object...) */ @Override public void forwardToPlayer(Player player, String channel, Object... msg) throws IOException { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("Forward"); stream.writeUTF(player.getName()); stream.writeUTF(channel); ByteArrayOutputStream msgbytes = new ByteArrayOutputStream(); DataOutputStream dataout = new DataOutputStream(msgbytes); for (Object o : msg) { dataout.writeUTF(o.toString()); } stream.writeShort(msgbytes.toByteArray().length); stream.write(msgbytes.toByteArray()); this.networkManager.sendMessageToProxy(stream); } /** * @param player The player from which you will get the UUID * @see DefaultBungeeLib#requestUUID(Player) */ @Override public void requestUUID(Player player) { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("UUIDOther"); stream.writeUTF(player.getName()); this.networkManager.sendMessageToProxy(stream); } /** * Get the UUID of a specific Player * * @param player The player from which you will get the UUID * @param result The result of the request (Will give null if an error occurs while communicating) * @see DefaultBungeeLib#getUUID(Player, Callback) */ @Override public void getUUID(Player player, Callback<String> result) { PluginMessageListener pluginMessageListener = null; final PluginMessageListener[] finalPluginMessageListener = { null }; pluginMessageListener = (s, player1, bytes) -> { try { if (s.equals("BungeeCord")) { DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); String subChannel = dataInputStream.readUTF(); if (subChannel.equals("UUIDOther")) { if (dataInputStream.readUTF().equals(player.getName())) { String uuid = dataInputStream.readUTF(); result.invoke(uuid); } } } } catch (IOException e) { e.printStackTrace(); result.invoke(null); } finally { Bukkit.getMessenger().unregisterIncomingPluginChannel(instance, "BungeeCord", finalPluginMessageListener[0]); } }; Bukkit.getMessenger().registerIncomingPluginChannel(instance, "BungeeCord", pluginMessageListener); finalPluginMessageListener[0] = pluginMessageListener; ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("UUIDOther"); stream.writeUTF(player.getName()); this.networkManager.sendMessageToProxy(stream); } /** * @param serverName The server from which you will get the IP * @see DefaultBungeeLib#requestServerIP(String) */ @Override public void requestServerIP(String serverName) { ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("ServerIP"); stream.writeUTF(serverName); this.networkManager.sendMessageToProxy(stream); } /** * Get the IP of an Server in the Network * * @param serverName The server from which you will get the IP * @param result The result of the request (Will give null if an error occurs while communicating) * @see DefaultBungeeLib#getServerIP(String, Callback) */ @Override public void getServerIP(String serverName, Callback<String> result) { PluginMessageListener pluginMessageListener = null; final PluginMessageListener[] finalPluginMessageListener = { null }; pluginMessageListener = (s, player1, bytes) -> { try { if (s.equals("BungeeCord")) { DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); String subChannel = dataInputStream.readUTF(); if (subChannel.equals("ServerIP")) { if (dataInputStream.readUTF().equals(serverName)) { String serverIP = dataInputStream.readUTF(); int serverPort = dataInputStream.readInt(); result.invoke(serverIP + ":" + serverPort); } } } } catch (IOException e) { e.printStackTrace(); result.invoke(null); } finally { Bukkit.getMessenger().unregisterIncomingPluginChannel(instance, "BungeeCord", finalPluginMessageListener[0]); } }; Bukkit.getMessenger().registerIncomingPluginChannel(instance, "BungeeCord", pluginMessageListener); finalPluginMessageListener[0] = pluginMessageListener; ByteArrayDataOutput stream = ByteStreams.newDataOutput(); stream.writeUTF("ServerIP"); stream.writeUTF(serverName); this.networkManager.sendMessageToProxy(stream); } /** * @param player The player which get kicked * @param reason The reason which the kick will have * @see DefaultBungeeLib#kickPlayer(Player, String) */ @Override public void kickPlayer(Player player, String reason) { this.networkManager.sendMessageToProxy("KickPlayer", player.getName(), reason); } /** * Get the ResultSet of an MessageResultSet * The API only returns ResultSet's and no MessageResultSet's * * @param messageResultSet The MessageResultSet which get converted * @return The ResultSet of the MessageResultSet */ private ResultSet toResultSet(MessageResultSet messageResultSet) { return messageResultSet; } /** * @see DefaultBungeeLib#getLatestResultSet() */ @Override public ResultSet getLatestResultSet() { return latestResult; } public class DefaultIncomingEventHandler implements Listener { @EventHandler public void onRecieveMessage(PluginMessageIncomingEvent e) { if (e.getChannel().equalsIgnoreCase("BungeeCord")) { try { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = e.getDataInputStream().read(buffer)) > -1) { byteArrayOutputStream.write(buffer, 0, len); } byteArrayOutputStream.flush(); DataInputStream resultStream = new DataInputStream( new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); e.setDataInputStream( new DataInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()))); resultStream.readUTF(); DefaultManager.latestResult = new MessageResultSet(resultStream); } catch (Exception ex) { ex.printStackTrace(); } } } } }