Delete src/main/java/net/viper/status/modules/chat/PrivateMsgManager.java via Git Manager GUI
This commit is contained in:
@@ -1,163 +0,0 @@
|
|||||||
package net.viper.status.modules.chat;
|
|
||||||
|
|
||||||
import net.md_5.bungee.api.ChatColor;
|
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
|
||||||
import net.md_5.bungee.api.chat.TextComponent;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
||||||
import net.viper.status.ratelimit.GlobalRateLimitFramework;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Verwaltet private Nachrichten (/msg, /r) und Social-Spy.
|
|
||||||
*/
|
|
||||||
public class PrivateMsgManager {
|
|
||||||
|
|
||||||
private final BlockManager blockManager;
|
|
||||||
private final GlobalRateLimitFramework rateLimiter = GlobalRateLimitFramework.getInstance();
|
|
||||||
|
|
||||||
// UUID → letzte PM-Gesprächspartner UUID (für /r)
|
|
||||||
private final Map<UUID, UUID> lastPartner = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
// UUIDs die Social-Spy aktiviert haben
|
|
||||||
private final java.util.Set<UUID> spyEnabled =
|
|
||||||
java.util.Collections.newSetFromMap(new ConcurrentHashMap<>());
|
|
||||||
|
|
||||||
public PrivateMsgManager(BlockManager blockManager) {
|
|
||||||
this.blockManager = blockManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sendet eine private Nachricht von `sender` an `receiver`.
|
|
||||||
*
|
|
||||||
* @param sender Der sendende Spieler
|
|
||||||
* @param receiver Der empfangende Spieler
|
|
||||||
* @param message Die Nachricht
|
|
||||||
* @param config Chat-Konfiguration (Formate)
|
|
||||||
* @param bypassPermission Permission für Admin-Bypass (kann nicht geblockt werden)
|
|
||||||
* @return true wenn erfolgreich gesendet
|
|
||||||
*/
|
|
||||||
public boolean send(ProxiedPlayer sender, ProxiedPlayer receiver,
|
|
||||||
String message, ChatConfig config, String bypassPermission) {
|
|
||||||
|
|
||||||
// Selbst anschreiben verhindern
|
|
||||||
if (sender.getUniqueId().equals(receiver.getUniqueId())) {
|
|
||||||
sender.sendMessage(color("&cDu kannst dir nicht selbst schreiben."));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Admin-Bypass: Wenn Sender Admin ist, kann er nicht geblockt werden
|
|
||||||
boolean senderIsAdmin = sender.hasPermission(bypassPermission);
|
|
||||||
|
|
||||||
// Block-Check (nur wenn Sender kein Admin)
|
|
||||||
if (!senderIsAdmin) {
|
|
||||||
if (!blockManager.canReceive(sender.getUniqueId(), receiver.getUniqueId())) {
|
|
||||||
sender.sendMessage(color("&cDieser Spieler hat dich blockiert oder du hast ihn blockiert."));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.isPmRateLimitEnabled()) {
|
|
||||||
GlobalRateLimitFramework.Result result = rateLimiter.check(
|
|
||||||
"chat.pm",
|
|
||||||
sender.getUniqueId().toString(),
|
|
||||||
new GlobalRateLimitFramework.Rule(
|
|
||||||
true,
|
|
||||||
config.getPmRateLimitWindowMs(),
|
|
||||||
config.getPmRateLimitMaxActions(),
|
|
||||||
config.getPmRateLimitBlockMs()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result.isBlocked()) {
|
|
||||||
sender.sendMessage(color(config.getPmRateLimitMessage()));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Formatierung
|
|
||||||
String toSender = format(config.getPmFormatSender(), sender.getName(), receiver.getName(), message, true);
|
|
||||||
String toReceiver = format(config.getPmFormatReceiver(), sender.getName(), receiver.getName(), message, false);
|
|
||||||
|
|
||||||
sender.sendMessage(color(toSender));
|
|
||||||
receiver.sendMessage(color(toReceiver));
|
|
||||||
|
|
||||||
// Letzte Partner speichern (für /r)
|
|
||||||
lastPartner.put(sender.getUniqueId(), receiver.getUniqueId());
|
|
||||||
lastPartner.put(receiver.getUniqueId(), sender.getUniqueId());
|
|
||||||
|
|
||||||
// Social Spy
|
|
||||||
String spyMsg = format(config.getPmFormatSpy(), sender.getName(), receiver.getName(), message, true);
|
|
||||||
broadcastSpy(spyMsg, config.getPmSpyPermission(), sender.getUniqueId(), receiver.getUniqueId());
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Antwort-Funktion (/r).
|
|
||||||
* Sucht den letzten Gesprächspartner des Senders.
|
|
||||||
*/
|
|
||||||
public void reply(ProxiedPlayer sender, String message, ChatConfig config, String bypassPermission) {
|
|
||||||
UUID partnerUuid = lastPartner.get(sender.getUniqueId());
|
|
||||||
if (partnerUuid == null) {
|
|
||||||
sender.sendMessage(color("&cDu hast noch keine Nachricht erhalten."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ProxiedPlayer partner = ProxyServer.getInstance().getPlayer(partnerUuid);
|
|
||||||
if (partner == null || !partner.isConnected()) {
|
|
||||||
sender.sendMessage(color("&cDieser Spieler ist nicht mehr online."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
send(sender, partner, message, config, bypassPermission);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Social-Spy umschalten. */
|
|
||||||
public boolean toggleSpy(UUID uuid) {
|
|
||||||
if (spyEnabled.contains(uuid)) {
|
|
||||||
spyEnabled.remove(uuid);
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
spyEnabled.add(uuid);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void broadcastSpy(String formatted, String spyPermission, UUID... exclude) {
|
|
||||||
java.util.Set<UUID> excl = new java.util.HashSet<>(java.util.Arrays.asList(exclude));
|
|
||||||
for (ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) {
|
|
||||||
if (excl.contains(p.getUniqueId())) continue;
|
|
||||||
// Spy muss entweder via Permission aktiv oder manuell aktiviert haben
|
|
||||||
boolean hasPerm = p.hasPermission(spyPermission);
|
|
||||||
boolean hasToggle= spyEnabled.contains(p.getUniqueId());
|
|
||||||
if (hasPerm || hasToggle) {
|
|
||||||
p.sendMessage(color(formatted));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Formatiert eine PM-Nachricht.
|
|
||||||
* {sender} → Name des Absenders
|
|
||||||
* {receiver} → Name des Empfängers
|
|
||||||
* {player} → Gesprächspartner aus Sicht des jeweiligen Empfängers:
|
|
||||||
* Beim Sender: der Empfänger (an wen schreibt er?)
|
|
||||||
* Beim Empfänger: der Sender (von wem kommt es?)
|
|
||||||
*
|
|
||||||
* @param viewerIsSender true wenn der aktuelle Betrachter der Absender ist
|
|
||||||
*/
|
|
||||||
private String format(String template, String sender, String receiver,
|
|
||||||
String message, boolean viewerIsSender) {
|
|
||||||
String partner = viewerIsSender ? receiver : sender;
|
|
||||||
return template
|
|
||||||
.replace("{sender}", sender)
|
|
||||||
.replace("{receiver}", receiver)
|
|
||||||
.replace("{player}", partner) // Gesprächspartner aus Sicht des Betrachters
|
|
||||||
.replace("{message}", message);
|
|
||||||
}
|
|
||||||
|
|
||||||
private TextComponent color(String text) {
|
|
||||||
return new TextComponent(ChatColor.translateAlternateColorCodes('&', text));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user