From 0cd47639c28dfb0b3013c8b4fe7edd7e2a90e25a Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 20:48:34 -0500 Subject: [PATCH 01/13] Fix /kill and /suicide on latest Spigot/Paper --- .../com/earth2me/essentials/Essentials.java | 15 ++++++++++++ .../com/earth2me/essentials/IEssentials.java | 3 +++ .../essentials/commands/Commandkill.java | 3 +-- .../essentials/commands/Commandsuicide.java | 3 +-- .../providers/LegacyDamageEventProvider.java | 19 +++++++++++++++ .../ess3/provider/DamageEventProvider.java | 8 +++++++ .../providers/ModernDamageEventProvider.java | 24 +++++++++++++++++++ 7 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 8e47ae748..261a13f46 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -60,6 +60,7 @@ import net.ess3.nms.refl.providers.ReflSpawnEggProvider; import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider; import net.ess3.nms.refl.providers.ReflSyncCommandsProvider; import net.ess3.provider.ContainerProvider; +import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.ItemUnbreakableProvider; import net.ess3.provider.KnownCommandsProvider; @@ -83,10 +84,12 @@ import net.ess3.provider.providers.BukkitMaterialTagProvider; import net.ess3.provider.providers.BukkitSpawnerBlockProvider; import net.ess3.provider.providers.FixedHeightWorldInfoProvider; import net.ess3.provider.providers.FlatSpawnEggProvider; +import net.ess3.provider.providers.LegacyDamageEventProvider; import net.ess3.provider.providers.LegacyItemUnbreakableProvider; import net.ess3.provider.providers.LegacyPlayerLocaleProvider; import net.ess3.provider.providers.LegacyPotionMetaProvider; import net.ess3.provider.providers.LegacySpawnEggProvider; +import net.ess3.provider.providers.ModernDamageEventProvider; import net.ess3.provider.providers.ModernDataWorldInfoProvider; import net.ess3.provider.providers.ModernItemUnbreakableProvider; import net.ess3.provider.providers.ModernPersistentDataProvider; @@ -193,6 +196,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient WorldInfoProvider worldInfoProvider; private transient PlayerLocaleProvider playerLocaleProvider; private transient SignDataProvider signDataProvider; + private transient DamageEventProvider damageEventProvider; private transient Kits kits; private transient RandomTeleport randomTeleport; private transient UpdateChecker updateChecker; @@ -475,6 +479,12 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { playerLocaleProvider = new LegacyPlayerLocaleProvider(); } + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_20_4_R01)) { + damageEventProvider = new ModernDamageEventProvider(); + } else { + damageEventProvider = new LegacyDamageEventProvider(); + } + execTimer.mark("Init(Providers)"); reload(); @@ -1405,6 +1415,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { return playerLocaleProvider; } + @Override + public DamageEventProvider getDamageEventProvider() { + return damageEventProvider; + } + @Override public SignDataProvider getSignDataProvider() { return signDataProvider; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index f0b627133..9aea053e8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -10,6 +10,7 @@ import com.earth2me.essentials.updatecheck.UpdateChecker; import com.earth2me.essentials.userstorage.IUserMap; import net.ess3.nms.refl.providers.ReflOnlineModeProvider; import net.ess3.provider.ContainerProvider; +import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.ItemUnbreakableProvider; import net.ess3.provider.KnownCommandsProvider; @@ -183,5 +184,7 @@ public interface IEssentials extends Plugin { PlayerLocaleProvider getPlayerLocaleProvider(); + DamageEventProvider getDamageEventProvider(); + PluginCommand getPluginCommand(String cmd); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java index 6bb19b4bb..d2a76cbfa 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandkill.java @@ -29,8 +29,7 @@ public class Commandkill extends EssentialsLoopCommand { if (sender.isPlayer() && user.isAuthorized("essentials.kill.exempt") && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.kill.force")) { throw new PlayerExemptException("killExempt", matchPlayer.getDisplayName()); } - final EntityDamageEvent ede = new EntityDamageEvent(matchPlayer, sender.isPlayer() && sender.getPlayer().getName().equals(matchPlayer.getName()) ? EntityDamageEvent.DamageCause.SUICIDE : EntityDamageEvent.DamageCause.CUSTOM, Float.MAX_VALUE); - server.getPluginManager().callEvent(ede); + final EntityDamageEvent ede = ess.getDamageEventProvider().callDamageEvent(matchPlayer, sender.isPlayer() && sender.getPlayer().getName().equals(matchPlayer.getName()) ? EntityDamageEvent.DamageCause.SUICIDE : EntityDamageEvent.DamageCause.CUSTOM, Float.MAX_VALUE); if (ede.isCancelled() && sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.kill.force")) { return; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java index 53b170f67..c81d92c8e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java @@ -14,8 +14,7 @@ public class Commandsuicide extends EssentialsCommand { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - final EntityDamageEvent ede = new EntityDamageEvent(user.getBase(), EntityDamageEvent.DamageCause.SUICIDE, Float.MAX_VALUE); - server.getPluginManager().callEvent(ede); + final EntityDamageEvent ede = ess.getDamageEventProvider().callDamageEvent(user.getBase(), EntityDamageEvent.DamageCause.SUICIDE, Float.MAX_VALUE); ede.getEntity().setLastDamageCause(ede); user.getBase().setHealth(0); user.sendTl("suicideMessage"); diff --git a/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java new file mode 100644 index 000000000..74487c25d --- /dev/null +++ b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyDamageEventProvider.java @@ -0,0 +1,19 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.DamageEventProvider; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +public class LegacyDamageEventProvider implements DamageEventProvider { + @Override + public EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage) { + final EntityDamageEvent ede = new EntityDamageEvent(player, cause, damage); + player.getServer().getPluginManager().callEvent(ede); + return ede; + } + + @Override + public String getDescription() { + return "Legacy Damage Event Provider"; + } +} diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java new file mode 100644 index 000000000..4eb229bf2 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/DamageEventProvider.java @@ -0,0 +1,8 @@ +package net.ess3.provider; + +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +public interface DamageEventProvider extends Provider { + EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage); +} diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java new file mode 100644 index 000000000..77ba5cb9b --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDamageEventProvider.java @@ -0,0 +1,24 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.DamageEventProvider; +import org.bukkit.damage.DamageSource; +import org.bukkit.damage.DamageType; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +@SuppressWarnings("UnstableApiUsage") +public class ModernDamageEventProvider implements DamageEventProvider { + private final DamageSource MAGIC_SOURCE = DamageSource.builder(DamageType.MAGIC).build(); + + @Override + public EntityDamageEvent callDamageEvent(Player player, EntityDamageEvent.DamageCause cause, double damage) { + final EntityDamageEvent ede = new EntityDamageEvent(player, cause, MAGIC_SOURCE, damage); + player.getServer().getPluginManager().callEvent(ede); + return ede; + } + + @Override + public String getDescription() { + return "1.20.4+ Damage Event Provider"; + } +} From ac0ba8890f163d3c646812985c7a0c78d82fffb0 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 20:52:00 -0500 Subject: [PATCH 02/13] Fix format parsing in /unlimited --- .../com/earth2me/essentials/commands/Commandunlimited.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java index d3581c20f..448934aa8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandunlimited.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.Inventories; +import com.earth2me.essentials.utils.AdventureUtil; import net.ess3.api.TranslatableException; import org.bukkit.Material; import org.bukkit.Server; @@ -29,7 +30,7 @@ public class Commandunlimited extends EssentialsCommand { } if (args[0].equalsIgnoreCase("list")) { - user.sendMessage(getList(user, target)); + user.sendComponent(AdventureUtil.miniMessage().deserialize(getList(user, target))); } else if (args[0].equalsIgnoreCase("clear")) { for (final Material m : new HashSet<>(target.getUnlimited())) { if (m == null) { @@ -56,7 +57,7 @@ public class Commandunlimited extends EssentialsCommand { } joiner.add(material.toString().toLowerCase(Locale.ENGLISH).replace("_", "")); } - output.append(joiner.toString()); + output.append(joiner); return output.toString(); } From 1dccfbfceedce904715802dffe926ced99caab54 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 20:57:25 -0500 Subject: [PATCH 03/13] Fix format parsing in /suicide (Fixes #5662) --- .../java/com/earth2me/essentials/commands/Commandsuicide.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java index c81d92c8e..eb259bc53 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsuicide.java @@ -19,7 +19,7 @@ public class Commandsuicide extends EssentialsCommand { user.getBase().setHealth(0); user.sendTl("suicideMessage"); user.setDisplayNick(); - ess.broadcastTl(user, "suicideSuccess", user.getDisplayName()); + ess.broadcastTl(user, "suicideSuccess", new Object[]{user.getDisplayName()}); } @Override From 82606a7cedbd66cac9223501cd6d96ea3dc8e339 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 21:36:57 -0500 Subject: [PATCH 04/13] Fix format parsing in local spy chat format (Fixes #5665) --- .../java/com/earth2me/essentials/utils/AdventureUtil.java | 7 +++++++ .../essentials/chat/processing/AbstractChatHandler.java | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java index 6b23b0efe..828ee6886 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/AdventureUtil.java @@ -125,6 +125,13 @@ public final class AdventureUtil { return COLORS[index]; } + /** + * Convenience method for submodules to escape MiniMessage tags. + */ + public static String escapeTags(final String input) { + return miniMessage().escapeTags(input); + } + /** * Parameters for a translation message are not parsed for MiniMessage by default to avoid injection. If you want * a parameter to be parsed for MiniMessage you must wrap it in a ParsedPlaceholder by using this method. diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java index f3e515b4a..f593840d7 100644 --- a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java @@ -227,8 +227,10 @@ public abstract class AbstractChatHandler { server.getPluginManager().callEvent(spyEvent); if (!spyEvent.isCancelled()) { + final String legacyString = AdventureUtil.miniToLegacy(String.format(spyEvent.getFormat(), AdventureUtil.legacyToMini(user.getDisplayName()), AdventureUtil.escapeTags(spyEvent.getMessage()))); + for (final Player onlinePlayer : spyEvent.getRecipients()) { - onlinePlayer.sendMessage(String.format(spyEvent.getFormat(), user.getDisplayName(), spyEvent.getMessage())); + onlinePlayer.sendMessage(legacyString); } } } From 221a6622f38f3e4dad206faaa8844cacfd8bf909 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 11 Feb 2024 21:47:49 -0500 Subject: [PATCH 05/13] Fix format parsing in /time (Fixes #5661) --- .../java/com/earth2me/essentials/commands/Commandtime.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java index 848126fea..4e85d7b4c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtime.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.DescParseTickFormat; import com.earth2me.essentials.utils.NumberUtil; import com.google.common.collect.Lists; @@ -95,12 +96,12 @@ public class Commandtime extends EssentialsCommand { private void getWorldsTime(final CommandSource sender, final Collection worlds) { if (worlds.size() == 1) { final Iterator iter = worlds.iterator(); - sender.sendMessage(DescParseTickFormat.format(iter.next().getTime())); + sender.sendComponent(AdventureUtil.miniMessage().deserialize(DescParseTickFormat.format(iter.next().getTime()))); return; } for (final World world : worlds) { - sender.sendTl("timeWorldCurrent", world.getName(), DescParseTickFormat.format(world.getTime())); + sender.sendTl("timeWorldCurrent", world.getName(), AdventureUtil.parsed(DescParseTickFormat.format(world.getTime()))); } } From dfc5c49f563f39d6a24b97eeedbbbdad0f91c3be Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 15 Feb 2024 20:50:42 -0500 Subject: [PATCH 06/13] Log individual JUnit test results --- .../main/kotlin/essentials.base-conventions.gradle.kts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts b/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts index efb9fdbc4..0a497fed8 100644 --- a/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts @@ -11,8 +11,8 @@ val baseExtension = extensions.create("essentials", pro val checkstyleVersion = "8.36.2" val spigotVersion = "1.20.4-R0.1-SNAPSHOT" -val junit5Version = "5.7.0" -val mockitoVersion = "3.2.0" +val junit5Version = "5.10.2" +val mockitoVersion = "3.12.4" dependencies { testImplementation("org.junit.jupiter", "junit-jupiter", junit5Version) @@ -26,6 +26,12 @@ dependencies { } } +tasks.test { + testLogging { + events("PASSED", "SKIPPED", "FAILED") + } +} + afterEvaluate { if (baseExtension.injectBukkitApi.get()) { dependencies { From 14125d9c4caa95e7e7d0158c7675ebe909fe5af0 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:39:39 -0500 Subject: [PATCH 07/13] Fix format parsing in /spawner (Fixes #5680) --- .../src/main/java/com/earth2me/essentials/Essentials.java | 2 +- .../com/earth2me/essentials/commands/Commandbroadcastworld.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 261a13f46..506ed9165 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -873,7 +873,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { sender.sendMessage(command.getUsage().replace("", commandLabel)); } if (!ex.getMessage().isEmpty()) { - sender.sendMessage(ex.getMessage()); + sender.sendComponent(AdventureUtil.miniMessage().deserialize(ex.getMessage())); } if (ex.getCause() != null && settings.isDebug()) { ex.getCause().printStackTrace(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java index 089883b1c..b9156cf8b 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbroadcastworld.java @@ -39,7 +39,7 @@ public class Commandbroadcastworld extends EssentialsCommand { @Override public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { if (args.length < 2) { - throw new NotEnoughArgumentsException("world"); + throw new NotEnoughArgumentsException(); } final World world = ess.getWorld(args[0]); From 77d505bb4ac7982c6ff12b281d6ed2e3af60b189 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:20:41 -0500 Subject: [PATCH 08/13] Fix format parsing using in-game commands in console (Fixes #5670) --- .../com/earth2me/essentials/commands/EssentialsCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java index 36cdad3e4..187067298 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java @@ -10,6 +10,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.ess3.api.IEssentials; +import net.ess3.api.TranslatableException; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -180,7 +181,7 @@ public abstract class EssentialsCommand implements IEssentialsCommand { } protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - throw new Exception(tlLiteral("onlyPlayers", commandLabel)); + throw new TranslatableException("onlyPlayers", commandLabel); } @Override From 80e6f96c710149bca1f8a520381c4519fd8c9057 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:30:19 -0500 Subject: [PATCH 09/13] Fix format parsing in /msg from Discord (Fixes #5671) --- .../discord/interactions/commands/MessageCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java index e85cb4ca4..abfd6b83c 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java @@ -2,6 +2,7 @@ package net.essentialsx.discord.interactions.commands; import com.earth2me.essentials.User; import com.earth2me.essentials.commands.PlayerNotFoundException; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.FormatUtil; import net.essentialsx.api.v2.services.discord.InteractionCommandArgument; import net.essentialsx.api.v2.services.discord.InteractionCommandArgumentType; @@ -51,7 +52,7 @@ public class MessageCommand extends InteractionCommandImpl { FormatUtil.replaceFormat(event.getStringArgument("message")) : FormatUtil.stripFormat(event.getStringArgument("message")); event.reply(tlLiteral("msgFormat", tlLiteral("meSender"), MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(message))); - user.sendMessage(tlLiteral("msgFormat", event.getMember().getTag(), user.playerTl("meRecipient"), message)); + user.sendTl("msgFormat", event.getMember().getTag(), AdventureUtil.parsed(user.playerTl("meRecipient")), message); // We use an atomic reference here so that java will garbage collect the recipient final AtomicReference ref = new AtomicReference<>(new DiscordMessageRecipient(event.getMember())); jda.getPlugin().getEss().runTaskLaterAsynchronously(() -> ref.set(null), 6000); // Expires after 5 minutes From d307279b3b332f33fcfd9ebf3c00677cd0d00c05 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:41:15 -0500 Subject: [PATCH 10/13] Fix format parsing in unlinked kick message (Fixes #5667) --- .../essentialsx/discordlink/listeners/LinkBukkitListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java index bb7eee63e..99cdb76b2 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/listeners/LinkBukkitListener.java @@ -60,7 +60,7 @@ public class LinkBukkitListener implements Listener { } catch (IllegalArgumentException e) { code = e.getMessage(); } - event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, tlLiteral("discordLinkLoginKick", "/link " + code, ess.getApi().getInviteUrl())); + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, AdventureUtil.miniToLegacy(tlLiteral("discordLinkLoginKick", "/link " + code, ess.getApi().getInviteUrl()))); } } From 139db29782fe83cb629dcd55967af310d2e90f08 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:49:59 -0500 Subject: [PATCH 11/13] Fix format parsing in various discord commands --- .../api/v2/services/discord/InteractionEvent.java | 7 +++++++ .../interactions/InteractionControllerImpl.java | 2 +- .../discord/interactions/InteractionEventImpl.java | 8 ++++++++ .../discord/interactions/commands/ExecuteCommand.java | 2 +- .../discord/interactions/commands/MessageCommand.java | 10 +++++----- .../commands/discord/AccountInteractionCommand.java | 6 +++--- .../commands/discord/LinkInteractionCommand.java | 6 +++--- .../commands/discord/UnlinkInteractionCommand.java | 4 ++-- 8 files changed, 30 insertions(+), 15 deletions(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java index eece3cb36..f66105e27 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java @@ -10,6 +10,13 @@ public interface InteractionEvent { */ void reply(String message); + /** + * Appends the given string to the initial response message and creates one if it doesn't exist. + * @param tlKey The tlKey of the message to append. + * @param args The args for the message to append. + */ + void replyTl(String tlKey, Object... args); + /** * Gets the member which caused this event. * @return the member which caused the event. diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java index ed62f0165..265815972 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java @@ -61,7 +61,7 @@ public class InteractionControllerImpl extends ListenerAdapter implements Intera final InteractionEvent interactionEvent = new InteractionEventImpl(event); final List commandSnowflakes = jda.getSettings().getCommandSnowflakes(command.getName()); if (commandSnowflakes != null && !DiscordUtil.hasRoles(event.getMember(), commandSnowflakes)) { - interactionEvent.reply(tlLiteral("noAccessCommand")); + interactionEvent.replyTl("noAccessCommand"); return; } jda.getPlugin().getEss().scheduleSyncDelayedTask(() -> command.onCommand(interactionEvent)); diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java index 018916415..ca008c37f 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java @@ -1,5 +1,6 @@ package net.essentialsx.discord.interactions; +import com.earth2me.essentials.utils.AdventureUtil; import com.earth2me.essentials.utils.FormatUtil; import com.google.common.base.Joiner; import net.dv8tion.jda.api.entities.Message; @@ -18,6 +19,8 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import static com.earth2me.essentials.I18n.tlLiteral; + /** * A class which provides information about what triggered an interaction event. */ @@ -45,6 +48,11 @@ public class InteractionEventImpl implements InteractionEvent { .queue(null, error -> logger.log(Level.SEVERE, "Error while editing command interaction response", error)); } + @Override + public void replyTl(String tlKey, Object... args) { + reply(AdventureUtil.miniToLegacy(tlLiteral(tlKey, args))); + } + @Override public InteractionMember getMember() { return member; diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java index 31e8a4efb..09e1a9fad 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java @@ -21,7 +21,7 @@ public class ExecuteCommand extends InteractionCommandImpl { @Override public void onCommand(final InteractionEvent event) { final String command = event.getStringArgument("command"); - event.reply(tlLiteral("discordCommandExecuteReply", command)); + event.replyTl("discordCommandExecuteReply", command); Bukkit.getScheduler().runTask(jda.getPlugin(), () -> { try { Bukkit.dispatchCommand(new DiscordCommandSender(jda, Bukkit.getConsoleSender(), message -> event.reply(MessageUtil.sanitizeDiscordMarkdown(message))).getSender(), command); diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java index abfd6b83c..94f00faf6 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java @@ -31,26 +31,26 @@ public class MessageCommand extends InteractionCommandImpl { try { user = jda.getPlugin().getEss().matchUser(Bukkit.getServer(), null, event.getStringArgument("username"), getHidden, false); } catch (PlayerNotFoundException e) { - event.reply(tlLiteral("errorWithMessage", e.getMessage())); + event.replyTl("errorWithMessage", e.getMessage()); return; } if (!getHidden && user.isIgnoreMsg()) { - event.reply(tlLiteral("msgIgnore", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()))); + event.replyTl("msgIgnore", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName())); return; } if (user.isAfk()) { if (user.getAfkMessage() != null) { - event.reply(tlLiteral("userAFKWithMessage", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(user.getAfkMessage()))); + event.replyTl("userAFKWithMessage", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(user.getAfkMessage())); } else { - event.reply(tlLiteral("userAFK", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()))); + event.replyTl("userAFK", MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName())); } } final String message = event.getMember().hasRoles(jda.getSettings().getPermittedFormattingRoles()) ? FormatUtil.replaceFormat(event.getStringArgument("message")) : FormatUtil.stripFormat(event.getStringArgument("message")); - event.reply(tlLiteral("msgFormat", tlLiteral("meSender"), MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(message))); + event.replyTl("msgFormat", tlLiteral("meSender"), MessageUtil.sanitizeDiscordMarkdown(user.getDisplayName()), MessageUtil.sanitizeDiscordMarkdown(message)); user.sendTl("msgFormat", event.getMember().getTag(), AdventureUtil.parsed(user.playerTl("meRecipient")), message); // We use an atomic reference here so that java will garbage collect the recipient diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/AccountInteractionCommand.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/AccountInteractionCommand.java index c9758c964..753223582 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/AccountInteractionCommand.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/AccountInteractionCommand.java @@ -53,14 +53,14 @@ public class AccountInteractionCommand implements InteractionCommand { final InteractionMember effectiveUser = userArg == null ? event.getMember() : userArg; final IUser user = accounts.getUser(effectiveUser.getId()); if (user == null) { - event.reply(tlLiteral(event.getMember().getId().equals(effectiveUser.getId()) ? "discordCommandAccountResponseNotLinked" : "discordCommandAccountResponseNotLinkedOther", effectiveUser.getAsMention())); + event.replyTl(event.getMember().getId().equals(effectiveUser.getId()) ? "discordCommandAccountResponseNotLinked" : "discordCommandAccountResponseNotLinkedOther", effectiveUser.getAsMention()); return; } if (event.getMember().getId().equals(effectiveUser.getId())) { - event.reply(tlLiteral("discordCommandAccountResponseLinked", user.getName())); + event.replyTl("discordCommandAccountResponseLinked", user.getName()); return; } - event.reply(tlLiteral("discordCommandAccountResponseLinkedOther", effectiveUser.getAsMention(), user.getName())); + event.replyTl("discordCommandAccountResponseLinkedOther", effectiveUser.getAsMention(), user.getName()); } } diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/LinkInteractionCommand.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/LinkInteractionCommand.java index befd71c4b..16ca47034 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/LinkInteractionCommand.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/LinkInteractionCommand.java @@ -25,18 +25,18 @@ public class LinkInteractionCommand implements InteractionCommand { @Override public void onCommand(InteractionEvent event) { if (accounts.isLinked(event.getMember().getId())) { - event.reply(tlLiteral("discordCommandLinkHasAccount")); + event.replyTl("discordCommandLinkHasAccount"); return; } final UUID uuid = accounts.getPendingUUID(event.getStringArgument("code")); if (uuid == null) { - event.reply(tlLiteral("discordCommandLinkInvalidCode")); + event.replyTl("discordCommandLinkInvalidCode"); return; } accounts.registerAccount(uuid, event.getMember(), DiscordLinkStatusChangeEvent.Cause.SYNC_PLAYER); - event.reply(tlLiteral("discordCommandLinkLinked")); + event.replyTl("discordCommandLinkLinked"); } @Override diff --git a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/UnlinkInteractionCommand.java b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/UnlinkInteractionCommand.java index 46f344132..b2d26e904 100644 --- a/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/UnlinkInteractionCommand.java +++ b/EssentialsDiscordLink/src/main/java/net/essentialsx/discordlink/commands/discord/UnlinkInteractionCommand.java @@ -20,10 +20,10 @@ public class UnlinkInteractionCommand implements InteractionCommand { @Override public void onCommand(InteractionEvent event) { if (!accounts.removeAccount(event.getMember(), DiscordLinkStatusChangeEvent.Cause.UNSYNC_PLAYER)) { - event.reply(tlLiteral("discordCommandUnlinkInvalidCode")); + event.replyTl("discordCommandUnlinkInvalidCode"); return; } - event.reply(tlLiteral("discordCommandUnlinkUnlinked")); + event.replyTl("discordCommandUnlinkUnlinked"); } @Override From 4386713807d14b217c9d47a211caa2096aee03c5 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:37:03 -0500 Subject: [PATCH 12/13] Fix messages not sending after /ess reload (Fixes #5663) --- .../src/main/java/com/earth2me/essentials/Essentials.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 506ed9165..a5e091487 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -635,6 +635,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { public void reload() { Trade.closeLog(); + if (bukkitAudience != null) { + bukkitAudience.close(); + bukkitAudience = null; + } + for (final IConf iConf : confList) { iConf.reloadConfig(); execTimer.mark("Reload(" + iConf.getClass().getSimpleName() + ")"); From 1929d4110af296ee8dbc869b8846b1847ed52403 Mon Sep 17 00:00:00 2001 From: Charles DeLancey <46200123+Evidentsinger14@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:57:57 -0500 Subject: [PATCH 13/13] Fix format parsing in /heal (Fixes #5690) --- Essentials/src/main/java/com/earth2me/essentials/User.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index 46e2e03e4..16cabcf3f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -16,6 +16,7 @@ import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.Lists; import net.ess3.api.IEssentials; import net.ess3.api.MaxMoneyException; +import net.ess3.api.TranslatableException; import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.api.events.JailStatusChangeEvent; import net.ess3.api.events.MuteStatusChangeEvent; @@ -225,7 +226,7 @@ public class User extends UserData implements Comparable, IMessageRecipien cooldownTime.add(Calendar.SECOND, (int) cooldown); cooldownTime.add(Calendar.MILLISECOND, (int) ((cooldown * 1000.0) % 1000.0)); if (cooldownTime.after(now) && !isAuthorized("essentials.heal.cooldown.bypass")) { - throw new Exception(playerTl("timeBeforeHeal", DateUtil.formatDateDiff(cooldownTime.getTimeInMillis()))); + throw new TranslatableException("timeBeforeHeal", DateUtil.formatDateDiff(cooldownTime.getTimeInMillis())); } } setLastHealTimestamp(now.getTimeInMillis());