Skip to content

Conversation

@dktapps
Copy link
Member

@dktapps dktapps commented May 4, 2025

This PR started out as an effort to decouple Command and CommandMap, but it's turned into a bit more than that.

A summary of changes:

UX

  • Added cmdalias create, cmdalias delete and cmdalias list commands
  • /help now shows prefixed names such as pocketmine:help
  • Prefixed command name (e.g. pocketmine:help) are now visible to Minecraft clients
  • Permission denied messages are now able to show more useful context when e.g. checking subcommand permissions
  • Multiple commands claiming an alias make the alias unusable (an error will be shown when used telling the user to pick from the namespaced names), instead of whichever plugin loaded last getting lucky

API

  • Added CommandAliasMap, which handles mapping of aliases to namespaced command IDs
  • Added CommandSender->getCommandAliasMap() for user-specific aliases
  • Added CommandMap->getAliasMap() for global fallback aliases
  • Command no longer tracks its own registered aliases (now the job of CommandMap), breaking circular dependency
  • Aliases must now be provided to CommandMap->register()
  • Aliases can now be individually registered and unregistered without re-registering/unregistering the whole command using CommandAliasMap APIs
  • Aliases are no longer namespaced, only the main command name (e.g. pocketmine:? is now gone while pocketmine:help still exists)
  • Command now requires a $namespace parameter, which replaces the old $fallbackPrefix parameter of register(). It should be set to the name of the plugin.

Relevant issues

dktapps added 3 commits May 4, 2025 15:23
This decouples Command from CommandMap, and moves the burden of tracking registered
aliases to CommandMap. This allows lots of simplification, and also solves a few
weird usage message issues.

- Active (registered) aliases are now tracked via CommandMapEntry
- Commands overriding other commands' aliases now update the original command's registered alias list properly
- Command alias lists now include prefixed aliases
- Prefixed aliases are now included in command data provided to the client
- Server-side /pocketmine:help is now visible on the client
- Permission testing can now provide context that's more relevant to the command invocation - e.g. if a user doesn't have /time set permission, it'll now show a more specific message where previously it would just show that the permission for /time was denied
- User-specified label is now used for permission messages instead of command name - this is more consistent with user expectations
- /help can now see prefixed aliases
- Removed magic alias registration behaviour for VanillaCommand that I don't think anyone expected
- Aliases are now provided to CommandMap via register() parameters, instead of being retrieved from the provided Command
- Command->get/setAliases(), get/setLabel() and getName() are removed
- Command->getName() pushed down to PluginCommand, as it's only useful for CommandExecutors as a command ID and shouldn't be used anywhere else
@dktapps dktapps requested a review from a team as a code owner May 4, 2025 16:03
@dktapps dktapps added Category: API Related to the plugin API BC break Breaks API compatibility Type: Enhancement Contributes features or other improvements to PocketMine-MP labels May 4, 2025
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes May 4, 2025
@NTT1906
Copy link
Contributor

NTT1906 commented May 23, 2025

image

Prefixed aliases are now visible to Minecraft clients

I don't like the look of it. Sending fully prefixed/namespaced commands to clients feels spammy. It should be cleaner by default.

  1. The last registered command should take the name (without the namespace), except for help.

  2. Only show namespace versions if more than 1 command with the same name.

  3. Maybe add an option for the command to choose whether they wanted to show or not the namespace.

  4. While the pocketmine namespace is consistent, using pmmp is a shorter, cleaner alternative.

  5. Maybe a bad idea, as it might cause confusion, but by allowing namespace commands to still work silently—no hints, they can still be executed.

  6. Yet another bad idea, and idk how it could work with the current command system in PMMP. Maybe introduce some kind of bundled command? Create a super command class where commands with the same name get bundled into a single command data. This allows for registering multiple overloads at the cost of losing command descriptions and needs a way to separate the command args when passing down the command args.

@dktapps
Copy link
Member Author

dktapps commented May 24, 2025

Yeah, I'm not sure about the fully-qualified names either. I think the way that those are handled probably needs to be rethought.
For example I don't like prefixing the aliases. Probably we should only prefix the primary label.

Longer term I think I want to have those move towards being internalised command IDs which are used by aliases to locate a command (see #3371), rather than being able to be directly invoked. But that's too big of a change for one PR.

@dktapps
Copy link
Member Author

dktapps commented May 24, 2025

I don't like the look of it. Sending fully prefixed/namespaced commands to clients feels spammy.

To be honest this was more of a side effect of changing the tracking of the registered aliases. Previously the command registration wasn't aware of its own prefixed aliases, which lead to all kinds of interesting surprises for people trying to block commands by name rather than using permissions, since the aliases weren't visible in /help nor in client-side hints. (Not that they should have been doing that, but it's still surprising to have these hidden things.)

Filtering out the prefixed aliases is a bit problematic since we currently don't restrict aliases or fallback prefixes from containing :, so there's no foolproof way to tell them apart.

@dktapps dktapps moved this to In Progress in Commands rework Sep 1, 2025
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 4, 2025
just the primary alias (as in, the command ID) is enough
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 4, 2025
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 8, 2025
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 8, 2025
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 8, 2025
NetworkSession is a rat's nest of these sorts of errors. It'll need to be rewritten at some point.
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 8, 2025
this obviates the need for CommandMapEntry.
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 8, 2025
probably these should be restricted further, but this is enough for now, since the original code didn't check these either
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 8, 2025
dktapps added a commit to pmmp/Language that referenced this pull request Oct 10, 2025
pmmp-admin-bot[bot]
pmmp-admin-bot bot previously approved these changes Oct 10, 2025
@dktapps dktapps merged commit 9f9bc5f into major-next Oct 10, 2025
22 checks passed
@github-project-automation github-project-automation bot moved this from In Progress to Done in Commands rework Oct 10, 2025
@dktapps dktapps deleted the command-alias-handling branch October 10, 2025 22:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

BC break Breaks API compatibility Category: API Related to the plugin API Type: Enhancement Contributes features or other improvements to PocketMine-MP

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants