Add a commands.yml file for specifying custom command descriptions

This commit is contained in:
Camotoy 2021-12-26 14:57:17 -05:00
parent b70e2645c8
commit 3061481a1a
No known key found for this signature in database
GPG key ID: 7EEFB66FE798081F
16 changed files with 123 additions and 165 deletions

1
.gitignore vendored
View file

@ -238,6 +238,7 @@ nbdist/
### Geyser ### ### Geyser ###
run/ run/
config.yml config.yml
commands.yml
logs/ logs/
public-key.pem public-key.pem
locales/ locales/

View file

@ -28,18 +28,16 @@ package org.geysermc.geyser.platform.bungeecord;
import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.config.ListenerInfo;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
import org.geysermc.common.PlatformType; import org.geysermc.common.PlatformType;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.command.CommandManager; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.configuration.GeyserConfiguration;
import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.dump.BootstrapDumpInfo;
import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough;
import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough;
import org.geysermc.geyser.util.FileUtils;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandExecutor; import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandExecutor;
import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandManager; import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.FileUtils;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
@ -53,7 +51,6 @@ import java.util.logging.Level;
public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
private GeyserBungeeCommandManager geyserCommandManager;
private GeyserBungeeConfiguration geyserConfig; private GeyserBungeeConfiguration geyserConfig;
private GeyserBungeeInjector geyserInjector; private GeyserBungeeInjector geyserInjector;
private GeyserBungeeLogger geyserLogger; private GeyserBungeeLogger geyserLogger;
@ -125,8 +122,6 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
this.geyserInjector = new GeyserBungeeInjector(this); this.geyserInjector = new GeyserBungeeInjector(this);
this.geyserInjector.initializeLocalChannel(this); this.geyserInjector.initializeLocalChannel(this);
this.geyserCommandManager = new GeyserBungeeCommandManager(geyser);
if (geyserConfig.isLegacyPingPassthrough()) { if (geyserConfig.isLegacyPingPassthrough()) {
this.geyserBungeePingPassthrough = GeyserLegacyPingPassthrough.init(geyser); this.geyserBungeePingPassthrough = GeyserLegacyPingPassthrough.init(geyser);
} else { } else {
@ -156,11 +151,6 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
return geyserLogger; return geyserLogger;
} }
@Override
public CommandManager getGeyserCommandManager() {
return this.geyserCommandManager;
}
@Override @Override
public IGeyserPingPassthrough getGeyserPingPassthrough() { public IGeyserPingPassthrough getGeyserPingPassthrough() {
return geyserBungeePingPassthrough; return geyserBungeePingPassthrough;

View file

@ -1,41 +0,0 @@
/*
* Copyright (c) 2019-2021 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.platform.bungeecord.command;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.CommandManager;
public class GeyserBungeeCommandManager extends CommandManager {
public GeyserBungeeCommandManager(GeyserImpl geyser) {
super(geyser);
}
@Override
public String getDescription(String command) {
return ""; // no support for command descriptions in bungee
}
}

View file

@ -63,7 +63,6 @@ import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
private GeyserSpigotCommandManager geyserCommandManager;
private GeyserSpigotConfiguration geyserConfig; private GeyserSpigotConfiguration geyserConfig;
private GeyserSpigotInjector geyserInjector; private GeyserSpigotInjector geyserInjector;
private GeyserSpigotLogger geyserLogger; private GeyserSpigotLogger geyserLogger;
@ -160,8 +159,6 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
this.geyserSpigotPingPassthrough = new GeyserSpigotPingPassthrough(geyserLogger); this.geyserSpigotPingPassthrough = new GeyserSpigotPingPassthrough(geyserLogger);
} }
this.geyserCommandManager = new GeyserSpigotCommandManager(geyser);
boolean isViaVersion = Bukkit.getPluginManager().getPlugin("ViaVersion") != null; boolean isViaVersion = Bukkit.getPluginManager().getPlugin("ViaVersion") != null;
if (isViaVersion) { if (isViaVersion) {
try { try {
@ -265,8 +262,8 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap {
} }
@Override @Override
public CommandManager getGeyserCommandManager() { public CommandManager createGeyserCommandManager(GeyserImpl geyser) {
return this.geyserCommandManager; return new GeyserSpigotCommandManager(geyser);
} }
@Override @Override

View file

@ -31,6 +31,7 @@ import org.bukkit.command.CommandMap;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.CommandManager; import org.geysermc.geyser.command.CommandManager;
import javax.annotation.Nonnull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
public class GeyserSpigotCommandManager extends CommandManager { public class GeyserSpigotCommandManager extends CommandManager {
@ -52,8 +53,14 @@ public class GeyserSpigotCommandManager extends CommandManager {
} }
@Override @Override
@Nonnull
public String getDescription(String command) { public String getDescription(String command) {
Command cmd = COMMAND_MAP.getCommand(command.replace("/", "")); String description = super.getDescription(command);
return cmd != null ? cmd.getDescription() : ""; if (description.isEmpty()) {
Command cmd = COMMAND_MAP.getCommand(command.replace("/", ""));
return cmd != null ? cmd.getDescription() : "";
} else {
return description;
}
} }
} }

View file

@ -62,7 +62,6 @@ public class GeyserSpongePlugin implements GeyserBootstrap {
@ConfigDir(sharedRoot = false) @ConfigDir(sharedRoot = false)
private File configDir; private File configDir;
private GeyserSpongeCommandManager geyserCommandManager;
private GeyserSpongeConfiguration geyserConfig; private GeyserSpongeConfiguration geyserConfig;
private GeyserSpongeLogger geyserLogger; private GeyserSpongeLogger geyserLogger;
private IGeyserPingPassthrough geyserSpongePingPassthrough; private IGeyserPingPassthrough geyserSpongePingPassthrough;
@ -119,7 +118,6 @@ public class GeyserSpongePlugin implements GeyserBootstrap {
this.geyserSpongePingPassthrough = new GeyserSpongePingPassthrough(); this.geyserSpongePingPassthrough = new GeyserSpongePingPassthrough();
} }
this.geyserCommandManager = new GeyserSpongeCommandManager(Sponge.getCommandManager(), geyser);
Sponge.getCommandManager().register(this, new GeyserSpongeCommandExecutor(geyser), "geyser"); Sponge.getCommandManager().register(this, new GeyserSpongeCommandExecutor(geyser), "geyser");
} }
@ -139,8 +137,8 @@ public class GeyserSpongePlugin implements GeyserBootstrap {
} }
@Override @Override
public CommandManager getGeyserCommandManager() { public CommandManager createGeyserCommandManager(GeyserImpl geyser) {
return this.geyserCommandManager; return new GeyserSpongeCommandManager(Sponge.getCommandManager(), geyser);
} }
@Override @Override

View file

@ -31,6 +31,8 @@ import org.spongepowered.api.Sponge;
import org.spongepowered.api.command.CommandMapping; import org.spongepowered.api.command.CommandMapping;
import org.spongepowered.api.text.Text; import org.spongepowered.api.text.Text;
import javax.annotation.Nonnull;
public class GeyserSpongeCommandManager extends CommandManager { public class GeyserSpongeCommandManager extends CommandManager {
private final org.spongepowered.api.command.CommandManager handle; private final org.spongepowered.api.command.CommandManager handle;
@ -41,9 +43,15 @@ public class GeyserSpongeCommandManager extends CommandManager {
} }
@Override @Override
@Nonnull
public String getDescription(String command) { public String getDescription(String command) {
return handle.get(command).map(CommandMapping::getCallable) String description = super.getDescription(command);
.map(callable -> callable.getShortDescription(Sponge.getServer().getConsole()).orElse(Text.EMPTY)) if (description.isEmpty()) {
.orElse(Text.EMPTY).toPlain(); return handle.get(command).map(CommandMapping::getCallable)
.map(callable -> callable.getShortDescription(Sponge.getServer().getConsole()).orElse(Text.EMPTY))
.orElse(Text.EMPTY).toPlain();
} else {
return description;
}
} }
} }

View file

@ -39,18 +39,16 @@ import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.geysermc.common.PlatformType; import org.geysermc.common.PlatformType;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.command.CommandManager; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.configuration.GeyserConfiguration;
import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; import org.geysermc.geyser.configuration.GeyserJacksonConfiguration;
import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.dump.BootstrapDumpInfo;
import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough;
import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough;
import org.geysermc.geyser.util.FileUtils;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.platform.standalone.command.GeyserCommandManager;
import org.geysermc.geyser.platform.standalone.gui.GeyserStandaloneGUI; import org.geysermc.geyser.platform.standalone.gui.GeyserStandaloneGUI;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.FileUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -63,7 +61,6 @@ import java.util.stream.Collectors;
public class GeyserStandaloneBootstrap implements GeyserBootstrap { public class GeyserStandaloneBootstrap implements GeyserBootstrap {
private GeyserCommandManager geyserCommandManager;
private GeyserStandaloneConfiguration geyserConfig; private GeyserStandaloneConfiguration geyserConfig;
private GeyserStandaloneLogger geyserLogger; private GeyserStandaloneLogger geyserLogger;
private IGeyserPingPassthrough geyserPingPassthrough; private IGeyserPingPassthrough geyserPingPassthrough;
@ -215,10 +212,9 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
logger.get().setLevel(geyserConfig.isDebugMode() ? Level.DEBUG : Level.INFO); logger.get().setLevel(geyserConfig.isDebugMode() ? Level.DEBUG : Level.INFO);
geyser = GeyserImpl.start(PlatformType.STANDALONE, this); geyser = GeyserImpl.start(PlatformType.STANDALONE, this);
geyserCommandManager = new GeyserCommandManager(geyser);
if (gui != null) { if (gui != null) {
gui.setupInterface(geyserLogger, geyserCommandManager); gui.setupInterface(geyserLogger, geyser.getCommandManager());
} }
geyserPingPassthrough = GeyserLegacyPingPassthrough.init(geyser); geyserPingPassthrough = GeyserLegacyPingPassthrough.init(geyser);
@ -259,11 +255,6 @@ public class GeyserStandaloneBootstrap implements GeyserBootstrap {
return geyserLogger; return geyserLogger;
} }
@Override
public CommandManager getGeyserCommandManager() {
return geyserCommandManager;
}
@Override @Override
public IGeyserPingPassthrough getGeyserPingPassthrough() { public IGeyserPingPassthrough getGeyserPingPassthrough() {
return geyserPingPassthrough; return geyserPingPassthrough;

View file

@ -26,11 +26,11 @@
package org.geysermc.geyser.platform.standalone.gui; package org.geysermc.geyser.platform.standalone.gui;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.CommandManager;
import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommand;
import org.geysermc.geyser.platform.standalone.GeyserStandaloneLogger;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.platform.standalone.GeyserStandaloneLogger;
import org.geysermc.geyser.platform.standalone.command.GeyserCommandManager;
import javax.swing.*; import javax.swing.*;
import javax.swing.table.DefaultTableModel; import javax.swing.table.DefaultTableModel;
@ -253,13 +253,13 @@ public class GeyserStandaloneGUI {
* Add all the Geyser commands to the commands menu, and setup the debug mode toggle * Add all the Geyser commands to the commands menu, and setup the debug mode toggle
* *
* @param geyserStandaloneLogger The current logger * @param geyserStandaloneLogger The current logger
* @param geyserCommandManager The commands manager * @param commandManager The commands manager
*/ */
public void setupInterface(GeyserStandaloneLogger geyserStandaloneLogger, GeyserCommandManager geyserCommandManager) { public void setupInterface(GeyserStandaloneLogger geyserStandaloneLogger, CommandManager commandManager) {
commandsMenu.removeAll(); commandsMenu.removeAll();
optionsMenu.removeAll(); optionsMenu.removeAll();
for (Map.Entry<String, GeyserCommand> command : geyserCommandManager.getCommands().entrySet()) { for (Map.Entry<String, GeyserCommand> command : commandManager.getCommands().entrySet()) {
// Remove the offhand command and any alias commands to prevent duplicates in the list // Remove the offhand command and any alias commands to prevent duplicates in the list
if (!command.getValue().isExecutableOnConsole() || command.getValue().getAliases().contains(command.getKey())) { if (!command.getValue().isExecutableOnConsole() || command.getValue().getAliases().contains(command.getKey())) {
continue; continue;

View file

@ -43,7 +43,6 @@ import org.geysermc.geyser.dump.BootstrapDumpInfo;
import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough;
import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough;
import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandExecutor; import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandExecutor;
import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandManager;
import org.geysermc.geyser.session.auth.AuthType; import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
@ -70,7 +69,6 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
@Inject @Inject
private CommandManager commandManager; private CommandManager commandManager;
private GeyserVelocityCommandManager geyserCommandManager;
private GeyserVelocityConfiguration geyserConfig; private GeyserVelocityConfiguration geyserConfig;
private GeyserVelocityInjector geyserInjector; private GeyserVelocityInjector geyserInjector;
private GeyserVelocityLogger geyserLogger; private GeyserVelocityLogger geyserLogger;
@ -144,7 +142,6 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
this.geyserInjector = new GeyserVelocityInjector(proxyServer); this.geyserInjector = new GeyserVelocityInjector(proxyServer);
// Will be initialized after the proxy has been bound // Will be initialized after the proxy has been bound
this.geyserCommandManager = new GeyserVelocityCommandManager(geyser);
this.commandManager.register("geyser", new GeyserVelocityCommandExecutor(geyser)); this.commandManager.register("geyser", new GeyserVelocityCommandExecutor(geyser));
if (geyserConfig.isLegacyPingPassthrough()) { if (geyserConfig.isLegacyPingPassthrough()) {
this.geyserPingPassthrough = GeyserLegacyPingPassthrough.init(geyser); this.geyserPingPassthrough = GeyserLegacyPingPassthrough.init(geyser);
@ -173,11 +170,6 @@ public class GeyserVelocityPlugin implements GeyserBootstrap {
return geyserLogger; return geyserLogger;
} }
@Override
public org.geysermc.geyser.command.CommandManager getGeyserCommandManager() {
return this.geyserCommandManager;
}
@Override @Override
public IGeyserPingPassthrough getGeyserPingPassthrough() { public IGeyserPingPassthrough getGeyserPingPassthrough() {
return geyserPingPassthrough; return geyserPingPassthrough;

View file

@ -1,41 +0,0 @@
/*
* Copyright (c) 2019-2021 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.platform.velocity.command;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.CommandManager;
public class GeyserVelocityCommandManager extends CommandManager {
public GeyserVelocityCommandManager(GeyserImpl geyser) {
super(geyser);
}
@Override
public String getDescription(String command) {
return ""; // no support for command descriptions in velocity
}
}

View file

@ -31,6 +31,7 @@ import org.geysermc.geyser.dump.BootstrapDumpInfo;
import org.geysermc.geyser.level.GeyserWorldManager; import org.geysermc.geyser.level.GeyserWorldManager;
import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.level.WorldManager;
import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough;
import org.jetbrains.annotations.Contract;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -68,11 +69,14 @@ public interface GeyserBootstrap {
GeyserLogger getGeyserLogger(); GeyserLogger getGeyserLogger();
/** /**
* Returns the current CommandManager * Creates a command manager for {@link GeyserImpl to use}.
* *
* @return The current CommandManager * @return a new CommandManager instance
*/ */
CommandManager getGeyserCommandManager(); @Contract("_ -> new")
default CommandManager createGeyserCommandManager(GeyserImpl geyser) {
return new CommandManager(geyser);
}
/** /**
* Returns the current PingPassthrough manager * Returns the current PingPassthrough manager

View file

@ -118,6 +118,8 @@ public class GeyserImpl implements GeyserApi {
private final ScheduledExecutorService scheduledThread; private final ScheduledExecutorService scheduledThread;
private final CommandManager commandManager;
private final BedrockServer bedrockServer; private final BedrockServer bedrockServer;
private final PlatformType platformType; private final PlatformType platformType;
private final GeyserBootstrap bootstrap; private final GeyserBootstrap bootstrap;
@ -150,6 +152,8 @@ public class GeyserImpl implements GeyserApi {
this.scheduledThread = Executors.newSingleThreadScheduledExecutor(new DefaultThreadFactory("Geyser Scheduled Thread")); this.scheduledThread = Executors.newSingleThreadScheduledExecutor(new DefaultThreadFactory("Geyser Scheduled Thread"));
this.commandManager = bootstrap.createGeyserCommandManager(this);
logger.setDebug(config.isDebugMode()); logger.setDebug(config.isDebugMode());
/* Initialize translators and registries */ /* Initialize translators and registries */
@ -480,10 +484,6 @@ public class GeyserImpl implements GeyserApi {
return bootstrap.getGeyserConfig(); return bootstrap.getGeyserConfig();
} }
public CommandManager getCommandManager() {
return bootstrap.getGeyserCommandManager();
}
public WorldManager getWorldManager() { public WorldManager getWorldManager() {
return bootstrap.getWorldManager(); return bootstrap.getWorldManager();
} }

View file

@ -25,20 +25,30 @@
package org.geysermc.geyser.command; package org.geysermc.geyser.command;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import lombok.Getter; import lombok.Getter;
import org.geysermc.common.PlatformType; import org.geysermc.common.PlatformType;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.defaults.*; import org.geysermc.geyser.command.defaults.*;
import org.geysermc.geyser.configuration.CustomCommandsConfiguration;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.GeyserLocale;
import java.util.*; import javax.annotation.Nonnull;
import java.io.File;
public abstract class CommandManager { import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
public class CommandManager {
@Getter @Getter
private final Map<String, GeyserCommand> commands = new HashMap<>(); private final Map<String, GeyserCommand> commands = new HashMap<>();
@Getter
private final Map<String, String> commandDescriptionOverrides;
private final GeyserImpl geyser; private final GeyserImpl geyser;
@ -58,6 +68,32 @@ public abstract class CommandManager {
if (GeyserImpl.getInstance().getPlatformType() == PlatformType.STANDALONE) { if (GeyserImpl.getInstance().getPlatformType() == PlatformType.STANDALONE) {
registerCommand(new StopCommand(geyser, "stop", "geyser.commands.stop.desc", "geyser.command.stop")); registerCommand(new StopCommand(geyser, "stop", "geyser.commands.stop.desc", "geyser.command.stop"));
} }
// Read or create command overrides
ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
File commandsFile = geyser.getBootstrap().getConfigFolder().resolve("commands.yml").toFile();
if (!commandsFile.exists()) {
try (InputStream stream = geyser.getBootstrap().getResource("commands.yml")) {
Files.copy(stream, commandsFile.toPath());
} catch (IOException e) {
geyser.getLogger().error("Unable to load commands.yml template from jar!", e);
}
}
CustomCommandsConfiguration commandsConfiguration;
try {
commandsConfiguration = objectMapper.readValue(commandsFile, CustomCommandsConfiguration.class);
} catch (IOException e) {
geyser.getLogger().error("Unable to load commands configuration!", e);
commandsConfiguration = new CustomCommandsConfiguration();
}
this.commandDescriptionOverrides = new Object2ObjectOpenHashMap<>();
for (CustomCommandsConfiguration.CustomCommandEntry entry : commandsConfiguration.getDescriptions()) {
for (String name : entry.getCommands()) {
commandDescriptionOverrides.put(name, entry.getDescription());
}
}
} }
public void registerCommand(GeyserCommand command) { public void registerCommand(GeyserCommand command) {
@ -105,18 +141,15 @@ public abstract class CommandManager {
} }
} }
/**
* @return a list of all subcommands under {@code /geyser}.
*/
public List<String> getCommandNames() {
return Arrays.asList(geyser.getCommandManager().getCommands().keySet().toArray(new String[0]));
}
/** /**
* Returns the description of the given command * Returns the description of the given command
* *
* @param command Command to get the description for * @param command Command to get the description for
* @return Command description * @return Command description
*/ */
public abstract String getDescription(String command); @Nonnull
public String getDescription(String command) {
// Most platforms don't have an option to get the description, so we rely on our overrides instead
return commandDescriptionOverrides.getOrDefault(command, "");
}
} }

View file

@ -23,19 +23,23 @@
* @link https://github.com/GeyserMC/Geyser * @link https://github.com/GeyserMC/Geyser
*/ */
package org.geysermc.geyser.platform.standalone.command; package org.geysermc.geyser.configuration;
import org.geysermc.geyser.GeyserImpl; import lombok.Getter;
import org.geysermc.geyser.command.CommandManager; import lombok.ToString;
public class GeyserCommandManager extends CommandManager { import java.util.Collections;
import java.util.List;
public GeyserCommandManager(GeyserImpl geyser) { @Getter
super(geyser); @ToString
} public class CustomCommandsConfiguration {
private List<CustomCommandEntry> descriptions = Collections.emptyList();
@Override @Getter
public String getDescription(String command) { @ToString
return ""; // this is not sent over the protocol, so we return none public static class CustomCommandEntry {
private String description;
private List<String> commands;
} }
} }

View file

@ -0,0 +1,15 @@
# Specify custom command descriptions.
# On platforms that have their own command descriptions, any entry here will override what the platform provides.
descriptions: [
{
description: "This is an example command description setup for Bedrock players",
# Each command here will have the above command description applied.
commands: [
"foo", "bar"
]
},
{
description: "The main command for Geyser.",
commands: ["geyser"]
}
]