---
description: Die Command Manager API meines Plugins
---

# Command Manager API

Die Command Manager API ist in der [developer-api](developer-api "mention") enthaltene API um Commands mit SubCommands zu erstellen und es garnicht so schwer.

### Initialization

Als erstes muss man eine neue Klasse die der Command Manager werden soll erstellen. Diese Klasse muss dann die Klasse `de.happybavarian07.adminpanel.commandmanagement.CommandManager` extenden und die Methoden müssen implementiert werden. Die Methoden Namen sind wahrscheinlich ziemlich selbsterklärend aber ganz unten kommt nochmal ein gesamt Beispiel. Dann muss man der Klasse die Annotation `@de.happybavarian07.adminpanel.commandmanagement.CommandData` hinzufügen und der Parameter ist auch selbst erklärend. Die Methoden onCommand müssen wenn man nichts verändern will und es sich leicht machen will einfach für den Spieler `return super.onCommand(player, args);` und für die Console `return super.onCommand(sender, args);` enthalten und nichts weiteres. Für Tab Complete ist es `return super.onTabComplete(sender, command, label, args);`. In der Setup Methode registriert man alle Sub Commands, indem man sie der Liste hinzufügt so: `commands.add(new <SubCommand>());`.

Danach muss  man nur noch in der `onEnable` Methode des Plugins das auf meine API zugreift gehen und `AdminPanelMain.getAPI().registerCommandManager(new SuperCommandManager());` ausführen. Mein Plugin wird den Rest übernehmen und den Command registrieren (ohne plugin.yml oder sontiges). Momentan wird der Command dann noch den Prefix admin-panel haben aber vielleicht gebe ich später noch eine Option für sowas.

Übrigens, falls es noch nicht klar war: getJavaPlugin steht für das Plugin was auf die API zugreift also dein Plugin für den der Command sein soll.

### Sub Commands

Die Sub Commands kann man über die Setup Methode im Manager hinzufügen, aber dafür muss man erst einen erstellen (Ich habe unter dem Manager Example ein Help Command Example hinzugefügt, den man nutzen kann aber nicht muss). Also man fängt damit an, dass man eine Klasse erstellt die die Klasse `de.happybavarian07.adminpanel.commandmanagement.SubCommand` extended. Danach implementiert man die Methoden und fühlt sie mit Daten aus (getName() = "Sub Command Name", etc). Dann muss man in onPlayerCommand und onConsoleCommand den Code hinzufügen der ausgeführt werden soll (onPlayerCommand = Player Code, onConsoleCommand = Console Code). Wenn man Unter Argumente hat im Sub Command kann man mit der Methode subArgs diese auflisten für den Tab Completer und mein Plugin wird dann alles handeln. Wenn man Aliases haben möchte muss man natürlich es in die aliases Methode eintragen. Eine weitere Info: Wenn man möchte das der Sub Command speziell nur für Spieler sein sollte dann einfach auch hier die CommandData Annotation hinzufügen mit playerRequired auf true. Wenn man bei den Sub Commands den playerRequired auf true / false macht, muss natürlich im Command Manager die Annotation auf false gesetzt werden um den Check auszuschalten der dafür sorgt, dass der ganze Command nur für Spieler / für alle ist

### Weitere Nützliche Klassen

* Ich habe unter anderem eine Klasse hinzugefügt mit der man eine Liste an Objekten in eine Liste mit Seiten machen kann. Diese Klasse heißt `PaginatedList` und kann benutzt werden wann immer man mag. Zum Beispiel:&#x20;

```java
PaginatedList<SubCommand> subCommandsSorted = new PaginatedList<>(plugin.getCommandManagerRegistry().getSubCommands("example"));
subCommandsSorted.maxItemsPerPage(10).sort();
System.out.println(subCommandsSorted.toString());
```

### Full Code Example

```java
package de.happybavarian07.adminpanel.commands.managers;
/*
 * @Author HappyBavarian07
 * @Date 27.04.2022 | 17:07
 */

import de.happybavarian07.adminpanel.commandmanagement.CommandData;
import de.happybavarian07.adminpanel.commandmanagement.CommandManager;
import de.happybavarian07.adminpanel.commandmanagement.SubCommand;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.HelpCommand;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.playermanager.*;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.pluginmanager.*;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.servermanager.*;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.worldmanager.*;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;

import java.util.Collections;
import java.util.List;

// getJavaPlugin kann ein Plugin sein man kann aber auch einfach adminpanel reinschreiben,
// dann wird der Command mit dem Admin-Panel registriert und erhält admin-panel als Prefix
@CommandData(playerRequired = false)
public class ExampleCommandManager extends CommandManager {
    @Override
    public String getCommandName() {
        return "example";
    }

    @Override
    public String getCommandUsage() {
        /*
         */
        return "/example<SubCommand> (openpanel help <Page>)";
    }

    @Override
    public JavaPlugin getJavaPlugin() {
        return adminpanel;
    }

    @Override
    public String getCommandInfo() {
        return "Read the Example message and do a flip";
    }

    @Override
    public List<String> getCommandAliases() {
        return Collections.singletonList("ex");
    }

    @Override
    public String getCommandPermission() {
        return "The.CommandManager.Example";
    }

    @Override
    public boolean onCommand(Player player, String[] args) {
        return super.onCommand(player, args);
    }

    @Override
    public boolean onCommand(ConsoleCommandSender player, String[] args) {
        return super.onCommand(player, args);
    }

    @Override
    public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
        return super.onTabComplete(sender, command, label, args);
    }

    @Override
    public void setup() {
        commands.add(new SuperDuperCommand());
    }

    @Override
    public List<SubCommand> getSubCommands() {
        return commands;
    }
}

```

