Skip to content

Commit

Permalink
New configuration system + clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
Mqzn committed Nov 2, 2024
1 parent 2c81d35 commit 5b60ee7
Show file tree
Hide file tree
Showing 69 changed files with 1,502 additions and 1,119 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ private <T> LiteralArgumentBuilder<T> convertRoot(CommandNode<S> root) {
.requires((obj) -> {
var source = wrapCommandSource(obj);
return root.getData().isIgnoringACPerms()
|| dispatcher.getPermissionResolver().hasPermission(source, root.getData().permission());
|| dispatcher.config().getPermissionResolver().hasPermission(source, root.getData().permission());
});
executor(builder);

Expand All @@ -67,7 +67,7 @@ private <T> com.mojang.brigadier.tree.CommandNode<T> convertNode(CommandNode<S>
: RequiredArgumentBuilder.argument(node.getData().name(), getArgumentType(node.getData()));

childBuilder.requires((obj) -> {
var permissionResolver = dispatcher.getPermissionResolver();
var permissionResolver = dispatcher.config().getPermissionResolver();
var source = wrapCommandSource(obj);

boolean isIgnoringAC = root.getData().isIgnoringACPerms();
Expand Down Expand Up @@ -127,9 +127,9 @@ private <T> com.mojang.brigadier.tree.CommandNode<T> convertNode(CommandNode<S>
//ImperatDebugger.debug("Last-argument='%s'", args.getLast());

CompletionArg arg = new CompletionArg(args.isEmpty() ? "" : args.getLast(), args.size() - 1);
SuggestionContext<S> ctx = dispatcher.getContextFactory().createSuggestionContext(source, command, args, arg);
SuggestionContext<S> ctx = dispatcher.config().getContextFactory().createSuggestionContext(source, command, args, arg);

return dispatcher.getParameterSuggestionResolver(parameter).asyncAutoComplete(ctx, parameter)
return dispatcher.config().getParameterSuggestionResolver(parameter).asyncAutoComplete(ctx, parameter)
.thenCompose((results) -> {
results
.stream()
Expand Down
109 changes: 109 additions & 0 deletions bukkit/src/main/java/dev/velix/imperat/BukkitConfigBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package dev.velix.imperat;

import dev.velix.imperat.adventure.AdventureProvider;
import dev.velix.imperat.adventure.CastingAdventure;
import dev.velix.imperat.adventure.EmptyAdventure;
import dev.velix.imperat.exception.SourceException;
import dev.velix.imperat.exception.UnknownOfflinePlayerException;
import dev.velix.imperat.exception.UnknownPlayerException;
import dev.velix.imperat.exception.UnknownWorldException;
import dev.velix.imperat.selector.TargetSelector;
import dev.velix.imperat.type.ParameterOfflinePlayer;
import dev.velix.imperat.type.ParameterPlayer;
import dev.velix.imperat.type.ParameterTargetSelector;
import dev.velix.imperat.type.ParameterWorld;
import dev.velix.imperat.util.reflection.Reflections;
import net.kyori.adventure.audience.Audience;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public final class BukkitConfigBuilder extends ConfigBuilder<BukkitSource, BukkitImperat> {

private final static BukkitPermissionResolver DEFAULT_PERMISSION_RESOLVER = new BukkitPermissionResolver();

private final Plugin plugin;
private final AdventureProvider<CommandSender> adventureProvider;

private boolean supportBrigadier = false;

BukkitConfigBuilder(Plugin plugin, @Nullable AdventureProvider<CommandSender> adventureProvider) {
this.plugin = plugin;
this.adventureProvider = adventureProvider;

config.setPermissionResolver(DEFAULT_PERMISSION_RESOLVER);
addThrowableHandlers();
registerSourceResolvers();
registerValueResolvers();
}

private void registerSourceResolvers() {
config.registerSourceResolver(CommandSender.class, BukkitSource::origin);
config.registerSourceResolver(Player.class, (source) -> {
if (source.isConsole()) {
throw new SourceException("Only players are allowed to do this !");
}
return source.asPlayer();
});
}

private void addThrowableHandlers() {
config.setThrowableResolver(
UnknownPlayerException.class, (exception, imperat, context) ->
context.source().error("A player with the name '" + exception.getName() + "' doesn't seem to be online")
);
config.setThrowableResolver(
UnknownOfflinePlayerException.class, (exception, imperat, context) ->
context.source().error("A player with the name '" + exception.getName() + "' doesn't seem to exist")
);
config.setThrowableResolver(
UnknownWorldException.class, (exception, imperat, context) ->
context.source().error("A world with the name '" + exception.getName() + "' doesn't seem to exist")
);

}

private void registerValueResolvers() {
config.registerParamType(Player.class, new ParameterPlayer());
config.registerParamType(OfflinePlayer.class, new ParameterOfflinePlayer());
config.registerParamType(TargetSelector.class, new ParameterTargetSelector());
var worldClass = Reflections.getClass("org.bukkit.World");
config.registerParamType(worldClass, new ParameterWorld(worldClass));
}

public static BukkitConfigBuilder builder(Plugin plugin) {
return builder(plugin, null);
}

public static BukkitConfigBuilder builder(Plugin plugin, @Nullable AdventureProvider<CommandSender> adventureProvider) {
return new BukkitConfigBuilder(plugin, loadAdventure(plugin, adventureProvider));
}

public BukkitConfigBuilder applyBrigadier(boolean supportBrigadier) {
this.supportBrigadier = supportBrigadier;
return this;
}

@Override
public @NotNull BukkitImperat build() {
return new BukkitImperat(plugin, adventureProvider, supportBrigadier, this.config);
}

private static AdventureProvider<CommandSender> loadAdventure(Plugin plugin, @Nullable AdventureProvider<CommandSender> provider) {
if (Reflections.findClass("net.kyori.adventure.audience.Audience")) {
if (provider != null) {
return provider;
} else if (Audience.class.isAssignableFrom(CommandSender.class)) {
return new CastingAdventure<>();
} else if (Reflections.findClass("net.kyori.adventure.platform.bukkit.BukkitAudiences")) {
return new BukkitAdventure(plugin);
}
}

return new EmptyAdventure<>();
}

}
117 changes: 7 additions & 110 deletions bukkit/src/main/java/dev/velix/imperat/BukkitImperat.java
Original file line number Diff line number Diff line change
@@ -1,51 +1,33 @@
package dev.velix.imperat;

import dev.velix.imperat.adventure.AdventureProvider;
import dev.velix.imperat.adventure.CastingAdventure;
import dev.velix.imperat.adventure.EmptyAdventure;
import dev.velix.imperat.brigadier.BukkitBrigadierManager;
import dev.velix.imperat.command.BaseImperat;
import dev.velix.imperat.command.Command;
import dev.velix.imperat.exception.SourceException;
import dev.velix.imperat.exception.UnknownOfflinePlayerException;
import dev.velix.imperat.exception.UnknownPlayerException;
import dev.velix.imperat.exception.UnknownWorldException;
import dev.velix.imperat.resolvers.PermissionResolver;
import dev.velix.imperat.selector.TargetSelector;
import dev.velix.imperat.type.ParameterOfflinePlayer;
import dev.velix.imperat.type.ParameterPlayer;
import dev.velix.imperat.type.ParameterTargetSelector;
import dev.velix.imperat.type.ParameterWorld;
import dev.velix.imperat.util.BukkitUtil;
import dev.velix.imperat.util.ImperatDebugger;
import dev.velix.imperat.util.Preconditions;
import dev.velix.imperat.util.StringUtils;
import dev.velix.imperat.util.reflection.Reflections;
import net.kyori.adventure.audience.Audience;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

public final class BukkitImperat extends BaseImperat<BukkitSource> {

private final static BukkitPermissionResolver DEFAULT_PERMISSION_RESOLVER = new BukkitPermissionResolver();
private final Plugin plugin;
private final AdventureProvider<CommandSender> adventureProvider;
private BukkitBrigadierManager brigadierManager;
private Map<String, org.bukkit.command.Command> bukkitCommands = new HashMap<>();

@SuppressWarnings("unchecked")
private BukkitImperat(Plugin plugin, AdventureProvider<CommandSender> adventureProvider, @NotNull PermissionResolver<BukkitSource> permissionResolver) {
super(permissionResolver);
BukkitImperat(Plugin plugin, AdventureProvider<CommandSender> adventureProvider, boolean supportBrigadier, ImperatConfig<BukkitSource> config) {
super(config);
this.plugin = plugin;
this.adventureProvider = adventureProvider;

ImperatDebugger.setLogger(plugin.getLogger());
try {
if (BukkitUtil.KNOWN_COMMANDS != null) {
Expand All @@ -56,84 +38,12 @@ private BukkitImperat(Plugin plugin, AdventureProvider<CommandSender> adventureP
throw new RuntimeException(e);
}

this.addThrowableHandlers();
this.adventureProvider = loadAdventure(adventureProvider);
registerSourceResolvers();
registerValueResolvers();
}

private void registerSourceResolvers() {
this.registerSourceResolver(CommandSender.class, BukkitSource::origin);
this.registerSourceResolver(Player.class, (source) -> {
if (source.isConsole()) {
throw new SourceException("Only players are allowed to do this !");
}
return source.asPlayer();
});
}

private void addThrowableHandlers() {
this.setThrowableResolver(
UnknownPlayerException.class, (exception, imperat, context) ->
context.source().error("A player with the name '" + exception.getName() + "' doesn't seem to be online")
);
this.setThrowableResolver(
UnknownOfflinePlayerException.class, (exception, imperat, context) ->
context.source().error("A player with the name '" + exception.getName() + "' doesn't seem to exist")
);
this.setThrowableResolver(
UnknownWorldException.class, (exception, imperat, context) ->
context.source().error("A world with the name '" + exception.getName() + "' doesn't seem to exist")
);

}

private AdventureProvider<CommandSender> loadAdventure(@Nullable AdventureProvider<CommandSender> provider) {
if (Reflections.findClass("net.kyori.adventure.audience.Audience")) {
if (provider != null) {
return provider;
} else if (Audience.class.isAssignableFrom(CommandSender.class)) {
return new CastingAdventure<>();
} else if (Reflections.findClass("net.kyori.adventure.platform.bukkit.BukkitAudiences")) {
return new BukkitAdventure(plugin);
}
if (supportBrigadier) {
applyBrigadier();
}

return new EmptyAdventure<>();
}

/**
* Creates a bukkit command dispatcher instance
*
* @param plugin the plugin
* @param audienceProvider the kyori adventure audience provider
* @param permissionResolver the permission resolver
* @return the new or existing bukkit command dispatcher instance in the bukkit server
*/
public static BukkitImperat create(
@NotNull Plugin plugin,
@Nullable AdventureProvider<CommandSender> audienceProvider,
@NotNull PermissionResolver<BukkitSource> permissionResolver
) {
Preconditions.notNull(plugin, "plugin");
Preconditions.notNull(permissionResolver, "permission-resolver");
return new BukkitImperat(plugin, audienceProvider, permissionResolver);
}

public static BukkitImperat create(Plugin plugin, @Nullable AdventureProvider<CommandSender> audienceProvider) {
return create(plugin, audienceProvider, DEFAULT_PERMISSION_RESOLVER);
}

public static BukkitImperat create(Plugin plugin, @NotNull PermissionResolver<BukkitSource> permissionResolver) {
return create(plugin, null, permissionResolver);
}

public static BukkitImperat create(Plugin plugin) {
return create(plugin, null, DEFAULT_PERMISSION_RESOLVER);
}



/**
* Wraps the sender into a built-in command-sender valueType
*
Expand All @@ -159,11 +69,6 @@ public void shutdownPlatform() {
Bukkit.getPluginManager().disablePlugin(plugin);
}

@Override
public String commandPrefix() {
return "/";
}

/**
* Registering a command into the dispatcher
*
Expand All @@ -177,7 +82,7 @@ public void registerCommand(Command<BukkitSource> command) {
BukkitUtil.COMMAND_MAP.register(this.plugin.getName(), internalCmd);

if (brigadierManager != null) {
brigadierManager.registerBukkitCommand(internalCmd, command, permissionResolver);
brigadierManager.registerBukkitCommand(internalCmd, command, config.getPermissionResolver());
}
}

Expand Down Expand Up @@ -226,14 +131,6 @@ public void unregisterAllCommands() {
//BukkitUtil.COMMAND_MAP.clearCommands();
}

private void registerValueResolvers() {
this.registerParamType(Player.class, new ParameterPlayer());
this.registerParamType(OfflinePlayer.class, new ParameterOfflinePlayer());
this.registerParamType(TargetSelector.class, new ParameterTargetSelector());
var worldClass = Reflections.getClass("org.bukkit.World");
this.registerParamType(worldClass, new ParameterWorld(worldClass));
}

public void applyBrigadier() {
brigadierManager = BukkitBrigadierManager.load(this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ default void register(C command, LiteralArgumentBuilder<?> argumentBuilder) {
* Registers the provided argument data to the dispatcher.
* Equivalent to calling
* {@link CommandDispatcher#register(LiteralArgumentBuilder)}
*
* <p>
* Prefer using {@link Commodore#register(C, LiteralCommandNode)}
*
* @param node the argument data
Expand All @@ -129,7 +129,7 @@ default void register(C command, LiteralArgumentBuilder<?> argumentBuilder) {
* Registers the provided argument data to the dispatcher.
* Equivalent to calling
* {@link CommandDispatcher#register(LiteralArgumentBuilder)}
*
* <p>
* Prefer using {@link Commodore#register(C, LiteralArgumentBuilder)}
*
* @param argumentBuilder the argument data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
public class ParameterPlayer extends BaseParameterType<BukkitSource, Player> {

private final PlayerSuggestionResolver SUGGESTION_RESOLVER = new PlayerSuggestionResolver();

public ParameterPlayer() {
super(TypeWrap.of(Player.class));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ public ParameterTargetSelector() {
}*/



SelectionType type = commandInputStream.popLetter()
.map((s) -> SelectionType.from(String.valueOf(s))).orElse(SelectionType.UNKNOWN);
//update current
Expand Down
Loading

0 comments on commit 5b60ee7

Please sign in to comment.