Example usage for com.google.common.io ByteArrayDataInput readUnsignedShort

List of usage examples for com.google.common.io ByteArrayDataInput readUnsignedShort

Introduction

In this page you can find the example usage for com.google.common.io ByteArrayDataInput readUnsignedShort.

Prototype

@Override
    int readUnsignedShort();

Source Link

Usage

From source file:io.github.leonardosnt.bungeechannelapi.BungeeChannelApi.java

@SuppressWarnings("unchecked")
private void onPluginMessageReceived(String channel, Player player, byte[] message) {
    if (!channel.equalsIgnoreCase("BungeeCord"))
        return;/*from  www  .  j  av a  2s.  c  om*/

    ByteArrayDataInput input = ByteStreams.newDataInput(message);
    String subchannel = input.readUTF();

    synchronized (callbackMap) {
        Queue<CompletableFuture<?>> callbacks;

        if (subchannel.equals("PlayerCount") || subchannel.equals("PlayerList")
                || subchannel.equals("UUIDOther") || subchannel.equals("ServerIP")) {
            String identifier = input.readUTF(); // Server/player name
            callbacks = callbackMap.get(subchannel + "-" + identifier);

            if (callbacks == null || callbacks.isEmpty()) {
                return;
            }

            CompletableFuture<?> callback = callbacks.poll();

            try {
                switch (subchannel) {
                case "PlayerCount":
                    ((CompletableFuture<Integer>) callback).complete(Integer.valueOf(input.readInt()));
                    break;

                case "PlayerList":
                    ((CompletableFuture<List<String>>) callback)
                            .complete(Arrays.asList(input.readUTF().split(", ")));
                    break;

                case "UUIDOther":
                    ((CompletableFuture<String>) callback).complete(input.readUTF());
                    break;

                case "ServerIP": {
                    String ip = input.readUTF();
                    int port = input.readUnsignedShort();
                    ((CompletableFuture<InetSocketAddress>) callback).complete(new InetSocketAddress(ip, port));
                    break;
                }
                }
            } catch (Exception ex) {
                callback.completeExceptionally(ex);
            }

            return;
        }

        callbacks = callbackMap.get(subchannel);

        if (callbacks == null) {
            short dataLength = input.readShort();
            byte[] data = new byte[dataLength];
            input.readFully(data);

            if (globalForwardListener != null) {
                globalForwardListener.accept(subchannel, player, data);
            }

            if (forwardListeners != null) {
                synchronized (forwardListeners) {
                    ForwardConsumer listener = forwardListeners.get(subchannel);
                    if (listener != null) {
                        listener.accept(subchannel, player, data);
                    }
                }
            }

            return;
        }

        if (callbacks.isEmpty()) {
            return;
        }

        final CompletableFuture<?> callback = callbacks.poll();

        try {
            switch (subchannel) {
            case "GetServers":
                ((CompletableFuture<List<String>>) callback)
                        .complete(Arrays.asList(input.readUTF().split(", ")));
                break;

            case "GetServer":
            case "UUID":
                ((CompletableFuture<String>) callback).complete(input.readUTF());
                break;

            case "IP": {
                String ip = input.readUTF();
                int port = input.readInt();
                ((CompletableFuture<InetSocketAddress>) callback).complete(new InetSocketAddress(ip, port));
                break;
            }

            default:
                break;
            }
        } catch (Exception ex) {
            callback.completeExceptionally(ex);
        }
    }
}