Skip to content

Commit

Permalink
Implement @arg for commands
Browse files Browse the repository at this point in the history
  • Loading branch information
fullwall committed Sep 7, 2022
1 parent 42e9218 commit 712f30a
Show file tree
Hide file tree
Showing 7 changed files with 201 additions and 79 deletions.
5 changes: 5 additions & 0 deletions src/main/java/net/citizensnpcs/api/CitizensAPI.java
Expand Up @@ -7,6 +7,7 @@
import org.bukkit.plugin.Plugin;

import net.citizensnpcs.api.ai.speech.SpeechFactory;
import net.citizensnpcs.api.command.CommandManager;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.NPCDataStore;
import net.citizensnpcs.api.npc.NPCRegistry;
Expand Down Expand Up @@ -60,6 +61,10 @@ public static NPCRegistry createNamedNPCRegistry(String name, NPCDataStore store
return getImplementation().createNamedNPCRegistry(name, store);
}

public static CommandManager getCommandManager() {
return getImplementation().getCommandManager();
}

/**
* @return The data folder of the current implementation
*/
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/net/citizensnpcs/api/CitizensPlugin.java
Expand Up @@ -5,6 +5,7 @@
import org.bukkit.plugin.Plugin;

import net.citizensnpcs.api.ai.speech.SpeechFactory;
import net.citizensnpcs.api.command.CommandManager;
import net.citizensnpcs.api.npc.NPCDataStore;
import net.citizensnpcs.api.npc.NPCRegistry;
import net.citizensnpcs.api.npc.NPCSelector;
Expand Down Expand Up @@ -36,6 +37,8 @@ public interface CitizensPlugin extends Plugin {
*/
public NPCRegistry createNamedNPCRegistry(String name, NPCDataStore store);

public CommandManager getCommandManager();

/**
* @return The default {@link NPCSelector} for managing player/server NPC selection
*/
Expand Down
33 changes: 26 additions & 7 deletions src/main/java/net/citizensnpcs/api/command/Arg.java
Expand Up @@ -4,6 +4,8 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Collection;
import java.util.Collections;

import org.bukkit.command.CommandSender;

Expand All @@ -13,18 +15,35 @@
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.PARAMETER })
public @interface Arg {
Class<? extends FlagValidator<?>> validator() default Identity.class;
String[] completions() default {};

Class<? extends CompletionsProvider> completionsProvider() default CompletionsProvider.Identity.class;

Class<? extends FlagValidator<?>> validator() default FlagValidator.Identity.class;

int value();

public static interface FlagValidator<T> {
public T validate(CommandSender sender, NPC npc, String input) throws CommandException;
public static interface CompletionsProvider {
public Collection<String> getCompletions(CommandContext args, CommandSender sender);

public static class Identity implements CompletionsProvider {
@Override
public Collection<String> getCompletions(CommandContext args, CommandSender sender) {
return Collections.emptyList();
}
}
}

public static class Identity implements FlagValidator<String> {
@Override
public String validate(CommandSender sender, NPC npc, String input) throws CommandException {
return input;
public static interface FlagValidator<T> {
public T validate(CommandContext args, CommandSender sender, NPC npc, String input) throws CommandException;

public static class Identity implements FlagValidator<String> {
@Override
public String validate(CommandContext args, CommandSender sender, NPC npc, String input)
throws CommandException {
return input;
}
}
}

}
Expand Up @@ -30,6 +30,7 @@
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.EulerAngle;

import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
Expand Down Expand Up @@ -310,6 +311,12 @@ public boolean matches(String command) {
return args[0].equalsIgnoreCase(command);
}

public EulerAngle parseEulerAngle(String input) {
List<Double> pose = Lists
.newArrayList(Iterables.transform(Splitter.on(',').split(input), (s) -> Double.parseDouble(s)));
return new EulerAngle(pose.get(0), pose.get(1), pose.get(2));
}

public int parseTicks(String dur) {
dur = dur.trim();
char last = Character.toLowerCase(dur.charAt(dur.length() - 1));
Expand Down Expand Up @@ -377,6 +384,5 @@ public static Location parseLocation(Location currentLocation, String flag) thro

private static final Pattern FLAG = Pattern.compile("^-[a-zA-Z]+$");
private static final Splitter LOCATION_SPLITTER = Splitter.on(Pattern.compile("[,:]")).omitEmptyStrings();

private static final Pattern VALUE_FLAG = Pattern.compile("^--[a-zA-Z0-9-]+$");
}

0 comments on commit 712f30a

Please sign in to comment.