diff --git a/_trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/chat/MuteManager.java b/_trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/chat/MuteManager.java new file mode 100644 index 0000000..2360417 --- /dev/null +++ b/_trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/chat/MuteManager.java @@ -0,0 +1,124 @@ +package net.viper.status.modules.chat; + +import java.io.*; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Logger; + +/** + * Verwaltet Mutes von Spielern. + * Speichert: UUID → Ablaufzeitpunkt (Unix-Sekunden, 0 = permanent) + * + * Admins/OPs mit dem Bypass-Permission können nicht gemutet werden. + */ +public class MuteManager { + + private final File file; + private final Logger logger; + + // UUID → Ablaufzeitpunkt (0 = permanent) + private final ConcurrentHashMap mutes = new ConcurrentHashMap<>(); + + public MuteManager(File dataFolder, Logger logger) { + this.file = new File(dataFolder, "chat_mutes.dat"); + this.logger = logger; + } + + // ===== Mute-Logik ===== + + /** + * Mutet einen Spieler für durationMinutes Minuten. + * durationMinutes = 0 → permanent + */ + public void mute(UUID uuid, int durationMinutes) { + long expiry = (durationMinutes <= 0) + ? 0L + : (System.currentTimeMillis() / 1000L) + ((long) durationMinutes * 60); + mutes.put(uuid, expiry); + save(); + } + + /** Hebt den Mute auf. */ + public void unmute(UUID uuid) { + mutes.remove(uuid); + save(); + } + + /** Prüft ob ein Spieler aktuell gemutet ist. */ + public boolean isMuted(UUID uuid) { + Long expiry = mutes.get(uuid); + if (expiry == null) return false; + if (expiry == 0L) return true; // permanent + if (System.currentTimeMillis() / 1000L >= expiry) { + // Abgelaufen → entfernen + mutes.remove(uuid); + save(); + return false; + } + return true; + } + + /** + * Gibt die verbleibende Zeit als lesbaren String zurück. + * Gibt "permanent" zurück bei dauerhaftem Mute. + */ + public String getRemainingTime(UUID uuid) { + Long expiry = mutes.get(uuid); + if (expiry == null) return "0"; + if (expiry == 0L) return "permanent"; + + long remaining = expiry - (System.currentTimeMillis() / 1000L); + if (remaining <= 0) return "0"; + + long hours = remaining / 3600; + long minutes = (remaining % 3600) / 60; + long seconds = remaining % 60; + + if (hours > 0) return hours + "h " + minutes + "m"; + if (minutes > 0) return minutes + "m " + seconds + "s"; + return seconds + "s"; + } + + // ===== Persistenz ===== + + public void save() { + try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) { + long now = System.currentTimeMillis() / 1000L; + for (Map.Entry e : mutes.entrySet()) { + // Nur aktive Mutes speichern + if (e.getValue() == 0L || e.getValue() > now) { + bw.write(e.getKey() + "|" + e.getValue()); + bw.newLine(); + } + } + } catch (IOException e) { + logger.warning("[ChatModule] Fehler beim Speichern der Mutes: " + e.getMessage()); + } + } + + public void load() { + mutes.clear(); + if (!file.exists()) return; + try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"))) { + String line; + long now = System.currentTimeMillis() / 1000L; + while ((line = br.readLine()) != null) { + line = line.trim(); + if (line.isEmpty()) continue; + String[] parts = line.split("\\|"); + if (parts.length < 2) continue; + try { + UUID uuid = UUID.fromString(parts[0]); + long expiry = Long.parseLong(parts[1]); + // Nur laden wenn noch aktiv + if (expiry == 0L || expiry > now) { + mutes.put(uuid, expiry); + } + } catch (Exception ignored) {} + } + } catch (IOException e) { + logger.warning("[ChatModule] Fehler beim Laden der Mutes: " + e.getMessage()); + } + } +} \ No newline at end of file