mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-10-12 03:24:14 +00:00
Reorganized debug commands
- Debug dump replaces the root debugdump command - Debug toggle controls diagnostic logging - Debug version uses the shared version display - Root version remains executable but hidden from help - Diagnostic dump routing retains its separate permission path - Translations and tests cover the revised command structure
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
package art.arcane.iris.core.commands;
|
||||
|
||||
import art.arcane.iris.Iris;
|
||||
import art.arcane.iris.core.IrisSettings;
|
||||
import art.arcane.iris.core.localization.BukkitCommandMessagesExtended;
|
||||
import art.arcane.iris.core.localization.IrisLanguage;
|
||||
import art.arcane.iris.util.common.director.DirectorExecutor;
|
||||
import art.arcane.volmlib.util.director.annotations.Director;
|
||||
import art.arcane.volmlib.util.director.annotations.Param;
|
||||
import art.arcane.volmlib.util.director.help.DirectorMiniMenu;
|
||||
import art.arcane.volmlib.util.localization.MessageArgument;
|
||||
import art.arcane.volmlib.util.plugin.ComponentMessenger;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
@Director(name = "debug", description = "Iris diagnostic tools", descriptionKey = "iris.director.commanddebug.description")
|
||||
public final class CommandDebug implements DirectorExecutor {
|
||||
@Director(name = "dump", sync = true, description = "Create and optionally upload a diagnostic report", descriptionKey = "iris.director.commandiris.director.debugdump")
|
||||
public void dump(
|
||||
@Param(name = "upload", defaultValue = "true", description = "Upload the report to mclo.gs", descriptionKey = "iris.director.commandiris.param.debugdump_upload") boolean upload,
|
||||
@Param(name = "sender", contextual = true) CommandSender sender
|
||||
) {
|
||||
Iris.instance.debugDump().request(sender, upload);
|
||||
}
|
||||
|
||||
@Director(sync = true, description = "Print version information", descriptionKey = "iris.director.commandiris.director.print_version_information")
|
||||
public void version(@Param(name = "sender", contextual = true) CommandSender sender) {
|
||||
ComponentMessenger.sendMarkup(sender, DirectorMiniMenu.version(
|
||||
"Iris", Iris.instance.getDescription().getVersion(), DirectorMiniMenu.Theme.irisGreen()));
|
||||
}
|
||||
|
||||
@Director(description = "Toggle debug", descriptionKey = "iris.director.commandiris.director.toggle_debug")
|
||||
public void toggle() {
|
||||
boolean enabled = !IrisSettings.get().getGeneral().isDebug();
|
||||
IrisSettings.get().getGeneral().setDebug(enabled);
|
||||
IrisSettings.get().forceSave();
|
||||
sender().sendMessage(IrisLanguage.text(BukkitCommandMessagesExtended.COMMAND_IRIS_SET_DEBUG,
|
||||
MessageArgument.untrusted("to", enabled)));
|
||||
}
|
||||
}
|
||||
+4
-19
@@ -94,16 +94,9 @@ public class CommandIris implements DirectorExecutor {
|
||||
private CommandPack pack;
|
||||
private CommandFind find;
|
||||
private CommandDatapack datapack;
|
||||
private CommandDebug debug;
|
||||
VolmitSender sender = Iris.getSender();
|
||||
|
||||
@Director(name = "debugdump", sync = true, description = "Create and optionally upload a diagnostic report", descriptionKey = "iris.director.commandiris.director.debugdump")
|
||||
public void debugdump(
|
||||
@Param(name = "upload", defaultValue = "true", description = "Upload the report to mclo.gs", descriptionKey = "iris.director.commandiris.param.debugdump_upload") boolean upload,
|
||||
@Param(name = "sender", contextual = true) CommandSender sender
|
||||
) {
|
||||
Iris.instance.debugDump().request(sender, upload);
|
||||
}
|
||||
|
||||
@Director(description = "Choose your language or the server default")
|
||||
public void language() {
|
||||
Iris.instance.selectLanguage(sender().getS(), new String[0]);
|
||||
@@ -314,9 +307,9 @@ public class CommandIris implements DirectorExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
@Director(description = "Print version information", descriptionKey = "iris.director.commandiris.director.print_version_information")
|
||||
public void version() {
|
||||
sender().sendMessage(IrisLanguage.text(BukkitCommandMessagesExtended.COMMAND_IRIS_IRIS_V_BY_VOLMIT_SOFTWARE, MessageArgument.untrusted("value", Iris.instance.getDescription().getVersion())));
|
||||
@Director(hidden = true, sync = true, description = "Print version information", descriptionKey = "iris.director.commandiris.director.print_version_information")
|
||||
public void version(@Param(name = "sender", contextual = true) CommandSender sender) {
|
||||
debug.version(sender);
|
||||
}
|
||||
|
||||
@Director(description = "Print world height information", descriptionKey = "iris.director.commandiris.director.print_world_height_information", origin = DirectorOrigin.PLAYER)
|
||||
@@ -440,14 +433,6 @@ public class CommandIris implements DirectorExecutor {
|
||||
return failure.getMessage();
|
||||
}
|
||||
|
||||
@Director(description = "Toggle debug", descriptionKey = "iris.director.commandiris.director.toggle_debug")
|
||||
public void debug() {
|
||||
boolean to = !IrisSettings.get().getGeneral().isDebug();
|
||||
IrisSettings.get().getGeneral().setDebug(to);
|
||||
IrisSettings.get().forceSave();
|
||||
sender().sendMessage(IrisLanguage.text(BukkitCommandMessagesExtended.COMMAND_IRIS_SET_DEBUG, MessageArgument.untrusted("to", to)));
|
||||
}
|
||||
|
||||
@Director(description = "Download a project.", descriptionKey = "iris.director.commandiris.director.download_project", aliases = "dl")
|
||||
public void download(
|
||||
@Param(name = "pack", description = "The built-in pack to download", descriptionKey = "iris.director.commandiris.param.pack_download", defaultValue = NO_DOWNLOAD_SOURCE, customHandler = DownloadPackHandler.class)
|
||||
|
||||
@@ -192,7 +192,7 @@ public class CommandSVC implements IrisService, CommandExecutor, TabCompleter, D
|
||||
Iris.instance.selectLanguage(sender, Arrays.copyOfRange(args, 1, args.length));
|
||||
return;
|
||||
}
|
||||
if (!(args.length > 0 && args[0].equalsIgnoreCase("debugdump"))
|
||||
if (!(args.length > 1 && args[0].equalsIgnoreCase("debug") && args[1].equalsIgnoreCase("dump"))
|
||||
&& !sender.hasPermission(ROOT_PERMISSION)) {
|
||||
ComponentMessenger.sendSection(sender, IrisLanguage.text(
|
||||
IrisMessages.COMMAND_PERMISSION_DENIED,
|
||||
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
package art.arcane.iris.core.commands;
|
||||
|
||||
import art.arcane.iris.Iris;
|
||||
import art.arcane.iris.core.service.CommandSVC;
|
||||
import art.arcane.iris.util.common.scheduling.J;
|
||||
import art.arcane.volmlib.util.diagnostics.BukkitDebugDump;
|
||||
import art.arcane.volmlib.util.director.DirectorEngineOptions;
|
||||
import art.arcane.volmlib.util.director.compat.DirectorEngineFactory;
|
||||
import art.arcane.volmlib.util.director.context.DirectorContextRegistry;
|
||||
import art.arcane.volmlib.util.director.help.DirectorMiniMenu;
|
||||
import art.arcane.volmlib.util.director.runtime.DirectorInvocation;
|
||||
import art.arcane.volmlib.util.director.runtime.DirectorRuntimeEngine;
|
||||
import art.arcane.volmlib.util.director.runtime.DirectorSender;
|
||||
import art.arcane.volmlib.util.plugin.ComponentMessenger;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.junit.Test;
|
||||
import org.mockito.MockedStatic;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.mockStatic;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
public class CommandDebugTest {
|
||||
@Test
|
||||
public void nestedDumpPreservesUploadDefaultAndLocalOnlyOption() {
|
||||
Iris previousPlugin = Iris.instance;
|
||||
Iris plugin = mock(Iris.class);
|
||||
Iris.instance = plugin;
|
||||
BukkitDebugDump dump = mock(BukkitDebugDump.class);
|
||||
CommandSender sender = mock(CommandSender.class);
|
||||
DirectorSender invocationSender = mock(DirectorSender.class);
|
||||
when(plugin.debugDump()).thenReturn(dump);
|
||||
when(invocationSender.getName()).thenReturn("Console");
|
||||
DirectorContextRegistry contexts = new DirectorContextRegistry();
|
||||
contexts.register(CommandSender.class, (invocation, arguments) -> sender);
|
||||
|
||||
try (MockedStatic<Iris> iris = mockStatic(Iris.class)) {
|
||||
DirectorRuntimeEngine engine = DirectorEngineFactory.create(new CommandIris(),
|
||||
DirectorEngineOptions.builder().contexts(contexts).build());
|
||||
|
||||
assertTrue(engine.execute(new DirectorInvocation(invocationSender, "iris", List.of("debug", "dump"))).isSuccess());
|
||||
assertTrue(engine.execute(new DirectorInvocation(invocationSender, "iris", List.of("debug", "dump", "upload=false"))).isSuccess());
|
||||
verify(dump).request(sender, true);
|
||||
verify(dump).request(sender, false);
|
||||
assertEquals(List.of("dump", "toggle", "version"),
|
||||
DirectorMiniMenu.resolveHelp(engine, List.of("debug")).orElseThrow().entries().stream()
|
||||
.map(entry -> entry.getDescriptor().getName()).sorted().toList());
|
||||
} finally {
|
||||
Iris.instance = previousPlugin;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void canonicalDumpReachesItsOwnPermissionCheckWithoutTheAdminPermission() {
|
||||
CommandSender sender = mock(CommandSender.class);
|
||||
|
||||
try (MockedStatic<J> scheduling = mockStatic(J.class)) {
|
||||
new CommandSVC().executeRoot(sender, "iris", new String[]{"debug", "dump", "upload=false"});
|
||||
|
||||
scheduling.verify(() -> J.aBukkit(any(Runnable.class)));
|
||||
verify(sender, never()).hasPermission("iris.all");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void otherDebugCommandsStillRequireTheAdminPermission() {
|
||||
CommandSender sender = mock(CommandSender.class);
|
||||
|
||||
try (MockedStatic<J> scheduling = mockStatic(J.class);
|
||||
MockedStatic<ComponentMessenger> messages = mockStatic(ComponentMessenger.class)) {
|
||||
CommandSVC commands = new CommandSVC();
|
||||
commands.executeRoot(sender, "iris", new String[]{"debug", "version"});
|
||||
commands.executeRoot(sender, "iris", new String[]{"debug", "toggle"});
|
||||
commands.executeRoot(sender, "iris", new String[]{"debug", "ver"});
|
||||
commands.executeRoot(sender, "iris", new String[]{"debug", "tog"});
|
||||
|
||||
scheduling.verifyNoInteractions();
|
||||
}
|
||||
}
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
package art.arcane.iris.core.commands;
|
||||
|
||||
import art.arcane.iris.Iris;
|
||||
import art.arcane.volmlib.util.director.DirectorEngineOptions;
|
||||
import art.arcane.volmlib.util.director.compat.DirectorEngineFactory;
|
||||
import art.arcane.volmlib.util.director.context.DirectorContextRegistry;
|
||||
import art.arcane.volmlib.util.director.help.DirectorMiniMenu;
|
||||
import art.arcane.volmlib.util.director.runtime.DirectorInvocation;
|
||||
import art.arcane.volmlib.util.director.runtime.DirectorRuntimeEngine;
|
||||
import art.arcane.volmlib.util.director.runtime.DirectorSender;
|
||||
import art.arcane.volmlib.util.plugin.ComponentMessenger;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.PluginDescriptionFile;
|
||||
import org.junit.Test;
|
||||
import org.mockito.MockedStatic;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.mockStatic;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
public class CommandVersionTest {
|
||||
@Test
|
||||
public void nestedVersionAndHiddenShortcutUseTheSameInstalledVersion() {
|
||||
Iris previousPlugin = Iris.instance;
|
||||
Iris plugin = mock(Iris.class);
|
||||
Iris.instance = plugin;
|
||||
CommandSender sender = mock(CommandSender.class);
|
||||
DirectorSender invocationSender = mock(DirectorSender.class);
|
||||
when(plugin.getDescription()).thenReturn(new PluginDescriptionFile("Iris", "3.2.1-test", "test.Plugin"));
|
||||
when(invocationSender.getName()).thenReturn("Console");
|
||||
DirectorContextRegistry contexts = new DirectorContextRegistry();
|
||||
contexts.register(CommandSender.class, (invocation, arguments) -> sender);
|
||||
try (MockedStatic<Iris> iris = mockStatic(Iris.class);
|
||||
MockedStatic<ComponentMessenger> messages = mockStatic(ComponentMessenger.class)) {
|
||||
DirectorRuntimeEngine engine = DirectorEngineFactory.create(new CommandIris(),
|
||||
DirectorEngineOptions.builder().contexts(contexts).build());
|
||||
|
||||
assertTrue(engine.execute(new DirectorInvocation(invocationSender, "iris", List.of("debug", "version"))).isSuccess());
|
||||
assertTrue(engine.execute(new DirectorInvocation(invocationSender, "iris", List.of("version"))).isSuccess());
|
||||
messages.verify(() -> ComponentMessenger.sendMarkup(sender,
|
||||
DirectorMiniMenu.version("Iris", "3.2.1-test", DirectorMiniMenu.Theme.irisGreen())), times(2));
|
||||
assertFalse(DirectorMiniMenu.resolveHelp(engine, List.of()).orElseThrow().entries().stream()
|
||||
.anyMatch(entry -> entry.getDescriptor().getName().equals("version")));
|
||||
assertTrue(DirectorMiniMenu.resolveHelp(engine, List.of("debug")).orElseThrow().entries().stream()
|
||||
.anyMatch(entry -> entry.getDescriptor().getName().equals("version")));
|
||||
assertTrue(DirectorMiniMenu.resolveHelp(engine, List.of("debug")).orElseThrow().entries().stream()
|
||||
.anyMatch(entry -> entry.getDescriptor().getName().equals("toggle")));
|
||||
} finally {
|
||||
Iris.instance = previousPlugin;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user