Hub / src / main / java / com / lifeknight / relaymchub / miscellaneous / MessageProcessor.java
MessageProcessor.java
Raw
package com.lifeknight.relaymchub.miscellaneous;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.lifeknight.relaymchub.Main;
import com.lifeknight.relaymchub.player.HubPlayer;
import com.lifeknight.relaymcutils.RelayMCUtils;
import com.lifeknight.relaymcutils.event.MessageReceivedEvent;
import com.lifeknight.relaymcutils.player.SmartPlayer;
import com.lifeknight.relayutils.RelayUtils;
import com.lifeknight.relayutils.basic.Text;
import com.lifeknight.relayutils.data.PartyData;
import com.lifeknight.relayutils.data.QueueData;
import com.lifeknight.relayutils.game.GameType;
import com.lifeknight.relayutils.network.Message;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class MessageProcessor implements Listener {

    @EventHandler
    public void onMessageReceived(MessageReceivedEvent event) {
        Message message = event.getMessage();
        try {
            handleProxyMessage(message);
        } catch (Exception exception) {
            RelayUtils.printError("processing of a message", exception, 5);
        }
    }

    private static void handleUnknownMessage(Message message) {

    }

    private static void handleProxyMessage(Message message) {
        String[] arguments = message.getArgumentsStringArray();

        switch (message.getCommandCommand()) {
            case UPDATE_INFO:
                break;
            case PLAYER_COUNT:
                handlePlayerCount(arguments[0].split(","));
                break;
            case HUBS:
                handleHubs(arguments);
                break;
            case SCOREBOARD:
                SmartPlayer smartPlayer = SmartPlayer.getSmartPlayer(arguments[0]);
                if (smartPlayer == null) return;
                HubPlayer.getHubPlayer(smartPlayer).displayDefaultScoreboard();
                break;
            case OTHER:
                switch (arguments[0]) {
                    case "duelsgames":
                        Main.onCustomKitsCount(arguments[1]);
                        break;
                    case "queueposition":
                        HubPlayer.getHubPlayer(arguments[1]).updateQueuePosition(Integer.parseInt(arguments[2]), Integer.parseInt(arguments[3]), Integer.parseInt(arguments[4]), Integer.parseInt(arguments[5]), Integer.parseInt(arguments[6]), Boolean.parseBoolean(arguments[7]));
                        break;
                    case "queuescoreboard":
                        HubPlayer.getHubPlayer(arguments[1]).updateQueueScoreboard(GameType.getGameType(arguments[2]), Integer.parseInt(arguments[3]), Integer.parseInt(arguments[4]), Integer.parseInt(arguments[5]), Integer.parseInt(arguments[6]), Integer.parseInt(arguments[7]), Boolean.parseBoolean(arguments[8]), Boolean.parseBoolean(arguments[9]), QueueData.fromString(arguments[10]));
                        break;
                    case "partydata":
                        HubPlayer hubPlayer = HubPlayer.getHubPlayer(arguments[1]);
                        PartyData partyData = null;
                        if (!arguments[2].equals("none")) {
                            partyData = PartyData.fromString(arguments[2]);
                        }
                        hubPlayer.updatePartyInfo(partyData);
                        break;
                    case "duelgui":
                        HubPlayer.getHubPlayer(arguments[1]).showDuelGui(arguments[2]);
                        break;
                    case "ping":
                        break;
                    case "requeue":
                        HubPlayer.getHubPlayer(arguments[1]).setCanRequeue();
                        break;
                    case "limbo":
                        if (Main.isLimbo()) {
                            SmartPlayer.getSmartPlayer(arguments[1]).setCanPickUpItems(true);
                        }
                        break;
                    case "limboqueueposition":
                        if (Main.isLimbo()) {
                            HubPlayer.getHubPlayer(arguments[1]).setLimboQueuePosition(arguments[2], arguments[3]);
                        }
                        break;
                    case "chat": {
                        HubPlayer.getHubPlayer(arguments[1]).onChat(arguments[2]);
                    }
                    break;
                    case "dailyjoin": {
                        HubPlayer.getHubPlayer(arguments[1]).onDailyJoin();
                        break;
                    }
                    default:
                        Main.error("Unrecognized other command: %s", arguments[0]);
                        break;
                }
                break;
        }
    }

    public static void handlePlayerCount(String[] arguments) {
        Map<GameType, Integer> counts = new HashMap<>();
        for (String playerCount : arguments) {
            String[] split = playerCount.split(Pattern.quote(":"));
            GameType gameType = GameType.getGameType(split[0]);
            if (gameType != null) {
                int count = Integer.parseInt(split[1]);
                counts.put(gameType, count);
            } else {
                RelayMCUtils.error("Unrecognized gametype: %s", split[0]);
            }
        }

        Main.onPlayerCount(counts);
    }

    public static void handleHubs(String[] arguments) {
        JsonArray jsonArray = new JsonParser().parse(arguments[0]).getAsJsonArray();

        Map<String, Map<String, Integer>> hubs = new HashMap<>();

        for (JsonElement jsonElement : jsonArray) {
            JsonObject hubGroup = jsonElement.getAsJsonObject();
            String type = hubGroup.get("type").getAsString();
            Map<String, Integer> hubsMap = new HashMap<>();
            for (JsonElement element : hubGroup.get("hubs").getAsJsonArray()) {
                JsonObject hub = element.getAsJsonObject();
                String hubName = hub.get("name").getAsString();
                int count = hub.get("count").getAsInt();
                hubsMap.put(hubName, count);
            }
            hubs.put(type, hubsMap);
        }

        for (String s : hubs.keySet()) {
            if (Text.toComparable(s).equals(Text.toComparable(Main.hubType))) {
                SmartGUIUtils.onHubs(hubs.get(s));
                break;
            }
        }
    }
}