diff --git a/bukkit/src/main/java/org/popcraft/bolt/command/impl/ModifyCommand.java b/bukkit/src/main/java/org/popcraft/bolt/command/impl/ModifyCommand.java index 3bfd469a..855bb937 100644 --- a/bukkit/src/main/java/org/popcraft/bolt/command/impl/ModifyCommand.java +++ b/bukkit/src/main/java/org/popcraft/bolt/command/impl/ModifyCommand.java @@ -95,25 +95,15 @@ public void execute(CommandSender sender, Arguments arguments) { editFuture.thenAccept(source -> SchedulerUtil.schedule(plugin, player, () -> { if (source != null) { boltPlayer.getModifications().put(source, access.type()); - if (boltPlayer.isTrusting() && !boltPlayer.isTrustingSilently()) { - BoltComponents.sendMessage( - player, - adding ? Translation.TRUST_ADD : Translation.TRUST_REMOVE, - Placeholder.component(Translation.Placeholder.SOURCE_TYPE, Component.text(source.getType())), - Placeholder.component(Translation.Placeholder.SOURCE_IDENTIFIER, Component.text(finalIdentifier)) - ); - } } })); } - if (!boltPlayer.isTrusting()) { - BoltComponents.sendMessage( - player, - Translation.CLICK_ACTION, - plugin.isUseActionBar(), - Placeholder.component(Translation.Placeholder.ACTION, BoltComponents.resolveTranslation(Translation.EDIT, player)) - ); - } + BoltComponents.sendMessage( + player, + Translation.CLICK_ACTION, + plugin.isUseActionBar(), + Placeholder.component(Translation.Placeholder.ACTION, BoltComponents.resolveTranslation(Translation.EDIT, player)) + ); } @Override diff --git a/bukkit/src/main/java/org/popcraft/bolt/command/impl/TrustCommand.java b/bukkit/src/main/java/org/popcraft/bolt/command/impl/TrustCommand.java index ded05390..e61088d3 100644 --- a/bukkit/src/main/java/org/popcraft/bolt/command/impl/TrustCommand.java +++ b/bukkit/src/main/java/org/popcraft/bolt/command/impl/TrustCommand.java @@ -5,14 +5,15 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.popcraft.bolt.BoltPlugin; +import org.popcraft.bolt.access.Access; import org.popcraft.bolt.access.AccessList; import org.popcraft.bolt.command.Arguments; import org.popcraft.bolt.command.BoltCommand; import org.popcraft.bolt.lang.Translation; import org.popcraft.bolt.source.Source; -import org.popcraft.bolt.util.Action; +import org.popcraft.bolt.source.SourceType; +import org.popcraft.bolt.source.SourceTypes; import org.popcraft.bolt.util.BoltComponents; -import org.popcraft.bolt.util.BoltPlayer; import org.popcraft.bolt.util.Profiles; import org.popcraft.bolt.util.Protections; import org.popcraft.bolt.util.SchedulerUtil; @@ -23,6 +24,7 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; +import java.util.concurrent.CompletableFuture; public class TrustCommand extends BoltCommand { public TrustCommand(BoltPlugin plugin) { @@ -36,82 +38,82 @@ public void execute(CommandSender sender, Arguments arguments) { return; } final String action = arguments.next(); - if ("list".equals(action)) { - final AccessList accessList = plugin.getBolt().getStore().loadAccessList(player.getUniqueId()).join(); - final Map accessMap = accessList == null ? new HashMap<>() : accessList.getAccess(); - BoltComponents.sendMessage( - player, - Translation.INFO_SELF, - Placeholder.component(Translation.Placeholder.ACCESS_LIST_SIZE, Component.text(accessMap.size())), - Placeholder.component(Translation.Placeholder.ACCESS_LIST, Protections.accessList(accessMap, sender)) - ); - } else if ("add".equals(action) || "remove".equals(action)) { - if (arguments.remaining() < 1) { + if ("add".equalsIgnoreCase(action) || "remove".equalsIgnoreCase(action)) { + if (arguments.remaining() < 2) { shortHelp(sender, arguments); return; } - final boolean adding = "add".equals(action); - final String target = arguments.next(); - final UUID uuid = player.getUniqueId(); - final AccessList accessList = Objects.requireNonNullElse(plugin.getBolt().getStore().loadAccessList(uuid).join(), new AccessList(uuid, new HashMap<>())); - Profiles.findOrLookupProfileByName(target).thenAccept(playerProfile -> SchedulerUtil.schedule(plugin, sender, () -> { - if (!playerProfile.complete()) { - BoltComponents.sendMessage( - sender, - Translation.PLAYER_NOT_FOUND, - Placeholder.component(Translation.Placeholder.PLAYER, Component.text(target)) - ); - return; - } - final Source source = Source.player(playerProfile.uuid()); - if (adding) { - accessList.getAccess().put(source.toString(), plugin.getDefaultAccessType()); - } else { - accessList.getAccess().remove(source.toString()); - } - plugin.getBolt().getStore().saveAccessList(accessList); - BoltComponents.sendMessage(sender, Translation.TRUST_EDITED); - })); - } else if ("confirm".equals(action)) { - final BoltPlayer boltPlayer = plugin.player(player); - final Action playerAction = boltPlayer.getAction(); - final boolean trusting = boltPlayer.isTrusting(); - if (playerAction == null || !Action.Type.EDIT.equals(playerAction.getType()) || !trusting) { - final String command = trusting ? "/bolt modify" : "/bolt trust"; + final boolean adding = "add".equalsIgnoreCase(action); + final String sourceTypeName = arguments.next().toLowerCase(); + final SourceType sourceType = plugin.getBolt().getSourceTypeRegistry().getSourceByName(sourceTypeName).orElse(null); + if (sourceType == null || !plugin.getBolt().getSourceTypeRegistry().sourceTypes().contains(sourceType)) { BoltComponents.sendMessage( sender, - Translation.TRUST_EDITED_FAILED, - Placeholder.component(Translation.Placeholder.COMMAND, Component.text(command)) + Translation.EDIT_SOURCE_INVALID, + Placeholder.component(Translation.Placeholder.SOURCE_TYPE, Component.text(sourceTypeName)) ); return; } - final UUID uuid = player.getUniqueId(); - final AccessList accessList = Objects.requireNonNullElse(plugin.getBolt().getStore().loadAccessList(uuid).join(), new AccessList(uuid, new HashMap<>())); - boltPlayer.consumeModifications().forEach((source, type) -> { - if (Boolean.parseBoolean(playerAction.getData())) { - accessList.getAccess().put(source.toString(), type); - } else { - accessList.getAccess().remove(source.toString()); - } - }); - plugin.getBolt().getStore().saveAccessList(accessList); - BoltComponents.sendMessage(sender, Translation.TRUST_EDITED); - boltPlayer.clearAction(); - boltPlayer.setTrusting(false); - boltPlayer.setTrustingSilently(false); - } else { - final boolean silent = "silent".equals(action); - final BoltPlayer boltPlayer = plugin.player(player); - boltPlayer.setTrusting(true); - boltPlayer.setTrustingSilently(silent); - if (!silent) { + if (sourceType.restricted() && !sender.hasPermission("bolt.type.source.%s".formatted(sourceType.name()))) { + BoltComponents.sendMessage(sender, Translation.EDIT_SOURCE_NO_PERMISSION); + return; + } + final String sourceIdentifier = arguments.next(); + final String accessType = Objects.requireNonNullElse(arguments.next(), plugin.getDefaultAccessType()).toLowerCase(); + final Access access = plugin.getBolt().getAccessRegistry().getAccessByType(accessType).orElse(null); + if (access == null) { BoltComponents.sendMessage( sender, - Translation.TRUST, - Placeholder.component(Translation.Placeholder.COMMAND, Component.text("/bolt modify")), - Placeholder.component(Translation.Placeholder.COMMAND_2, Component.text("/bolt trust confirm")) + Translation.EDIT_ACCESS_INVALID, + Placeholder.component(Translation.Placeholder.ACCESS_TYPE, Component.text(accessType)) ); + return; + } + if (access.restricted() && !sender.hasPermission("bolt.type.access.%s".formatted(access.type()))) { + BoltComponents.sendMessage(sender, Translation.EDIT_ACCESS_NO_PERMISSION); + return; } + final UUID uuid = player.getUniqueId(); + final AccessList accessList = Objects.requireNonNullElse(plugin.getBolt().getStore().loadAccessList(uuid).join(), new AccessList(uuid, new HashMap<>())); + final CompletableFuture editFuture; + if (SourceTypes.PLAYER.equals(sourceType.name())) { + editFuture = Profiles.findOrLookupProfileByName(sourceIdentifier).thenApply(profile -> { + if (profile.uuid() != null) { + return Source.player(profile.uuid()); + } else { + SchedulerUtil.schedule(plugin, player, () -> BoltComponents.sendMessage( + player, + Translation.PLAYER_NOT_FOUND, + Placeholder.component(Translation.Placeholder.PLAYER, Component.text(sourceIdentifier)) + )); + return null; + } + }); + } else if (SourceTypes.PASSWORD.equals(sourceType.name())) { + editFuture = CompletableFuture.completedFuture(Source.password(sourceIdentifier)); + } else { + editFuture = CompletableFuture.completedFuture(Source.of(sourceType.name(), sourceIdentifier)); + } + editFuture.thenAccept(source -> SchedulerUtil.schedule(plugin, player, () -> { + if (source != null) { + if (adding) { + accessList.getAccess().put(source.toString(), plugin.getDefaultAccessType()); + } else { + accessList.getAccess().remove(source.toString()); + } + plugin.getBolt().getStore().saveAccessList(accessList); + BoltComponents.sendMessage(sender, Translation.TRUST_EDITED); + } + })); + } else { + final AccessList accessList = plugin.getBolt().getStore().loadAccessList(player.getUniqueId()).join(); + final Map accessMap = accessList == null ? new HashMap<>() : accessList.getAccess(); + BoltComponents.sendMessage( + player, + Translation.INFO_SELF, + Placeholder.component(Translation.Placeholder.ACCESS_LIST_SIZE, Component.text(accessMap.size())), + Placeholder.component(Translation.Placeholder.ACCESS_LIST, Protections.accessList(accessMap, sender)) + ); } } @@ -122,11 +124,31 @@ public List suggestions(CommandSender sender, Arguments arguments) { } final String subcommand = arguments.next(); if (arguments.remaining() == 0) { - return List.of("list", "add", "remove", "confirm"); + return List.of("add", "remove"); + } + final String sourceType = arguments.next(); + if (arguments.remaining() == 0) { + return plugin.getBolt().getSourceTypeRegistry().sourceTypes().stream() + .filter(type -> !type.restricted() || sender.hasPermission("bolt.type.source.%s".formatted(type.name()))) + .map(SourceType::name) + .toList(); } arguments.next(); - if (arguments.remaining() == 0 && ("add".equals(subcommand) || "remove".equals(subcommand))) { - return plugin.getServer().getOnlinePlayers().stream().map(Player::getName).toList(); + if (arguments.remaining() == 0) { + if (SourceTypes.PLAYER.equals(sourceType)) { + return plugin.getServer().getOnlinePlayers().stream().map(Player::getName).toList(); + } else if (SourceTypes.GROUP.equals(sourceType) && sender instanceof final Player player) { + return plugin.getPlayersOwnedGroups(player); + } else { + return Collections.emptyList(); + } + } + arguments.next(); + if (arguments.remaining() == 0) { + return plugin.getBolt().getAccessRegistry().access().stream() + .filter(access -> !access.restricted() || sender.hasPermission("bolt.type.access.%s".formatted(access.type()))) + .map(Access::type) + .toList(); } return Collections.emptyList(); } @@ -137,7 +159,7 @@ public void shortHelp(CommandSender sender, Arguments arguments) { sender, Translation.HELP_COMMAND_SHORT_TRUST, Placeholder.component(Translation.Placeholder.COMMAND, Component.text("/bolt trust")), - Placeholder.component(Translation.Placeholder.LITERAL, Component.text("[list|add|remove|confirm]")) + Placeholder.component(Translation.Placeholder.LITERAL, Component.text("(add|remove)")) ); } diff --git a/common/src/main/java/org/popcraft/bolt/util/BoltPlayer.java b/common/src/main/java/org/popcraft/bolt/util/BoltPlayer.java index 08667623..a13d86ea 100644 --- a/common/src/main/java/org/popcraft/bolt/util/BoltPlayer.java +++ b/common/src/main/java/org/popcraft/bolt/util/BoltPlayer.java @@ -96,22 +96,6 @@ public Map consumeModifications() { return modificationsCopy; } - public boolean isTrusting() { - return trusting; - } - - public void setTrusting(boolean trusting) { - this.trusting = trusting; - } - - public boolean isTrustingSilently() { - return trustingSilently; - } - - public void setTrustingSilently(boolean trustingSilently) { - this.trustingSilently = trustingSilently; - } - public boolean isLockNil() { return lockNil; }