From 06ca7a311a88a5897b6651377e9195c0e111cce6 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 15 Mar 2024 18:46:07 -0700 Subject: [PATCH] Simplify code. Fix code smells. --- .../commands/island/team/IslandTeamGUI.java | 291 ++++++++++-------- .../island/team/IslandTeamInviteGUI.java | 39 ++- 2 files changed, 184 insertions(+), 146 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamGUI.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamGUI.java index 93e096a67..598e940a9 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamGUI.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamGUI.java @@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.commands.island.team.Invite.Type; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem; @@ -44,6 +45,10 @@ public class IslandTeamGUI { private static final List RANKS = List.of(RanksManager.OWNER_RANK, RanksManager.SUB_OWNER_RANK, RanksManager.MEMBER_RANK, RanksManager.TRUSTED_RANK, RanksManager.COOP_RANK); + private static final String NAME = ".name"; + + private static final String TIPS = "commands.island.team.gui.tips."; + private final User user; private final Island island; @@ -111,7 +116,7 @@ public class IslandTeamGUI { builder.name(user.getTranslation("commands.island.team.gui.buttons.invite.name")); builder.description(user.getTranslation("commands.island.team.gui.buttons.invite.description")); builder.clickHandler((panel, user, clickType, clickSlot) -> { - if (!template.actions().stream().anyMatch(ar -> clickType.equals(ar.clickType()))) { + if (template.actions().stream().noneMatch(ar -> clickType.equals(ar.clickType()))) { // If the click type is not in the template, don't do anything return true; } @@ -133,25 +138,15 @@ public class IslandTeamGUI { builder.name(user.getTranslation("commands.island.team.gui.buttons.rank-filter.name")); builder.icon(Material.AMETHYST_SHARD); // Create description - RanksManager.getInstance().getRanks().forEach((reference, score) -> { - if (rankView == RanksManager.OWNER_RANK && score > RanksManager.VISITOR_RANK - && score <= RanksManager.OWNER_RANK) { - builder.description(user.getTranslation("protection.panel.flag-item.allowed-rank") - + user.getTranslation(reference)); - } else if (score > RanksManager.VISITOR_RANK && score < rankView) { - builder.description(user.getTranslation("protection.panel.flag-item.blocked-rank") - + user.getTranslation(reference)); - } else if (score <= RanksManager.OWNER_RANK && score > rankView) { - builder.description(user.getTranslation("protection.panel.flag-item.blocked-rank") - + user.getTranslation(reference)); - } else if (score == rankView) { - builder.description(user.getTranslation("protection.panel.flag-item.allowed-rank") - + user.getTranslation(reference)); - } - }); - builder.description(user.getTranslation("commands.island.team.gui.buttons.rank-filter.description")); + createDescription(builder); + createClickHandler(builder, template.actions()); + + return builder.build(); + } + + private void createClickHandler(PanelItemBuilder builder, @NonNull List actions) { builder.clickHandler((panel, user, clickType, clickSlot) -> { - if (!template.actions().stream().anyMatch(ar -> clickType.equals(ar.clickType()))) { + if (actions.stream().noneMatch(ar -> clickType.equals(ar.clickType()))) { // If the click type is not in the template, don't do anything return true; } @@ -179,7 +174,28 @@ public class IslandTeamGUI { return true; }); - return builder.build(); + + } + + private void createDescription(PanelItemBuilder builder) { + RanksManager.getInstance().getRanks().forEach((reference, score) -> { + if (rankView == RanksManager.OWNER_RANK && score > RanksManager.VISITOR_RANK + && score <= RanksManager.OWNER_RANK) { + builder.description(user.getTranslation("protection.panel.flag-item.allowed-rank") + + user.getTranslation(reference)); + } else if (score > RanksManager.VISITOR_RANK && score < rankView) { + builder.description(user.getTranslation("protection.panel.flag-item.blocked-rank") + + user.getTranslation(reference)); + } else if (score <= RanksManager.OWNER_RANK && score > rankView) { + builder.description(user.getTranslation("protection.panel.flag-item.blocked-rank") + + user.getTranslation(reference)); + } else if (score == rankView) { + builder.description(user.getTranslation("protection.panel.flag-item.allowed-rank") + + user.getTranslation(reference)); + } + }); + builder.description(user.getTranslation("commands.island.team.gui.buttons.rank-filter.description")); + } /** @@ -193,59 +209,70 @@ public class IslandTeamGUI { PanelItemBuilder builder = new PanelItemBuilder(); if (parent.isInvited(user.getUniqueId()) && user.hasPermission(parent.getAcceptCommand().getPermission())) { Invite invite = parent.getInvite(user.getUniqueId()); + if (invite == null) { + return this.getBlankBorder(); + } User inviter = User.getInstance(invite.getInviter()); String name = inviter.getName(); builder.icon(inviter.getName()); builder.name(user.getTranslation("commands.island.team.gui.buttons.invitation")); - builder.description(switch (invite.getType()) { - case COOP -> - List.of(user.getTranslation("commands.island.team.invite.name-has-invited-you.coop", TextVariables.NAME, - name)); - case TRUST -> - List.of(user.getTranslation("commands.island.team.invite.name-has-invited-you.trust", - TextVariables.NAME, name)); - default -> - List.of(user.getTranslation("commands.island.team.invite.name-has-invited-you", TextVariables.NAME, - name), user.getTranslation("commands.island.team.invite.accept.confirmation")); - }); - // Add all the tool tips - builder.description(template.actions().stream() - .map(ar -> user.getTranslation("commands.island.team.gui.tips." + ar.clickType().name() + ".name") - + " " - + user.getTranslation(ar.tooltip())) - .toList()); - builder.clickHandler((panel, user, clickType, clickSlot) -> { - if (!template.actions().stream().anyMatch(ar -> clickType.equals(ar.clickType()))) { - // If the click type is not in the template, don't do anything - return true; - } - if (clickType.equals(ClickType.SHIFT_LEFT) - && user.hasPermission(parent.getAcceptCommand().getPermission())) { - plugin.log("Invite accepted: " + user.getName() + " accepted " + invite.getType()); - // Accept - switch (invite.getType()) { - case COOP -> parent.getAcceptCommand().acceptCoopInvite(user, invite); - case TRUST -> parent.getAcceptCommand().acceptTrustInvite(user, invite); - default -> parent.getAcceptCommand().acceptTeamInvite(user, invite); - } - user.closeInventory(); - } - if (clickType.equals(ClickType.SHIFT_RIGHT) - && user.hasPermission(parent.getRejectCommand().getPermission())) { - // Reject - plugin.log("Invite rejected: " + user.getName() + " rejected " + invite.getType() - + " invite."); - parent.getRejectCommand().execute(user, "", List.of()); - user.closeInventory(); - } - return true; - }); + createInviteDescription(builder, invite.getType(), name, template.actions()); + createInviteClickHandler(builder, invite, template.actions()); } else { return this.getBlankBorder(); } return builder.build(); } + private void createInviteClickHandler(PanelItemBuilder builder, Invite invite, @NonNull List list) { + Type type = invite.getType(); + builder.clickHandler((panel, user, clickType, clickSlot) -> { + if (list.stream().noneMatch(ar -> clickType.equals(ar.clickType()))) { + // If the click type is not in the template, don't do anything + return true; + } + if (clickType.equals(ClickType.SHIFT_LEFT) + && user.hasPermission(parent.getAcceptCommand().getPermission())) { + plugin.log("Invite accepted: " + user.getName() + " accepted " + type); + // Accept + switch (type) { + case COOP -> parent.getAcceptCommand().acceptCoopInvite(user, invite); + case TRUST -> parent.getAcceptCommand().acceptTrustInvite(user, invite); + default -> parent.getAcceptCommand().acceptTeamInvite(user, invite); + } + user.closeInventory(); + } + if (clickType.equals(ClickType.SHIFT_RIGHT) + && user.hasPermission(parent.getRejectCommand().getPermission())) { + // Reject + plugin.log("Invite rejected: " + user.getName() + " rejected " + type + " invite."); + parent.getRejectCommand().execute(user, "", List.of()); + user.closeInventory(); + } + return true; + }); + + } + + private void createInviteDescription(PanelItemBuilder builder, Type type, String name, + @NonNull List list) { + builder.description(switch (type) { + case COOP -> List.of( + user.getTranslation("commands.island.team.invite.name-has-invited-you.coop", TextVariables.NAME, name)); + case TRUST -> List.of(user.getTranslation("commands.island.team.invite.name-has-invited-you.trust", + TextVariables.NAME, name)); + default -> + List.of(user.getTranslation("commands.island.team.invite.name-has-invited-you", TextVariables.NAME, name), + user.getTranslation("commands.island.team.invite.accept.confirmation")); + }); + // Add all the tool tips + builder.description(list.stream() + .map(ar -> user.getTranslation(TIPS + ar.clickType().name() + NAME) + " " + + user.getTranslation(ar.tooltip())) + .toList()); + + } + /** * Create status button panel item. * @@ -256,8 +283,8 @@ public class IslandTeamGUI { private PanelItem createStatusButton(ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) { PanelItemBuilder builder = new PanelItemBuilder(); // Player issuing the command must have an island - Island island = plugin.getIslands().getPrimaryIsland(parent.getWorld(), user.getUniqueId()); - if (island == null) { + Island is = plugin.getIslands().getPrimaryIsland(parent.getWorld(), user.getUniqueId()); + if (is == null) { return getBlankBorder(); } @@ -285,32 +312,32 @@ public class IslandTeamGUI { */ private PanelItem createMemberButton(ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) { // Player issuing the command must have an island - Island island = plugin.getIslands().getPrimaryIsland(parent.getWorld(), user.getUniqueId()); - if (island == null) { + Island is = plugin.getIslands().getPrimaryIsland(parent.getWorld(), user.getUniqueId()); + if (is == null) { return this.getBlankBackground(); } int minimumRank = RanksManager.getInstance().getRankUpValue(RanksManager.VISITOR_RANK); // Get the rank above Visitor. - Optional opMember = island.getMemberSet(minimumRank).stream().map(User::getInstance) - .filter((User usr) -> rankView == RanksManager.OWNER_RANK || island.getRank(usr) == rankView) // If rankView is owner then show all ranks - .sorted(Comparator.comparingInt((User usr) -> island.getRank(usr)).reversed()) // Show owner on left, then descending ranks + Optional opMember = is.getMemberSet(minimumRank).stream().map(User::getInstance) + .filter((User usr) -> rankView == RanksManager.OWNER_RANK || is.getRank(usr) == rankView) // If rankView is owner then show all ranks + .sorted(Comparator.comparingInt((User usr) -> is.getRank(usr)).reversed()) // Show owner on left, then descending ranks .skip(slot.slot()) // Get the head for this slot .limit(1L).findFirst(); // Get just one head if (opMember.isEmpty()) { return this.getBlankBackground(); } User member = opMember.get(); - int rank = island.getRank(member); + int rank = is.getRank(member); String rankRef = RanksManager.getInstance().getRank(rank); @NonNull List actions = template.actions(); // Make button description depending on viewer List desc = new ArrayList<>(); - int userRank = Objects.requireNonNull(island).getRank(user); + int userRank = Objects.requireNonNull(is).getRank(user); // Add the tooltip for kicking if (user.hasPermission(parent.getKickCommand().getPermission()) - && userRank >= island.getRankCommand(parent.getLabel() + " kick") && !user.equals(member)) { + && userRank >= is.getRankCommand(parent.getLabel() + " kick") && !user.equals(member)) { actions.stream().filter(ar -> ar.actionType().equalsIgnoreCase("kick")) - .map(ar -> user.getTranslation("commands.island.team.gui.tips." + ar.clickType().name() + ".name") + .map(ar -> user.getTranslation(TIPS + ar.clickType().name() + NAME) + " " + user.getTranslation(ar.tooltip())) .findFirst().ifPresent(desc::add); } @@ -319,7 +346,7 @@ public class IslandTeamGUI { && userRank >= RanksManager.OWNER_RANK && rank >= RanksManager.MEMBER_RANK) { // Add the tooltip for setowner actions.stream().filter(ar -> ar.actionType().equalsIgnoreCase("setowner")) - .map(ar -> user.getTranslation("commands.island.team.gui.tips." + ar.clickType().name() + ".name") + .map(ar -> user.getTranslation(TIPS + ar.clickType().name() + NAME) + " " + user.getTranslation(ar.tooltip())) .findFirst().ifPresent(desc::add); } @@ -328,7 +355,7 @@ public class IslandTeamGUI { && userRank < RanksManager.OWNER_RANK) { // Add the tooltip for leave actions.stream().filter(ar -> ar.actionType().equalsIgnoreCase("leave")) - .map(ar -> user.getTranslation("commands.island.team.gui.tips." + ar.clickType().name() + ".name") + .map(ar -> user.getTranslation(TIPS + ar.clickType().name() + NAME) + " " + user.getTranslation(ar.tooltip())) .findFirst().ifPresent(desc::add); } @@ -342,7 +369,7 @@ public class IslandTeamGUI { // Offline player desc.add(0, user.getTranslation(rankRef)); return new PanelItemBuilder().icon(member.getName()) - .name(offlinePlayerStatus(user, Bukkit.getOfflinePlayer(member.getUniqueId()))).description(desc) + .name(offlinePlayerStatus(Bukkit.getOfflinePlayer(member.getUniqueId()))).description(desc) .clickHandler( (panel, user, clickType, i) -> clickListener(panel, user, clickType, i, member, actions)) .build(); @@ -361,7 +388,7 @@ public class IslandTeamGUI { */ private boolean clickListener(Panel panel, User clickingUser, ClickType clickType, int i, User target, List actions) { - if (!actions.stream().anyMatch(ar -> clickType.equals(ar.clickType()))) { + if (actions.stream().noneMatch(ar -> clickType.equals(ar.clickType()))) { // If the click type is not in the template, don't do anything return true; } @@ -369,52 +396,11 @@ public class IslandTeamGUI { for (ItemTemplateRecord.ActionRecords action : actions) { if (clickType.equals(action.clickType())) { switch (action.actionType().toUpperCase(Locale.ENGLISH)) { - case "KICK" -> { - // Kick the player, or uncoop, or untrust - if (clickingUser.hasPermission(parent.getKickCommand().getPermission()) - && !target.equals(clickingUser) - && rank >= island.getRankCommand(parent.getLabel() + " kick")) { - plugin.log("Kick: " + clickingUser.getName() + " kicked " + target.getName() - + " from island at " + island.getCenter()); - clickingUser.closeInventory(); - if (removePlayer(clickingUser, target)) { - clickingUser.getPlayer().playSound(clickingUser.getLocation(), Sound.BLOCK_GLASS_BREAK, 1F, - 1F); - plugin.log("Kick: success"); - } else { - plugin.log("Kick: failed"); - } - } - } - case "SETOWNER" -> { - // Make the player the leader of the island - if (clickingUser.hasPermission(parent.getSetOwnerCommand().getPermission()) - && !target.equals(clickingUser) - && clickingUser.getUniqueId().equals(island.getOwner()) - && island.getRank(target) >= RanksManager.MEMBER_RANK) { - plugin.log("Set Owner: " + clickingUser.getName() + " trying to make " + target.getName() - + " owner of island at " + island.getCenter()); - clickingUser.closeInventory(); - if (parent.getSetOwnerCommand().setOwner(clickingUser, target.getUniqueId())) { - plugin.log("Set Owner: success"); - } else { - plugin.log("Set Owner: failed"); - } - } - } - case "LEAVE" -> { - if (clickingUser.hasPermission(parent.getLeaveCommand().getPermission()) - && target.equals(clickingUser) - && !clickingUser.getUniqueId().equals(island.getOwner())) { - plugin.log("Leave: " + clickingUser.getName() + " trying to leave island at " - + island.getCenter()); - clickingUser.closeInventory(); - if (parent.getLeaveCommand().leave(clickingUser)) { - plugin.log("Leave: success"); - } else { - plugin.log("Leave: failed"); - } - } + case "KICK" -> kickPlayer(clickingUser, target, rank); + case "SETOWNER" -> setOwner(clickingUser, target); + case "LEAVE" -> leave(clickingUser, target); + default -> { + // Do nothing } } } @@ -422,6 +408,51 @@ public class IslandTeamGUI { return true; } + private void leave(User clickingUser, User target) { + if (clickingUser.hasPermission(parent.getLeaveCommand().getPermission()) && target.equals(clickingUser) + && !clickingUser.getUniqueId().equals(island.getOwner())) { + plugin.log("Leave: " + clickingUser.getName() + " trying to leave island at " + island.getCenter()); + clickingUser.closeInventory(); + if (parent.getLeaveCommand().leave(clickingUser)) { + plugin.log("Leave: success"); + } else { + plugin.log("Leave: failed"); + } + } + } + + private void setOwner(User clickingUser, User target) { + // Make the player the leader of the island + if (clickingUser.hasPermission(parent.getSetOwnerCommand().getPermission()) && !target.equals(clickingUser) + && clickingUser.getUniqueId().equals(island.getOwner()) + && island.getRank(target) >= RanksManager.MEMBER_RANK) { + plugin.log("Set Owner: " + clickingUser.getName() + " trying to make " + target.getName() + + " owner of island at " + island.getCenter()); + clickingUser.closeInventory(); + if (parent.getSetOwnerCommand().setOwner(clickingUser, target.getUniqueId())) { + plugin.log("Set Owner: success"); + } else { + plugin.log("Set Owner: failed"); + } + } + } + + private void kickPlayer(User clickingUser, User target, int rank) { + // Kick the player, or uncoop, or untrust + if (clickingUser.hasPermission(parent.getKickCommand().getPermission()) && !target.equals(clickingUser) + && rank >= island.getRankCommand(parent.getLabel() + " kick")) { + plugin.log("Kick: " + clickingUser.getName() + " kicked " + target.getName() + " from island at " + + island.getCenter()); + clickingUser.closeInventory(); + if (removePlayer(clickingUser, target)) { + clickingUser.getPlayer().playSound(clickingUser.getLocation(), Sound.BLOCK_GLASS_BREAK, 1F, 1F); + plugin.log("Kick: success"); + } else { + plugin.log("Kick: failed"); + } + } + } + private boolean removePlayer(User clicker, User member) { // If member then kick, if coop, uncoop, if trusted, then untrust return switch (island.getRank(member)) { @@ -468,28 +499,28 @@ public class IslandTeamGUI { user.getTranslation(RanksManager.getInstance().getRank(rank)), TextVariables.NUMBER, String.valueOf(island.getMemberSet(rank, false).size()))); } - message.addAll(displayOnOffline(user, rank, island, onlineMembers)); + message.addAll(displayOnOffline(rank, island, onlineMembers)); } } return message; } - private List displayOnOffline(User user, int rank, Island island, List onlineMembers) { + private List displayOnOffline(int rank, Island island, List onlineMembers) { List message = new ArrayList<>(); for (UUID member : island.getMemberSet(rank, false)) { - message.add(getMemberStatus(user, member, onlineMembers.contains(member))); + message.add(getMemberStatus(member, onlineMembers.contains(member))); } return message; } - private String getMemberStatus(User user2, UUID member, boolean online) { + private String getMemberStatus(UUID member, boolean online) { OfflinePlayer offlineMember = Bukkit.getOfflinePlayer(member); if (online) { return user.getTranslation("commands.island.team.info.member-layout.online", TextVariables.NAME, offlineMember.getName()); } else { - return offlinePlayerStatus(user, offlineMember); + return offlinePlayerStatus(offlineMember); } } @@ -499,7 +530,7 @@ public class IslandTeamGUI { * @param offlineMember member of the team * @return string */ - private String offlinePlayerStatus(User user2, OfflinePlayer offlineMember) { + private String offlinePlayerStatus(OfflinePlayer offlineMember) { String lastSeen = lastSeen(offlineMember); if (island.getMemberSet(RanksManager.MEMBER_RANK, true).contains(offlineMember.getUniqueId())) { return user.getTranslation("commands.island.team.info.member-layout.offline", TextVariables.NAME, diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUI.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUI.java index c3e2967cb..7cf35345f 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUI.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteGUI.java @@ -3,6 +3,8 @@ package world.bentobox.bentobox.api.commands.island.team; import java.io.File; import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.stream.Stream; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -118,7 +120,6 @@ public class IslandTeamInviteGUI { private PanelItem createNextButton(ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) { checkTemplate(template); - System.out.println(itc); long count = itc.getWorld().getPlayers().stream().filter(player -> user.getPlayer().canSee(player)) .filter(player -> !player.equals(user.getPlayer())).count(); if (count > page * PER_PAGE) { @@ -173,18 +174,27 @@ public class IslandTeamInviteGUI { */ private PanelItem createProspectButton(ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) { // Player issuing the command must have an island - Island island = plugin.getIslands().getPrimaryIsland(itc.getWorld(), user.getUniqueId()); - if (island == null) { + Island is = plugin.getIslands().getPrimaryIsland(itc.getWorld(), user.getUniqueId()); + if (is == null) { return this.getBlankBackground(); } if (page < 0) { page = 0; } - return itc.getWorld().getPlayers().stream().filter(player -> user.getPlayer().canSee(player)) - .filter(player -> this.searchName.isBlank() ? true - : player.getName().toLowerCase().contains(searchName.toLowerCase())) - .filter(player -> !player.equals(user.getPlayer())).skip(slot.slot() + page * PER_PAGE).findFirst() - .map(player -> getProspect(player, template)).orElse(this.getBlankBackground()); + // Stream of all players that the user can see + Stream visiblePlayers = itc.getWorld().getPlayers().stream().filter(user.getPlayer()::canSee); + + // Filter players based on searchName if it's not blank, and ensure they're not the user + Stream filteredPlayers = visiblePlayers + .filter(player -> this.searchName.isBlank() + || player.getName().toLowerCase().contains(searchName.toLowerCase())) + .filter(player -> !player.equals(user.getPlayer())); + + // Skipping to the correct pagination slot, then finding the first player + Optional playerOptional = filteredPlayers.skip(slot.slot() + page * PER_PAGE).findFirst(); + + // Map the player to a prospect or return a blank background if not found + return playerOptional.map(player -> getProspect(player, template)).orElse(this.getBlankBackground()); } private PanelItem getProspect(Player player, ItemTemplateRecord template) { @@ -199,14 +209,13 @@ public class IslandTeamInviteGUI { + " " + user.getTranslation(ar.tooltip())).toList(); return new PanelItemBuilder().icon(player.getName()).name(player.getDisplayName()).description(desc) .clickHandler( - (panel, user, clickType, clickSlot) -> clickHandler(panel, user, clickType, clickSlot, player, + (panel, user, clickType, clickSlot) -> clickHandler(user, clickType, player, template.actions())) .build(); } - private boolean clickHandler(Panel panel, User user, ClickType clickType, int clickSlot, Player player, - @NonNull List list) { - if (!list.stream().anyMatch(ar -> clickType.equals(ar.clickType()))) { + private boolean clickHandler(User user, ClickType clickType, Player player, @NonNull List list) { + if (list.stream().noneMatch(ar -> clickType.equals(ar.clickType()))) { // If the click type is not in the template, don't do anything return true; } @@ -262,12 +271,10 @@ public class IslandTeamInviteGUI { @Override public Prompt acceptInput(@NonNull ConversationContext context, String input) { - // TODO remove this and pass the options back to the GUI - if (itic.canExecute(user, itic.getLabel(), List.of(input))) { - if (itic.execute(user, itic.getLabel(), List.of(input))) { + if (itic.canExecute(user, itic.getLabel(), List.of(input)) + && itic.execute(user, itic.getLabel(), List.of(input))) { return Prompt.END_OF_CONVERSATION; } - } // Set the search item to what was entered searchName = input; // Return to the GUI but give a second for the error to show