From 2fe886205b675a3ee7c4d4233200b027f3097879 Mon Sep 17 00:00:00 2001 From: Brokkonaut Date: Tue, 31 Jul 2018 18:58:48 +0200 Subject: [PATCH] Calculate online time locally Fixes #645 --- .../java/de/diddiz/LogBlock/Consumer.java | 14 ++++++------ .../java/de/diddiz/LogBlock/LogBlock.java | 7 +++--- .../LogBlock/listeners/PlayerInfoLogging.java | 22 ++++++++++++++++++- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/diddiz/LogBlock/Consumer.java b/src/main/java/de/diddiz/LogBlock/Consumer.java index 913b713..0d37b21 100644 --- a/src/main/java/de/diddiz/LogBlock/Consumer.java +++ b/src/main/java/de/diddiz/LogBlock/Consumer.java @@ -394,8 +394,8 @@ public class Consumer extends TimerTask { queue.add(new PlayerJoinRow(player)); } - public void queueLeave(Player player) { - queue.add(new PlayerLeaveRow(player)); + public void queueLeave(Player player, long onlineTime) { + queue.add(new PlayerLeaveRow(player, onlineTime)); } public void queueAddMaterialMapping(int key, String material) { @@ -1019,20 +1019,20 @@ public class Consumer extends TimerTask { } private class PlayerLeaveRow implements Row { - private final long leaveTime; + private final long onlineTime; private final Actor actor; - PlayerLeaveRow(Player player) { - leaveTime = System.currentTimeMillis() / 1000; + PlayerLeaveRow(Player player, long onlineTime) { + this.onlineTime = onlineTime; actor = Actor.actorFromEntity(player); } @Override public String[] getInserts() { if (logPlayerInfo) { - return new String[] { "UPDATE `lb-players` SET onlinetime = onlinetime + TIMESTAMPDIFF(SECOND, lastlogin, FROM_UNIXTIME('" + leaveTime + "')), playername = '" + mysqlTextEscape(actor.getName()) + "' WHERE lastlogin > 0 && UUID = '" + actor.getUUID() + "';" }; + return new String[] { "UPDATE `lb-players` SET onlinetime = onlinetime + " + onlineTime + " WHERE lastlogin > 0 && UUID = '" + actor.getUUID() + "';" }; } - return new String[] { "UPDATE `lb-players` SET playername = '" + mysqlTextEscape(actor.getName()) + "' WHERE UUID = '" + actor.getUUID() + "';" }; + return new String[0]; } @Override diff --git a/src/main/java/de/diddiz/LogBlock/LogBlock.java b/src/main/java/de/diddiz/LogBlock/LogBlock.java index 324d33c..3e1e909 100644 --- a/src/main/java/de/diddiz/LogBlock/LogBlock.java +++ b/src/main/java/de/diddiz/LogBlock/LogBlock.java @@ -37,6 +37,7 @@ public class LogBlock extends JavaPlugin { private Updater updater = null; private Timer timer = null; private boolean errorAtLoading = false, noDb = false, connected = true; + private PlayerInfoLogging playerInfoLogging; public static LogBlock getInstance() { return logblock; @@ -147,7 +148,7 @@ public class LogBlock extends JavaPlugin { private void registerEvents() { final PluginManager pm = getPluginManager(); pm.registerEvents(new ToolListener(this), this); - pm.registerEvents(new PlayerInfoLogging(this), this); + pm.registerEvents(playerInfoLogging = new PlayerInfoLogging(this), this); if (askRollbackAfterBan) { pm.registerEvents(new BanListener(this), this); } @@ -214,9 +215,9 @@ public class LogBlock extends JavaPlugin { } getServer().getScheduler().cancelTasks(this); if (consumer != null) { - if (logPlayerInfo && getServer().getOnlinePlayers() != null) { + if (logPlayerInfo && playerInfoLogging != null) { for (final Player player : getServer().getOnlinePlayers()) { - consumer.queueLeave(player); + playerInfoLogging.onPlayerQuit(player); } } getLogger().info("Waiting for consumer ..."); diff --git a/src/main/java/de/diddiz/LogBlock/listeners/PlayerInfoLogging.java b/src/main/java/de/diddiz/LogBlock/listeners/PlayerInfoLogging.java index dad3503..fbdf9c4 100644 --- a/src/main/java/de/diddiz/LogBlock/listeners/PlayerInfoLogging.java +++ b/src/main/java/de/diddiz/LogBlock/listeners/PlayerInfoLogging.java @@ -1,23 +1,43 @@ package de.diddiz.LogBlock.listeners; import de.diddiz.LogBlock.LogBlock; +import de.diddiz.LogBlock.config.Config; + +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; public class PlayerInfoLogging extends LoggingListener { + + private final HashMap playerLogins = new HashMap<>(); + public PlayerInfoLogging(LogBlock lb) { super(lb); } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent event) { + playerLogins.put(event.getPlayer().getUniqueId(), System.currentTimeMillis()); consumer.queueJoin(event.getPlayer()); } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerQuit(PlayerQuitEvent event) { - consumer.queueLeave(event.getPlayer()); + onPlayerQuit(event.getPlayer()); + } + + public void onPlayerQuit(Player player) { + Long joinTime = playerLogins.remove(player.getUniqueId()); + if (Config.logPlayerInfo && joinTime != null) { + long onlineTime = (System.currentTimeMillis() - joinTime) / 1000; + if (onlineTime > 0) { + consumer.queueLeave(player, onlineTime); + } + } } }