Finish up the pagination of the help system

This commit is contained in:
Aikar
2017-10-28 13:36:39 -04:00
parent fd314b0f7c
commit 72e052d953
31 changed files with 1040 additions and 736 deletions
@@ -167,7 +167,11 @@ public class CommandContexts <R extends CommandExecutionContext<?, ? extends Com
search = c.getArgs();
}
CommandHelp commandHelp = manager.generateCommandHelp();
commandHelp.setPage(page, 15);
commandHelp.setPage(page);
Integer perPage = c.getFlagValue("perpage", (Integer) null);
if (perPage != null) {
commandHelp.setPerPage(perPage);
}
commandHelp.setSearch(search);
return commandHelp;
});
@@ -29,7 +29,6 @@ import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Stream;
@SuppressWarnings("WeakerAccess")
public class CommandHelp {
@@ -37,12 +36,13 @@ public class CommandHelp {
private final CommandIssuer issuer;
private final List<HelpEntry> helpEntries = new ArrayList<>();
private int page;
private int perPage = 15;
private int perPage;
private List<String> search;
public CommandHelp(CommandManager manager, RootCommand rootCommand, CommandIssuer issuer) {
this.manager = manager;
this.issuer = issuer;
this.perPage = manager.defaultHelpPerPage;
SetMultimap<String, RegisteredCommand> subCommands = rootCommand.getSubCommands();
Set<RegisteredCommand> seen = new HashSet<>();
@@ -107,16 +107,23 @@ public class CommandHelp {
}
public void showHelp(CommandIssuer issuer, MessageKeyProvider format) {
Iterator<HelpEntry> results = getHelpEntries().stream()
List<HelpEntry> helpEntries = getHelpEntries();
Iterator<HelpEntry> results = helpEntries.stream()
.filter(HelpEntry::shouldShow)
.sorted(Comparator.comparingInt(helpEntry -> helpEntry.getSearchScore() * -1)).iterator();
if (!results.hasNext()) {
issuer.sendMessage(MessageType.ERROR, MessageKeys.NO_COMMAND_MATCHED_SEARCH, "{search}", ACFUtil.join(this.search, " "));
results = getHelpEntries().iterator();
helpEntries = getHelpEntries();
results = helpEntries.iterator();
}
int totalResults = helpEntries.size();
int min = (this.page-1) * this.perPage; // TODO: per page configurable?
int max = min + this.perPage;
int i = 0;
if (min >= totalResults) {
issuer.sendMessage(MessageType.HELP, MessageKeys.HELP_NO_RESULTS);
return;
}
while (results.hasNext()) {
HelpEntry e = results.next();
@@ -132,6 +139,13 @@ public class CommandHelp {
issuer.sendMessageInternal(ACFUtil.rtrim(msg));
}
}
if (min > 0 || results.hasNext()) {
issuer.sendMessage(MessageType.HELP, MessageKeys.HELP_PAGE_INFORMATION,
"{page}", "" + this.page,
"{totalpages}", ""+ (int)Math.ceil((float)totalResults / (float)this.perPage),
"{results}", "" + totalResults
);
}
}
/**
@@ -154,9 +168,17 @@ public class CommandHelp {
return helpEntries;
}
public void setPage(int page, int perPage) {
public void setPerPage(int perPage) {
this.perPage = perPage;
}
public void setPage(int page) {
this.page = page;
this.perPage = 15;
}
public void setPage(int page, int perPage) {
this.setPage(page);
this.setPerPage(perPage);
}
public void setSearch(List<String> search) {
@@ -52,6 +52,7 @@ public abstract class CommandManager <I, FT, F extends MessageFormatter<FT>> {
protected Set<Locale> supportedLanguages = Sets.newHashSet(Locales.ENGLISH, Locales.GERMAN, Locales.SPANISH, Locales.CZECH);
protected Map<MessageType, F> formatters = new IdentityHashMap<>();
protected F defaultFormatter;
protected int defaultHelpPerPage = 10;
private Set<String> unstableAPIs = Sets.newHashSet();
public static CommandOperationContext getCurrentCommandOperationContext() {
@@ -141,6 +142,18 @@ public abstract class CommandManager <I, FT, F extends MessageFormatter<FT>> {
return new CommandHelp(this, rootCommand, issuer);
}
/** @deprecated Unstable API */ @Deprecated @UnstableAPI
public int getDefaultHelpPerPage() {
verifyUnstableAPI("help");
return defaultHelpPerPage;
}
/** @deprecated Unstable API */ @Deprecated @UnstableAPI
public void setDefaultHelpPerPage(int defaultHelpPerPage) {
verifyUnstableAPI("help");
this.defaultHelpPerPage = defaultHelpPerPage;
}
/**
* Registers a command with ACF
*
@@ -45,7 +45,10 @@ public enum MessageKeys implements MessageKeyProvider {
NOT_ALLOWED_ON_CONSOLE,
COULD_NOT_FIND_PLAYER,
HELP_FORMAT,
NO_COMMAND_MATCHED_SEARCH;
NO_COMMAND_MATCHED_SEARCH,
HELP_PAGE_INFORMATION,
HELP_NO_RESULTS
;
private final MessageKey key = MessageKey.of("acf-core." + this.name().toLowerCase());
public MessageKey getMessageKey() {