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 COMMANDS = Arrays.asList( "invite", "kick", "kickoffline", "promote", "disband", "warp", "list", "join", "leave", "settings", "create" ); private final static List 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 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<>(); } }