Skip to content

5.0.0

Choose a tag to compare

@Traqueur-dev Traqueur-dev released this 02 Jan 18:10
· 6 commits to master since this release
85ee27a

CommandsAPI v5.0.0

🚨 Breaking Changes

  • Repository Migration: JitPack β†’ repo.groupez.dev
  • GroupId Change: com.github.Traqueur-dev.CommandsAPI β†’ fr.traqueur.commands
  • Java 21 Required
  • Removed deprecated getAsInt(), getAsDouble() methods β†’ Use args.<T>get() or args.<T>getOptional()

✨ New Features

Annotations Addon

New optional module for declarative command definition using annotations.

@CommandContainer
public class MyCommands {
@Command(name = "heal", permission = "admin.heal")
@Alias({"h", "health"})
public void heal(Player sender, @Arg("target") Optional&lt;Player&gt; target) {
    Player toHeal = target.orElse(sender);
    toHeal.setHealth(20);
}

@Command(name = "admin.reload")  // Hierarchical via dot notation
public void reload(CommandSender sender) { }

@TabComplete(command = "heal", arg = "target")
public List&lt;String&gt; completeTarget(Player sender, String current) {
    return Bukkit.getOnlinePlayers().stream()
        .map(Player::getName)
        .filter(n -&gt; n.startsWith(current))
        .toList();
}

}

Annotations: @CommandContainer, @Command, @Arg, @Infinite, @Alias, @TabComplete

CommandBuilder - Fluent API

Create commands without subclassing:

manager.command("hello")
    .description("Say hello")
    .permission("myplugin.hello")
    .arg("player", Player.class)
    .optionalArg("message", String.class)
    .executor((sender, args) -> {
        Player target = args.get("player");
        sender.sendMessage("Hello " + target.getName());
    })
    .register();

SenderResolver

Automatic sender type resolution for annotations. Each platform provides its own resolver:

  • Bukkit: CommandSender, Player, ConsoleCommandSender
  • Velocity: CommandSource, Player, ConsoleCommandSource
  • JDA: SlashCommandInteractionEvent, User, Member

ArgumentParser System

New extensible parsing system with typed error handling:

  • ParseResult with success/error states
  • ParseError with types: MISSING_REQUIRED, TYPE_NOT_FOUND, CONVERSION_FAILED

⚑ Performance Improvements

  • Player/OfflinePlayer argument caching - Tab completion cached with 1s/5s TTL
  • CommandTree optimizations - Precompiled patterns, HashMap lookups
  • Async version checker - Non-blocking update check with 5s timeout

πŸ”§ Improvements

  • Sealed ArgumentType interface (Simple | Infinite)
  • Better label validation (max 64 chars/segment, max 10 depth)
  • Improved Javadoc across all modules
  • Code cleanup and formatting

πŸ“¦ Installation

<repository>
    <id>groupez-releases</id>
    <url>https://repo.groupez.dev/releases</url>
</repository>

<dependency>
<groupId>fr.traqueur.commands</groupId>
<artifactId>platform-spigot</artifactId> <!-- or platform-velocity, platform-jda -->
<version>5.0.0</version>
</dependency>

<!-- Optional: Annotations Addon -->
<dependency>
<groupId>fr.traqueur.commands</groupId>
<artifactId>annotations-addon</artifactId>
<version>5.0.0</version>
</dependency>

repositories {
    maven { url 'https://repo.groupez.dev/releases' }
}

dependencies {
    implementation 'fr.traqueur.commands:platform-spigot:5.0.0'
    implementation 'fr.traqueur.commands:annotations-addon:5.0.0' // Optional
}

🎯 3 Ways to Create Commands

Method Style Best For
Inheritance extends Command<T,S> Complex commands, full control
Builder manager.command() Quick inline commands
Annotations @ Command Clean, declarative style

Full Changelog: See MIGRATION_v4_to_v5.md for detailed migration guide.

Full Changelog: 4.3.1...5.0.0