From 87f6c8ab1aab953f450cc3a93f23c3e875bd3260 Mon Sep 17 00:00:00 2001 From: asminme Date: Thu, 8 Oct 2026 10:03:48 +0200 Subject: [PATCH] Add Discord command and logo embed --- README.md | 2 +- .../discordbridge/AsminDiscordBridge.java | 23 +++++++++++++++---- src/main/resources/config.yml | 5 ++-- src/main/resources/plugin.yml | 3 +++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index cb12c00..8cd16b9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # AsminDiscordBridge -Prosty plugin do Minecrafta, który pokazuje na Discordzie, czy serwer jest online oraz kto aktualnie gra. Lista graczy jest sortowana według rangi z LuckPerms. Wiadomość odświeża się co 180 sekund, a jej ID plugin zapamiętuje w `memory.yml`, żeby po restarcie edytować tę samą wiadomość. +Prosty plugin do Minecrafta, który pokazuje na Discordzie, czy serwer jest online oraz kto aktualnie gra. Lista graczy jest sortowana według rangi z LuckPerms. Wiadomość zawiera logo serwera i odświeża się co 180 sekund, a jej ID plugin zapamiętuje w `memory.yml`, żeby po restarcie edytować tę samą wiadomość. Komenda `/discord` pokazuje klikalny link do Discorda. Plugin jest napisany pod moje własne potrzeby. Kod jest „taki sobie” i nie wiem, czy będzie stabilny — **nie odpowiadam za jego działanie**. Jeśli chcesz go użyć albo poeksperymentować, zapraszam. Chętnie przyjmę feedback w Pull Requeście albo na adresie [hello@asmin.me](mailto:hello@asmin.me). diff --git a/src/main/java/me/asmin/discordbridge/AsminDiscordBridge.java b/src/main/java/me/asmin/discordbridge/AsminDiscordBridge.java index 6201eb1..b74a75b 100644 --- a/src/main/java/me/asmin/discordbridge/AsminDiscordBridge.java +++ b/src/main/java/me/asmin/discordbridge/AsminDiscordBridge.java @@ -8,6 +8,8 @@ import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.events.session.ReadyEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.requests.GatewayIntent; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; import net.luckperms.api.model.user.User; @@ -21,6 +23,7 @@ import org.bukkit.scheduler.BukkitTask; import java.awt.Color; import java.io.File; import java.io.IOException; +import java.util.Collections; import java.util.Comparator; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -40,8 +43,21 @@ public final class AsminDiscordBridge extends JavaPlugin { @Override public void onEnable() { saveDefaultConfig(); + getConfig().addDefault("discord.invite-link", "https://classicmc.top/discord/"); + getConfig().addDefault("server.title-img", "https://asmin.me/cdn/classicmc/logo-horizontal.webp"); + getConfig().options().copyDefaults(true); + saveConfig(); loadMemory(); + getCommand("discord").setExecutor((sender, command, label, args) -> { + String inviteLink = getConfig().getString("discord.invite-link", "https://classicmc.top/discord/"); + Component message = Component.text("Discord: ") + .append(Component.text(inviteLink).clickEvent(ClickEvent.openUrl(inviteLink))); + sender.sendMessage(message); + return true; + }); + getCommand("discord").setTabCompleter((sender, command, alias, args) -> Collections.emptyList()); + String token = getConfig().getString("discord.token", "").trim(); String configuredChannel = getConfig().getString("discord.channel-id", "").trim(); if (token.isEmpty() || token.equals("WSTAW_TOKEN_BOTA") || !configuredChannel.matches("\\d+")) { @@ -145,7 +161,6 @@ public final class AsminDiscordBridge extends JavaPlugin { } private MessageEmbed createEmbed(boolean online) { - String brand = getConfig().getString("server.brand", "ClassicMC.top"); String status = online ? "🟢 ONLINE" : "🔴 OFFLINE"; StringBuilder players = new StringBuilder(); @@ -169,12 +184,11 @@ public final class AsminDiscordBridge extends JavaPlugin { EmbedBuilder embed = new EmbedBuilder() .setColor(new Color(embedColor)) - .setTitle(brand) + .setImage(getConfig().getString("server.title-img", "https://asmin.me/cdn/classicmc/logo-horizontal.webp")) .addField("Status Serwera", status, false) .addField("Aktywni gracze / Online Players (" + (online ? getServer().getOnlinePlayers().size() : 0) + ")", players.toString(), false) - .setFooter("AsminDiscordBridge • odświeżanie co " - + Math.max(30L, getConfig().getLong("server.refresh-seconds", 180L)) + " s"); + .setFooter("AsminDiscordBridge"); return embed.build(); } @@ -200,7 +214,6 @@ public final class AsminDiscordBridge extends JavaPlugin { String translated = ChatColor.translateAlternateColorCodes('&', prefix); String plain = ChatColor.stripColor(translated); if (plain == null || plain.isEmpty()) return ""; - // Discord nie obsługuje własnych kolorów tekstu w embedach; zachowujemy pogrubienie prefixu. return LEGACY_COLOR.matcher(translated).find() && translated.matches("(?s).*§[lL].*") ? "**" + plain + "** " : plain + " "; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 9fbd219..d5d4012 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,10 +1,9 @@ -# Token utworzysz w Discord Developer Portal. Nie udostępniaj go publicznie. discord: token: "WSTAW_TOKEN_BOTA" channel-id: "WSTAW_ID_KANALU" + invite-link: "https://classicmc.top/discord/" server: - brand: "ClassicMC.top" - # Kolor paska embeda w formacie HEX (domyślnie jasna zieleń). + title-img: "https://asmin.me/cdn/classicmc/logo-horizontal.webp" embed-color: "#90EE90" refresh-seconds: 180 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 03daa38..e875259 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,3 +6,6 @@ author: Asmin_ website: https://asmin.me description: Prosty status serwera Minecraft na Discordzie. softdepend: [LuckPerms] +commands: + discord: + description: Pokazuje link do Discorda serwera.