Calculate online time locally

Fixes #645
This commit is contained in:
Brokkonaut
2018-07-31 18:58:48 +02:00
parent 28aabd09c7
commit 2fe886205b
3 changed files with 32 additions and 11 deletions

View File

@@ -394,8 +394,8 @@ public class Consumer extends TimerTask {
queue.add(new PlayerJoinRow(player)); queue.add(new PlayerJoinRow(player));
} }
public void queueLeave(Player player) { public void queueLeave(Player player, long onlineTime) {
queue.add(new PlayerLeaveRow(player)); queue.add(new PlayerLeaveRow(player, onlineTime));
} }
public void queueAddMaterialMapping(int key, String material) { public void queueAddMaterialMapping(int key, String material) {
@@ -1019,20 +1019,20 @@ public class Consumer extends TimerTask {
} }
private class PlayerLeaveRow implements Row { private class PlayerLeaveRow implements Row {
private final long leaveTime; private final long onlineTime;
private final Actor actor; private final Actor actor;
PlayerLeaveRow(Player player) { PlayerLeaveRow(Player player, long onlineTime) {
leaveTime = System.currentTimeMillis() / 1000; this.onlineTime = onlineTime;
actor = Actor.actorFromEntity(player); actor = Actor.actorFromEntity(player);
} }
@Override @Override
public String[] getInserts() { public String[] getInserts() {
if (logPlayerInfo) { 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 @Override

View File

@@ -37,6 +37,7 @@ public class LogBlock extends JavaPlugin {
private Updater updater = null; private Updater updater = null;
private Timer timer = null; private Timer timer = null;
private boolean errorAtLoading = false, noDb = false, connected = true; private boolean errorAtLoading = false, noDb = false, connected = true;
private PlayerInfoLogging playerInfoLogging;
public static LogBlock getInstance() { public static LogBlock getInstance() {
return logblock; return logblock;
@@ -147,7 +148,7 @@ public class LogBlock extends JavaPlugin {
private void registerEvents() { private void registerEvents() {
final PluginManager pm = getPluginManager(); final PluginManager pm = getPluginManager();
pm.registerEvents(new ToolListener(this), this); pm.registerEvents(new ToolListener(this), this);
pm.registerEvents(new PlayerInfoLogging(this), this); pm.registerEvents(playerInfoLogging = new PlayerInfoLogging(this), this);
if (askRollbackAfterBan) { if (askRollbackAfterBan) {
pm.registerEvents(new BanListener(this), this); pm.registerEvents(new BanListener(this), this);
} }
@@ -214,9 +215,9 @@ public class LogBlock extends JavaPlugin {
} }
getServer().getScheduler().cancelTasks(this); getServer().getScheduler().cancelTasks(this);
if (consumer != null) { if (consumer != null) {
if (logPlayerInfo && getServer().getOnlinePlayers() != null) { if (logPlayerInfo && playerInfoLogging != null) {
for (final Player player : getServer().getOnlinePlayers()) { for (final Player player : getServer().getOnlinePlayers()) {
consumer.queueLeave(player); playerInfoLogging.onPlayerQuit(player);
} }
} }
getLogger().info("Waiting for consumer ..."); getLogger().info("Waiting for consumer ...");

View File

@@ -1,23 +1,43 @@
package de.diddiz.LogBlock.listeners; package de.diddiz.LogBlock.listeners;
import de.diddiz.LogBlock.LogBlock; 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.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
public class PlayerInfoLogging extends LoggingListener { public class PlayerInfoLogging extends LoggingListener {
private final HashMap<UUID, Long> playerLogins = new HashMap<>();
public PlayerInfoLogging(LogBlock lb) { public PlayerInfoLogging(LogBlock lb) {
super(lb); super(lb);
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
playerLogins.put(event.getPlayer().getUniqueId(), System.currentTimeMillis());
consumer.queueJoin(event.getPlayer()); consumer.queueJoin(event.getPlayer());
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) { 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);
}
}
} }
} }