Added lastLogin, online time and ip logging

This commit is contained in:
Robin Kupper
2011-10-03 16:34:01 +02:00
parent 4f5588f570
commit 83ba529dba
6 changed files with 88 additions and 3 deletions

View File

@@ -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<Integer> 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<String>());
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) {

View File

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

View File

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

View File

@@ -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;

View File

@@ -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()) {

View File

@@ -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