mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Add a commands.yml file for specifying custom command descriptions
This commit is contained in:
parent
b70e2645c8
commit
3061481a1a
16 changed files with 123 additions and 165 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -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/
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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, "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
15
core/src/main/resources/commands.yml
Normal file
15
core/src/main/resources/commands.yml
Normal 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"]
|
||||||
|
}
|
||||||
|
]
|
Loading…
Reference in a new issue