feat(plugin): make Plugin extend Namespaced (#12867)

Co-authored-by: Bjarne Koll <git@lynxplay.dev>
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
This commit is contained in:
Emil
2025-07-21 00:01:22 +02:00
committed by GitHub
parent 602ea9f0e1
commit c8a8c0ef89
5 changed files with 21 additions and 4 deletions

View File

@@ -1,6 +1,9 @@
package io.papermc.paper.plugin.configuration;
import java.util.List;
import java.util.Locale;
import net.kyori.adventure.key.KeyPattern;
import net.kyori.adventure.key.Namespaced;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.PluginLoadOrder;
@@ -14,7 +17,7 @@ import org.jspecify.annotations.Nullable;
*/
@NullMarked
@ApiStatus.NonExtendable
public interface PluginMeta {
public interface PluginMeta extends Namespaced {
/**
* Provides the name of the plugin. This name uniquely identifies the plugin amongst all loaded plugins on the
@@ -180,4 +183,10 @@ public interface PluginMeta {
*/
@Nullable String getAPIVersion();
@KeyPattern.Namespace
@SuppressWarnings("PatternValidation")
@Override
default String namespace() {
return this.getName().toLowerCase(Locale.ROOT);
}
}

View File

@@ -72,7 +72,7 @@ public final class NamespacedKey implements Key, com.destroystokyo.paper.Namespa
public NamespacedKey(@NotNull Plugin plugin, @NotNull String key) {
Preconditions.checkArgument(plugin != null, "Plugin cannot be null");
Preconditions.checkArgument(key != null, "Key cannot be null");
this.namespace = plugin.getName().toLowerCase(Locale.ROOT);
this.namespace = plugin.namespace();
this.key = key.toLowerCase(Locale.ROOT);
// Check validity after normalization

View File

@@ -3,6 +3,7 @@ package org.bukkit.plugin;
import java.io.File;
import java.io.InputStream;
import java.util.logging.Logger;
import net.kyori.adventure.key.Namespaced;
import org.bukkit.Server;
import org.bukkit.command.TabExecutor;
import org.bukkit.configuration.file.FileConfiguration;
@@ -16,7 +17,7 @@ import org.jetbrains.annotations.Nullable;
* <p>
* The use of {@link PluginBase} is recommended for actual Implementation
*/
public interface Plugin extends TabExecutor, io.papermc.paper.plugin.lifecycle.event.LifecycleEventOwner { // Paper
public interface Plugin extends TabExecutor, io.papermc.paper.plugin.lifecycle.event.LifecycleEventOwner, Namespaced { // Paper
/**
* Returns the folder that the plugin data files are located in. The
* folder may not yet exist.

View File

@@ -1,6 +1,7 @@
package org.bukkit.plugin;
import org.jetbrains.annotations.NotNull;
import java.util.Locale;
/**
* Represents a base {@link Plugin}
@@ -33,4 +34,10 @@ public abstract class PluginBase implements Plugin {
public final String getName() {
return getPluginMeta().getName(); // Paper
}
@Override
@NotNull
public String namespace() {
return this.getPluginMeta().namespace();
}
}

View File

@@ -91,7 +91,7 @@ public class PaperCommands implements Commands, PaperRegistrar<LifecycleEventOwn
@Override
public @Unmodifiable Set<String> registerWithFlags(final PluginMeta pluginMeta, final LiteralCommandNode<CommandSourceStack> node, final @Nullable String description, final Collection<String> aliases, final Set<CommandRegistrationFlag> flags) {
return registerWithFlagsInternal(pluginMeta, pluginMeta.getName().toLowerCase(Locale.ROOT), null, node, description, aliases, flags);
return this.registerWithFlagsInternal(pluginMeta, pluginMeta.namespace(), null, node, description, aliases, flags);
}
public @Unmodifiable Set<String> registerWithFlagsInternal(final @Nullable PluginMeta pluginMeta, final String namespace, final @Nullable String helpNamespaceOverride, final LiteralCommandNode<CommandSourceStack> node, final @Nullable String description, final Collection<String> aliases, final Set<CommandRegistrationFlag> flags) {