tk.playerforcehd.networklib.bukkit.connection.DefaultManager.java Source code

Java tutorial

Introduction

Here is the source code for tk.playerforcehd.networklib.bukkit.connection.DefaultManager.java

Source

/*
 *     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();
                }
            }
        }
    }
}