package net.viper.status.stats; import net.md_5.bungee.api.event.PlayerDisconnectEvent; import net.md_5.bungee.api.event.PostLoginEvent; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import net.viper.status.module.Module; import java.util.concurrent.TimeUnit; /** * StatsModule: Kümmert sich eigenständig um das Tracking der Spielerdaten. * Implementiert Module (für das Lifecycle) und Listener (für die Events). */ public class StatsModule implements Module, Listener { private StatsManager manager; private StatsStorage storage; @Override public String getName() { return "StatsModule"; } @Override public void onEnable(Plugin plugin) { // Initialisierung manager = new StatsManager(); storage = new StatsStorage(plugin.getDataFolder()); // Laden try { storage.load(manager); plugin.getLogger().info("Player-Stats wurden erfolgreich geladen."); } catch (Exception e) { plugin.getLogger().warning("Fehler beim Laden der Stats: " + e.getMessage()); } // Event Listener registrieren plugin.getProxy().getPluginManager().registerListener(plugin, this); // Auto-Save Task (alle 5 Minuten) plugin.getProxy().getScheduler().schedule(plugin, () -> { try { storage.save(manager); plugin.getLogger().info("Auto-Save: Player-Stats gespeichert."); } catch (Exception e) { plugin.getLogger().warning("Fehler beim Auto-Save: " + e.getMessage()); } }, 5, 5, TimeUnit.MINUTES); } @Override public void onDisable(Plugin plugin) { if (manager != null && storage != null) { // Laufende Sessions beenden vor dem Speichern long now = System.currentTimeMillis() / 1000L; for (PlayerStats ps : manager.all()) { synchronized (ps) { if (ps.currentSessionStart > 0) { long delta = now - ps.currentSessionStart; if (delta > 0) { ps.totalPlaytime += delta; } ps.currentSessionStart = 0; // Session beenden } } } try { storage.save(manager); plugin.getLogger().info("Player-Stats beim Shutdown gespeichert."); } catch (Exception e) { plugin.getLogger().warning("Fehler beim Speichern (Shutdown): " + e.getMessage()); } } } // Öffentlicher Zugriff für den WebServer public StatsManager getManager() { return manager; } // --- Events --- @EventHandler public void onJoin(PostLoginEvent e) { try { manager.get(e.getPlayer().getUniqueId(), e.getPlayer().getName()).onJoin(); } catch (Exception ignored) {} } @EventHandler public void onQuit(PlayerDisconnectEvent e) { try { PlayerStats ps = manager.getIfPresent(e.getPlayer().getUniqueId()); if (ps != null) ps.onQuit(); } catch (Exception ignored) {} } }