From 12f56e90d8350430cb44fc4ab4a280927abfa3b8 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Fri, 7 Feb 2025 17:29:23 +0100 Subject: [PATCH] Add server link's feature. --- .../implementation/PluginConfiguration.java | 5 ++ .../serverlinks/ServerLinksConfig.java | 21 ++++++ .../serverlinks/ServerLinksController.java | 30 +++++++++ .../feature/serverlinks/ServerLinksEntry.java | 27 ++++++++ .../serverlinks/ServerLinksService.java | 66 +++++++++++++++++++ .../feature/serverlinks/package-info.java | 6 ++ 6 files changed, 155 insertions(+) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksConfig.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksController.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksEntry.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksService.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/package-info.java diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java index 778160135..c4852fe87 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java @@ -9,6 +9,7 @@ import com.eternalcode.core.feature.helpop.HelpOpSettings; import com.eternalcode.core.feature.jail.JailSettings; import com.eternalcode.core.feature.randomteleport.RandomTeleportSettingsImpl; +import com.eternalcode.core.feature.serverlinks.ServerLinksConfig; import com.eternalcode.core.feature.spawn.SpawnSettings; import com.eternalcode.core.injector.annotations.Bean; import com.eternalcode.core.injector.annotations.component.ConfigurationFile; @@ -440,6 +441,10 @@ public float getCatboyWalkSpeed() { } } + @Bean + @Description({ " ", "# ServerLinks Section" }) + ServerLinksConfig serverLinks = new ServerLinksConfig(); + @Override public Resource resource(File folder) { return Source.of(folder, "config.yml"); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksConfig.java new file mode 100644 index 000000000..84af1fc37 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksConfig.java @@ -0,0 +1,21 @@ +package com.eternalcode.core.feature.serverlinks; + +import java.util.List; +import net.dzikoysk.cdn.entity.Contextual; +import net.dzikoysk.cdn.entity.Description; + +@Contextual +public class ServerLinksConfig { + + @Description({ + "# Configuration of server links displayed in the ESC/pause menu", + "# Links will be visible in the game's pause menu under server information", + "# Note: This feature requires Minecraft version 1.21 or newer to work properly" + }) + public boolean sendLinksOnJoin = true; + + public List serverLinks = List.of( + ServerLinksEntry.of("Discord", "https://discord.gg/v2rkPb4Q2r"), + ServerLinksEntry.of("Website", "https://www.eternalcode.pl") + ); +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksController.java new file mode 100644 index 000000000..eca4e7cf4 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksController.java @@ -0,0 +1,30 @@ +package com.eternalcode.core.feature.serverlinks; + +import com.eternalcode.core.compatibility.Compatibility; +import com.eternalcode.core.compatibility.Version; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Controller; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +@Controller +@Compatibility(from = @Version(minor = 21, patch = 0)) +public class ServerLinksController implements Listener { + + private final ServerLinksService serverLinksService; + private final ServerLinksConfig serverLinksConfig; + + @Inject + public ServerLinksController(ServerLinksService serverLinksService, ServerLinksConfig serverLinksConfig) { + this.serverLinksService = serverLinksService; + this.serverLinksConfig = serverLinksConfig; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + if (this.serverLinksConfig.sendLinksOnJoin) { + this.serverLinksService.sendServerLinks(event.getPlayer()); + } + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksEntry.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksEntry.java new file mode 100644 index 000000000..01a9c68b3 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksEntry.java @@ -0,0 +1,27 @@ +package com.eternalcode.core.feature.serverlinks; + +import net.dzikoysk.cdn.entity.Contextual; + +@Contextual +public class ServerLinksEntry { + + public final String name; + public final String address; + + public ServerLinksEntry(String name, String address) { + this.name = name; + this.address = address; + } + + public static ServerLinksEntry of(String name, String address) { + return new ServerLinksEntry(name, address); + } + + public String name() { + return name; + } + + public String address() { + return address; + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksService.java new file mode 100644 index 000000000..6e2cf0f0e --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/ServerLinksService.java @@ -0,0 +1,66 @@ +package com.eternalcode.core.feature.serverlinks; + +import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection; + +import com.eternalcode.core.compatibility.Compatibility; +import com.eternalcode.core.compatibility.Version; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Service; +import java.net.URI; +import java.net.URISyntaxException; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.ServerLinks; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +@Service +@Compatibility(from = @Version(minor = 21, patch = 0)) +public class ServerLinksService { + + private final Plugin plugin; + private final MiniMessage miniMessage; + private final ServerLinksConfig config; + + @Inject + public ServerLinksService(Plugin plugin, MiniMessage miniMessage, ServerLinksConfig config) { + this.plugin = plugin; + this.miniMessage = miniMessage; + this.config = config; + } + + public void sendServerLinks(Player player) { + ServerLinks serverLinks = this.plugin.getServer().getServerLinks().copy(); + + for (ServerLinksEntry serverLink : this.config.serverLinks) { + this.parseLinks(serverLinks, serverLink); + } + + player.sendLinks(serverLinks); + } + + private URI parseUrl(String url) { + try { + if (!url.startsWith("https://") && !url.startsWith("http://")) { + return null; + } + return new URI(url); + } + catch (URISyntaxException exception) { + return null; + } + } + + private org.bukkit.ServerLinks.ServerLink parseLinks(org.bukkit.ServerLinks serverLinks, ServerLinksEntry links) { + URI url = parseUrl(links.address()); + + if (url == null) { + return null; + } + + // TODO: Use ServerLinks#addLinks(Component, URI) instead of ServerLinks#addLink(String, URI) when we use + // PaperAPI in nearly future. + Component deserialize = this.miniMessage.deserialize(links.name()); + return serverLinks.addLink(legacySection().serialize(deserialize), url); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/package-info.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/package-info.java new file mode 100644 index 000000000..e442c1976 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/serverlinks/package-info.java @@ -0,0 +1,6 @@ +package com.eternalcode.core.feature.serverlinks; + + +/* +This feature work's only with Minecraft version 1.21 or newer + */