diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java index dfb63f4..da9480f 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClanCommand.java @@ -4,6 +4,7 @@ import me.freezy.plugins.papermc.blazesmp.BlazeSMP; import me.freezy.plugins.papermc.blazesmp.command.util.SimpleCommand; import me.freezy.plugins.papermc.blazesmp.module.Clan; import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -12,15 +13,20 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.LinkedList; import java.util.stream.Collectors; import java.util.stream.Stream; +import static net.kyori.adventure.text.minimessage.MiniMessage.miniMessage; + public class ClanCommand extends SimpleCommand { private final BlazeSMP plugin; private final Clans clans; - private final LinkedHashMap> clanInvites = new LinkedHashMap<>(); + // Mapping: Clan -> Liste der Join-Anfragen (Spieler, die einer bestehenden Clan beitreten möchten) private final LinkedHashMap> clanJoins = new LinkedHashMap<>(); + // Mapping: Clan -> Liste der Einladungen (Spieler, die vom Clan eingeladen wurden) + private final LinkedHashMap> clanInvites = new LinkedHashMap<>(); public ClanCommand() { super("clan"); @@ -29,31 +35,325 @@ public class ClanCommand extends SimpleCommand { } @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String list, @NotNull String[] args) { - return false; + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, @NotNull String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage(miniMessage().deserialize("You must be a player to execute this command!")); + return true; + } + UUID playerUUID = player.getUniqueId(); + + if (args.length == 0) { + // Anzeige der Hilfemeldung – abhängig von der Rolle des Spielers + if (clans.isLeader(playerUUID)) { + Component l1 = miniMessage().deserialize("=== Clan Commands ===\n"); + Component l2 = miniMessage().deserialize(" - /clan info\n"); + Component l3 = miniMessage().deserialize(" - /clan invite\n"); + Component l4 = miniMessage().deserialize(" - /clan kick\n"); + Component l5 = miniMessage().deserialize(" - /clan transfer\n"); + Component l6 = miniMessage().deserialize(" - /clan promote\n"); + Component l7 = miniMessage().deserialize(" - /clan demote\n"); + Component l8 = miniMessage().deserialize(" - /clan disband\n"); + Component l9 = miniMessage().deserialize(" - /clan leave\n"); + Component l10 = miniMessage().deserialize(" - /clan accept\n"); + Component l11 = miniMessage().deserialize(" - /clan deny\n"); + Component l12 = miniMessage().deserialize(" - /clan modify\n"); + Component l13 = miniMessage().deserialize("====================="); + player.sendMessage(l1.append(l2).append(l3).append(l4).append(l5) + .append(l6).append(l7).append(l8).append(l9).append(l10).append(l11).append(l12).append(l13)); + } else if (clans.isVice(playerUUID)) { + Component l1 = miniMessage().deserialize("=== Clan Commands ===\n"); + Component l2 = miniMessage().deserialize(" - /clan info\n"); + Component l3 = miniMessage().deserialize(" - /clan invite\n"); + Component l4 = miniMessage().deserialize(" - /clan kick\n"); + Component l5 = miniMessage().deserialize(" - /clan demote\n"); + Component l6 = miniMessage().deserialize(" - /clan leave\n"); + Component l7 = miniMessage().deserialize(" - /clan accept\n"); + Component l8 = miniMessage().deserialize(" - /clan deny\n"); + Component l9 = miniMessage().deserialize("====================="); + player.sendMessage(l1.append(l2).append(l3).append(l4).append(l5) + .append(l6).append(l7).append(l8).append(l9)); + } else if (clans.isMember(playerUUID)) { + Component l1 = miniMessage().deserialize("=== Clan Commands ===\n"); + Component l2 = miniMessage().deserialize(" - /clan info\n"); + Component l3 = miniMessage().deserialize(" - /clan leave\n"); + Component l4 = miniMessage().deserialize("====================="); + player.sendMessage(l1.append(l2).append(l3).append(l4)); + } else { + Component l1 = miniMessage().deserialize("=== Clan Commands ===\n"); + Component l2 = miniMessage().deserialize(" - /clan create\n"); + Component l3 = miniMessage().deserialize(" - /clan join\n"); + Component l4 = miniMessage().deserialize(" - /clan accept\n"); + Component l5 = miniMessage().deserialize(" - /clan deny\n"); + Component l6 = miniMessage().deserialize("====================="); + player.sendMessage(l1.append(l2).append(l3).append(l4).append(l5).append(l6)); + } + return true; + } + + // Verarbeitung der Unterbefehle + String subCommand = args[0].toLowerCase(); + switch (subCommand) { + case "create" -> { + if (clans.isInClan(playerUUID)) { + player.sendMessage(miniMessage().deserialize("You are already in a clan!")); + return true; + } + if (args.length < 3) { + player.sendMessage(miniMessage().deserialize("Usage: /clan create ")); + return true; + } + String clanName = args[1]; + String clanTag = args[2]; + Component tagComponent = miniMessage().deserialize(clanTag); + Clan newClan = new Clan(clanName, tagComponent, playerUUID); + clans.addClan(newClan); + newClan.save(); + player.sendMessage(miniMessage().deserialize("Clan created successfully!")); + return true; + } + case "join" -> { + if (clans.isInClan(playerUUID)) { + player.sendMessage(miniMessage().deserialize("You are already in a clan!")); + return true; + } + if (args.length < 2) { + player.sendMessage(miniMessage().deserialize("Usage: /clan join ")); + return true; + } + String targetClanName = args[1]; + Clan targetClan = clans.getClanByName(targetClanName); + if (targetClan == null) { + player.sendMessage(miniMessage().deserialize("Clan not found!")); + return true; + } + // Füge eine Join-Anfrage hinzu + clanJoins.computeIfAbsent(targetClan, k -> new LinkedList<>()); + LinkedList joinRequests = clanJoins.get(targetClan); + if (joinRequests.contains(playerUUID)) { + player.sendMessage(miniMessage().deserialize("You have already requested to join this clan.")); + return true; + } + joinRequests.add(playerUUID); + player.sendMessage(miniMessage().deserialize("Join request sent to clan " + targetClan.getName() + "!")); + // Benachrichtige den Clan-Leader (sofern online) mit klickbaren Nachrichten + Player leader = Bukkit.getPlayer(targetClan.getLeaderUUID()); + if (leader != null && leader.isOnline()) { + String acceptCommand = "/clan accept " + player.getName(); + String denyCommand = "/clan deny " + player.getName(); + Component notifyMsg = miniMessage().deserialize( + "New join request from " + player.getName() + ".\n" + + "[Accept] " + + "[Deny]" + ); + leader.sendMessage(notifyMsg); + } + return true; + } + case "invite" -> { + if (!clans.isLeader(playerUUID) && !clans.isVice(playerUUID)) { + player.sendMessage(miniMessage().deserialize("You are not authorized to invite players to a clan!")); + return true; + } + if (args.length < 2) { + player.sendMessage(miniMessage().deserialize("Usage: /clan invite ")); + return true; + } + String inviteeName = args[1]; + Player invitee = Bukkit.getPlayer(inviteeName); + if (invitee == null || !invitee.isOnline()) { + player.sendMessage(miniMessage().deserialize("Player " + inviteeName + " is not online!")); + return true; + } + if (clans.isInClan(invitee.getUniqueId())) { + player.sendMessage(miniMessage().deserialize("" + inviteeName + " is already in a clan!")); + return true; + } + Clan inviterClan = clans.getClanByMember(playerUUID); + if (inviterClan == null) { + player.sendMessage(miniMessage().deserialize("Error: Your clan could not be found.")); + return true; + } + clanInvites.computeIfAbsent(inviterClan, k -> new LinkedList<>()); + LinkedList inviteList = clanInvites.get(inviterClan); + if (inviteList.contains(invitee.getUniqueId())) { + player.sendMessage(miniMessage().deserialize("Player " + inviteeName + " has already been invited!")); + return true; + } + inviteList.add(invitee.getUniqueId()); + player.sendMessage(miniMessage().deserialize("Invite sent to " + inviteeName + ".")); + // Benachrichtige den eingeladenen Spieler mit klickbaren Nachrichten + String acceptCmd = "/clan accept " + inviterClan.getName(); + String denyCmd = "/clan deny " + inviterClan.getName(); + Component inviteNotify = miniMessage().deserialize( + "Invite from clan " + inviterClan.getName() + ".\n" + + "[Accept] " + + "[Deny]" + ); + invitee.sendMessage(inviteNotify); + return true; + } + case "accept" -> { + // Unterscheidung: Ist der Spieler noch in keinem Clan? -> Einladung annehmen. + if (!clans.isInClan(playerUUID)) { + if (args.length < 2) { + player.sendMessage(miniMessage().deserialize("Usage: /clan accept ")); + return true; + } + String clanNameForInvite = args[1]; + Clan invitedClan = null; + for (var entry : clanInvites.entrySet()) { + if (entry.getValue().contains(playerUUID) && + entry.getKey().getName().equalsIgnoreCase(clanNameForInvite)) { + invitedClan = entry.getKey(); + break; + } + } + if (invitedClan == null) { + player.sendMessage(miniMessage().deserialize("No invite found from clan " + clanNameForInvite + ".")); + return true; + } + invitedClan.getMembers().add(playerUUID); + clanInvites.get(invitedClan).remove(playerUUID); + player.sendMessage(miniMessage().deserialize("You have joined the clan " + invitedClan.getName() + "!")); + Player leader = Bukkit.getPlayer(invitedClan.getLeaderUUID()); + if (leader != null && leader.isOnline()) { + leader.sendMessage(miniMessage().deserialize("" + player.getName() + " has accepted the clan invite.")); + } + invitedClan.save(); + } else { + // Akzeptiere eine Beitrittsanfrage – nur für Leader oder Vice + if (!clans.isLeader(playerUUID) && !clans.isVice(playerUUID)) { + player.sendMessage(miniMessage().deserialize("You are not authorized to accept join requests.")); + return true; + } + if (args.length < 2) { + player.sendMessage(miniMessage().deserialize("Usage: /clan accept ")); + return true; + } + String joinRequesterName = args[1]; + Clan currentClan = clans.getClanByMember(playerUUID); + if (currentClan == null) { + player.sendMessage(miniMessage().deserialize("Error: Your clan could not be found.")); + return true; + } + LinkedList joinReqs = clanJoins.get(currentClan); + if (joinReqs == null || joinReqs.isEmpty()) { + player.sendMessage(miniMessage().deserialize("No join requests available.")); + return true; + } + UUID requesterUUID = null; + for (UUID uuid : joinReqs) { + Player p = Bukkit.getPlayer(uuid); + if (p != null && p.getName().equalsIgnoreCase(joinRequesterName)) { + requesterUUID = uuid; + break; + } + } + if (requesterUUID == null) { + player.sendMessage(miniMessage().deserialize("No join request found from " + joinRequesterName + ".")); + return true; + } + currentClan.getMembers().add(requesterUUID); + joinReqs.remove(requesterUUID); + player.sendMessage(miniMessage().deserialize("You have accepted " + joinRequesterName + "'s join request.")); + Player requester = Bukkit.getPlayer(requesterUUID); + if (requester != null && requester.isOnline()) { + requester.sendMessage(miniMessage().deserialize("Your join request for clan " + currentClan.getName() + " has been accepted.")); + } + currentClan.save(); + } + return true; + } + case "deny" -> { + if (!clans.isInClan(playerUUID)) { + if (args.length < 2) { + player.sendMessage(miniMessage().deserialize("Usage: /clan deny ")); + return true; + } + String clanNameForInvite = args[1]; + Clan invitedClan = null; + for (var entry : clanInvites.entrySet()) { + if (entry.getValue().contains(playerUUID) && + entry.getKey().getName().equalsIgnoreCase(clanNameForInvite)) { + invitedClan = entry.getKey(); + break; + } + } + if (invitedClan == null) { + player.sendMessage(miniMessage().deserialize("No invite found from clan " + clanNameForInvite + ".")); + return true; + } + clanInvites.get(invitedClan).remove(playerUUID); + player.sendMessage(miniMessage().deserialize("You have declined the clan invite from " + invitedClan.getName() + ".")); + Player leader = Bukkit.getPlayer(invitedClan.getLeaderUUID()); + if (leader != null && leader.isOnline()) { + leader.sendMessage(miniMessage().deserialize("" + player.getName() + " has declined the clan invite.")); + } + } else { + if (!clans.isLeader(playerUUID) && !clans.isVice(playerUUID)) { + player.sendMessage(miniMessage().deserialize("You are not authorized to deny join requests.")); + return true; + } + if (args.length < 2) { + player.sendMessage(miniMessage().deserialize("Usage: /clan deny ")); + return true; + } + String joinRequesterName = args[1]; + Clan currentClan = clans.getClanByMember(playerUUID); + if (currentClan == null) { + player.sendMessage(miniMessage().deserialize("Error: Your clan could not be found.")); + return true; + } + LinkedList joinReqs = clanJoins.get(currentClan); + if (joinReqs == null || joinReqs.isEmpty()) { + player.sendMessage(miniMessage().deserialize("No join requests available.")); + return true; + } + UUID requesterUUID = null; + for (UUID uuid : joinReqs) { + Player p = Bukkit.getPlayer(uuid); + if (p != null && p.getName().equalsIgnoreCase(joinRequesterName)) { + requesterUUID = uuid; + break; + } + } + if (requesterUUID == null) { + player.sendMessage(miniMessage().deserialize("No join request found from " + joinRequesterName + ".")); + return true; + } + joinReqs.remove(requesterUUID); + player.sendMessage(miniMessage().deserialize("You have denied " + joinRequesterName + "'s join request.")); + Player requester = Bukkit.getPlayer(requesterUUID); + if (requester != null && requester.isOnline()) { + requester.sendMessage(miniMessage().deserialize("Your join request for clan " + currentClan.getName() + " has been denied.")); + } + } + return true; + } + default -> { + player.sendMessage(miniMessage().deserialize("Unknown subcommand. Use /clan for help.")); + return true; + } + } } @Override - public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String list, @NotNull String[] args) { + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, @NotNull String[] args) { Player player = (Player) sender; UUID playerUUID = player.getUniqueId(); if (args.length == 1) { if (clans.isLeader(playerUUID)) { return Stream.of("info", "invite", "kick", "transfer", "promote", "demote", "disband", "leave", "accept", "deny", "modify") - .filter(s -> s.startsWith(args[0])) - .toList(); + .filter(s -> s.startsWith(args[0])).toList(); } else if (clans.isVice(playerUUID)) { return Stream.of("info", "invite", "kick", "demote", "leave", "accept", "deny") - .filter(s -> s.startsWith(args[0])) - .toList(); + .filter(s -> s.startsWith(args[0])).toList(); } else if (clans.isMember(playerUUID)) { - return Stream.of("info","leave") - .filter(s -> s.startsWith(args[0])) - .toList(); + return Stream.of("info", "leave") + .filter(s -> s.startsWith(args[0])).toList(); } else { return Stream.of("create", "join", "accept", "deny") - .filter(s -> s.startsWith(args[0])) - .toList(); + .filter(s -> s.startsWith(args[0])).toList(); } } else if (args.length == 2) { if (clans.isLeader(playerUUID)) { @@ -61,18 +361,15 @@ public class ClanCommand extends SimpleCommand { return Bukkit.getOnlinePlayers().stream() .filter(p -> !clans.isMember(p.getUniqueId())) .map(Player::getName) - .filter(name -> name.startsWith(args[1])) - .collect(Collectors.toList()); + .filter(name -> name.startsWith(args[1])).collect(Collectors.toList()); } else if (args[0].equalsIgnoreCase("kick")) { return clans.getClanByMember(playerUUID).getMembers().stream() .map(UUID::toString) - .filter(s -> s.startsWith(args[1])) - .collect(Collectors.toList()); + .filter(s -> s.startsWith(args[1])).collect(Collectors.toList()); } else if (args[0].equalsIgnoreCase("promote")) { return clans.getClanByMember(playerUUID).getMembers().stream() .map(UUID::toString) - .filter(s -> s.startsWith(args[1])) - .collect(Collectors.toList()); + .filter(s -> s.startsWith(args[1])).collect(Collectors.toList()); } else if (args[0].equalsIgnoreCase("demote")) { return Collections.singletonList(plugin.getServer().getOfflinePlayer(clans.getClanByMember(playerUUID).getViceUUID()).getName()); } else if (args[0].equalsIgnoreCase("accept")) { @@ -82,22 +379,18 @@ public class ClanCommand extends SimpleCommand { List joins = getClanJoinRequests(args, playerUUID); if (joins != null) return joins; } else if (args[0].equalsIgnoreCase("modify")) { - return Stream.of("name", "tag") - .filter(s -> s.startsWith(args[1])) - .toList(); + return Stream.of("name", "tag").filter(s -> s.startsWith(args[1])).toList(); } } else if (clans.isVice(playerUUID)) { if (args[0].equalsIgnoreCase("invite")) { return Bukkit.getOnlinePlayers().stream() .filter(p -> !clans.isMember(p.getUniqueId())) .map(Player::getName) - .filter(name -> name.startsWith(args[1])) - .collect(Collectors.toList()); + .filter(name -> name.startsWith(args[1])).collect(Collectors.toList()); } else if (args[0].equalsIgnoreCase("kick")) { return clans.getClanByMember(playerUUID).getMembers().stream() .map(UUID::toString) - .filter(s -> s.startsWith(args[1])) - .collect(Collectors.toList()); + .filter(s -> s.startsWith(args[1])).collect(Collectors.toList()); } else if (args[0].equalsIgnoreCase("accept")) { List joins = getClanJoinRequests(args, playerUUID); if (joins != null) return joins; @@ -121,8 +414,7 @@ public class ClanCommand extends SimpleCommand { } else if (args[0].equalsIgnoreCase("join")) { return clans.getClans().stream() .map(Clan::getName) - .filter(s -> s.startsWith(args[1])) - .collect(Collectors.toList()); + .filter(s -> s.startsWith(args[1])).collect(Collectors.toList()); } else if (args[0].equalsIgnoreCase("create")) { return Collections.singletonList(""); } @@ -150,8 +442,7 @@ public class ClanCommand extends SimpleCommand { return joins.stream() .map(uuid -> plugin.getServer().getOfflinePlayer(uuid).getName()) .filter(Objects::nonNull) - .filter(s -> s.startsWith(args[1])) - .collect(Collectors.toList()); + .filter(s -> s.startsWith(args[1])).collect(Collectors.toList()); } return null; }