Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Command Help #6080

Merged
merged 2 commits into from Oct 3, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
152 changes: 77 additions & 75 deletions src/main/java/ch/njol/skript/command/CommandHelp.java
Expand Up @@ -23,6 +23,7 @@

import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;

import org.bukkit.command.CommandSender;
Expand All @@ -33,118 +34,119 @@
import ch.njol.skript.localization.Message;
import ch.njol.skript.util.SkriptColor;

/**
* @author Peter Güttinger
*/
public class CommandHelp {

private final static String DEFAULTENTRY = "description";

private final static ArgsMessage m_invalid_argument = new ArgsMessage("commands.invalid argument");
private final static Message m_usage = new Message("skript command.usage");


private final String actualCommand, actualNode, argsColor;
private String command;
private String langNode;
@Nullable
private Message description = null;
private final String argsColor;

@Nullable
private String langNode = null;

private final LinkedHashMap<String, Object> arguments = new LinkedHashMap<>();

private Message description;

private final Map<String, Object> arguments = new LinkedHashMap<>();

@Nullable
private Message wildcardArg = null;

public CommandHelp(final String command, final SkriptColor argsColor, final String langNode) {
this.command = command;
this.argsColor = "" + argsColor.getFormattedChat();
this.langNode = langNode;
description = new Message(langNode + "." + DEFAULTENTRY);
private ArgumentHolder wildcardArg = null;

public CommandHelp(String command, SkriptColor argsColor, String langNode) {
this(command, argsColor.getFormattedChat(), langNode, new Message(langNode + "." + DEFAULTENTRY));
}

public CommandHelp(final String command, final SkriptColor argsColor) {
this.command = command;
this.argsColor = "" + argsColor.getFormattedChat();

public CommandHelp(String command, SkriptColor argsColor) {
this(command, argsColor.getFormattedChat(), command, null);
}

public CommandHelp add(final String argument) {
if (langNode == null) {
if (argument.startsWith("<") && argument.endsWith(">")) {
final String carg = GRAY + "<" + argsColor + argument.substring(1, argument.length() - 1) + GRAY + ">";
arguments.put(carg, argument);
} else {
arguments.put(argument, null);
}
} else {
if (argument.startsWith("<") && argument.endsWith(">")) {
final String carg = GRAY + "<" + argsColor + argument.substring(1, argument.length() - 1) + GRAY + ">";
wildcardArg = new Message(langNode + "." + argument);
arguments.put(carg, wildcardArg);
} else {
arguments.put(argument, new Message(langNode + "." + argument));
}

private CommandHelp(String command, String argsColor, String node, @Nullable Message description) {
this.actualCommand = this.command = command;
this.actualNode = this.langNode = node;
this.argsColor = argsColor;
this.description = description;
}

public CommandHelp add(String argument) {
ArgumentHolder holder = new ArgumentHolder(argument);
if (argument.startsWith("<") && argument.endsWith(">")) {
argument = GRAY + "<" + argsColor + argument.substring(1, argument.length() - 1) + GRAY + ">";
wildcardArg = holder;
}
arguments.put(argument, holder);
return this;
}
public CommandHelp add(final CommandHelp help) {

public CommandHelp add(CommandHelp help) {
arguments.put(help.command, help);
help.onAdd(this);
return this;
}
protected void onAdd(final CommandHelp parent) {
langNode = parent.langNode + "." + command;

protected void onAdd(CommandHelp parent) {
langNode = parent.langNode + "." + actualNode;
description = new Message(langNode + "." + DEFAULTENTRY);
command = parent.command + " " + parent.argsColor + command;
for (final Entry<String, Object> e : arguments.entrySet()) {
if (e.getValue() instanceof CommandHelp) {
((CommandHelp) e.getValue()).onAdd(this);
} else {
if (e.getValue() != null) { // wildcard arg
wildcardArg = new Message(langNode + "." + e.getValue());
e.setValue(wildcardArg);
} else {
e.setValue(new Message(langNode + "." + e.getKey()));
}
command = parent.command + " " + parent.argsColor + actualCommand;
for (Entry<String, Object> entry : arguments.entrySet()) {
if (entry.getValue() instanceof CommandHelp) {
((CommandHelp) entry.getValue()).onAdd(this);
continue;
}
((ArgumentHolder) entry.getValue()).update();
}
}
public boolean test(final CommandSender sender, final String[] args) {

public boolean test(CommandSender sender, String[] args) {
return test(sender, args, 0);
}
private boolean test(final CommandSender sender, final String[] args, final int index) {

private boolean test(CommandSender sender, String[] args, int index) {
if (index >= args.length) {
showHelp(sender);
return false;
}
final Object help = arguments.get(args[index].toLowerCase(Locale.ENGLISH));
Object help = arguments.get(args[index].toLowerCase(Locale.ENGLISH));
if (help == null && wildcardArg == null) {
showHelp(sender, m_invalid_argument.toString(argsColor + args[index]));
return false;
}
if (help instanceof CommandHelp)
return ((CommandHelp) help).test(sender, args, index + 1);
return true;
return !(help instanceof CommandHelp) || ((CommandHelp) help).test(sender, args, index + 1);
}
public void showHelp(final CommandSender sender) {

public void showHelp(CommandSender sender) {
showHelp(sender, m_usage.toString());
}
private void showHelp(final CommandSender sender, final String pre) {

private void showHelp(CommandSender sender, String pre) {
Skript.message(sender, pre + " " + command + " " + argsColor + "...");
for (final Entry<String, Object> e : arguments.entrySet()) {
Skript.message(sender, " " + argsColor + e.getKey() + " " + GRAY + "-" + RESET + " " + e.getValue());
}
for (Entry<String, Object> entry : arguments.entrySet())
Skript.message(sender, " " + argsColor + entry.getKey() + " " + GRAY + "-" + RESET + " " + entry.getValue());
}

@Override
public String toString() {
return "" + description;
}


private class ArgumentHolder {

private final String argument;
private Message description;

private ArgumentHolder(String argument) {
this.argument = argument;
this.description = new Message(langNode + "." + argument);
}

private void update() {
description = new Message(langNode + "." + argument);
}

@Override
public String toString() {
return description.toString();
}

}

}