package com.alttd.chat.commands; import com.alttd.chat.ChatPlugin; import com.alttd.chat.database.Queries; import com.alttd.chat.managers.ChatUserManager; import com.alttd.chat.managers.PartyManager; import com.alttd.chat.objects.ChatUser; import com.alttd.chat.objects.Party; import com.alttd.chat.util.Utility; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import java.util.Objects; public class PartyCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if(!(sender instanceof Player player)) { // must be a player return true; } if (args.length == 0) { helpMessage(sender); return true; } new BukkitRunnable() { @Override public void run() { switch (args[0].toLowerCase()) { case "create" -> { if (args.length < 3 || !args[1].matches("[\\w]{3,16}") || !args[2].matches("[\\w]{3,16}")) { invalidMessage(sender, CommandUsage.CREATE); break; } if (PartyManager.getParty(args[1]) != null) { sender.sendMessage(MiniMessage.get().parse("A party with this name already exists.")); break; } Party party = Queries.addParty(player.getUniqueId(), args[1], args[2]); party.addUser(ChatUserManager.getChatUser(player.getUniqueId())); PartyManager.addParty(party); sender.sendMessage(MiniMessage.get().parse("You created a party called: '" + party.getPartyName() + "' with the password: '" + party.getPartyPassword() + "'")); } case "invite" -> { if (args.length < 2) { invalidMessage(sender, CommandUsage.INVITE); break; } Party party = PartyManager.getParty(player.getUniqueId()); if (party == null) { sender.sendMessage(MiniMessage.get().parse("You're not in a party.")); break; } if (!party.getOwnerUuid().equals(player.getUniqueId())) { sender.sendMessage("You don't own this party."); break; } Player target = Bukkit.getPlayer(args[1]); if (target == null || !target.isOnline()) { sender.sendMessage(MiniMessage.get().parse("The player must be on the same server to receive an invite.")); break; } target.sendMessage(MiniMessage.get().parse("You received an invite to join " + party.getPartyName() + " click this message to accept.")); sender.sendMessage(MiniMessage.get().parse("You send a party invite to " + target.getName() + "!")); } case "join" -> { if (args.length < 3 || !args[1].matches("[\\w]{3,16}") || !args[2].matches("[\\w]{3,16}")) { invalidMessage(sender, CommandUsage.JOIN); break; } Party party = PartyManager.getParty(args[1]); if (party == null) { sender.sendMessage(MiniMessage.get().parse("This party does not exist.")); break; } if (!party.getPartyPassword().equals(args[2])) { sender.sendMessage(MiniMessage.get().parse("Invalid password.")); break; } party.addUser(ChatUserManager.getChatUser(player.getUniqueId())); sender.sendMessage(MiniMessage.get().parse("You joined " + party.getPartyName() + "!")); } case "leave" -> { Party party = PartyManager.getParty(player.getUniqueId()); if (party == null) { sender.sendMessage(MiniMessage.get().parse("You're not in a party.")); break; } party.removeUser(player.getUniqueId()); if (party.getOwnerUuid().equals(player.getUniqueId())) { if (party.getPartyUsers().size() > 0) { ChatUser chatUser = ChatUserManager.getChatUser(party.newOwner()); sender.sendMessage(MiniMessage.get().parse("Since you own this party a new party owner will be chosen.")); ChatPlugin.getInstance().getChatHandler().partyMessage(party, player, "" + ChatUserManager.getChatUser(player.getUniqueId()).getDisplayName() + " left the party, the new party owner is " + chatUser.getDisplayName()); } else { party.delete(); } } // TODO: 07/08/2021 leave the party } case "remove" -> { if (args.length < 2) { invalidMessage(sender, CommandUsage.REMOVE); break; } Party party = PartyManager.getParty(player.getUniqueId()); if (party == null) { sender.sendMessage(MiniMessage.get().parse("You're not in a party.")); break; } if (!party.getOwnerUuid().equals(player.getUniqueId())) { sender.sendMessage("You don't own this party."); break; } OfflinePlayer offlinePlayerIfCached = Bukkit.getOfflinePlayerIfCached((args[1])); if (offlinePlayerIfCached == null) { sender.sendMessage(MiniMessage.get().parse("Unable to find this player.")); return; } party.removeUser(ChatUserManager.getChatUser(offlinePlayerIfCached.getUniqueId())); if (offlinePlayerIfCached.isOnline()) { Objects.requireNonNull(offlinePlayerIfCached.getPlayer()) .sendMessage(MiniMessage.get().parse("You were removed from the '" + party.getPartyName() + "' party.")); } sender.sendMessage(MiniMessage.get().parse("You removed " + offlinePlayerIfCached.getName() + " from the party!")); } case "info" -> { Party party = PartyManager.getParty(player.getUniqueId()); if (party == null) { sender.sendMessage(MiniMessage.get().parse("You're not in a party.")); break; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("Party info:") .append("Party name: ").append(party.getPartyName()).append("\n") .append(party.getOwnerUuid().equals(player.getUniqueId()) ? "Party password: " + party.getPartyPassword() + "\n" : "") .append("Party owner: ").append(party.getUserDisplayName(party.getOwnerUuid())).append("\n") .append("Party members: "); for (String displayName : party.getPartyUsers().values()) { stringBuilder.append(displayName).append(", "); } stringBuilder.delete(stringBuilder.length() - 2, stringBuilder.length()); sender.sendMessage(Utility.applyColor(stringBuilder.toString())); } default -> { helpMessage(sender); } } } }.runTaskAsynchronously(ChatPlugin.getInstance()); return false; } private void invalidMessage(CommandSender sender, CommandUsage commandUsage) { sender.sendMessage(MiniMessage.get().parse("Invalid command, proper usage: %command%.".replaceAll("%command%", commandUsage.message))); } private void helpMessage(CommandSender sender) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("Party commands:"); for (CommandUsage commandUsage : CommandUsage.values()) { stringBuilder.append("\n- ").append(commandUsage.message); } stringBuilder.append(""); sender.sendMessage(MiniMessage.get().parse(stringBuilder.toString())); } private enum CommandUsage { CREATE("/party create <#FFE800>A party name must be 3-16 characters'> " + "A party password must be 3-16 characters\n" + "When choosing a password keep in mind staff can see it and you might need to share it with other players!'>"), INVITE("/party invite "), JOIN("/party join "), LEAVE("If the party owner leaves the server will choose a new party owner'>/party leave"), REMOVE("/party remove "); private final String message; CommandUsage(String message) { this.message = message; } } }