### Help Command Example

```java
package de.happybavarian07.adminpanel.commands.subcommands.panelopencommands;
/*
 * @Author HappyBavarian07
 * @Date 05.10.2021 | 17:53
 */

import de.happybavarian07.adminpanel.commandmanagement.PaginatedList;
import de.happybavarian07.adminpanel.commandmanagement.SubCommand;
import de.happybavarian07.adminpanel.main.PlaceholderType;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;

import java.util.HashMap;
import java.util.Map;

@CommandData
// Diese Klasse nimmt sich eine Liste aller Sub Commands des Befehls
// und sortiert diese und setzt ein Maximum pro Seite.
// Danach muss man nur noch durch die Liste durchgehen wie hier oder halt auch anders
public class HelpCommand extends SubCommand {
    @Override
    public boolean onPlayerCommand(Player player, String[] args) {
        if (args.length != 1) {
            return false;
        }
        try {
            int page = Integer.parseInt(args[0]);
            PaginatedList<SubCommand> messages = new PaginatedList<>(plugin.getCommandManagerRegistry().getSubCommands("openpanel"));
            messages.maxItemsPerPage(10).sort();
            lgm.addPlaceholder(PlaceholderType.MESSAGE, "%page%", page, false);
            if (!messages.containsPage(page)) {
                player.sendMessage(lgm.getMessage("Player.Commands.HelpPageDoesNotExist", player, true));
                return true;
            }
            lgm.addPlaceholder(PlaceholderType.MESSAGE, "%max_page%", messages.getMaxPage(), false);
            player.sendMessage(lgm.getMessage("Player.Commands.HelpMessages.Header", player, false));
            for (SubCommand s : messages.getPage(page)) {
                if(player.hasPermission(s.permission())) {
                    player.sendMessage(format(lgm.getMessage("Player.Commands.HelpMessages.Format", player, false), s));
                }
            }
            player.sendMessage(lgm.getMessage("Player.Commands.HelpMessages.Footer", player, true));
        } catch (NumberFormatException e) {
            player.sendMessage(lgm.getMessage("Player.Commands.NotANumber", player, true));
            return true;
        } catch (PaginatedList.ListNotSortedException e2) {
            e2.printStackTrace();
            return true;
        }
        return true;
    }

    @Override
    public boolean onConsoleCommand(ConsoleCommandSender sender, String[] args) {
        if (args.length != 1) {
            return false;
        }
        try {
            int page = Integer.parseInt(args[0]);
            PaginatedList<SubCommand> messages = new PaginatedList<>(plugin.getCommandManagerRegistry().getSubCommands("openpanel"));
            messages.maxItemsPerPage(10).sort();
            lgm.addPlaceholder(PlaceholderType.MESSAGE, "%page%", page, false);
            if (!messages.containsPage(page)) {
                sender.sendMessage(lgm.getMessage("Player.Commands.HelpPageDoesNotExist", null, true));
                return true;
            }
            lgm.addPlaceholder(PlaceholderType.MESSAGE, "%max_page%", messages.getMaxPage(), false);
            sender.sendMessage(lgm.getMessage("Player.Commands.HelpMessages.Header", null, false));
            for (SubCommand s : messages.getPage(page)) {
                if(sender.hasPermission(s.permission())) {
                    sender.sendMessage(format(lgm.getMessage("Player.Commands.HelpMessages.Format", null, false), s));
                }
            }
            sender.sendMessage(lgm.getMessage("Player.Commands.HelpMessages.Footer", null, true));
        } catch (NumberFormatException e) {
            sender.sendMessage(lgm.getMessage("Player.Commands.NotANumber", null, true));
            return true;
        } catch (PaginatedList.ListNotSortedException e2) {
            e2.printStackTrace();
            return true;
        }
        return true;
    }

    @Override
    public String name() {
        return "help";
    }

    @Override
    public String info() {
        return "The Help Command";
    }

    @Override
    public String[] aliases() {
        return new String[0];
    }

    @Override
    public Map<Integer, String[]> subArgs() {
        return new HashMap<>();
    }

    @Override
    public String syntax() {
        return "/openpanel help <Page>";
    }

    @Override
    public String permission() {
        return "";
    }
}

```
