7 Commits
1.2 ... main

Author SHA1 Message Date
581d580f05 README.md aktualisiert 2026-01-11 10:13:01 +00:00
e4d477042c README.md aktualisiert 2026-01-11 10:12:18 +00:00
aa0f861d11 src/main/resources/plugin.yml aktualisiert 2026-01-11 09:52:00 +00:00
8347a60335 src/main/java/de/viper/globalchat/suppressor/GlobalChatSuppressor.java aktualisiert 2026-01-11 09:51:37 +00:00
e6fbd908e7 pom.xml aktualisiert 2026-01-11 09:51:20 +00:00
3f80c0eb1e README.md aktualisiert 2026-01-11 09:51:00 +00:00
c02866809c README.md aktualisiert 2026-01-11 09:49:54 +00:00
4 changed files with 192 additions and 146 deletions

View File

@@ -6,17 +6,20 @@ Ein leistungsfähiges BungeeCord-Plugin für globalen Chat, Support-Nachrichten
## ⚠️ WICHTIGER HINWEIS ## ⚠️ WICHTIGER HINWEIS
**Die Kernfunktionalität des GlobalChat wurde in die [StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI) integriert.** **Die Kernfunktionalität des GlobalChat wurde in die [StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI) integriert.** wenn die nur den Chat nutzen möchten können sie auch die GlobalChat herunterladen.
**Download**: [GlobalChat](https://git.viper.ipv64.net/M_Viper/GlobalChat)
Dieses Plugin (**GlobalChat Suppressor**) dient ab sofort **nur noch als Schnittstelle** für die Unterserver (Spigot/Paper) und leitet die Nachrichten an die StatusAPI weiter. Die Befehle und Funktionen können wie gewohnt weiterverwendet werden. Dieses Plugin (**GlobalChat Suppressor**) dient ab sofort **nur noch als Schnittstelle** für die Unterserver (Spigot/Paper) und leitet die Nachrichten an die StatusAPI weiter. Die Befehle und Funktionen können wie gewohnt weiterverwendet werden.
### Was bedeutet das? ### Was bedeutet das?
- **StatusAPI MUSS installiert sein:** Ohne die [StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI) auf deinem BungeeCord funktioniert der GlobalChat nicht mehr. - **StatusAPI oder GlobalChat MUSS installiert sein:** Ohne die [StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI) oder [GlobalChat](https://git.viper.ipv64.net/M_Viper/GlobalChat) auf deinem BungeeCord funktioniert der GlobalChat nicht.
- **GlobalChat Suppressor:** Dieses Plugin bleibt auf den Unterservern aktiv und kommuniziert mit der StatusAPI. - **GlobalChat Suppressor:** Dieses Plugin bleibt auf den Unterservern aktiv und kommuniziert mit der StatusAPI oder mit GlobalChat.
- **Zentrale Verwaltung:** Alle Chat-Funktionen, Badword-Filter und Support-Nachrichten werden nun zentral über die StatusAPI verwaltet. - **Zentrale Verwaltung:** Alle Chat-Funktionen, Badword-Filter und Support-Nachrichten werden nun zentral über die StatusAPI verwaltet.
**Download StatusAPI:** [https://git.viper.ipv64.net/M_Viper/StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI) **Download StatusAPI:** [StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI)
**Download GlobalChat**: [GlobalChat](https://git.viper.ipv64.net/M_Viper/GlobalChat)
--- ---
@@ -48,12 +51,11 @@ Dieses Plugin (**GlobalChat Suppressor**) dient ab sofort **nur noch als Schnitt
### Voraussetzung: StatusAPI ### Voraussetzung: StatusAPI
⚠️ **Die [StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI) MUSS auf deinem BungeeCord-Server installiert sein!** ⚠️ **Die [StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI) oder [GlobalChat](https://git.viper.ipv64.net/M_Viper/GlobalChat) MUSS auf deinem BungeeCord-Server installiert sein!**
```text ```text
BungeeCord/ BungeeCord/
├─ plugins/ ├─ plugins/
│ ├─ StatusAPI.jar ← PFLICHT │ ├─ StatusAPI.jar oder GlobalChat.jar ← PFLICHT
│ └─ GlobalChat-Bungee.jar ← Optional (nur für BungeeCord)
``` ```
### Schritt-für-Schritt ### Schritt-für-Schritt
@@ -94,7 +96,7 @@ Neue Badwords können einfach hinzugefügt werden. Das Plugin muss nach Änderun
## Architektur ## Architektur
```text ```text
BungeeCord BungeeCord
└─ StatusAPI (Hauptlogik, Befehle, Filter, Logs) └─ StatusAPI oder GlobalChat (Hauptlogik, Befehle, Filter, Logs)
Unterserver (Spigot/Paper) Unterserver (Spigot/Paper)
└─ GlobalChat Suppressor (Schnittstelle, leitet an StatusAPI weiter) └─ GlobalChat Suppressor (Schnittstelle, leitet an StatusAPI weiter)
@@ -102,17 +104,6 @@ Unterserver (Spigot/Paper)
--- ---
## Migration von alter Version
Wenn du eine ältere Version des GlobalChat verwendest:
1. Installiere die neue [StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI) auf BungeeCord
2. Kopiere deine `filter.yml` in den StatusAPI-Ordner
3. Ersetze das alte GlobalChat-Plugin auf den Unterservern mit dem neuen GlobalChat Suppressor
4. Starte alle Server neu
---
## Lizenz ## Lizenz
Dieses Plugin ist **proprietär** und darf nicht ohne Erlaubnis des Autors verbreitet oder verändert werden. Dieses Plugin ist **proprietär** und darf nicht ohne Erlaubnis des Autors verbreitet oder verändert werden.
@@ -122,4 +113,6 @@ Dieses Plugin ist **proprietär** und darf nicht ohne Erlaubnis des Autors verbr
## Support & Weitere Informationen ## Support & Weitere Informationen
Für detaillierte Informationen zur StatusAPI und deren Konfiguration: Für detaillierte Informationen zur StatusAPI und deren Konfiguration:
**[https://git.viper.ipv64.net/M_Viper/StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI)** **[StatusAPI](https://git.viper.ipv64.net/M_Viper/StatusAPI)**
**[GlobalChat](https://git.viper.ipv64.net/M_Viper/GlobalChat)**

104
pom.xml
View File

@@ -1,42 +1,62 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"> http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.viper.globalchat</groupId> <groupId>de.viper.globalchat</groupId>
<artifactId>GlobalChatSuppressor</artifactId> <artifactId>GlobalChatSuppressor</artifactId>
<version>1.0.0</version> <version>1.2</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>GlobalChatSuppressor</name> <name>GlobalChatSuppressor</name>
<properties> <properties>
<java.version>17</java.version> <java.version>17</java.version>
<spigot.version>1.21.1-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.21.1-R0.1-SNAPSHOT</spigot.version>
</properties> </properties>
<dependencies> <!-- HINZUGEFÜGT: Repositories, damit Maven die Libs findet -->
<dependency> <repositories>
<groupId>org.spigotmc</groupId> <repository>
<artifactId>spigot-api</artifactId> <id>spigot-repo</id>
<version>${spigot.version}</version> <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
<scope>provided</scope> </repository>
</dependency> <repository>
</dependencies> <id>sonatype</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<build> </repository>
<plugins> </repositories>
<plugin>
<groupId>org.apache.maven.plugins</groupId> <dependencies>
<artifactId>maven-compiler-plugin</artifactId> <dependency>
<version>3.13.0</version> <groupId>org.spigotmc</groupId>
<configuration> <artifactId>spigot-api</artifactId>
<source>${java.version}</source> <version>${spigot.version}</version>
<target>${java.version}</target> <scope>provided</scope>
<encoding>UTF-8</encoding> </dependency>
</configuration>
</plugin> <!-- HINZUGEFÜGT: Die Dependency für ComponentSerializer -->
</plugins> <dependency>
</build> <groupId>net.md-5</groupId>
</project> <artifactId>bungeecord-chat</artifactId>
<version>1.20-R0.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,79 +1,112 @@
package de.viper.globalchat.suppressor; package de.viper.globalchat.suppressor;
import org.bukkit.entity.Player; import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.plugin.java.JavaPlugin; import net.md_5.bungee.chat.ComponentSerializer;
import org.bukkit.plugin.messaging.PluginMessageListener; import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler; import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.messaging.PluginMessageListener;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import java.io.ByteArrayInputStream; import org.bukkit.event.player.PlayerJoinEvent;
import java.io.DataInputStream; import org.bukkit.event.player.PlayerQuitEvent;
import java.io.IOException;
import java.util.HashSet; import java.io.ByteArrayInputStream;
import java.util.Set; import java.io.DataInputStream;
import java.util.UUID; import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class GlobalChatSuppressor extends JavaPlugin implements PluginMessageListener, Listener { import java.util.HashSet;
import java.util.Set;
private static final String CHANNEL = "global:control"; import java.util.UUID;
private final Set<UUID> suppressJoinQuit = new HashSet<>();
public class GlobalChatSuppressor extends JavaPlugin implements PluginMessageListener, Listener {
@Override
public void onEnable() { private static final String CHANNEL_CONTROL = "global:control";
getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL, this); private static final String CHANNEL_CHAT = "global:chat"; // NEU: Kanal für Chat Relay
getServer().getMessenger().registerOutgoingPluginChannel(this, CHANNEL);
getServer().getPluginManager().registerEvents(this, this); private final Set<UUID> suppressJoinQuit = new HashSet<>();
getLogger().info("GlobalChatSuppressor aktiviert!");
} @Override
public void onEnable() {
@Override // Incoming Channels (Daten von BungeeCord)
public void onDisable() { getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL_CONTROL, this);
getServer().getMessenger().unregisterIncomingPluginChannel(this, CHANNEL); getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL_CHAT, this);
getServer().getMessenger().unregisterOutgoingPluginChannel(this, CHANNEL);
getLogger().info("GlobalChatSuppressor deaktiviert!"); // Outgoing Channels (Daten zu BungeeCord)
} getServer().getMessenger().registerOutgoingPluginChannel(this, CHANNEL_CONTROL);
@Override getServer().getPluginManager().registerEvents(this, this);
public void onPluginMessageReceived(String channel, Player player, byte[] message) { getLogger().info("GlobalChatSuppressor aktiviert (Chat Relay included)!");
if (!channel.equals(CHANNEL)) return; }
try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(message))) { @Override
String subChannel = in.readUTF(); public void onDisable() {
if ("suppress".equalsIgnoreCase(subChannel)) { getServer().getMessenger().unregisterIncomingPluginChannel(this, CHANNEL_CONTROL);
String uuidStr = in.readUTF(); getServer().getMessenger().unregisterIncomingPluginChannel(this, CHANNEL_CHAT);
UUID playerUUID = UUID.fromString(uuidStr); getServer().getMessenger().unregisterOutgoingPluginChannel(this, CHANNEL_CONTROL);
suppressJoinQuit.add(playerUUID); getLogger().info("GlobalChatSuppressor deaktiviert!");
getLogger().info("Suppress für Spieler UUID: " + playerUUID + " aktiviert."); }
// Entferne die Unterdrückung nach 2 Sekunden (synchron mit BungeeCord)
getServer().getScheduler().runTaskLater(this, () -> { @Override
suppressJoinQuit.remove(playerUUID); public void onPluginMessageReceived(String channel, Player player, byte[] message) {
getLogger().info("Suppress für Spieler UUID: " + playerUUID + " entfernt."); if (!channel.equals(CHANNEL_CONTROL) && !channel.equals(CHANNEL_CHAT)) return;
}, 40L); // 40 Ticks = 2 Sekunden
} try {
} catch (IOException e) { String data = new String(message, StandardCharsets.UTF_8);
e.printStackTrace();
} if (channel.equals(CHANNEL_CHAT)) {
} // ==========================================
// NEU: GLOBAL CHAT RELAY LOGIK
@EventHandler // ==========================================
public void onPlayerJoin(PlayerJoinEvent event) { // Wir empfangen JSON von BungeeCord.
Player player = event.getPlayer(); BaseComponent[] components = ComponentSerializer.parse(data);
if (suppressJoinQuit.contains(player.getUniqueId())) {
event.setJoinMessage(null); // An alle Spieler auf diesem Server senden.
getLogger().info("Join-Nachricht für " + player.getName() + " unterdrückt."); // Da dies eine Server-Nachricht ist, bricht sie die Secure Chain nicht.
suppressJoinQuit.remove(player.getUniqueId()); // Auch der Spieler selbst sieht sie.
} for (Player all : Bukkit.getOnlinePlayers()) {
} all.spigot().sendMessage(components);
}
@EventHandler // ==========================================
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer(); } else if (channel.equals(CHANNEL_CONTROL)) {
if (suppressJoinQuit.contains(player.getUniqueId())) { // Alte Suppress Logik (Join/Quit)
event.setQuitMessage(null); try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(message))) {
getLogger().info("Quit-Nachricht für " + player.getName() + " unterdrückt."); String subChannel = in.readUTF();
suppressJoinQuit.remove(player.getUniqueId()); if ("suppress".equalsIgnoreCase(subChannel)) {
} String uuidStr = in.readUTF();
} UUID playerUUID = UUID.fromString(uuidStr);
suppressJoinQuit.add(playerUUID);
getLogger().info("Suppress für Spieler UUID: " + playerUUID + " aktiviert.");
getServer().getScheduler().runTaskLater(this, () -> {
suppressJoinQuit.remove(playerUUID);
getLogger().info("Suppress für Spieler UUID: " + playerUUID + " entfernt.");
}, 40L);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
if (suppressJoinQuit.contains(player.getUniqueId())) {
event.setJoinMessage(null);
getLogger().info("Join-Nachricht für " + player.getName() + " unterdrückt.");
suppressJoinQuit.remove(player.getUniqueId());
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
if (suppressJoinQuit.contains(player.getUniqueId())) {
event.setQuitMessage(null);
getLogger().info("Quit-Nachricht für " + player.getName() + " unterdrückt.");
suppressJoinQuit.remove(player.getUniqueId());
}
}
} }

View File

@@ -1,6 +1,6 @@
name: GlobalChatSuppressor name: GlobalChatSuppressor
version: 1.0.0 version: 1.2
main: de.viper.globalchat.suppressor.GlobalChatSuppressor main: de.viper.globalchat.suppressor.GlobalChatSuppressor
api-version: 1.21 api-version: 1.21
author: M_Viper author: M_Viper
commands: {} commands: {}