Skip to content

Commit 03ba0af

Browse files
committed
🐛🚸 Fixed help command + added more syntax help
Closes #381. Requires Revxrsal/Lamp#152 to be merged for this to function properly.
1 parent 03428a8 commit 03ba0af

File tree

5 files changed

+126
-87
lines changed

5 files changed

+126
-87
lines changed

api/src/main/java/fr/skytasul/quests/api/localization/Lang.java

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -161,26 +161,6 @@ public enum Lang implements Locale {
161161
COMMAND_TRANSLATION_EXISTS("msg.command.downloadTranslations.exists"), // 0: file
162162
COMMAND_TRANSLATION_DOWNLOADED("msg.command.downloadTranslations.downloaded"), // 0: lang
163163

164-
COMMAND_HELP("msg.command.help.header", MessageType.DefaultMessageType.UNPREFIXED),
165-
COMMAND_HELP_CREATE("msg.command.help.create", MessageType.DefaultMessageType.UNPREFIXED),
166-
COMMAND_HELP_EDIT("msg.command.help.edit", MessageType.DefaultMessageType.UNPREFIXED),
167-
COMMAND_HELP_REMOVE("msg.command.help.remove", MessageType.DefaultMessageType.UNPREFIXED),
168-
COMMAND_HELP_FINISH("msg.command.help.finishAll", MessageType.DefaultMessageType.UNPREFIXED),
169-
COMMAND_HELP_STAGE("msg.command.help.setStage", MessageType.DefaultMessageType.UNPREFIXED),
170-
COMMAND_HELP_DIALOG("msg.command.help.startDialog", MessageType.DefaultMessageType.UNPREFIXED),
171-
COMMAND_HELP_RESET("msg.command.help.resetPlayer", MessageType.DefaultMessageType.UNPREFIXED),
172-
COMMAND_HELP_RESETQUEST("msg.command.help.resetPlayerQuest", MessageType.DefaultMessageType.UNPREFIXED),
173-
COMMAND_HELP_SEE("msg.command.help.seePlayer", MessageType.DefaultMessageType.UNPREFIXED),
174-
COMMAND_HELP_RELOAD("msg.command.help.reload", MessageType.DefaultMessageType.UNPREFIXED),
175-
COMMAND_HELP_START("msg.command.help.start", MessageType.DefaultMessageType.UNPREFIXED),
176-
COMMAND_HELP_SETITEM("msg.command.help.setItem", MessageType.DefaultMessageType.UNPREFIXED),
177-
COMMAND_HELP_SETFIREWORK("msg.command.help.setFirework", MessageType.DefaultMessageType.UNPREFIXED),
178-
COMMAND_HELP_ADMINMODE("msg.command.help.adminMode", MessageType.DefaultMessageType.UNPREFIXED),
179-
COMMAND_HELP_VERSION("msg.command.help.version", MessageType.DefaultMessageType.UNPREFIXED),
180-
COMMAND_HELP_DOWNLOAD_TRANSLATIONS("msg.command.help.downloadTranslations", MessageType.DefaultMessageType.UNPREFIXED),
181-
COMMAND_HELP_SAVE("msg.command.help.save", MessageType.DefaultMessageType.UNPREFIXED),
182-
COMMAND_HELP_LIST("msg.command.help.list", MessageType.DefaultMessageType.UNPREFIXED),
183-
184164
// * Editors *
185165
ALREADY_EDITOR("msg.editor.already"),
186166
ENTER_EDITOR_TITLE("msg.editor.enter.title"),
@@ -317,6 +297,32 @@ public enum Lang implements Locale {
317297
TEXTLIST_TEXT_HELP_LIST("msg.editor.textList.help.list", MessageType.DefaultMessageType.UNPREFIXED),
318298
TEXTLIST_TEXT_HELP_CLOSE("msg.editor.textList.help.close", MessageType.DefaultMessageType.UNPREFIXED),
319299

300+
/* Command syntax */
301+
COMMAND_HELP_HEADER("command.header"),
302+
COMMAND_HELP_BASE("command.base"),
303+
COMMAND_HELP_CREATE("command.create"),
304+
COMMAND_HELP_EDIT("command.edit"),
305+
COMMAND_HELP_REMOVE("command.remove"),
306+
COMMAND_HELP_FINISH_ALL("command.finishAll"),
307+
COMMAND_HELP_STAGE("command.setStage"),
308+
COMMAND_HELP_DIALOG("command.startDialog"),
309+
COMMAND_HELP_RESET("command.resetPlayer"),
310+
COMMAND_HELP_RESETPLAYERQUEST("command.resetPlayerQuest"),
311+
COMMAND_HELP_RESETQUEST("command.resetQuest"),
312+
COMMAND_HELP_SEE("command.seePlayer"),
313+
COMMAND_HELP_START("command.start"),
314+
COMMAND_HELP_CANCEL("command.cancel"),
315+
COMMAND_HELP_FINISH("command.finish"),
316+
COMMAND_HELP_CHECKPOINT("command.checkpoint"),
317+
COMMAND_HELP_POOLS("command.pools"),
318+
COMMAND_HELP_SETITEM("command.setItem"),
319+
COMMAND_HELP_SETFIREWORK("command.setFirework"),
320+
COMMAND_HELP_ADMINMODE("command.adminMode"),
321+
COMMAND_HELP_VERSION("command.version"),
322+
COMMAND_HELP_DOWNLOAD_TRANSLATIONS("command.downloadTranslations"),
323+
COMMAND_HELP_SAVE("command.save"),
324+
COMMAND_HELP_LIST("command.list"),
325+
320326
// * Quests lists*
321327

322328
Finished("advancement.finished"),
@@ -917,4 +923,12 @@ public String toString() {
917923
return getValue();
918924
}
919925

926+
public static @Nullable Lang getFromPath(@NotNull String path) {
927+
for (Lang lang : values()) {
928+
if (lang.path.equals(path))
929+
return lang;
930+
}
931+
return null;
932+
}
933+
920934
}

core/src/main/java/fr/skytasul/quests/commands/CommandsAdmin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ private void doRemove(BukkitCommandActor sender, Quest quest) {
122122

123123
@Subcommand ("reload")
124124
@CommandPermission ("beautyquests.command.manage")
125+
@SecretCommand // TODO remove once reload implemented again
125126
public void reload(BukkitCommandActor actor) {
126127
BeautyQuests.getInstance().performReload(actor.sender());
127128
}

core/src/main/java/fr/skytasul/quests/commands/CommandsMisc.java

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,57 +4,81 @@
44
import fr.skytasul.quests.api.localization.Lang;
55
import fr.skytasul.quests.api.utils.messaging.MessageType;
66
import fr.skytasul.quests.api.utils.messaging.MessageUtils;
7+
import fr.skytasul.quests.api.utils.messaging.PlaceholderRegistry;
8+
import revxrsal.commands.annotation.Default;
79
import revxrsal.commands.annotation.Description;
10+
import revxrsal.commands.annotation.Range;
811
import revxrsal.commands.annotation.Subcommand;
912
import revxrsal.commands.bukkit.actor.BukkitCommandActor;
1013
import revxrsal.commands.bukkit.annotation.CommandPermission;
1114
import revxrsal.commands.command.ExecutableCommand;
15+
import revxrsal.commands.exception.NumberNotInRangeException;
1216
import revxrsal.commands.help.Help;
17+
import revxrsal.commands.node.CommandNode;
1318
import revxrsal.commands.orphan.OrphanCommand;
1419
import java.util.ArrayList;
20+
import java.util.List;
21+
import java.util.StringJoiner;
1522

1623
@Description ("Main command for quests")
1724
@CommandPermission ("beautyquests.command")
1825
public class CommandsMisc implements OrphanCommand {
1926

20-
@Subcommand ("help")
21-
public void help(BukkitCommandActor actor, ExecutableCommand<BukkitCommandActor> executedCommand,
22-
Help.RelatedCommands<BukkitCommandActor> commands) {
23-
Lang.COMMAND_HELP.send(actor.sender());
27+
private static final int COMMANDS_PER_HELP_PAGE = 15;
2428

25-
var list = new ArrayList<Lang>();
29+
@Subcommand ("help")
30+
public void help(BukkitCommandActor actor,
31+
@Range(min = 1) @Default("1") int page,
32+
ExecutableCommand<BukkitCommandActor> thisCommand) {
33+
List<ExecutableCommand<BukkitCommandActor>> commands = thisCommand.siblingCommands(actor).all().stream()
34+
.sorted((c1, c2) -> {
35+
if (!c1.nodes().get(1).isLiteral())
36+
return -1; // c1 is the top-level command
37+
if (!c2.nodes().get(1).isLiteral())
38+
return 1; // c2 is the top-level command
39+
return c1.path().compareTo(c2.path());
40+
})
41+
.toList();
2642

27-
for (var command : commands) {
28-
if (!command.isVisibleTo(actor))
29-
continue;
43+
int numberOfPages = Help.numberOfPages(commands.size(), COMMANDS_PER_HELP_PAGE);
44+
if (page > numberOfPages)
45+
throw new NumberNotInRangeException(page, 1, numberOfPages);
3046

31-
String subcommandLabel = "ERROR";
32-
for (var node : command.nodes()) {
33-
if (node.isLiteral()) {
34-
subcommandLabel = node.name();
35-
} else
36-
break;
37-
}
47+
Lang.COMMAND_HELP_HEADER.send(actor.sender(), PlaceholderRegistry.of("page_id", page, "page_count", numberOfPages));
3848

39-
for (Lang lang : Lang.values()) {
40-
if (lang.getPath().startsWith("msg.command.help.")) {
41-
list.add(lang);
42-
String cmdKey = lang.getPath().substring(17);
43-
if (cmdKey.equalsIgnoreCase(subcommandLabel)) {
44-
list.remove(lang);
45-
String helpString = lang.quickFormat("label", command.firstNode().name());
46-
MessageUtils.sendMessage(actor.sender(), helpString, MessageType.DefaultMessageType.UNPREFIXED);
49+
for (var command : Help.paginate(commands, page, COMMANDS_PER_HELP_PAGE)) {
50+
String usage = command.usage();
51+
String path;
52+
if (command.nodes().get(1).isLiteral()) {
53+
var literalsJoiner = new StringJoiner(".");
54+
for (int i = 1; i < command.nodes().size(); i++) { // we skip the first value since it's the command label
55+
var node = command.nodes().get(i);
56+
if (!node.isLiteral())
4757
break;
48-
}
58+
literalsJoiner.add(node.name());
4959
}
60+
path = literalsJoiner.toString();
61+
} else {
62+
// hacky workaround for the [subcommand] parameter
63+
usage = command.nodes().get(0).name();
64+
path = "base";
5065
}
66+
Lang lang = Lang.getFromPath("command." + path);
67+
String message = "/" + usage;
68+
if (lang != null)
69+
message += ": §e" + lang.getValue();
70+
MessageUtils.sendMessage(actor.sender(), message, MessageType.DefaultMessageType.UNPREFIXED);
5171
}
72+
}
5273

53-
for (Lang lang : list) {
54-
// temporary, until refactoring of the help system TODO make use of automatic usage generation
55-
String helpString = lang.quickFormat("label", executedCommand.firstNode().name());
56-
MessageUtils.sendMessage(actor.sender(), helpString, MessageType.DefaultMessageType.UNPREFIXED);
74+
private static List<CommandNode<BukkitCommandActor>> getFirstLiterals(ExecutableCommand<BukkitCommandActor> command) {
75+
var nodes = new ArrayList<CommandNode<BukkitCommandActor>>();
76+
for (var node : command.nodes()) {
77+
if (!node.isLiteral())
78+
break;
79+
nodes.add(node);
5780
}
81+
return nodes;
5882
}
5983

6084
@Subcommand ("version")

core/src/main/java/fr/skytasul/quests/commands/CommandsPlayerManagement.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,13 @@ public void setStage(
9494
BukkitCommandActor actor,
9595
Quester quester,
9696
Quest quest,
97-
@Range (min = 0, max = 14) @Optional Integer branchID,
98-
@Range (min = 0, max = 14) @Optional Integer stageID) {
97+
@Range(min = 0, max = 14) @Optional Integer branchId,
98+
@Range(min = 0, max = 14) @Optional Integer stageId) {
9999
// syntax: no arg: next or start | 1 arg: start branch | 2 args: set branch stage
100100
BranchesManagerImplementation manager = (BranchesManagerImplementation) quest.getBranchesManager();
101101

102102
var dataOpt = quester.getDataHolder().getQuestDataIfPresent(quest);
103-
if (branchID == null && (dataOpt.isEmpty() || !dataOpt.get().hasStarted())) { // start quest
103+
if (branchId == null && (dataOpt.isEmpty() || !dataOpt.get().hasStarted())) { // start quest
104104
quest.start(quester, false);
105105
Lang.START_QUEST.send(actor.sender(), quest, quester);
106106
return;
@@ -109,32 +109,32 @@ public void setStage(
109109

110110
QuestBranchImplementation currentBranch =
111111
(QuestBranchImplementation) quest.getBranchesManager().getPlayerBranch(quester);
112-
if (branchID == null) { // next
112+
if (branchId == null) { // next
113113
if (data.getState() != QuesterQuestData.State.IN_ENDING_STAGES) {
114114
currentBranch.finishPlayerStage(quester, currentBranch.getRegularStage(data.getStage().getAsInt()));
115115
Lang.COMMAND_SETSTAGE_NEXT.send(actor.sender());
116116
}else Lang.COMMAND_SETSTAGE_NEXT_UNAVAILABLE.send(actor.sender());
117117
}else {
118-
QuestBranchImplementation targetBranch = manager.getBranch(branchID);
118+
QuestBranchImplementation targetBranch = manager.getBranch(branchId);
119119
if (targetBranch == null)
120-
throw new CommandErrorException(Lang.COMMAND_SETSTAGE_BRANCH_DOESNTEXIST.quickFormat("branch_id", branchID));
120+
throw new CommandErrorException(Lang.COMMAND_SETSTAGE_BRANCH_DOESNTEXIST.quickFormat("branch_id", branchId));
121121

122-
if (stageID != null) {
122+
if (stageId != null) {
123123
if (currentBranch == null)
124124
throw new CommandErrorException(Lang.ERROR_OCCURED.quickFormat("error",
125125
"player " + quester.getDetailedName() + " has not started quest"));
126-
if (targetBranch.getRegularStages().size() <= stageID)
126+
if (targetBranch.getRegularStages().size() <= stageId)
127127
throw new CommandErrorException(
128-
Lang.COMMAND_SETSTAGE_STAGE_DOESNTEXIST.quickFormat("stage_id", stageID));
128+
Lang.COMMAND_SETSTAGE_STAGE_DOESNTEXIST.quickFormat("stage_id", stageId));
129129
}
130-
Lang.COMMAND_SETSTAGE_SET.quickSend(actor.sender(), "stage_id", stageID);
130+
Lang.COMMAND_SETSTAGE_SET.quickSend(actor.sender(), "stage_id", stageId);
131131
if (currentBranch != null)
132132
currentBranch.remove(quester, true);
133-
if (stageID == null) { // start branch
133+
if (stageId == null) { // start branch
134134
targetBranch.start(quester);
135135
}else { // set stage in branch
136-
data.setBranch(OptionalInt.of(branchID));
137-
targetBranch.setPlayerStage(quester, targetBranch.getRegularStage(stageID));
136+
data.setBranch(OptionalInt.of(branchId));
137+
targetBranch.setPlayerStage(quester, targetBranch.getRegularStage(stageId));
138138
}
139139
QuestsAPI.getAPI().propagateQuestsHandlers(handler -> handler.questUpdated(quester, quest));
140140
}

core/src/main/resources/locales/en_US.yml

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -161,32 +161,6 @@ msg:
161161
own:
162162
hidden: §6Your scoreboard is now hidden.
163163
shown: §6Your scoreboard is shown again.
164-
help:
165-
header: §6§lBeautyQuests — Help
166-
create: '§6/{label} create: §eCreate a quest.'
167-
edit: '§6/{label} edit: §eEdit a quest.'
168-
remove: '§6/{label} remove <id>: §eDelete a quest with a specified id or click on
169-
the NPC when not defined.'
170-
finishAll: '§6/{label} finishAll <player>: §eFinish all quests of a player.'
171-
setStage: '§6/{label} setStage <player> <id> [new branch] [new stage]: §eSkip the
172-
current stage/start the branch/set a stage for a branch.'
173-
startDialog: '§6/{label} startDialog <player> <quest id>: §eStarts the pending dialog
174-
for a NPC stage or the starting dialog for a quest.'
175-
resetPlayer: '§6/{label} resetPlayer <player>: §eRemove all informations about a
176-
player.'
177-
resetPlayerQuest: '§6/{label} resetPlayerQuest <player> [id]: §eDelete informations
178-
of a quest for a player.'
179-
seePlayer: '§6/{label} seePlayer <player>: §eView informations about a player.'
180-
reload: '§6/{label} reload: §eSave and reload all configurations and files. (§cdeprecated§e)'
181-
start: '§6/{label} start <player> [id]: §eForce the starting of a quest.'
182-
setItem: '§6/{label} setItem <talk|launch>: §eSave the hologram item.'
183-
setFirework: '§6/{label} setFirework: §eEdit the default ending firework.'
184-
adminMode: '§6/{label} adminMode: §eToggle the Admin Mode. (Useful for displaying
185-
little log messages.)'
186-
version: '§6/{label} version: §eSee the current plugin version.'
187-
downloadTranslations: '§6/{label} downloadTranslations <language>: §eDownloads a vanilla translation file'
188-
save: '§6/{label} save: §eMake a manual plugin save.'
189-
list: '§6/{label} list: §eSee the quest list. (Only for supported versions.)'
190164
typeCancel: §aWrite "cancel" to come back to the last text.
191165
editor:
192166
blockAmount: '§aWrite the amount of blocks:'
@@ -796,6 +770,32 @@ description:
796770
quest: 'Finish quest §e{quest_name}'
797771
reward:
798772
title: '§8§lRewards:'
773+
774+
command:
775+
header: §6§lBeautyQuests — Help §e(page {page_id}/{page_count})
776+
base: 'Open the Quests menu.'
777+
create: 'Create a quest.'
778+
edit: 'Edit a quest.'
779+
remove: 'Delete a quest with a specified id or click on NPC when not defined.'
780+
finishAll: 'Force finish all quests of a player.'
781+
setStage: 'Skip the current stage OR start a branch OR go to a stage in a branch.'
782+
startDialog: 'Start the pending dialog a NPC stage or the starting dialog for a quest.'
783+
resetPlayer: 'Remove all data of a quester.'
784+
resetPlayerQuest: 'Delete quest data for a quester.'
785+
resetQuest: 'Delete data of all questers for a quest.'
786+
seePlayer: 'See all quests data for a player.'
787+
start: 'Start a quest manually.'
788+
cancel: 'Cancel a started quest.'
789+
finish: 'Force finish a started quest.'
790+
checkpoint: 'Go back to the last checkpoint reached for a quest.'
791+
pools: 'Manage quest pools.'
792+
setItem: 'Change the hologram item globally.'
793+
setFirework: 'Edit the default ending firework.'
794+
adminMode: 'Enter/exit the Admin Mode: get log messages in the chat when players do quest actions.'
795+
version: 'See the current plugin version.'
796+
downloadTranslations: 'Download a vanilla translation file for blocks, items...'
797+
save: 'Make a manual plugin save.'
798+
list: 'See a list of created quests.'
799799

800800
misc:
801801
format:

0 commit comments

Comments
 (0)