8000 Merge pull request #459 from JorelAli/dev/raw-argument-input · CommandAPI/CommandAPI@116306e · GitHub
[go: up one dir, main page]

Skip to content

Commit 116306e

Browse files
authored
Merge pull request #459 from JorelAli/dev/raw-argument-input
Add the option to retrieve raw arguments
2 parents 0009ca1 + ad1621d commit 116306e

File tree

23 files changed

+1077
-409
lines changed

23 files changed

+1077
-409
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ This is the current roadmap for the CommandAPI (as of 11th May 2023):
375375
<td valign="top">
376376
<ul>
377377
<li>Fixed the CommandAPI disabling datapacks on Paper 1.20.1 #40+ because it thought it was running on a Folia server</li>
378+
<li>https://github.com/JorelAli/CommandAPI/pull/459 Added the ability to access raw arguments in the command executor</li>
378379
<li>https://github.com/JorelAli/CommandAPI/issues/469 Adds <code>AdventureChatColorArgument</code></li>
379380
</ul>
380381
</td>

commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIExecutor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public int execute(ExecutionInfo<CommandSender, WrapperType> info) throws Comman
8383
} catch (WrapperCommandSyntaxException e) {
8484
throw e.getException();
8585
} catch (Throwable ex) {
86-
CommandAPI.getLogger().severe("Unhandled exception executing '" + info.args().getFullInput() + "'", ex);
86+
CommandAPI.getLogger().severe("Unhandled exception executing '" + info.args().fullInput() + "'", ex);
8787
if (ex instanceof Exception) {
8888
throw ex;
8989
} else {
@@ -97,7 +97,7 @@ public int execute(ExecutionInfo<CommandSender, WrapperType> info) throws Comman
9797
} catch (WrapperCommandSyntaxException e) {
9898
throw e.getException();
9999
} catch (Throwable ex) {
100-
CommandAPI.getLogger().severe("Unhandled exception executing '" + info.args().getFullInput() + "'", ex);
100+
CommandAPI.getLogger().severe("Unhandled exception executing '" + info.args().fullInput() + "'", ex);
101101
if (ex instanceof Exception) {
102102
throw ex;
103103
} else {

commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIHandler.java

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import java.awt.Component;
2424
import java.io.File;
2525
import java.io.IOException;
26-
import java.lang.invoke.MethodHandles;
27-
import java.lang.invoke.VarHandle;
2826
import java.lang.reflect.Field;
2927
import java.util.ArrayList;
3028
import java.util.Arrays;
@@ -102,11 +100,15 @@ public static <CommandSource> String getRawArgumentInput(CommandContext<CommandS
102100
final ParsedArgument<?, ?> parsedArgument = commandContextArguments.get(cmdCtx).get(key);
103101

104102
// TODO: Issue #310: Parsing this argument via /execute run <blah> doesn't have the value in
105-
// the arguments for this command context (most likely because it's a redirected command).
106-
// We need to figure out how to handle this case.
107-
if(parsedArgument != null) {
103+
// the arguments for this command context (most likely because it's a redirected command).
104+
// We need to figure out how to handle this case.
105+
if (parsedArgument != null) {
106+
// Sanity check: See https://github.com/JorelAli/CommandAPI/wiki/Implementation-details#chatcomponentargument-raw-arguments
108107
StringRange range = parsedArgument.getRange();
109-
return cmdCtx.getInput().substring(range.getStart(), range.getEnd());
108+
if (range.getEnd() > cmdCtx.getInput().length()) {
109+
range = StringRange.between(range.getStart(), cmdCtx.getInput().length());
110+
}
111+
return range.get(cmdCtx.getInput());
110112
} else {
111113
return "";
112114
}
@@ -223,7 +225,7 @@ public AbstractCommandSender<? extends CommandSender> senderWrapper() {
223225

224226
@Override
225227
public CommandArguments args() {
226-
return new CommandArguments(result, new LinkedHashMap<>(), "/" + cmdCtx.getInput());
228+
return new CommandArguments(result, new LinkedHashMap<>(), result, new LinkedHashMap<>(), "/" + cmdCtx.getInput());
227229
}
228230
};
229231

@@ -274,16 +276,30 @@ CommandArguments argsToCommandArgs(CommandContext<Source> cmdCtx, Argument[] arg
274276
// LinkedHashMap for arguments for executor
275277
Map<String, Object> argsMap = new LinkedHashMap<>();
276278

279+
// List for raw arguments
280+
List<String> rawArguments = new ArrayList<>();
281+
282+
// LinkedHashMap for raw arguments
283+
Map<String, String> rawArgumentsMap = new LinkedHashMap<>();
284+
277285
// Populate array
278286
for (Argument argument : args) {
279287
if (argument.isListed()) {
280-
Object parsedArgument = parseArgument(cmdCtx, argument.getNodeName(), argument, new CommandArguments(argList.toArray(), argsMap, "/" + cmdCtx.getInput()));
288+
Object parsedArgument = parseArgument(cmdCtx, argument.getNodeName(), argument, new CommandArguments(argList.toArray(), argsMap, rawArguments.toArray(new String[0]), rawArgumentsMap, "/" + cmdCtx.getInput()));
289+
290+
// Add the parsed argument
281291
argList.add(parsedArgument);
282292
argsMap.put(argument.getNodeName(), parsedArgument);
293+
294+
// Add the raw argument
295+
String rawArgumentString = getRawArgumentInput(cmdCtx, argument.getNodeName());
296+
297+
rawArguments.add(rawArgumentString);
298+
rawArgumentsMap.put(argument.getNodeName(), rawArgumentString);
283299
}
284300
}
285301

286-
return new CommandArguments(argList.toArray(), argsMap, "/" + cmdCtx.getInput());
302+
return new CommandArguments(argList.toArray(), argsMap, rawArguments.toArray(new String[0]), rawArgumentsMap, "/" + cmdCtx.getInput());
287303
}
288304

289305
/**
@@ -809,14 +825,20 @@ CommandArguments generatePreviousArguments(CommandContext<Source> context, Argum
809825
// LinkedHashMap for arguments
810826
Map<String, Object> argsMap = new LinkedHashMap<>();
811827

828+
// List for raw arguments
829+
List<String> rawArguments = new ArrayList<>();
830+
831+
// LinkedHashMap for raw arguments
832+
Map<String, String> rawArgumentsMap = new LinkedHashMap<>();
833+
812834
for (Argument arg : args) {
813835
if (arg.getNodeName().equals(nodeName) && !(arg instanceof Literal)) {
814836
break;
815837
}
816838

817839
Object result;
818840
try {
819-
result = parseArgument(context, arg.getNodeName(), arg, new CommandArguments(previousArguments.toArray(), argsMap, "/" + context.getInput()));
841+
result = parseArgument(context, arg.getNodeName(), arg, new CommandArguments(previousArguments.toArray(), argsMap, rawArguments.toArray(new String[0]), rawArgumentsMap, "/" + context.getInput()));
820842
} catch (IllegalArgumentException e) {
821843
/*
822844
* Redirected commands don't parse previous arguments properly. Simplest way to
@@ -829,11 +851,18 @@ CommandArguments generatePreviousArguments(CommandContext<Source> context, Argum
829851
result = null;
830852
}
831853
if (arg.isListed()) {
854+
// Add the parsed argument
832855
previousArguments.add(result);
833856
argsMap.put(arg.getNodeName(), result);
857+
858+
// Add the raw argument
859+
String rawArgumentString = getRawArgumentInput(context, arg.getNodeName());
860+
861+
rawArguments.add(rawArgumentString);
862+
rawArgumentsMap.put(arg.getNodeName(), rawArgumentString);
834863
}
835864
}
836-
return new CommandArguments(previousArguments.toArray(), argsMap, "/" + context.getInput());
865+
return new CommandArguments(previousArguments.toArray(), argsMap, rawArguments.toArray(new String[0]), rawArgumentsMap, "/" + context.getInput());
837866
}
838867

839868
SuggestionProvider<Source> toSuggestions(Argument theArgument, Argument[] args,

commandapi-core/src/main/java/dev/jorel/commandapi/arguments/SuggestionsBranch.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private ArgumentSuggestions<CommandSender> getNextSuggestion(CommandSender sende
7979

8080
if (currentSuggestion != null) {
8181
// Validate argument on the path
82-
SuggestionInfo<CommandSender> info = new SuggestionInfo<>(sender, new CommandArguments(processedArguments.toArray(), new HashMap<>(), currentInput.toString()), currentInput.toString(), "");
82+
SuggestionInfo<CommandSender> info = new SuggestionInfo<>(sender, new CommandArguments(processedArguments.toArray(), new LinkedHashMap<>(), processedArguments.toArray(new String[0]), new LinkedHashMap<>(), currentInput.toString()), currentInput.toString(), "");
8383
SuggestionsBuilder builder = new SuggestionsBuilder(currentInput.toString(), currentInput.length());
8484
currentSuggestion.suggest(info, builder);
8585
if (builder.build().getList().stream().map(Suggestion::getText).noneMatch(currentArgument::equals)) {
@@ -184,7 +184,7 @@ private EnforceReplacementsResult enforceReplacements(CommandSender sender, Stri
184184

185185
if (currentSuggestion != null) {
186186
// Validate argument on the path
187-
SuggestionInfo<CommandSender> info = new SuggestionInfo<>(sender, new CommandArguments(processedArguments.toArray(), new HashMap<>(), currentInput.toString()), currentInput.toString(), "");
187+
SuggestionInfo<CommandSender> info = new SuggestionInfo<>(sender, new CommandArguments(processedArguments.toArray(), new LinkedHashMap<>(), processedArguments.toArray(new String[0]), new LinkedHashMap<>(), currentInput.toString()), currentInput.toString(), "");
188188
SuggestionsBuilder builder = new SuggestionsBuilder(currentInput.toString(), currentInput.length());
189189
try {
190190
currentSuggestion.suggest(info, builder);

0 commit comments

Comments
 (0)
0