diff --git a/src/main/java/net/viper/status/stats/StatsModule.java b/src/main/java/net/viper/status/stats/StatsModule.java index 018bdff..3744f67 100644 --- a/src/main/java/net/viper/status/stats/StatsModule.java +++ b/src/main/java/net/viper/status/stats/StatsModule.java @@ -1,100 +1,100 @@ -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) {} - } +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) {} + } } \ No newline at end of file