3 Commits
1.1 ... main

Author SHA1 Message Date
37718929fc Update from Git Manager GUI 2026-01-15 13:36:18 +01:00
13dff08472 Upload pom.xml via GUI 2026-01-15 12:36:16 +00:00
5800889923 Upload file dependency-reduced-pom.xml via GUI 2026-01-15 13:36:15 +01:00
10 changed files with 320 additions and 99 deletions

View File

@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dev.viper</groupId>
<artifactId>TelegramChatBridge</artifactId>
<name>TelegramChatBridge</name>
<version>1.1</version>
<description>Bridge between Minecraft and Telegram chat</description>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
<relocations>
<relocation>
<pattern>org.telegram</pattern>
<shadedPattern>dev.viper.shaded.telegram</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>opencollab-snapshot</id>
<url>https://repo.opencollab.dev/maven-snapshots/</url>
</repository>
<repository>
<id>opencollab-releases</id>
<url>https://repo.opencollab.dev/maven-releases/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.21.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.geysermc.floodgate</groupId>
<artifactId>api</artifactId>
<version>2.2.2-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.target>17</maven.compiler.target>
<java.version>17</java.version>
<telegrambots.version>6.5.0</telegrambots.version>
<maven.compiler.source>17</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

33
pom.xml
View File

@@ -19,8 +19,26 @@
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
</properties> </properties>
<repositories>
<!-- Spigot Repository -->
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<!-- Opencollab Repository (Für GeyserMC / Floodgate) -->
<repository>
<id>opencollab-snapshot</id>
<url>https://repo.opencollab.dev/maven-snapshots/</url>
</repository>
<repository>
<id>opencollab-releases</id>
<url>https://repo.opencollab.dev/maven-releases/</url>
</repository>
</repositories>
<dependencies> <dependencies>
<!-- Telegram Bots --> <!-- Telegram Bots API -->
<dependency> <dependency>
<groupId>org.telegram</groupId> <groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId> <artifactId>telegrambots</artifactId>
@@ -31,7 +49,15 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.21.5-R0.1-SNAPSHOT</version> <version>1.21.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- Floodgate API für Bedrock-Support -->
<dependency>
<groupId>org.geysermc.floodgate</groupId>
<artifactId>api</artifactId>
<version>2.2.2-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>
@@ -48,7 +74,7 @@
</configuration> </configuration>
</plugin> </plugin>
<!-- Shade Plugin: packt Telegram-Bibliothek in die JAR --> <!-- Shade Plugin: Packt externe Bibliotheken in die JAR -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
@@ -60,6 +86,7 @@
<configuration> <configuration>
<minimizeJar>true</minimizeJar> <minimizeJar>true</minimizeJar>
<relocations> <relocations>
<!-- Verschiebt die Telegram-Lib, damit es keine Konflikte gibt -->
<relocation> <relocation>
<pattern>org.telegram</pattern> <pattern>org.telegram</pattern>
<shadedPattern>dev.viper.shaded.telegram</shadedPattern> <shadedPattern>dev.viper.shaded.telegram</shadedPattern>

View File

@@ -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();
}
}

View File

@@ -1,6 +1,8 @@
package dev.viper.telegramchat; package dev.viper.telegramchat;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.AsyncPlayerChatEvent;
@@ -11,20 +13,36 @@ public class ChatListener implements Listener {
this.plugin = plugin; this.plugin = plugin;
} }
@EventHandler @EventHandler(priority = EventPriority.HIGHEST)
public void onChat(AsyncPlayerChatEvent event) { 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 player = event.getPlayer();
var mode = plugin.getChatModeManager().getMode(player.getUniqueId()); 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(); String message = event.getMessage();
if (mode == ChatModeManager.ChatMode.TELEGRAM) { if (mode == ChatModeManager.ChatMode.TELEGRAM) {
// Nachricht an Telegram senden und im Minecraft-Chat unterdrücken plugin.getLogger().info("-> Modus ist TELEGRAM. Sende an Telegram und cancelle MC-Chat.");
plugin.getBotHandler().sendMessageToTelegram(username, message);
event.setCancelled(true);
}
// Im Minecraft-Modus passiert nichts weiter Nachricht wird normal angezeigt // 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.");
}
} }
} }

View File

