BungeeMain / src / main / java / com / lifeknight / relaymcbungeemain / commands / amenities / PartyCommand.java
PartyCommand.java
Raw
package com.lifeknight.relaymcbungeemain.commands.amenities;

import com.lifeknight.relaymcbungeemain.player.Party;
import com.lifeknight.relaymcbungeemain.player.SmartPlayer;
import com.lifeknight.relayutils.basic.Miscellaneous;
import com.lifeknight.relayutils.basic.Text;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.TabExecutor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class PartyCommand extends Command implements TabExecutor {

    private final static List<String> COMMANDS = Arrays.asList(
            "invite",
            "kick",
            "kickoffline",
            "promote",
            "disband",
            "warp",
            "list",
            "join",
            "leave",
            "settings",
            "create"
    );

    private final static List<String> SETTING_COMMANDS = Arrays.asList(
            "allinvite",
            "allplay",
            "allroles",
            "public",
            "maxsize"
    );

    public PartyCommand() {
        super("party", null, "p");
    }

    @Override
    public void execute(CommandSender sender, String[] arguments) {
        if (sender instanceof ProxiedPlayer) {
            SmartPlayer smartPlayer = SmartPlayer.getSmartPlayer((ProxiedPlayer) sender);
            if (arguments.length == 0) {
                smartPlayer.sendCommandsMessage(COMMANDS);
            } else {
                switch (COMMANDS.indexOf(arguments[0].toLowerCase())) {
                    case 0:
                        handleInvite(smartPlayer, arguments);
                        break;
                    case 1:
                        this.handleKick(smartPlayer, arguments);
                        break;
                    case 2:
                        this.handleKickOffline(smartPlayer);
                        break;
                    case 3:
                        this.handlePromote(smartPlayer, arguments);
                        break;
                    case 4:
                        this.handleDisband(smartPlayer);
                        break;
                    case 5:
                        this.handleWarp(smartPlayer);
                        break;
                    case 6:
                        this.handleList(smartPlayer);
                        break;
                    case 7:
                        this.handleJoin(smartPlayer, arguments);
                        break;
                    case 8:
                        this.handleLeave(smartPlayer);
                        break;
                    case 9:
                        this.handleSettings(smartPlayer, arguments);
                        break;
                    case 10:
                        this.handleCreate(smartPlayer);
                        break;
                    default:
                        if (arguments.length > 1) {
                            smartPlayer.sendCommandsMessage(COMMANDS);
                        } else {
                            handleInvite(smartPlayer, arguments);
                        }
                        break;
                }
            }
        }
    }

    public static void handleInvite(SmartPlayer smartPlayer, String[] arguments) {
        if (arguments.length == 0) {
            smartPlayer.sendPartyErrorMessage("Please enter a username to invite.");
            return;
        }

        if (arguments[0].equalsIgnoreCase("invite")) {
            if (arguments.length == 1) {
                smartPlayer.sendPartyErrorMessage("Please enter a username to invite.");
                return;
            }
            if (arguments[1].equalsIgnoreCase(smartPlayer.getProxiedPlayer().getName())) {
                smartPlayer.sendPartyErrorMessage("You cannot invite yourself to a party!");
                return;
            }
            SmartPlayer playerToInvite = SmartPlayer.getSmartPlayerOrNick(arguments[1]);
            if (!smartPlayer.isInParty()) {
                if (playerToInvite == null) {
                    smartPlayer.noPlayerFound(arguments[1]);
                } else if (!playerToInvite.canBeInvitedToParty(smartPlayer)) {
                    smartPlayer.sendErrorMessage("You cannot invite that player to a party!");
                } else {
                    smartPlayer.createParty();
                    smartPlayer.getCurrentParty().tryInvite(smartPlayer, arguments[1]);
                }
            } else {
                Party party = smartPlayer.getCurrentParty();
                party.tryInvite(smartPlayer, arguments[1]);
            }

        } else {
            if (!smartPlayer.isInParty()) smartPlayer.createParty();
            Party party = smartPlayer.getCurrentParty();
            party.tryInvite(smartPlayer, arguments[0]);
        }
    }

    private void handleKick(SmartPlayer smartPlayer, String[] arguments) {
        if (smartPlayer.isInParty()) {
            if (arguments.length == 1) {
                smartPlayer.sendPartyErrorMessage("Please enter a username to kick.");
                return;
            }
            Party party = smartPlayer.getCurrentParty();
            party.tryKick(smartPlayer, arguments[1]);
        } else {
            smartPlayer.sendPartyErrorMessage("You are not in a party!");
        }
    }

    private void handleKickOffline(SmartPlayer smartPlayer) {
        if (smartPlayer.isInParty()) {
            smartPlayer.getCurrentParty().tryKickOffline(smartPlayer);
        } else {
            smartPlayer.sendPartyErrorMessage("You are not in a party!");
        }
    }

    private void handlePromote(SmartPlayer smartPlayer, String[] arguments) {
        if (smartPlayer.isInParty()) {
            if (arguments.length == 1) {
                smartPlayer.sendPartyErrorMessage("Please enter a username to promote.");
                return;
            }
            Party party = smartPlayer.getCurrentParty();
            party.tryPromote(smartPlayer, arguments[1]);
        } else {
            smartPlayer.sendPartyErrorMessage("You are not in a party!");
        }
    }

    private void handleDisband(SmartPlayer smartPlayer) {
        if (smartPlayer.isInParty()) {
            Party party = smartPlayer.getCurrentParty();
            party.tryDisband(smartPlayer);
        } else {
            smartPlayer.sendPartyErrorMessage("You are not in a party!");
        }
    }

    private void handleWarp(SmartPlayer smartPlayer) {
        if (smartPlayer.isInParty()) {
            Party party = smartPlayer.getCurrentParty();
            party.tryWarp(smartPlayer);
        } else {
            smartPlayer.sendPartyErrorMessage("You are not in a party!");
        }
    }

    private void handleList(SmartPlayer smartPlayer) {
        if (smartPlayer.isInParty()) {
            smartPlayer.getCurrentParty().listPlayers(smartPlayer);
        } else {
            smartPlayer.sendPartyErrorMessage("You are not in a party!");
        }
    }

    private void handleJoin(SmartPlayer smartPlayer, String[] arguments) {
        if (smartPlayer.isInParty()) {
            smartPlayer.sendPartyErrorMessage("You are already in a party!");
        } else {
            if (arguments.length == 1) {
                smartPlayer.sendPartyErrorMessage("Please enter the username of a party to join.");
                return;
            }
            Party.tryJoin(smartPlayer, arguments[1]);
        }
    }

    private void handleLeave(SmartPlayer smartPlayer) {
        if (smartPlayer.isInParty()) {
            smartPlayer.getCurrentParty().leave(smartPlayer);
        } else {
            smartPlayer.sendPartyErrorMessage("You are not in a party!");
        }
    }

    private void handleSettings(SmartPlayer smartPlayer, String[] arguments) {
        if (smartPlayer.isInParty()) {
            if (arguments.length == 1) {
                tellPlayerSettingCommands(smartPlayer);
            } else {
                switch (SETTING_COMMANDS.indexOf(arguments[1].toLowerCase())) {
                    case 0:
                        smartPlayer.getCurrentParty().toggleAllInvite(smartPlayer);
                        break;
                    case 1:
                        smartPlayer.getCurrentParty().toggleAllPlay(smartPlayer);
                        break;
                    case 2:
                        smartPlayer.getCurrentParty().toggleAllRolePermissions(smartPlayer);
                        break;
                    case 3:
                        smartPlayer.getCurrentParty().togglePublic(smartPlayer);
                        break;
                    case 4:
                        if (arguments.length > 2) {
                            try {
                                int size = Integer.parseInt(arguments[2]);
                                smartPlayer.getCurrentParty().updateMaxSize(smartPlayer, size);
                            } catch (Exception exception) {
                                smartPlayer.sendUsageMessage("/party settings maxsize [maxsize]");
                            }
                        } else {
                            smartPlayer.sendUsageMessage("/party settings maxsize [maxsize]");
                        }
                        break;
                    default:
                        tellPlayerSettingCommands(smartPlayer);
                        break;
                }
            }
        } else {
            smartPlayer.sendPartyErrorMessage("You are not in a party!");
        }
    }

    public void handleCreate(SmartPlayer smartPlayer) {
        if (smartPlayer.isInParty()) {
            smartPlayer.sendPartyErrorMessage("You are already in a party!");
        } else {
            smartPlayer.createParty();
            smartPlayer.sendPartySuccessMessage("Created party.");
        }
    }

    private static void tellPlayerSettingCommands(SmartPlayer smartPlayer) {
        smartPlayer.sendInfoMessage("Party setting commands: %s%s", ChatColor.GREEN, Text.separateWithCommas(SETTING_COMMANDS));
    }

    private static void tellPlayerCommands(SmartPlayer smartPlayer) {
        smartPlayer.sendInfoMessage("Party commands: %s%s", ChatColor.GREEN, Text.separateWithCommas(COMMANDS));
    }

    @Override
    public Iterable<String> onTabComplete(CommandSender sender, String[] arguments) {
        if (!(sender instanceof ProxiedPlayer)) return new ArrayList<>();
        SmartPlayer smartPlayer = SmartPlayer.getSmartPlayer((ProxiedPlayer) sender);
        if (arguments.length <= 1) {
            return Text.returnStartingEntries(COMMANDS, arguments.length > 0 ? arguments[0] : null, true);
        } else if (arguments.length == 2) {
            switch (COMMANDS.indexOf(arguments[0].toLowerCase())) {
                case 0:
                    return Text.returnStartingEntries(smartPlayer.getNamesOfPlayersOnServer(), arguments[1], true);
                case 1:
                case 2:
                    if (smartPlayer.isInParty() && smartPlayer.isPartyOwner()) {
                        return Text.returnStartingEntries(Miscellaneous.processList(Miscellaneous.without(smartPlayer.getCurrentParty().getPlayers(), smartPlayer), SmartPlayer::getName), arguments[1], true);
                    }
                    break;
                case 7:
                    return Text.returnStartingEntries(smartPlayer.getPartiesToJoin(), arguments[1], true);
                case 9:
                    return Text.returnStartingEntries(SETTING_COMMANDS, arguments[1], true);
            }
        }
        return new ArrayList<>();
    }
}