From 83ba529dbaded33020af1cb811625f3213fd3e42 Mon Sep 17 00:00:00 2001 From: Robin Kupper Date: Mon, 3 Oct 2011 16:34:01 +0200 Subject: [PATCH] Added lastLogin, online time and ip logging --- src/de/diddiz/LogBlock/Config.java | 4 +- src/de/diddiz/LogBlock/Consumer.java | 52 ++++++++++++++++++++ src/de/diddiz/LogBlock/LBPlayerListener.java | 12 +++++ src/de/diddiz/LogBlock/LogBlock.java | 7 +++ src/de/diddiz/LogBlock/Updater.java | 14 +++++- src/plugin.yml | 2 +- 6 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/de/diddiz/LogBlock/Config.java b/src/de/diddiz/LogBlock/Config.java index d305509..2a59be6 100644 --- a/src/de/diddiz/LogBlock/Config.java +++ b/src/de/diddiz/LogBlock/Config.java @@ -28,7 +28,7 @@ public class Config public final int keepLogDays; public final boolean dumpDeletedLog; public boolean logBlockPlacings, logBlockBreaks, logSignTexts, logExplosions, logFire, logLeavesDecay, logLavaFlow, logWaterFlow, logChestAccess, logButtonsAndLevers, logKills, logChat, logSnowForm, logSnowFade, logDoors, logCakes, logEndermen; - public final boolean logCreeperExplosionsAsPlayerWhoTriggeredThese; + public final boolean logCreeperExplosionsAsPlayerWhoTriggeredThese, logPlayerInfo; public final LogKillsLevel logKillsLevel; public final Set dontRollback, replaceAnyway; public final int rollbackMaxTime, rollbackMaxArea; @@ -62,6 +62,7 @@ public class Config def.put("clearlog.keepLogDays", -1); def.put("logging.logCreeperExplosionsAsPlayerWhoTriggeredThese", false); def.put("logging.logKillsLevel", "PLAYERS"); + def.put("logging.logPlayerInfo", true); def.put("logging.hiddenPlayers", new ArrayList()); def.put("logging.hiddenBlocks", Arrays.asList(0)); def.put("rollback.dontRollback", Arrays.asList(10, 11, 46, 51)); @@ -118,6 +119,7 @@ public class Config throw new DataFormatException("Too large timespan for keepLogDays. Must be shorter than " + (int)(System.currentTimeMillis() / 86400000L) + " days."); dumpDeletedLog = config.getBoolean("clearlog.dumpDeletedLog", false); logCreeperExplosionsAsPlayerWhoTriggeredThese = config.getBoolean("logging.logCreeperExplosionsAsPlayerWhoTriggeredThese", false); + logPlayerInfo = config.getBoolean("logging.logPlayerInfo", true); try { logKillsLevel = LogKillsLevel.valueOf(config.getString("logging.logKillsLevel").toUpperCase()); } catch (final IllegalArgumentException ex) { diff --git a/src/de/diddiz/LogBlock/Consumer.java b/src/de/diddiz/LogBlock/Consumer.java index e10612a..a18b347 100644 --- a/src/de/diddiz/LogBlock/Consumer.java +++ b/src/de/diddiz/LogBlock/Consumer.java @@ -237,6 +237,14 @@ public class Consumer extends TimerTask queue.add(new ChatRow(player, message.replace("\\", "\\\\").replace("'", "\\'"))); } + public void queueJoin(Player player) { + queue.add(new PlayerJoinRow(player)); + } + + public void queueLeave(Player player) { + queue.add(new PlayerLeaveRow(player)); + } + @Override public void run() { if (queue.isEmpty() || !lock.tryLock()) @@ -430,4 +438,48 @@ public class Consumer extends TimerTask return new String[]{playerName}; } } + + private class PlayerJoinRow implements Row + { + private final String playerName; + private final long lastLogin; + private final String ip; + + PlayerJoinRow(Player player) { + playerName = player.getName(); + lastLogin = System.currentTimeMillis() / 1000; + ip = player.getAddress().toString().replace("'", "\\'"); + } + + @Override + public String[] getInserts() { + return new String[]{"UPDATE `lb-players` SET lastlogin = FROM_UNIXTIME(" + lastLogin + "), ip = '" + ip + "' WHERE playerid = " + playerID(playerName) + ";"}; + } + + @Override + public String[] getPlayers() { + return new String[]{playerName}; + } + } + + private class PlayerLeaveRow implements Row + { + private final String playerName; + private final long leaveTime; + + PlayerLeaveRow(Player player) { + playerName = player.getName(); + leaveTime = System.currentTimeMillis() / 1000; + } + + @Override + public String[] getInserts() { + return new String[]{"UPDATE `lb-players` SET onlinetime = ADDTIME(onlinetime, TIMEDIFF(FROM_UNIXTIME(" + leaveTime + "), lastlogin)) WHERE playerid = " + playerID(playerName) + ";"}; + } + + @Override + public String[] getPlayers() { + return new String[]{playerName}; + } + } } diff --git a/src/de/diddiz/LogBlock/LBPlayerListener.java b/src/de/diddiz/LogBlock/LBPlayerListener.java index 3b6e7e0..9ea1e84 100644 --- a/src/de/diddiz/LogBlock/LBPlayerListener.java +++ b/src/de/diddiz/LogBlock/LBPlayerListener.java @@ -8,7 +8,9 @@ import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerQuitEvent; class LBPlayerListener extends PlayerListener { @@ -61,4 +63,14 @@ class LBPlayerListener extends PlayerListener if (wcfg != null && wcfg.logChat) consumer.queueChat(event.getPlayer().getName(), event.getMessage()); } + + @Override + public void onPlayerJoin(PlayerJoinEvent event) { + consumer.queueJoin(event.getPlayer()); + } + + @Override + public void onPlayerQuit(PlayerQuitEvent event) { + consumer.queueLeave(event.getPlayer()); + } } diff --git a/src/de/diddiz/LogBlock/LogBlock.java b/src/de/diddiz/LogBlock/LogBlock.java index 74bfd22..8f9dcb5 100644 --- a/src/de/diddiz/LogBlock/LogBlock.java +++ b/src/de/diddiz/LogBlock/LogBlock.java @@ -222,6 +222,10 @@ public class LogBlock extends JavaPlugin pm.registerEvent(Type.ENDERMAN_PICKUP, lbEntityListener, Priority.Monitor, this); pm.registerEvent(Type.ENDERMAN_PLACE, lbEntityListener, Priority.Monitor, this); } + if (config.logPlayerInfo) { + pm.registerEvent(Type.PLAYER_JOIN, lbPlayerListener, Priority.Monitor, this); + pm.registerEvent(Type.PLAYER_QUIT, lbPlayerListener, Priority.Monitor, this); + } if (config.useBukkitScheduler) { if (getServer().getScheduler().scheduleAsyncRepeatingTask(this, consumer, config.delayBetweenRuns * 20, config.delayBetweenRuns * 20) > 0) log.info("[LogBlock] Scheduled consumer with bukkit scheduler."); @@ -248,6 +252,9 @@ public class LogBlock extends JavaPlugin if (timer != null) timer.cancel(); getServer().getScheduler().cancelTasks(this); + if (config.logPlayerInfo) + for (final Player player : getServer().getOnlinePlayers()) + consumer.queueLeave(player); if (consumer != null && consumer.getQueueSize() > 0) { log.info("[LogBlock] Waiting for consumer ..."); int lastSize = -1, fails = 0; diff --git a/src/de/diddiz/LogBlock/Updater.java b/src/de/diddiz/LogBlock/Updater.java index f59dcb6..bb1576a 100644 --- a/src/de/diddiz/LogBlock/Updater.java +++ b/src/de/diddiz/LogBlock/Updater.java @@ -98,6 +98,18 @@ class Updater config.setProperty("tools." + tool + ".permissionDefault", "OP"); config.setProperty("version", "1.30"); } + if (config.getString("version").compareTo("1.31") < 0) { + log.info("[LogBlock] Updating tables to 1.31 ..."); + final Connection conn = logblock.getConnection(); + try { + conn.setAutoCommit(true); + final Statement st = conn.createStatement(); + st.execute("ALTER TABLE `lb-players` ADD COLUMN lastlogin DATETIME NOT NULL, ADD COLUMN onlinetime TIME NOT NULL, ADD COLUMN ip VARCHAR(255) NOT NULL"); + st.close(); + conn.close(); + } catch (final SQLException ex) {} + config.setProperty("version", "1.31"); + } config.save(); return true; } @@ -109,7 +121,7 @@ class Updater final Statement state = conn.createStatement(); final DatabaseMetaData dbm = conn.getMetaData(); conn.setAutoCommit(true); - createTable(dbm, state, "lb-players", "(playerid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, playername varchar(32) NOT NULL DEFAULT '-', PRIMARY KEY (playerid), UNIQUE (playername))"); + createTable(dbm, state, "lb-players", "(playerid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, playername varchar(32) NOT NULL, lastlogin DATETIME NOT NULL, onlinetime TIME NOT NULL, ip varchar(255) NOT NULL, PRIMARY KEY (playerid), UNIQUE (playername))"); if (logblock.getConfig().logChat) createTable(dbm, state, "lb-chat", "(id INT UNSIGNED NOT NULL AUTO_INCREMENT, date DATETIME NOT NULL, playerid SMALLINT UNSIGNED NOT NULL, message VARCHAR(255) NOT NULL, PRIMARY KEY (id), KEY playerid (playerid), FULLTEXT message (message)) ENGINE=MyISAM"); for (final WorldConfig wcfg : logblock.getConfig().worlds.values()) { diff --git a/src/plugin.yml b/src/plugin.yml index 3478399..79ae6f6 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,5 +1,5 @@ name: LogBlock -version: '1.30' +version: '1.31' author: DiddiZ website: http://www.diddiz.de/minecraft/ main: de.diddiz.LogBlock.LogBlock