Skip to content

Commit 12f56e9

Browse files
committed
Add server link's feature.
1 parent 046c0df commit 12f56e9

File tree

6 files changed

+155
-0
lines changed

6 files changed

+155
-0
lines changed

eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.eternalcode.core.feature.helpop.HelpOpSettings;
1010
import com.eternalcode.core.feature.jail.JailSettings;
1111
import com.eternalcode.core.feature.randomteleport.RandomTeleportSettingsImpl;
12+
import com.eternalcode.core.feature.serverlinks.ServerLinksConfig;
1213
import com.eternalcode.core.feature.spawn.SpawnSettings;
1314
import com.eternalcode.core.injector.annotations.Bean;
1415
import com.eternalcode.core.injector.annotations.component.ConfigurationFile;
@@ -440,6 +441,10 @@ public float getCatboyWalkSpeed() {
440441
}
441442
}
442443

444+
@Bean
445+
@Description({ " ", "# ServerLinks Section" })
446+
ServerLinksConfig serverLinks = new ServerLinksConfig();
447+
443448
@Override
444449
public Resource resource(File folder) {
445450
return Source.of(folder, "config.yml");
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.eternalcode.core.feature.serverlinks;
2+
3+
import java.util.List;
4+
import net.dzikoysk.cdn.entity.Contextual;
5+
import net.dzikoysk.cdn.entity.Description;
6+
7+
@Contextual
8+
public class ServerLinksConfig {
9+
10+
@Description({
11+
"# Configuration of server links displayed in the ESC/pause menu",
12+
"# Links will be visible in the game's pause menu under server information",
13+
"# Note: This feature requires Minecraft version 1.21 or newer to work properly"
14+
})
15+
public boolean sendLinksOnJoin = true;
16+
17+
public List<ServerLinksEntry> serverLinks = List.of(
18+
ServerLinksEntry.of("<rainbow>Discord", "https://discord.gg/v2rkPb4Q2r"),
19+
ServerLinksEntry.of("Website", "https://www.eternalcode.pl")
20+
);
21+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.eternalcode.core.feature.serverlinks;
2+
3+
import com.eternalcode.core.compatibility.Compatibility;
4+
import com.eternalcode.core.compatibility.Version;
5+
import com.eternalcode.core.injector.annotations.Inject;
6+
import com.eternalcode.core.injector.annotations.component.Controller;
7+
import org.bukkit.event.EventHandler;
8+
import org.bukkit.event.Listener;
9+
import org.bukkit.event.player.PlayerJoinEvent;
10+
11+
@Controller
12+
@Compatibility(from = @Version(minor = 21, patch = 0))
13+
public class ServerLinksController implements Listener {
14+
15+
private final ServerLinksService serverLinksService;
16+
private final ServerLinksConfig serverLinksConfig;
17+
18+
@Inject
19+
public ServerLinksController(ServerLinksService serverLinksService, ServerLinksConfig serverLinksConfig) {
20+
this.serverLinksService = serverLinksService;
21+
this.serverLinksConfig = serverLinksConfig;
22+
}
23+
24+
@EventHandler
25+
public void onJoin(PlayerJoinEvent event) {
26+
if (this.serverLinksConfig.sendLinksOnJoin) {
27+
this.serverLinksService.sendServerLinks(event.getPlayer());
28+
}
29+
}
30+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.eternalcode.core.feature.serverlinks;
2+
3+
import net.dzikoysk.cdn.entity.Contextual;
4+
5+
@Contextual
6+
public class ServerLinksEntry {
7+
8+
public final String name;
9+
public final String address;
10+
11+
public ServerLinksEntry(String name, String address) {
12+
this.name = name;
13+
this.address = address;
14+
}
15+
16+
public static ServerLinksEntry of(String name, String address) {
17+
return new ServerLinksEntry(name, address);
18+
}
19+
20+
public String name() {
21+
return name;
22+
}
23+
24+
public String address() {
25+
return address;
26+
}
27+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.eternalcode.core.feature.serverlinks;
2+
3+
import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection;
4+
5+
import com.eternalcode.core.compatibility.Compatibility;
6+
import com.eternalcode.core.compatibility.Version;
7+
import com.eternalcode.core.injector.annotations.Inject;
8+
import com.eternalcode.core.injector.annotations.component.Service;
9+
import java.net.URI;
10+
import java.net.URISyntaxException;
11+
import net.kyori.adventure.text.Component;
12+
import net.kyori.adventure.text.minimessage.MiniMessage;
13+
import org.bukkit.ServerLinks;
14+
import org.bukkit.entity.Player;
15+
import org.bukkit.plugin.Plugin;
16+
17+
@Service
18+
@Compatibility(from = @Version(minor = 21, patch = 0))
19+
public class ServerLinksService {
20+
21+
private final Plugin plugin;
22+
private final MiniMessage miniMessage;
23+
private final ServerLinksConfig config;
24+
25+
@Inject
26+
public ServerLinksService(Plugin plugin, MiniMessage miniMessage, ServerLinksConfig config) {
27+
this.plugin = plugin;
28+
this.miniMessage = miniMessage;
29+
this.config = config;
30+
}
31+
32+
public void sendServerLinks(Player player) {
33+
ServerLinks serverLinks = this.plugin.getServer().getServerLinks().copy();
34+
35+
for (ServerLinksEntry serverLink : this.config.serverLinks) {
36+
this.parseLinks(serverLinks, serverLink);
37+
}
38+
39+
player.sendLinks(serverLinks);
40+
}
41+
42+
private URI parseUrl(String url) {
43+
try {
44+
if (!url.startsWith("https://") && !url.startsWith("http://")) {
45+
return null;
46+
}
47+
return new URI(url);
48+
}
49+
catch (URISyntaxException exception) {
50+
return null;
51+
}
52+
}
53+
54+
private org.bukkit.ServerLinks.ServerLink parseLinks(org.bukkit.ServerLinks serverLinks, ServerLinksEntry links) {
55+
URI url = parseUrl(links.address());
56+
57+
if (url == null) {
58+
return null;
59+
}
60+
61+
// TODO: Use ServerLinks#addLinks(Component, URI) instead of ServerLinks#addLink(String, URI) when we use
62+
// PaperAPI in nearly future.
63+
Component deserialize = this.miniMessage.deserialize(links.name());
64+
return serverLinks.addLink(legacySection().serialize(deserialize), url);
65+
}
66+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.eternalcode.core.feature.serverlinks;
2+
3+
4+
/*
5+
This feature work's only with Minecraft version 1.21 or newer
6+
*/

0 commit comments

Comments
 (0)