From 4bf2a4303aa2d24e022059bbe3c73b0df8d35363 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Mon, 18 Sep 2023 15:31:39 +0200 Subject: [PATCH 1/5] Init: Add /geyser ping command --- .../geyser/command/GeyserCommandManager.java | 4 +- .../geyser/command/defaults/PingCommand.java | 58 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java diff --git a/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java b/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java index 373395ea2..1a1f87c41 100644 --- a/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java +++ b/core/src/main/java/org/geysermc/geyser/command/GeyserCommandManager.java @@ -44,6 +44,7 @@ import org.geysermc.geyser.command.defaults.ExtensionsCommand; import org.geysermc.geyser.command.defaults.HelpCommand; import org.geysermc.geyser.command.defaults.ListCommand; import org.geysermc.geyser.command.defaults.OffhandCommand; +import org.geysermc.geyser.command.defaults.PingCommand; import org.geysermc.geyser.command.defaults.ReloadCommand; import org.geysermc.geyser.command.defaults.SettingsCommand; import org.geysermc.geyser.command.defaults.StatisticsCommand; @@ -66,7 +67,7 @@ import java.util.Map; public class GeyserCommandManager { @Getter - private final Map commands = new Object2ObjectOpenHashMap<>(12); + private final Map commands = new Object2ObjectOpenHashMap<>(13); private final Map> extensionCommands = new Object2ObjectOpenHashMap<>(0); private final GeyserImpl geyser; @@ -83,6 +84,7 @@ public class GeyserCommandManager { registerBuiltInCommand(new AdvancementsCommand("advancements", "geyser.commands.advancements.desc", "geyser.command.advancements")); registerBuiltInCommand(new AdvancedTooltipsCommand("tooltips", "geyser.commands.advancedtooltips.desc", "geyser.command.tooltips")); registerBuiltInCommand(new ConnectionTestCommand(geyser, "connectiontest", "geyser.commands.connectiontest.desc", "geyser.command.connectiontest")); + registerBuiltInCommand(new PingCommand("ping", "geyser.commands.ping.desc", "geyser.command.ping")); if (this.geyser.getPlatformType() == PlatformType.STANDALONE) { registerBuiltInCommand(new StopCommand(geyser, "stop", "geyser.commands.stop.desc", "geyser.command.stop")); } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java new file mode 100644 index 000000000..9ba0ebfe8 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2019-2023 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.command.defaults; + +import org.cloudburstmc.netty.channel.raknet.RakChildChannel; +import org.cloudburstmc.netty.handler.codec.raknet.common.RakSessionCodec; +import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.ChatColor; + +public class PingCommand extends GeyserCommand { + public PingCommand(String name, String description, String permission) { + super(name, description, permission); + } + + @Override + public void execute(GeyserSession session, GeyserCommandSource sender, String[] args) { + if (!sender.isConsole()) { + return; + } + + RakSessionCodec rakSessionCodec = ((RakChildChannel) session.getUpstream().getSession().getPeer().getChannel()).rakPipeline().get(RakSessionCodec.class); + + //todo lang strings + sender.sendMessage("Your ping is: " + ChatColor.BOLD + rakSessionCodec.getPing() + ChatColor.RESET + "ms."); + sender.sendMessage("Your RTT is: §7" + ChatColor.BOLD + rakSessionCodec.getRTT() + ChatColor.RESET + "ms."); + } + + @Override + public boolean isBedrockOnly() { + return true; + } +} + From c75c5b4fb92a0cb8099992b3d08d5551e1fb5529 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Mon, 18 Sep 2023 15:35:06 +0200 Subject: [PATCH 2/5] Block just console execution, not everything but console senders --- .../org/geysermc/geyser/command/defaults/PingCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java index 9ba0ebfe8..ca883c7e7 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java @@ -39,13 +39,13 @@ public class PingCommand extends GeyserCommand { @Override public void execute(GeyserSession session, GeyserCommandSource sender, String[] args) { - if (!sender.isConsole()) { + if (sender.isConsole()) { return; } RakSessionCodec rakSessionCodec = ((RakChildChannel) session.getUpstream().getSession().getPeer().getChannel()).rakPipeline().get(RakSessionCodec.class); - //todo lang strings + // todo lang strings sender.sendMessage("Your ping is: " + ChatColor.BOLD + rakSessionCodec.getPing() + ChatColor.RESET + "ms."); sender.sendMessage("Your RTT is: §7" + ChatColor.BOLD + rakSessionCodec.getRTT() + ChatColor.RESET + "ms."); } From d62470b40819557de9ac510bfea3d1aed596806d Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Mon, 18 Sep 2023 15:39:23 +0200 Subject: [PATCH 3/5] Use RTT as that seems to vary less wildly compared to getPing() --- .../org/geysermc/geyser/command/defaults/PingCommand.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java index ca883c7e7..eb9bd638c 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java @@ -30,7 +30,6 @@ import org.cloudburstmc.netty.handler.codec.raknet.common.RakSessionCodec; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.text.ChatColor; public class PingCommand extends GeyserCommand { public PingCommand(String name, String description, String permission) { @@ -45,9 +44,7 @@ public class PingCommand extends GeyserCommand { RakSessionCodec rakSessionCodec = ((RakChildChannel) session.getUpstream().getSession().getPeer().getChannel()).rakPipeline().get(RakSessionCodec.class); - // todo lang strings - sender.sendMessage("Your ping is: " + ChatColor.BOLD + rakSessionCodec.getPing() + ChatColor.RESET + "ms."); - sender.sendMessage("Your RTT is: §7" + ChatColor.BOLD + rakSessionCodec.getRTT() + ChatColor.RESET + "ms."); + sender.sendMessage("Your ping is: §7" + (int) Math.floor(rakSessionCodec.getRTT()) + " ms."); } @Override From 7c194a0b74c0f98cb3d64bec224dda78b3f23411 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Tue, 19 Sep 2023 00:37:00 +0200 Subject: [PATCH 4/5] Cleanup, use lang strings --- .../geyser/command/defaults/PingCommand.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java index eb9bd638c..11169fdf9 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java @@ -30,6 +30,7 @@ import org.cloudburstmc.netty.handler.codec.raknet.common.RakSessionCodec; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.GeyserLocale; public class PingCommand extends GeyserCommand { public PingCommand(String name, String description, String permission) { @@ -38,18 +39,19 @@ public class PingCommand extends GeyserCommand { @Override public void execute(GeyserSession session, GeyserCommandSource sender, String[] args) { - if (sender.isConsole()) { - return; - } - + if (session == null) return; RakSessionCodec rakSessionCodec = ((RakChildChannel) session.getUpstream().getSession().getPeer().getChannel()).rakPipeline().get(RakSessionCodec.class); - - sender.sendMessage("Your ping is: §7" + (int) Math.floor(rakSessionCodec.getRTT()) + " ms."); + sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.ping.message", sender.locale(), (int) Math.floor(rakSessionCodec.getPing()))); } @Override public boolean isBedrockOnly() { return true; } + + @Override + public boolean isExecutableOnConsole() { + return false; + } } From 21f596b52e91b6d17dc6bd54bce0353ba599cd6a Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sun, 1 Oct 2023 16:29:45 +0200 Subject: [PATCH 5/5] Add ping() method to GeyserConnection in api --- .../geysermc/geyser/api/connection/GeyserConnection.java | 5 +++++ .../org/geysermc/geyser/command/defaults/PingCommand.java | 5 +---- .../java/org/geysermc/geyser/session/GeyserSession.java | 8 ++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/org/geysermc/geyser/api/connection/GeyserConnection.java b/api/src/main/java/org/geysermc/geyser/api/connection/GeyserConnection.java index 7094812a0..e75e7dcab 100644 --- a/api/src/main/java/org/geysermc/geyser/api/connection/GeyserConnection.java +++ b/api/src/main/java/org/geysermc/geyser/api/connection/GeyserConnection.java @@ -95,4 +95,9 @@ public interface GeyserConnection extends Connection, CommandSource { */ @NonNull Set fogEffects(); + + /** + * Returns the current ping of the connection. + */ + int ping(); } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java index 11169fdf9..6cb6375ca 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/PingCommand.java @@ -25,8 +25,6 @@ package org.geysermc.geyser.command.defaults; -import org.cloudburstmc.netty.channel.raknet.RakChildChannel; -import org.cloudburstmc.netty.handler.codec.raknet.common.RakSessionCodec; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; import org.geysermc.geyser.session.GeyserSession; @@ -40,8 +38,7 @@ public class PingCommand extends GeyserCommand { @Override public void execute(GeyserSession session, GeyserCommandSource sender, String[] args) { if (session == null) return; - RakSessionCodec rakSessionCodec = ((RakChildChannel) session.getUpstream().getSession().getPeer().getChannel()).rakPipeline().get(RakSessionCodec.class); - sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.ping.message", sender.locale(), (int) Math.floor(rakSessionCodec.getPing()))); + sender.sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.ping.message", sender.locale(), session.ping())); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index f7d362e0d..6ba6b7c44 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -85,6 +85,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.value.qual.IntRange; import org.cloudburstmc.math.vector.*; import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.netty.channel.raknet.RakChildChannel; +import org.cloudburstmc.netty.handler.codec.raknet.common.RakSessionCodec; import org.cloudburstmc.protocol.bedrock.BedrockDisconnectReasons; import org.cloudburstmc.protocol.bedrock.BedrockServerSession; import org.cloudburstmc.protocol.bedrock.data.*; @@ -2032,6 +2034,12 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { return Set.copyOf(this.appliedFog); } + @Override + public int ping() { + RakSessionCodec rakSessionCodec = ((RakChildChannel) getUpstream().getSession().getPeer().getChannel()).rakPipeline().get(RakSessionCodec.class); + return (int) Math.floor(rakSessionCodec.getPing()); + } + public void addCommandEnum(String name, String enums) { softEnumPacket(name, SoftEnumUpdateType.ADD, enums); }