From 37718929fc2c62f099330748d07d244bca0473a4 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 15 Jan 2026 13:36:18 +0100 Subject: [PATCH] Update from Git Manager GUI --- .../viper/telegramchat/BedrockSupport.java | 69 +++++++++++++++++++ .../dev/viper/telegramchat/ChatListener.java | 32 +++++++-- .../viper/telegramchat/ChatModeManager.java | 2 +- .../telegramchat/MinecraftChatCommand.java | 2 +- .../telegramchat/PlayerEventListener.java | 13 ++-- .../dev/viper/telegramchat/TBCommand.java | 2 +- .../telegramchat/TelegramBotHandler.java | 44 +++++++++--- .../telegramchat/TelegramChatBridge.java | 4 ++ 8 files changed, 143 insertions(+), 25 deletions(-) create mode 100644 src/main/java/dev/viper/telegramchat/BedrockSupport.java diff --git a/src/main/java/dev/viper/telegramchat/BedrockSupport.java b/src/main/java/dev/viper/telegramchat/BedrockSupport.java new file mode 100644 index 0000000..ae9b950 --- /dev/null +++ b/src/main/java/dev/viper/telegramchat/BedrockSupport.java @@ -0,0 +1,69 @@ +package dev.viper.telegramchat; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.geysermc.floodgate.api.FloodgateApi; +import org.geysermc.floodgate.api.player.FloodgatePlayer; + +import java.util.UUID; + +/** + * Hilfsklasse zur Unterstützung von Bedrock-Spielern via Floodgate. + */ +public class BedrockSupport { + + private static FloodgateApi floodgateApi = null; + + /** + * Initialisiert die Floodgate-API, falls das Plugin auf dem Server existiert. + */ + public static void init() { + if (Bukkit.getPluginManager().getPlugin("Floodgate") != null) { + try { + floodgateApi = FloodgateApi.getInstance(); + Bukkit.getLogger().info("[" + TelegramChatBridge.getInstance().getName() + "] Floodgate erkannt! Bedrock-Support aktiviert."); + } catch (Exception e) { + Bukkit.getLogger().warning("[" + TelegramChatBridge.getInstance().getName() + "] Konnte Floodgate-API nicht laden: " + e.getMessage()); + } + } else { + Bukkit.getLogger().info("[" + TelegramChatBridge.getInstance().getName() + "] Kein Floodgate gefunden. Nur Java-Support aktiv."); + } + } + + /** + * Gibt den Anzeigenamen des Spielers zurück. + * Wenn es ein Bedrock-Spieler ist, wird der Bedrock-Name zurückgegeben, sonst der Java-Name. + */ + public static String getDisplayName(Player player) { + if (floodgateApi != null) { + // Prüfen ob der Spieler ein Floodgate-Spieler ist + if (floodgateApi.isFloodgatePlayer(player.getUniqueId())) { + FloodgatePlayer fp = floodgateApi.getPlayer(player.getUniqueId()); + if (fp != null) { + return fp.getUsername(); // Echter Bedrock-Name + } + } + } + return player.getName(); // Standard Java-Name + } + + /** + * Gibt den Namen für eine UUID zurück (auch für Offline-Spieler, z.B. in der API-Logik). + */ + public static String getDisplayName(UUID uuid) { + if (floodgateApi != null) { + try { + if (floodgateApi.isFloodgatePlayer(uuid)) { + FloodgatePlayer fp = floodgateApi.getPlayer(uuid); + if (fp != null) { + return fp.getUsername(); + } + } + } catch (Exception e) { + // Falls API-Aufruf fehlschlägt, Fallback nutzen + } + } + // Fallback auf Bukkit OfflinePlayer + return Bukkit.getOfflinePlayer(uuid).getName(); + } +} \ No newline at end of file diff --git a/src/main/java/dev/viper/telegramchat/ChatListener.java b/src/main/java/dev/viper/telegramchat/ChatListener.java index 325ad08..f3d5628 100644 --- a/src/main/java/dev/viper/telegramchat/ChatListener.java +++ b/src/main/java/dev/viper/telegramchat/ChatListener.java @@ -1,6 +1,8 @@ package dev.viper.telegramchat; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; @@ -11,20 +13,36 @@ public class ChatListener implements Listener { this.plugin = plugin; } - @EventHandler + @EventHandler(priority = EventPriority.HIGHEST) public void onChat(AsyncPlayerChatEvent event) { + // Sicherheitscheck: Falls ein Plugin das Event bereits cancelt hat (z.B. EssentialsChat Local), tun wir nichts + if (event.isCancelled()) { + return; + } + var player = event.getPlayer(); var mode = plugin.getChatModeManager().getMode(player.getUniqueId()); - String username = player.getName(); + // DEBUG LOGGING + // Wir loggen jetzt JEDE Nachricht, damit wir wissen, ob der Spieler tippt + plugin.getLogger().info("Chat-Event: Spieler '" + BedrockSupport.getDisplayName(player) + "' schreibt: '" + event.getMessage() + "'"); + plugin.getLogger().info("Aktueller Modus: " + mode); + + String username = BedrockSupport.getDisplayName(player); String message = event.getMessage(); if (mode == ChatModeManager.ChatMode.TELEGRAM) { - // Nachricht an Telegram senden und im Minecraft-Chat unterdrücken - plugin.getBotHandler().sendMessageToTelegram(username, message); + plugin.getLogger().info("-> Modus ist TELEGRAM. Sende an Telegram und cancelle MC-Chat."); + + // Nachricht asynchron an Telegram senden (wichtig!) + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + plugin.getBotHandler().sendMessageToTelegram(username, message); + }); + + // Nachricht im MC-Chat unterdrücken event.setCancelled(true); + } else { + plugin.getLogger().info("-> Modus ist MINECRAFT. Nachricht geht normal weiter."); } - - // Im Minecraft-Modus passiert nichts weiter – Nachricht wird normal angezeigt } -} +} \ No newline at end of file diff --git a/src/main/java/dev/viper/telegramchat/ChatModeManager.java b/src/main/java/dev/viper/telegramchat/ChatModeManager.java index 2922f3f..4cf4e07 100644 --- a/src/main/java/dev/viper/telegramchat/ChatModeManager.java +++ b/src/main/java/dev/viper/telegramchat/ChatModeManager.java @@ -37,4 +37,4 @@ public class ChatModeManager { public void clearAllModes() { playerModes.clear(); } -} +} \ No newline at end of file diff --git a/src/main/java/dev/viper/telegramchat/MinecraftChatCommand.java b/src/main/java/dev/viper/telegramchat/MinecraftChatCommand.java index 8168f28..13d3782 100644 --- a/src/main/java/dev/viper/telegramchat/MinecraftChatCommand.java +++ b/src/main/java/dev/viper/telegramchat/MinecraftChatCommand.java @@ -22,4 +22,4 @@ public class MinecraftChatCommand implements CommandExecutor { player.sendMessage(ChatColor.translateAlternateColorCodes('&', msg)); return true; } -} +} \ No newline at end of file diff --git a/src/main/java/dev/viper/telegramchat/PlayerEventListener.java b/src/main/java/dev/viper/telegramchat/PlayerEventListener.java index 885d75e..35fd56f 100644 --- a/src/main/java/dev/viper/telegramchat/PlayerEventListener.java +++ b/src/main/java/dev/viper/telegramchat/PlayerEventListener.java @@ -2,9 +2,9 @@ package dev.viper.telegramchat; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.entity.PlayerDeathEvent; public class PlayerEventListener implements Listener { @@ -18,7 +18,8 @@ public class PlayerEventListener implements Listener { public void onPlayerJoin(PlayerJoinEvent event) { if (!plugin.getConfig().getBoolean("messages.joinAndLeaveEvent", true)) return; - String message = event.getPlayer().getName() + " ist dem Server beigetreten."; + String playerName = BedrockSupport.getDisplayName(event.getPlayer()); + String message = playerName + " ist dem Server beigetreten."; plugin.getBotHandler().sendMessageToTelegram("Server", message); } @@ -26,7 +27,8 @@ public class PlayerEventListener implements Listener { public void onPlayerQuit(PlayerQuitEvent event) { if (!plugin.getConfig().getBoolean("messages.joinAndLeaveEvent", true)) return; - String message = event.getPlayer().getName() + " hat den Server verlassen."; + String playerName = BedrockSupport.getDisplayName(event.getPlayer()); + String message = playerName + " hat den Server verlassen."; plugin.getBotHandler().sendMessageToTelegram("Server", message); } @@ -34,7 +36,8 @@ public class PlayerEventListener implements Listener { public void onPlayerDeath(PlayerDeathEvent event) { if (!plugin.getConfig().getBoolean("messages.deathEvent", true)) return; - String message = event.getDeathMessage(); + String playerName = BedrockSupport.getDisplayName(event.getEntity()); + String message = playerName + " ist gestorben: " + event.getDeathMessage(); plugin.getBotHandler().sendMessageToTelegram("Server", message); } -} +} \ No newline at end of file diff --git a/src/main/java/dev/viper/telegramchat/TBCommand.java b/src/main/java/dev/viper/telegramchat/TBCommand.java index 645a5bb..84a362b 100644 --- a/src/main/java/dev/viper/telegramchat/TBCommand.java +++ b/src/main/java/dev/viper/telegramchat/TBCommand.java @@ -80,4 +80,4 @@ public class TBCommand implements CommandExecutor { "&f/status &7- Zeigt die Serverlaufzeit an")); sender.sendMessage(helpMessage); } -} +} \ No newline at end of file diff --git a/src/main/java/dev/viper/telegramchat/TelegramBotHandler.java b/src/main/java/dev/viper/telegramchat/TelegramBotHandler.java index 6cfdbfa..cb33db9 100644 --- a/src/main/java/dev/viper/telegramchat/TelegramBotHandler.java +++ b/src/main/java/dev/viper/telegramchat/TelegramBotHandler.java @@ -112,9 +112,16 @@ public class TelegramBotHandler extends TelegramLongPollingBot { } UUID uuid = plugin.getAccountLinkManager().findUUIDByTelegramId(telegramId); - String from = uuid != null && Bukkit.getOfflinePlayer(uuid).getName() != null - ? Bukkit.getOfflinePlayer(uuid).getName() - : msg.getFrom().getFirstName(); + + // Name-Ermittlung: Zuerst versuchen den verknüpften Spielernamen zu nutzen (inkl. Bedrock-Check) + // Falls nicht verknüpft, den Telegram Vornamen nutzen + String from = msg.getFrom().getFirstName(); + if (uuid != null) { + String playerName = BedrockSupport.getDisplayName(uuid); + if (playerName != null) { + from = playerName; + } + } String formatted = plugin.getTelegramToMinecraftFormat() .replace("{username}", from) @@ -133,9 +140,15 @@ public class TelegramBotHandler extends TelegramLongPollingBot { String args = split.length > 1 ? split[1] : ""; UUID uuid = plugin.getAccountLinkManager().findUUIDByTelegramId(telegramId); - String from = uuid != null && Bukkit.getOfflinePlayer(uuid).getName() != null - ? Bukkit.getOfflinePlayer(uuid).getName() - : msg.getFrom().getFirstName(); + String from = msg.getFrom().getFirstName(); // Standardname für Antworten + + // Wenn verknüpft, versuchen den echten Spielernamen (Bedrock oder Java) zu holen + if (uuid != null) { + String playerName = BedrockSupport.getDisplayName(uuid); + if (playerName != null) { + from = playerName; + } + } switch (cmd) { case "/verify": @@ -235,7 +248,7 @@ public class TelegramBotHandler extends TelegramLongPollingBot { private void handleOtherCommands(String cmd, String args, String from, Message msg, UUID uuid) { switch (cmd) { case "/online": - List players = Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()); + List players = Bukkit.getOnlinePlayers().stream().map(p -> BedrockSupport.getDisplayName(p)).collect(Collectors.toList()); String msgText = players.isEmpty() ? getConfigMessage("messages.telegram.command.online-empty") : getConfigMessage("messages.telegram.command.online-list").replace("{list}", String.join(", ", players)); @@ -323,17 +336,28 @@ public class TelegramBotHandler extends TelegramLongPollingBot { return false; } - public void sendMessageToTelegram(String username, String message) { + public void sendMessageToTelegram(String username, String message) { + // DEBUG: Prüfen ob Chat-IDs geladen wurden + if (chatIds.isEmpty()) { + plugin.getLogger().severe("Keine Chat-IDs gefunden! Bitte prüfe die config.yml unter telegram.chat-id"); + return; + } + String formatted = plugin.getMinecraftToTelegramFormat() .replace("{username}", username) .replace("{message}", message); String telegramMessage = formatted.replaceAll("&[0-9a-fk-or]", ""); + + plugin.getLogger().info("Versuche Nachricht an " + chatIds.size() + " Chat(s) zu senden..."); + try { for (String id : chatIds) { execute(new SendMessage(id, telegramMessage)); + plugin.getLogger().info("Erfolgreich an Chat-ID gesendet: " + id); } } catch (Exception e) { - plugin.getLogger().warning("Fehler beim Senden an Telegram: " + e.getMessage()); + plugin.getLogger().severe("Fehler beim Senden an Telegram: " + e.getMessage()); + e.printStackTrace(); } } @@ -352,4 +376,4 @@ public class TelegramBotHandler extends TelegramLongPollingBot { String msg = plugin.getConfig().getString(path); return msg != null ? msg : "Fehlende Nachricht: " + path; } -} +} \ No newline at end of file diff --git a/src/main/java/dev/viper/telegramchat/TelegramChatBridge.java b/src/main/java/dev/viper/telegramchat/TelegramChatBridge.java index 81ae963..fa9cfdf 100644 --- a/src/main/java/dev/viper/telegramchat/TelegramChatBridge.java +++ b/src/main/java/dev/viper/telegramchat/TelegramChatBridge.java @@ -14,6 +14,10 @@ public class TelegramChatBridge extends JavaPlugin { @Override public void onEnable() { instance = this; + + // Bedrock-Support initialisieren + BedrockSupport.init(); + saveDefaultConfig(); chatModeManager = new ChatModeManager();