@@ -2,9 +2,9 @@ package dev.viper.telegramchat;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
public class PlayerEventListener implements Listener { public class PlayerEventListener implements Listener {
@@ -18,7 +18,8 @@ public class PlayerEventListener implements Listener {
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
if (!plugin.getConfig().getBoolean("messages.joinAndLeaveEvent", true)) return; 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); plugin.getBotHandler().sendMessageToTelegram("Server", message);
} }
@@ -26,7 +27,8 @@ public class PlayerEventListener implements Listener {
public void onPlayerQuit(PlayerQuitEvent event) { public void onPlayerQuit(PlayerQuitEvent event) {
if (!plugin.getConfig().getBoolean("messages.joinAndLeaveEvent", true)) return; 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); plugin.getBotHandler().sendMessageToTelegram("Server", message);
} }
@@ -34,7 +36,8 @@ public class PlayerEventListener implements Listener {
public void onPlayerDeath(PlayerDeathEvent event) { public void onPlayerDeath(PlayerDeathEvent event) {
if (!plugin.getConfig().getBoolean("messages.deathEvent", true)) return; 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); plugin.getBotHandler().sendMessageToTelegram("Server", message);
} }
} }

View File

@@ -112,9 +112,16 @@ public class TelegramBotHandler extends TelegramLongPollingBot {
} }
UUID uuid = plugin.getAccountLinkManager().findUUIDByTelegramId(telegramId); UUID uuid = plugin.getAccountLinkManager().findUUIDByTelegramId(telegramId);
String from = uuid != null && Bukkit.getOfflinePlayer(uuid).getName() != null
? Bukkit.getOfflinePlayer(uuid).getName() // Name-Ermittlung: Zuerst versuchen den verknüpften Spielernamen zu nutzen (inkl. Bedrock-Check)
: msg.getFrom().getFirstName(); // 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() String formatted = plugin.getTelegramToMinecraftFormat()
.replace("{username}", from) .replace("{username}", from)
@@ -133,9 +140,15 @@ public class TelegramBotHandler extends TelegramLongPollingBot {
String args = split.length > 1 ? split[1] : ""; String args = split.length > 1 ? split[1] : "";
UUID uuid = plugin.getAccountLinkManager().findUUIDByTelegramId(telegramId); UUID uuid = plugin.getAccountLinkManager().findUUIDByTelegramId(telegramId);
String from = uuid != null && Bukkit.getOfflinePlayer(uuid).getName() != null String from = msg.getFrom().getFirstName(); // Standardname für Antworten
? Bukkit.getOfflinePlayer(uuid).getName()
: msg.getFrom().getFirstName(); // 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) { switch (cmd) {
case "/verify": case "/verify":
@@ -235,7 +248,7 @@ public class TelegramBotHandler extends TelegramLongPollingBot {
private void handleOtherCommands(String cmd, String args, String from, Message msg, UUID uuid) { private void handleOtherCommands(String cmd, String args, String from, Message msg, UUID uuid) {
switch (cmd) { switch (cmd) {
case "/online": case "/online":
List<String> players = Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()); List<String> players = Bukkit.getOnlinePlayers().stream().map(p -> BedrockSupport.getDisplayName(p)).collect(Collectors.toList());
String msgText = players.isEmpty() String msgText = players.isEmpty()
? getConfigMessage("messages.telegram.command.online-empty") ? getConfigMessage("messages.telegram.command.online-empty")
: getConfigMessage("messages.telegram.command.online-list").replace("{list}", String.join(", ", players)); : getConfigMessage("messages.telegram.command.online-list").replace("{list}", String.join(", ", players));
@@ -323,17 +336,28 @@ public class TelegramBotHandler extends TelegramLongPollingBot {
return false; 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() String formatted = plugin.getMinecraftToTelegramFormat()
.replace("{username}", username) .replace("{username}", username)
.replace("{message}", message); .replace("{message}", message);
String telegramMessage = formatted.replaceAll("&[0-9a-fk-or]", ""); String telegramMessage = formatted.replaceAll("&[0-9a-fk-or]", "");
plugin.getLogger().info("Versuche Nachricht an " + chatIds.size() + " Chat(s) zu senden...");
try { try {
for (String id : chatIds) { for (String id : chatIds) {
execute(new SendMessage(id, telegramMessage)); execute(new SendMessage(id, telegramMessage));
plugin.getLogger().info("Erfolgreich an Chat-ID gesendet: " + id);
} }
} catch (Exception e) { } 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();
} }
} }

View File

@@ -14,6 +14,10 @@ public class TelegramChatBridge extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
instance = this; instance = this;
// Bedrock-Support initialisieren
BedrockSupport.init();
saveDefaultConfig(); saveDefaultConfig();
chatModeManager = new ChatModeManager(); chatModeManager = new ChatModeManager();