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));
}
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

View File

@@ -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 ...");

View File

@@ -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<UUID, Long> 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);
}
}
}
}