This commit is contained in:
Robin Kupper
2011-04-23 13:21:26 +02:00
parent 6ef25f0436
commit 088cbd1c91
14 changed files with 152 additions and 137 deletions

View File

@@ -25,7 +25,7 @@ public class AreaBlockSearch implements Runnable
AreaBlockSearch(LogBlock logblock, Player player, int type, int size) { AreaBlockSearch(LogBlock logblock, Player player, int type, int size) {
this.player = player; this.player = player;
this.location = player.getLocation(); location = player.getLocation();
this.type = type; this.type = type;
this.size = size; this.size = size;
log = logblock.getServer().getLogger(); log = logblock.getServer().getLogger();
@@ -33,11 +33,12 @@ public class AreaBlockSearch implements Runnable
table = logblock.getConfig().tables.get(player.getWorld().getName().hashCode()); table = logblock.getConfig().tables.get(player.getWorld().getName().hashCode());
} }
@Override
public void run() { public void run() {
boolean hist = false; boolean hist = false;
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss"); final SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss");
try { try {
if (conn == null) { if (conn == null) {
player.sendMessage(ChatColor.RED + "Failed to create database connection"); player.sendMessage(ChatColor.RED + "Failed to create database connection");
@@ -72,7 +73,7 @@ public class AreaBlockSearch implements Runnable
} }
if (!hist) if (!hist)
player.sendMessage(ChatColor.DARK_AQUA + "None."); player.sendMessage(ChatColor.DARK_AQUA + "None.");
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock AreaBlockSearch] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock AreaBlockSearch] SQL exception", ex);
} finally { } finally {
try { try {
@@ -82,7 +83,7 @@ public class AreaBlockSearch implements Runnable
ps.close(); ps.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock AreaBlockSearch] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock AreaBlockSearch] SQL exception on close", ex);
} }
} }

View File

@@ -26,6 +26,7 @@ public class AreaStats implements Runnable
table = logblock.getConfig().tables.get(player.getWorld().getName().hashCode()); table = logblock.getConfig().tables.get(player.getWorld().getName().hashCode());
} }
@Override
public void run() { public void run() {
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
@@ -59,7 +60,7 @@ public class AreaStats implements Runnable
player.sendMessage(ChatColor.GOLD + String.format("%-6d %-6d %s", rs.getInt("created"), rs.getInt("destroyed"), rs.getString("playername"))); player.sendMessage(ChatColor.GOLD + String.format("%-6d %-6d %s", rs.getInt("created"), rs.getInt("destroyed"), rs.getString("playername")));
} }
} }
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock AreaStats] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock AreaStats] SQL exception", ex);
} finally { } finally {
try { try {
@@ -69,7 +70,7 @@ public class AreaStats implements Runnable
ps.close(); ps.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock AreaStats] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock AreaStats] SQL exception on close", ex);
} }
} }

View File

@@ -34,7 +34,7 @@ public class BlockStats implements Runnable
boolean hist = false; boolean hist = false;
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss"); final SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss");
try { try {
if (conn == null) { if (conn == null) {
player.sendMessage(ChatColor.RED + "Failed to create database connection"); player.sendMessage(ChatColor.RED + "Failed to create database connection");
@@ -53,8 +53,8 @@ public class BlockStats implements Runnable
player.sendMessage(ChatColor.DARK_AQUA + "Block history (" + block.getX() + ", " + block.getY() + ", " + block.getZ() + "): "); player.sendMessage(ChatColor.DARK_AQUA + "Block history (" + block.getX() + ", " + block.getY() + ", " + block.getZ() + "): ");
while (rs.next()) { while (rs.next()) {
String msg = formatter.format(rs.getTimestamp("date")) + " " + rs.getString("playername") + " "; String msg = formatter.format(rs.getTimestamp("date")) + " " + rs.getString("playername") + " ";
int type = rs.getInt("type"); final int type = rs.getInt("type");
int replaced = rs.getInt("replaced"); final int replaced = rs.getInt("replaced");
if ((type == 63 || type == 68) && rs.getString("signtext") != null) if ((type == 63 || type == 68) && rs.getString("signtext") != null)
msg += "created " + rs.getString("signtext"); msg += "created " + rs.getString("signtext");
else if (type == replaced) { else if (type == replaced) {
@@ -71,7 +71,7 @@ public class BlockStats implements Runnable
} }
if (!hist) if (!hist)
player.sendMessage(ChatColor.DARK_AQUA + "None."); player.sendMessage(ChatColor.DARK_AQUA + "None.");
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock BlockStats] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock BlockStats] SQL exception", ex);
} finally { } finally {
try { try {
@@ -81,7 +81,7 @@ public class BlockStats implements Runnable
ps.close(); ps.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock BlockStats] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock BlockStats] SQL exception on close", ex);
} }
} }

View File

@@ -31,12 +31,12 @@ public class ClearLog implements Runnable
return; return;
dumpFolder.mkdirs(); dumpFolder.mkdirs();
state = conn.createStatement(); state = conn.createStatement();
String time = new SimpleDateFormat("yy-MM-dd-HH-mm-ss").format(System.currentTimeMillis() - config.keepLogDays*86400000L); final String time = new SimpleDateFormat("yy-MM-dd-HH-mm-ss").format(System.currentTimeMillis() - config.keepLogDays*86400000L);
ResultSet rs; ResultSet rs;
for (String table : config.tables.values()) { for (final String table : config.tables.values()) {
rs = state.executeQuery("SELECT count(*) FROM `" + table + "` WHERE date < '" + time + "'"); rs = state.executeQuery("SELECT count(*) FROM `" + table + "` WHERE date < '" + time + "'");
rs.next(); rs.next();
int deleted = rs.getInt(1); int deleted = rs.getInt(1);
if (deleted > 0) { if (deleted > 0) {
if (config.dumpDeletedLog) if (config.dumpDeletedLog)
state.execute("SELECT * FROM `" + table + "` WHERE date < '" + time + "' INTO OUTFILE '" + new File(dumpFolder, table + "-" + time + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); state.execute("SELECT * FROM `" + table + "` WHERE date < '" + time + "' INTO OUTFILE '" + new File(dumpFolder, table + "-" + time + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
@@ -45,7 +45,7 @@ public class ClearLog implements Runnable
} }
rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL"); rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL");
rs.next(); rs.next();
deleted = rs.getInt(1); deleted = rs.getInt(1);
if (deleted > 0) { if (deleted > 0) {
if (config.dumpDeletedLog) if (config.dumpDeletedLog)
state.execute("SELECT id, signtext FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, table + "-sign-" + time + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); state.execute("SELECT id, signtext FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, table + "-sign-" + time + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
@@ -54,7 +54,7 @@ public class ClearLog implements Runnable
} }
rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL"); rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL");
rs.next(); rs.next();
deleted = rs.getInt(1); deleted = rs.getInt(1);
if (deleted > 0) { if (deleted > 0) {
if (config.dumpDeletedLog) if (config.dumpDeletedLog)
state.execute("SELECT id, intype, inamount, outtype, outamount FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, table + "-chest-" + time + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'"); state.execute("SELECT id, intype, inamount, outtype, outamount FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, table + "-chest-" + time + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
@@ -62,7 +62,7 @@ public class ClearLog implements Runnable
log.info("[LogBlock] Cleared out table " + table + "-chest. Deleted " + deleted + " entries."); log.info("[LogBlock] Cleared out table " + table + "-chest. Deleted " + deleted + " entries.");
} }
} }
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock] SQL exception", ex);
} finally { } finally {
try { try {
@@ -70,7 +70,7 @@ public class ClearLog implements Runnable
state.close(); state.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock] SQL exception on close", ex);
} }
} }

View File

@@ -38,9 +38,9 @@ public class Config {
} }
Config (LogBlock logblock) throws Exception { Config (LogBlock logblock) throws Exception {
Configuration config = logblock.getConfiguration(); final Configuration config = logblock.getConfiguration();
config.load(); config.load();
List<String> keys = config.getKeys(null); final List<String> keys = config.getKeys(null);
List<String> subkeys; List<String> subkeys;
if (!keys.contains("version")) if (!keys.contains("version"))
config.setProperty("version", logblock.getDescription().getVersion()); config.setProperty("version", logblock.getDescription().getVersion());
@@ -133,7 +133,7 @@ public class Config {
logKills = config.getBoolean("logging.logKills", false); logKills = config.getBoolean("logging.logKills", false);
try { try {
logKillsLevel = LogKillsLevel.valueOf(config.getString("logging.logKillsLevel")); logKillsLevel = LogKillsLevel.valueOf(config.getString("logging.logKillsLevel"));
} catch (IllegalArgumentException ex) { } catch (final IllegalArgumentException ex) {
throw new Exception("lookup.toolblockID doesn't appear to be a valid log level. Allowed are 'PLAYERS', 'MONSTERS' and 'ANIMALS'"); throw new Exception("lookup.toolblockID doesn't appear to be a valid log level. Allowed are 'PLAYERS', 'MONSTERS' and 'ANIMALS'");
} }
dontRollback = config.getIntList("rollback.dontRollback", null); dontRollback = config.getIntList("rollback.dontRollback", null);
@@ -146,8 +146,8 @@ public class Config {
toolblockID = config.getInt("lookup.toolblockID", 7); toolblockID = config.getInt("lookup.toolblockID", 7);
if (Material.getMaterial(toolblockID) == null || !Material.getMaterial(toolblockID).isBlock() || toolblockID == 0) if (Material.getMaterial(toolblockID) == null || !Material.getMaterial(toolblockID).isBlock() || toolblockID == 0)
throw new Exception("lookup.toolblockID doesn't appear to be a valid block id"); throw new Exception("lookup.toolblockID doesn't appear to be a valid block id");
List<String> worldNames = config.getStringList("loggedWorlds", null); final List<String> worldNames = config.getStringList("loggedWorlds", null);
List<String> worldTables = config.getStringList("tables", null); final List<String> worldTables = config.getStringList("tables", null);
tables = new HashMap<Integer, String>(); tables = new HashMap<Integer, String>();
if (worldNames == null || worldTables == null || worldNames.size() == 0 || worldNames.size() != worldTables.size()) if (worldNames == null || worldTables == null || worldNames.size() == 0 || worldNames.size() != worldTables.size())
throw new Exception("worldNames or worldTables not set porperly"); throw new Exception("worldNames or worldTables not set porperly");

View File

@@ -32,7 +32,6 @@ public class Consumer extends TimerTask implements Runnable
private final HashSet<Integer> hiddenplayers = new HashSet<Integer>(); private final HashSet<Integer> hiddenplayers = new HashSet<Integer>();
private final HashMap<Integer, Integer> lastAttackedEntity = new HashMap<Integer, Integer>(); private final HashMap<Integer, Integer> lastAttackedEntity = new HashMap<Integer, Integer>();
private final HashMap<Integer, Long> lastAttackTime = new HashMap<Integer, Long>(); private final HashMap<Integer, Long> lastAttackTime = new HashMap<Integer, Long>();
Consumer (LogBlock logblock) { Consumer (LogBlock logblock) {
this.logblock = logblock; this.logblock = logblock;
@@ -55,7 +54,6 @@ public class Consumer extends TimerTask implements Runnable
queueBlock(playerName, loc, typeBefore, 0, dataBefore); queueBlock(playerName, loc, typeBefore, 0, dataBefore);
} }
/** /**
* Logs a block place. The block type before is assumed to be o (air). * Logs a block place. The block type before is assumed to be o (air).
* @param after Blockstate of the block after actually being placed. * @param after Blockstate of the block after actually being placed.
@@ -153,7 +151,7 @@ public class Consumer extends TimerTask implements Runnable
playerName = playerName.substring(0, 32); playerName = playerName.substring(0, 32);
if (signtext != null) if (signtext != null)
signtext = signtext.replace("\\", "\\\\").replace("'", "\\'"); signtext = signtext.replace("\\", "\\\\").replace("'", "\\'");
BlockRow row = new BlockRow(loc.getWorld().getName().hashCode(), playerName, typeBefore, typeAfter, data, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), signtext, ca); final BlockRow row = new BlockRow(loc.getWorld().getName().hashCode(), playerName, typeBefore, typeAfter, data, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), signtext, ca);
if (!bqueue.offer(row)) if (!bqueue.offer(row))
log.info("[LogBlock] Failed to queue block for " + playerName); log.info("[LogBlock] Failed to queue block for " + playerName);
} }
@@ -192,7 +190,7 @@ public class Consumer extends TimerTask implements Runnable
} }
boolean hide(Player player) { boolean hide(Player player) {
int hash = player.getName().hashCode(); final int hash = player.getName().hashCode();
if (hiddenplayers.contains(hash)) { if (hiddenplayers.contains(hash)) {
hiddenplayers.remove(hash); hiddenplayers.remove(hash);
return false; return false;
@@ -202,19 +200,20 @@ public class Consumer extends TimerTask implements Runnable
} }
} }
@Override
public synchronized void run() { public synchronized void run() {
Connection conn = logblock.getConnection(); final Connection conn = logblock.getConnection();
if (conn == null) if (conn == null)
return; return;
Statement state = null; Statement state = null;
BlockRow b; KillRow k; String table; BlockRow b; KillRow k; String table;
int count = 0; int count = 0;
if (bqueue.size() > 100) if (bqueue.size() > 100)
log.info("[LogBlock Consumer] Queue overloaded. Size: " + bqueue.size()); log.info("[LogBlock Consumer] Queue overloaded. Size: " + bqueue.size());
try { try {
conn.setAutoCommit(false); conn.setAutoCommit(false);
state = conn.createStatement(); state = conn.createStatement();
long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
while (count < 1000 && !bqueue.isEmpty() && (System.currentTimeMillis() - start < 100 || count < 100)) { while (count < 1000 && !bqueue.isEmpty() && (System.currentTimeMillis() - start < 100 || count < 100)) {
b = bqueue.poll(); b = bqueue.poll();
if (b == null) if (b == null)
@@ -222,13 +221,13 @@ public class Consumer extends TimerTask implements Runnable
table = config.tables.get(b.worldHash); table = config.tables.get(b.worldHash);
state.execute("INSERT INTO `" + table + "` (date, playerid, replaced, type, data, x, y, z) SELECT now(), playerid, " + b.replaced + ", " + b.type + ", " + b.data + ", '" + b.x + "', " + b.y + ", '" + b.z + "' FROM `lb-players` WHERE playername = '" + b.name + "'", Statement.RETURN_GENERATED_KEYS); state.execute("INSERT INTO `" + table + "` (date, playerid, replaced, type, data, x, y, z) SELECT now(), playerid, " + b.replaced + ", " + b.type + ", " + b.data + ", '" + b.x + "', " + b.y + ", '" + b.z + "' FROM `lb-players` WHERE playername = '" + b.name + "'", Statement.RETURN_GENERATED_KEYS);
if (b.signtext != null) { if (b.signtext != null) {
ResultSet keys = state.getGeneratedKeys(); final ResultSet keys = state.getGeneratedKeys();
if (keys.next()) if (keys.next())
state.execute("INSERT INTO `" + table + "-sign` (id, signtext) values (" + keys.getInt(1) + ", '" + b.signtext + "')"); state.execute("INSERT INTO `" + table + "-sign` (id, signtext) values (" + keys.getInt(1) + ", '" + b.signtext + "')");
else else
log.severe("[LogBlock Consumer] Failed to get generated keys"); log.severe("[LogBlock Consumer] Failed to get generated keys");
} else if (b.ca != null) { } else if (b.ca != null) {
ResultSet keys = state.getGeneratedKeys(); final ResultSet keys = state.getGeneratedKeys();
if (keys.next()) if (keys.next())
state.execute("INSERT INTO `" + table + "-chest` (id, intype, inamount, outtype, outamount) values (" + keys.getInt(1) + ", " + b.ca.inType + ", " + b.ca.inAmount + ", " + b.ca.outType + ", " + b.ca.outAmount + ")"); state.execute("INSERT INTO `" + table + "-chest` (id, intype, inamount, outtype, outamount) values (" + keys.getInt(1) + ", " + b.ca.inType + ", " + b.ca.inAmount + ", " + b.ca.outType + ", " + b.ca.outAmount + ")");
else else
@@ -244,7 +243,7 @@ public class Consumer extends TimerTask implements Runnable
state.execute("INSERT INTO `" + config.tables.get(k.worldHash) + "-kills` (date, killer, victim, weapon) SELECT now(), playerid, (SELECT playerid FROM `lb-players` WHERE playername = '" + k.victim + "'), " + k.weapon + " FROM `lb-players` WHERE playername = '" + k.killer + "'"); state.execute("INSERT INTO `" + config.tables.get(k.worldHash) + "-kills` (date, killer, victim, weapon) SELECT now(), playerid, (SELECT playerid FROM `lb-players` WHERE playername = '" + k.victim + "'), " + k.weapon + " FROM `lb-players` WHERE playername = '" + k.killer + "'");
} }
conn.commit(); conn.commit();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock Consumer] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock Consumer] SQL exception", ex);
} finally { } finally {
try { try {
@@ -252,7 +251,7 @@ public class Consumer extends TimerTask implements Runnable
conn.close(); conn.close();
if (state != null) if (state != null)
state.close(); state.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock Consumer] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock Consumer] SQL exception on close", ex);
} }
} }
@@ -312,8 +311,8 @@ public class Consumer extends TimerTask implements Runnable
KillRow(int worldHash, String attacker, String defender, int weapon) { KillRow(int worldHash, String attacker, String defender, int weapon) {
this.worldHash = worldHash; this.worldHash = worldHash;
this.killer = attacker; killer = attacker;
this.victim = defender; victim = defender;
this.weapon = weapon; this.weapon = weapon;
} }
@@ -328,7 +327,7 @@ public class Consumer extends TimerTask implements Runnable
return true; return true;
if (obj == null) if (obj == null)
return false; return false;
KillRow k = (KillRow)obj; final KillRow k = (KillRow)obj;
if (!killer.equals(k.killer)) if (!killer.equals(k.killer))
return false; return false;
if (!victim.equals(k.victim)) if (!victim.equals(k.victim))

View File

@@ -18,26 +18,31 @@ public class LBBlockListener extends BlockListener
consumer = logblock.getConsumer(); consumer = logblock.getConsumer();
} }
@Override
public void onBlockPlace(BlockPlaceEvent event) { public void onBlockPlace(BlockPlaceEvent event) {
if (!event.isCancelled() && !(config.logSignTexts && (event.getBlock().getType() == Material.WALL_SIGN || event.getBlock().getType() == Material.SIGN_POST))) if (!event.isCancelled() && !(config.logSignTexts && (event.getBlock().getType() == Material.WALL_SIGN || event.getBlock().getType() == Material.SIGN_POST)))
consumer.queueBlock(event.getPlayer().getName(), event.getBlock().getLocation(), event.getBlockReplacedState().getTypeId(), event.getBlockPlaced().getTypeId(), event.getBlockPlaced().getData()); consumer.queueBlock(event.getPlayer().getName(), event.getBlock().getLocation(), event.getBlockReplacedState().getTypeId(), event.getBlockPlaced().getTypeId(), event.getBlockPlaced().getData());
} }
@Override
public void onBlockBreak(BlockBreakEvent event) { public void onBlockBreak(BlockBreakEvent event) {
if (!event.isCancelled()) if (!event.isCancelled())
consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlock().getState()); consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlock().getState());
} }
@Override
public void onSignChange(SignChangeEvent event) { public void onSignChange(SignChangeEvent event) {
if (!event.isCancelled()) if (!event.isCancelled())
consumer.queueSign(event.getPlayer().getName(), event.getBlock().getLocation(), event.getBlock().getTypeId(), event.getBlock().getData(), "sign [" + event.getLine(0) + "] [" + event.getLine(1) + "] [" + event.getLine(2) + "] [" + event.getLine(3) + "]"); consumer.queueSign(event.getPlayer().getName(), event.getBlock().getLocation(), event.getBlock().getTypeId(), event.getBlock().getData(), "sign [" + event.getLine(0) + "] [" + event.getLine(1) + "] [" + event.getLine(2) + "] [" + event.getLine(3) + "]");
} }
@Override
public void onBlockBurn(BlockBurnEvent event) { public void onBlockBurn(BlockBurnEvent event) {
if (!event.isCancelled()) if (!event.isCancelled())
consumer.queueBlockBreak("Fire", event.getBlock().getState()); consumer.queueBlockBreak("Fire", event.getBlock().getState());
} }
@Override
public void onLeavesDecay(LeavesDecayEvent event) { public void onLeavesDecay(LeavesDecayEvent event) {
if (!event.isCancelled()) if (!event.isCancelled())
consumer.queueBlockBreak("LeavesDecay", event.getBlock().getState()); consumer.queueBlockBreak("LeavesDecay", event.getBlock().getState());

View File

@@ -23,27 +23,29 @@ public class LBEntityListener extends EntityListener
consumer = logblock.getConsumer(); consumer = logblock.getConsumer();
} }
@Override
public void onEntityExplode(EntityExplodeEvent event) { public void onEntityExplode(EntityExplodeEvent event) {
if (!event.isCancelled()) { if (!event.isCancelled()) {
String name; String name;
if (event.getEntity() instanceof TNTPrimed) if (event.getEntity() instanceof TNTPrimed)
name = "TNT"; name = "TNT";
else if (event.getEntity() instanceof Creeper) else if (event.getEntity() instanceof Creeper)
name = "Creeper"; name = "Creeper";
else if (event.getEntity() instanceof Fireball) else if (event.getEntity() instanceof Fireball)
name = "Ghast"; name = "Ghast";
else else
name = "Environment"; name = "Environment";
for (Block block : event.blockList()) for (final Block block : event.blockList())
consumer.queueBlockBreak(name, block.getState()); consumer.queueBlockBreak(name, block.getState());
} }
} }
@Override
public void onEntityDamage(EntityDamageEvent event) { public void onEntityDamage(EntityDamageEvent event) {
if (event.isCancelled() || !(event instanceof EntityDamageByEntityEvent) || !(event.getEntity() instanceof LivingEntity)) if (event.isCancelled() || !(event instanceof EntityDamageByEntityEvent) || !(event.getEntity() instanceof LivingEntity))
return; return;
LivingEntity victim = (LivingEntity)event.getEntity(); final LivingEntity victim = (LivingEntity)event.getEntity();
Entity killer = ((EntityDamageByEntityEvent)event).getDamager(); final Entity killer = ((EntityDamageByEntityEvent)event).getDamager();
if (victim.getHealth() - event.getDamage() > 0 || victim.getHealth() <= 0 ) if (victim.getHealth() - event.getDamage() > 0 || victim.getHealth() <= 0 )
return; return;
if (config.logKillsLevel == Config.LogKillsLevel.PLAYERS && !(victim instanceof Player && killer instanceof Player)) if (config.logKillsLevel == Config.LogKillsLevel.PLAYERS && !(victim instanceof Player && killer instanceof Player))

View File

@@ -26,16 +26,19 @@ public class LBPlayerListener extends PlayerListener
consumer = logblock.getConsumer(); consumer = logblock.getConsumer();
} }
@Override
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
if (!event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_BLOCK && (event.getClickedBlock().getType() == Material.CHEST || event.getClickedBlock().getType() == Material.FURNACE ||event.getClickedBlock().getType() == Material.DISPENSER)) if (!event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_BLOCK && (event.getClickedBlock().getType() == Material.CHEST || event.getClickedBlock().getType() == Material.FURNACE ||event.getClickedBlock().getType() == Material.DISPENSER))
consumer.queueChestAccess(event.getPlayer().getName(), event.getClickedBlock().getLocation(), event.getClickedBlock().getTypeId(),(short)0, (byte)0, (short)0, (byte)0); consumer.queueChestAccess(event.getPlayer().getName(), event.getClickedBlock().getLocation(), event.getClickedBlock().getTypeId(),(short)0, (byte)0, (short)0, (byte)0);
} }
@Override
public void onPlayerBucketFill(PlayerBucketFillEvent event) { public void onPlayerBucketFill(PlayerBucketFillEvent event) {
if (!event.isCancelled()) if (!event.isCancelled())
consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlockClicked().getState()); consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlockClicked().getState());
} }
@Override
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) {
if (event.getBucket() == Material.WATER_BUCKET) if (event.getBucket() == Material.WATER_BUCKET)
consumer.queueBlockPlace(event.getPlayer().getName(), event.getBlockClicked().getFace(event.getBlockFace()).getLocation(), 9, (byte)0); consumer.queueBlockPlace(event.getPlayer().getName(), event.getBlockClicked().getFace(event.getBlockFace()).getLocation(), 9, (byte)0);
@@ -43,15 +46,16 @@ public class LBPlayerListener extends PlayerListener
consumer.queueBlockPlace(event.getPlayer().getName(), event.getBlockClicked().getFace(event.getBlockFace()).getLocation(), 11, (byte)0); consumer.queueBlockPlace(event.getPlayer().getName(), event.getBlockClicked().getFace(event.getBlockFace()).getLocation(), 11, (byte)0);
} }
@Override
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
Connection conn = logblock.getConnection(); final Connection conn = logblock.getConnection();
if (conn == null) if (conn == null)
return; return;
Statement state = null; Statement state = null;
try { try {
state = conn.createStatement(); state = conn.createStatement();
state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('" + event.getPlayer().getName() + "');"); state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('" + event.getPlayer().getName() + "');");
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock] SQL exception", ex);
} finally { } finally {
try { try {
@@ -59,7 +63,7 @@ public class LBPlayerListener extends PlayerListener
state.close(); state.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock] SQL exception on close", ex);
} }
} }

View File

@@ -15,6 +15,7 @@ public class LBToolPlayerListener extends PlayerListener
config = logblock.getConfig(); config = logblock.getConfig();
} }
@Override
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
if (!event.isCancelled()) { if (!event.isCancelled()) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == config.toolID && logblock.checkPermission(event.getPlayer(), "logblock.lookup")) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == config.toolID && logblock.checkPermission(event.getPlayer(), "logblock.lookup")) {

View File

@@ -55,12 +55,12 @@ public class LogBlock extends JavaPlugin
log = getServer().getLogger(); log = getServer().getLogger();
try { try {
config = new Config(this); config = new Config(this);
} catch (Exception ex) { } catch (final Exception ex) {
log.log(Level.SEVERE, "[LogBlock] Exception while reading config:", ex); log.log(Level.SEVERE, "[LogBlock] Exception while reading config:", ex);
errorAtLoading = true; errorAtLoading = true;
return; return;
} }
File file = new File("lib/mysql-connector-java-bin.jar"); final File file = new File("lib/mysql-connector-java-bin.jar");
try { try {
if (!file.exists() || file.length() == 0) { if (!file.exists() || file.length() == 0) {
log.info("[LogBlock] Downloading " + file.getName() + "..."); log.info("[LogBlock] Downloading " + file.getName() + "...");
@@ -68,16 +68,16 @@ public class LogBlock extends JavaPlugin
} }
if (!file.exists() || file.length() == 0) if (!file.exists() || file.length() == 0)
throw new FileNotFoundException(file.getAbsolutePath() + file.getName()); throw new FileNotFoundException(file.getAbsolutePath() + file.getName());
} catch (Exception e) { } catch (final Exception e) {
log.log(Level.SEVERE, "[LogBlock] Error while downloading " + file.getName() + "."); log.log(Level.SEVERE, "[LogBlock] Error while downloading " + file.getName() + ".");
errorAtLoading = true; errorAtLoading = true;
return; return;
} }
try { try {
pool = new ConnectionPool("com.mysql.jdbc.Driver", config.url, config.user, config.password); pool = new ConnectionPool("com.mysql.jdbc.Driver", config.url, config.user, config.password);
Connection conn = getConnection(); final Connection conn = getConnection();
conn.close(); conn.close();
} catch (Exception ex) { } catch (final Exception ex) {
log.log(Level.SEVERE, "[LogBlock] Exception while checking database connection", ex); log.log(Level.SEVERE, "[LogBlock] Exception while checking database connection", ex);
errorAtLoading = true; errorAtLoading = true;
return; return;
@@ -103,10 +103,10 @@ public class LogBlock extends JavaPlugin
log.info("[LogBlock] Permissions plugin not found. Using default permissions."); log.info("[LogBlock] Permissions plugin not found. Using default permissions.");
if (config.keepLogDays >= 0) if (config.keepLogDays >= 0)
new Thread(new ClearLog(this)).start(); new Thread(new ClearLog(this)).start();
LBBlockListener lbBlockListener = new LBBlockListener(this); final LBBlockListener lbBlockListener = new LBBlockListener(this);
LBPlayerListener lbPlayerListener = new LBPlayerListener(this); final LBPlayerListener lbPlayerListener = new LBPlayerListener(this);
LBEntityListener lbEntityListener = new LBEntityListener(this); final LBEntityListener lbEntityListener = new LBEntityListener(this);
PluginManager pm = getServer().getPluginManager(); final PluginManager pm = getServer().getPluginManager();
pm.registerEvent(Type.PLAYER_INTERACT, new LBToolPlayerListener(this), Priority.Normal, this); pm.registerEvent(Type.PLAYER_INTERACT, new LBToolPlayerListener(this), Priority.Normal, this);
pm.registerEvent(Type.PLAYER_JOIN, lbPlayerListener, Priority.Monitor, this); pm.registerEvent(Type.PLAYER_JOIN, lbPlayerListener, Priority.Monitor, this);
if (config.logBlockCreations) { if (config.logBlockCreations) {
@@ -121,7 +121,7 @@ public class LogBlock extends JavaPlugin
pm.registerEvent(Type.SIGN_CHANGE, lbBlockListener, Priority.Monitor, this); pm.registerEvent(Type.SIGN_CHANGE, lbBlockListener, Priority.Monitor, this);
if (config.logFire) if (config.logFire)
pm.registerEvent(Type.BLOCK_BURN, lbBlockListener, Priority.Monitor, this); pm.registerEvent(Type.BLOCK_BURN, lbBlockListener, Priority.Monitor, this);
if (config.logExplosions) if (config.logExplosions)
pm.registerEvent(Type.ENTITY_EXPLODE, lbEntityListener, Priority.Monitor, this); pm.registerEvent(Type.ENTITY_EXPLODE, lbEntityListener, Priority.Monitor, this);
if (config.logLeavesDecay) if (config.logLeavesDecay)
pm.registerEvent(Type.LEAVES_DECAY, lbBlockListener, Priority.Monitor, this); pm.registerEvent(Type.LEAVES_DECAY, lbBlockListener, Priority.Monitor, this);
@@ -151,7 +151,7 @@ public class LogBlock extends JavaPlugin
timer.cancel(); timer.cancel();
if (consumer != null && consumer.getQueueSize() > 0) { if (consumer != null && consumer.getQueueSize() > 0) {
log.info("[LogBlock] Waiting for consumer ..."); log.info("[LogBlock] Waiting for consumer ...");
Thread thread = new Thread(consumer); final Thread thread = new Thread(consumer);
while (consumer.getQueueSize() > 0) { while (consumer.getQueueSize() > 0) {
log.info("[LogBlock] Remaining queue size: " + consumer.getQueueSize()); log.info("[LogBlock] Remaining queue size: " + consumer.getQueueSize());
thread.run(); thread.run();
@@ -168,52 +168,52 @@ public class LogBlock extends JavaPlugin
sender.sendMessage("You aren't a player"); sender.sendMessage("You aren't a player");
return true; return true;
} }
Player player = (Player)sender; final Player player = (Player)sender;
if (args.length == 0) { if (args.length == 0) {
player.sendMessage(ChatColor.LIGHT_PURPLE + "LogBlock v" + getDescription().getVersion() + " by DiddiZ"); player.sendMessage(ChatColor.LIGHT_PURPLE + "LogBlock v" + getDescription().getVersion() + " by DiddiZ");
player.sendMessage(ChatColor.LIGHT_PURPLE + "Type /lb help for help"); player.sendMessage(ChatColor.LIGHT_PURPLE + "Type /lb help for help");
} else if (args[0].equalsIgnoreCase("tool")) { } else if (args[0].equalsIgnoreCase("tool")) {
if (checkPermission(player, "logblock.tool")) { if (checkPermission(player, "logblock.tool")) {
if (player.getInventory().contains(config.toolID)) if (player.getInventory().contains(config.toolID))
player.sendMessage(ChatColor.RED + "You have alredy a tool"); player.sendMessage(ChatColor.RED + "You have alredy a tool");
else { else {
int free = player.getInventory().firstEmpty(); final int free = player.getInventory().firstEmpty();
if (free >= 0) { if (free >= 0) {
player.getInventory().setItem(free, player.getItemInHand()); player.getInventory().setItem(free, player.getItemInHand());
player.setItemInHand(new ItemStack(config.toolID, 1)); player.setItemInHand(new ItemStack(config.toolID, 1));
player.sendMessage(ChatColor.GREEN + "Here is your tool."); player.sendMessage(ChatColor.GREEN + "Here is your tool.");
} else } else
player.sendMessage(ChatColor.RED + "You have no empty slot in your inventory"); player.sendMessage(ChatColor.RED + "You have no empty slot in your inventory");
} }
} else } else
player.sendMessage(ChatColor.RED + "You aren't allowed to do this."); player.sendMessage(ChatColor.RED + "You aren't allowed to do this.");
} else if (args[0].equalsIgnoreCase("toolblock")) { } else if (args[0].equalsIgnoreCase("toolblock")) {
if (checkPermission(player, "logblock.toolblock")) { if (checkPermission(player, "logblock.toolblock")) {
if (player.getInventory().contains(config.toolblockID)) if (player.getInventory().contains(config.toolblockID))
player.sendMessage(ChatColor.RED + "You have alredy a tool"); player.sendMessage(ChatColor.RED + "You have alredy a tool");
else { else {
int free = player.getInventory().firstEmpty(); final int free = player.getInventory().firstEmpty();
if (free >= 0) { if (free >= 0) {
player.getInventory().setItem(free, player.getItemInHand()); player.getInventory().setItem(free, player.getItemInHand());
player.setItemInHand(new ItemStack(config.toolblockID, 1)); player.setItemInHand(new ItemStack(config.toolblockID, 1));
player.sendMessage(ChatColor.GREEN + "Here's your tool."); player.sendMessage(ChatColor.GREEN + "Here's your tool.");
} else } else
player.sendMessage(ChatColor.RED + "You have no empty slot in your inventory"); player.sendMessage(ChatColor.RED + "You have no empty slot in your inventory");
} }
} else } else
player.sendMessage(ChatColor.RED + "You aren't allowed to do this."); player.sendMessage(ChatColor.RED + "You aren't allowed to do this.");
} else if (args[0].equalsIgnoreCase("hide")) { } else if (args[0].equalsIgnoreCase("hide")) {
if (checkPermission(player, "logblock.hide")) { if (checkPermission(player, "logblock.hide")) {
if (consumer.hide(player)) if (consumer.hide(player))
player.sendMessage(ChatColor.GREEN + "You are now hided and won't appear in any log. Type '/lb hide' again to unhide"); player.sendMessage(ChatColor.GREEN + "You are now hided and won't appear in any log. Type '/lb hide' again to unhide");
else else
player.sendMessage(ChatColor.GREEN + "You aren't hided anylonger."); player.sendMessage(ChatColor.GREEN + "You aren't hided anylonger.");
} else } else
player.sendMessage(ChatColor.RED + "You aren't allowed to do this."); player.sendMessage(ChatColor.RED + "You aren't allowed to do this.");
} else if (args[0].equalsIgnoreCase("savequeue")) { } else if (args[0].equalsIgnoreCase("savequeue")) {
if (checkPermission(player, "logblock.rollback")) { if (checkPermission(player, "logblock.rollback")) {
player.sendMessage(ChatColor.DARK_AQUA + "Current queue size: " + consumer.getQueueSize()); player.sendMessage(ChatColor.DARK_AQUA + "Current queue size: " + consumer.getQueueSize());
Thread thread = new Thread(consumer); final Thread thread = new Thread(consumer);
while (consumer.getQueueSize() > 0) { while (consumer.getQueueSize() > 0) {
thread.run(); thread.run();
} }
@@ -240,14 +240,14 @@ public class LogBlock extends JavaPlugin
if (args.length == 3 && isInt(args[2])) if (args.length == 3 && isInt(args[2]))
radius = Integer.parseInt(args[2]); radius = Integer.parseInt(args[2]);
new Thread(new PlayerAreaStats(this, player, args[1], radius)).start(); new Thread(new PlayerAreaStats(this, player, args[1], radius)).start();
} else } else
player.sendMessage(ChatColor.RED + "Usage: /lb player [name] <radius>"); player.sendMessage(ChatColor.RED + "Usage: /lb player [name] <radius>");
} else } else
player.sendMessage(ChatColor.RED + "You aren't allowed to do this"); player.sendMessage(ChatColor.RED + "You aren't allowed to do this");
} else if (args[0].equalsIgnoreCase("block")) { } else if (args[0].equalsIgnoreCase("block")) {
if (checkPermission(player,"logblock.area")) { if (checkPermission(player,"logblock.area")) {
if (args.length == 2 || args.length == 3) { if (args.length == 2 || args.length == 3) {
Material mat = Material.matchMaterial(args[1]); final Material mat = Material.matchMaterial(args[1]);
int radius = config.defaultDist; int radius = config.defaultDist;
if (args.length == 3 && isInt(args[2])) if (args.length == 3 && isInt(args[2]))
radius = Integer.parseInt(args[2]); radius = Integer.parseInt(args[2]);
@@ -269,7 +269,7 @@ public class LogBlock extends JavaPlugin
minutes = parseTimeSpec(args[3], args[4]); minutes = parseTimeSpec(args[3], args[4]);
player.sendMessage(ChatColor.GREEN + "Rolling back " + args[2] + " by " + minutes + " minutes."); player.sendMessage(ChatColor.GREEN + "Rolling back " + args[2] + " by " + minutes + " minutes.");
getServer().getScheduler().scheduleAsyncDelayedTask(this, new Rollback(this, player, args[2], -1, null, minutes, false)); getServer().getScheduler().scheduleAsyncDelayedTask(this, new Rollback(this, player, args[2], -1, null, minutes, false));
} else } else
player.sendMessage(ChatColor.RED + "Usage: /lb rollback player [name] <time> <minutes|hours|days>"); player.sendMessage(ChatColor.RED + "Usage: /lb rollback player [name] <time> <minutes|hours|days>");
} else if (args[1].equalsIgnoreCase("area")) { } else if (args[1].equalsIgnoreCase("area")) {
if (args.length == 3 || args.length == 5) { if (args.length == 3 || args.length == 5) {
@@ -297,9 +297,9 @@ public class LogBlock extends JavaPlugin
if (args.length == 2 || args.length == 4) { if (args.length == 2 || args.length == 4) {
if (args.length == 4) if (args.length == 4)
minutes = parseTimeSpec(args[2], args[3]); minutes = parseTimeSpec(args[2], args[3]);
Plugin we = getServer().getPluginManager().getPlugin("WorldEdit"); final Plugin we = getServer().getPluginManager().getPlugin("WorldEdit");
if (we != null) { if (we != null) {
Selection sel = ((WorldEditPlugin)we).getSelection(player); final Selection sel = ((WorldEditPlugin)we).getSelection(player);
if (sel != null) { if (sel != null) {
if (sel instanceof CuboidSelection) { if (sel instanceof CuboidSelection) {
player.sendMessage(ChatColor.GREEN + "Rolling back selection by " + minutes + " minutes."); player.sendMessage(ChatColor.GREEN + "Rolling back selection by " + minutes + " minutes.");
@@ -310,7 +310,7 @@ public class LogBlock extends JavaPlugin
player.sendMessage(ChatColor.RED + "No selection defined"); player.sendMessage(ChatColor.RED + "No selection defined");
} else } else
player.sendMessage(ChatColor.RED + "WorldEdit plugin not found"); player.sendMessage(ChatColor.RED + "WorldEdit plugin not found");
} else } else
player.sendMessage(ChatColor.RED + "Usage: /lb rollback selection <time> <minutes|hours|days>"); player.sendMessage(ChatColor.RED + "Usage: /lb rollback selection <time> <minutes|hours|days>");
} else } else
player.sendMessage(ChatColor.RED + "Wrong rollback mode"); player.sendMessage(ChatColor.RED + "Wrong rollback mode");
@@ -333,7 +333,7 @@ public class LogBlock extends JavaPlugin
minutes = parseTimeSpec(args[3], args[4]); minutes = parseTimeSpec(args[3], args[4]);
player.sendMessage(ChatColor.GREEN + "Redoing " + args[2] + " for " + minutes + " minutes."); player.sendMessage(ChatColor.GREEN + "Redoing " + args[2] + " for " + minutes + " minutes.");
getServer().getScheduler().scheduleAsyncDelayedTask(this, new Rollback(this, player, args[2], -1, null, minutes, true)); getServer().getScheduler().scheduleAsyncDelayedTask(this, new Rollback(this, player, args[2], -1, null, minutes, true));
} else } else
player.sendMessage(ChatColor.RED + "Usage: /lb redo player [name] <time> <minutes|hours|days>"); player.sendMessage(ChatColor.RED + "Usage: /lb redo player [name] <time> <minutes|hours|days>");
} else if (args[1].equalsIgnoreCase("area")) { } else if (args[1].equalsIgnoreCase("area")) {
if (args.length == 3 || args.length == 5) { if (args.length == 3 || args.length == 5) {
@@ -361,9 +361,9 @@ public class LogBlock extends JavaPlugin
if (args.length == 2 || args.length == 4) { if (args.length == 2 || args.length == 4) {
if (args.length == 4) if (args.length == 4)
minutes = parseTimeSpec(args[2], args[3]); minutes = parseTimeSpec(args[2], args[3]);
Plugin we = getServer().getPluginManager().getPlugin("WorldEdit"); final Plugin we = getServer().getPluginManager().getPlugin("WorldEdit");
if (we != null) { if (we != null) {
Selection sel = ((WorldEditPlugin)we).getSelection(player); final Selection sel = ((WorldEditPlugin)we).getSelection(player);
if (sel != null) { if (sel != null) {
if (sel instanceof CuboidSelection) { if (sel instanceof CuboidSelection) {
player.sendMessage(ChatColor.GREEN + "Redoing selection for " + minutes + " minutes."); player.sendMessage(ChatColor.GREEN + "Redoing selection for " + minutes + " minutes.");
@@ -374,7 +374,7 @@ public class LogBlock extends JavaPlugin
player.sendMessage(ChatColor.RED + "No selection defined"); player.sendMessage(ChatColor.RED + "No selection defined");
} else } else
player.sendMessage(ChatColor.RED + "WorldEdit plugin not found"); player.sendMessage(ChatColor.RED + "WorldEdit plugin not found");
} else } else
player.sendMessage(ChatColor.RED + "Usage: /lb redo selection <time> <minutes|hours|days>"); player.sendMessage(ChatColor.RED + "Usage: /lb redo selection <time> <minutes|hours|days>");
} else } else
player.sendMessage(ChatColor.RED + "Wrong redo mode"); player.sendMessage(ChatColor.RED + "Wrong redo mode");
@@ -424,12 +424,12 @@ public class LogBlock extends JavaPlugin
} }
private boolean checkTables() { private boolean checkTables() {
Connection conn = getConnection(); final Connection conn = getConnection();
Statement state = null; Statement state = null;
if (conn == null) if (conn == null)
return false; return false;
try { try {
DatabaseMetaData dbm = conn.getMetaData(); final DatabaseMetaData dbm = conn.getMetaData();
state = conn.createStatement(); state = conn.createStatement();
if (!dbm.getTables(null, null, "lb-players", null).next()) { if (!dbm.getTables(null, null, "lb-players", null).next()) {
log.log(Level.INFO, "[LogBlock] Crating table lb-players."); log.log(Level.INFO, "[LogBlock] Crating table lb-players.");
@@ -438,7 +438,7 @@ public class LogBlock extends JavaPlugin
return false; return false;
state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('TNT'), ('Creeper'), ('Fire'), ('LeavesDecay'), ('Ghast'), ('Environment')"); state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('TNT'), ('Creeper'), ('Fire'), ('LeavesDecay'), ('Ghast'), ('Environment')");
} }
for (String table : config.tables.values()) { for (final String table : config.tables.values()) {
if (!dbm.getTables(null, null, table, null).next()) { if (!dbm.getTables(null, null, table, null).next()) {
log.log(Level.INFO, "[LogBlock] Crating table " + table + "."); log.log(Level.INFO, "[LogBlock] Crating table " + table + ".");
state.execute("CREATE TABLE `" + table + "` (id INT NOT NULL AUTO_INCREMENT, date DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', playerid SMALLINT UNSIGNED NOT NULL DEFAULT '0', replaced TINYINT UNSIGNED NOT NULL DEFAULT '0', type TINYINT UNSIGNED NOT NULL DEFAULT '0', data TINYINT UNSIGNED NOT NULL DEFAULT '0', x SMALLINT NOT NULL DEFAULT '0', y TINYINT UNSIGNED NOT NULL DEFAULT '0', z SMALLINT NOT NULL DEFAULT '0', PRIMARY KEY (id), KEY coords (y, x, z), KEY date (date));"); state.execute("CREATE TABLE `" + table + "` (id INT NOT NULL AUTO_INCREMENT, date DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', playerid SMALLINT UNSIGNED NOT NULL DEFAULT '0', replaced TINYINT UNSIGNED NOT NULL DEFAULT '0', type TINYINT UNSIGNED NOT NULL DEFAULT '0', data TINYINT UNSIGNED NOT NULL DEFAULT '0', x SMALLINT NOT NULL DEFAULT '0', y TINYINT UNSIGNED NOT NULL DEFAULT '0', z SMALLINT NOT NULL DEFAULT '0', PRIMARY KEY (id), KEY coords (y, x, z), KEY date (date));");
@@ -463,10 +463,10 @@ public class LogBlock extends JavaPlugin
if (!dbm.getTables(null, null, table + "-kills", null).next()) if (!dbm.getTables(null, null, table + "-kills", null).next())
return false; return false;
state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('Chicken'), ('Cow'), ('Creeper'), ('Ghast'), ('Giant'), ('Pig'), ('PigZombie'), ('Sheep'), ('Skeleton'), ('Slime'), ('Spider'), ('Squid'), ('Wolf'), ('Zombie')"); state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('Chicken'), ('Cow'), ('Creeper'), ('Ghast'), ('Giant'), ('Pig'), ('PigZombie'), ('Sheep'), ('Skeleton'), ('Slime'), ('Spider'), ('Squid'), ('Wolf'), ('Zombie')");
} }
} }
return true; return true;
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock] SQL exception while checking tables", ex); log.log(Level.SEVERE, "[LogBlock] SQL exception while checking tables", ex);
} finally { } finally {
try { try {
@@ -474,7 +474,7 @@ public class LogBlock extends JavaPlugin
state.close(); state.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock] SQL exception on close", ex);
} }
} }
@@ -496,7 +496,7 @@ public class LogBlock extends JavaPlugin
} }
static int parseTimeSpec(String timespec) { static int parseTimeSpec(String timespec) {
String[] split = timespec.split(" "); final String[] split = timespec.split(" ");
if (split.length != 2) if (split.length != 2)
return 0; return 0;
return parseTimeSpec(split[0], split[1]); return parseTimeSpec(split[0], split[1]);
@@ -506,13 +506,13 @@ public class LogBlock extends JavaPlugin
int min; int min;
try { try {
min = Integer.parseInt(time); min = Integer.parseInt(time);
} catch (NumberFormatException ex) { } catch (final NumberFormatException ex) {
return 0; return 0;
} }
if (unit.startsWith("hour")) if (unit.startsWith("hour"))
min *= 60; min *= 60;
else if (unit.startsWith("day")) else if (unit.startsWith("day"))
min *= (60*24); min *= 60*24;
return min; return min;
} }
@@ -520,15 +520,15 @@ public class LogBlock extends JavaPlugin
try { try {
Integer.parseInt(str); Integer.parseInt(str);
return true; return true;
} catch (NumberFormatException ex) { } catch (final NumberFormatException ex) {
return false; return false;
} }
} }
public Connection getConnection() { public Connection getConnection() {
try { try {
return pool.connect(ConnectionPool.URL_PREFIX, null); return pool.connect(ConnectionPool.URL_PREFIX, null);
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock] Error while fetching connection", ex); log.log(Level.SEVERE, "[LogBlock] Error while fetching connection", ex);
return null; return null;
} }

View File

@@ -29,6 +29,7 @@ public class PlayerAreaStats implements Runnable
table = logblock.getConfig().tables.get(player.getWorld().getName().hashCode()); table = logblock.getConfig().tables.get(player.getWorld().getName().hashCode());
} }
@Override
public void run() { public void run() {
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
@@ -64,7 +65,7 @@ public class PlayerAreaStats implements Runnable
player.sendMessage(ChatColor.GOLD + String.format("%-6d %-6d %s", rs.getInt("created"), rs.getInt("destroyed"), Material.getMaterial(rs.getInt("type")).toString().toLowerCase().replace('_', ' '))); player.sendMessage(ChatColor.GOLD + String.format("%-6d %-6d %s", rs.getInt("created"), rs.getInt("destroyed"), Material.getMaterial(rs.getInt("type")).toString().toLowerCase().replace('_', ' ')));
} }
} }
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock PlayerAreaStats] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock PlayerAreaStats] SQL exception", ex);
} finally { } finally {
try { try {
@@ -74,7 +75,7 @@ public class PlayerAreaStats implements Runnable
ps.close(); ps.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock PlayerAreaStats] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock PlayerAreaStats] SQL exception on close", ex);
} }
} }

View File

@@ -31,12 +31,12 @@ public class Rollback implements Runnable
log = logblock.getServer().getLogger(); log = logblock.getServer().getLogger();
conn = logblock.getConnection(); conn = logblock.getConnection();
config = logblock.getConfig(); config = logblock.getConfig();
StringBuffer sql = new StringBuffer(); final StringBuffer sql = new StringBuffer();
if (!redo) if (!redo)
sql.append("SELECT replaced, type, data, x, y, z "); sql.append("SELECT replaced, type, data, x, y, z ");
else else
sql.append("SELECT type AS replaced, replaced AS type, data, x, y, z "); sql.append("SELECT type AS replaced, replaced AS type, data, x, y, z ");
sql.append("FROM `" + logblock.getConfig().tables.get(player.getWorld().getName().hashCode()) + "` INNER JOIN `lb-players` USING (playerid) WHERE (type <> replaced OR (type = 0 AND replaced = 0)) AND "); sql.append("FROM `" + logblock.getConfig().tables.get(player.getWorld().getName().hashCode()) + "` INNER JOIN `lb-players` USING (playerid) WHERE (type <> replaced OR (type = 0 AND replaced = 0)) AND ");
if (name != null) if (name != null)
sql.append("playername = '" + name + "' AND "); sql.append("playername = '" + name + "' AND ");
if (radius != -1) if (radius != -1)
@@ -53,9 +53,10 @@ public class Rollback implements Runnable
query = sql.toString(); query = sql.toString();
} }
@Override
public void run() { public void run() {
ResultSet rs = null; ResultSet rs = null;
LinkedBlockingQueue<Edit> edits = new LinkedBlockingQueue<Edit>(); final LinkedBlockingQueue<Edit> edits = new LinkedBlockingQueue<Edit>();
edits.clear(); edits.clear();
try { try {
if (!config.tables.containsKey(player.getWorld().getName().hashCode())) { if (!config.tables.containsKey(player.getWorld().getName().hashCode())) {
@@ -64,10 +65,10 @@ public class Rollback implements Runnable
} }
rs = conn.createStatement().executeQuery(query); rs = conn.createStatement().executeQuery(query);
while (rs.next()) { while (rs.next()) {
Edit e = new Edit(rs.getInt("type"), rs.getInt("replaced"), rs.getByte("data"), rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), player.getWorld()); final Edit e = new Edit(rs.getInt("type"), rs.getInt("replaced"), rs.getByte("data"), rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), player.getWorld());
edits.offer(e); edits.offer(e);
} }
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock Rollback] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock Rollback] SQL exception", ex);
player.sendMessage(ChatColor.RED + "Error, check server logs."); player.sendMessage(ChatColor.RED + "Error, check server logs.");
return; return;
@@ -77,17 +78,17 @@ public class Rollback implements Runnable
rs.close(); rs.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock Rollback] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock Rollback] SQL exception on close", ex);
player.sendMessage(ChatColor.RED + "Error, check server logs."); player.sendMessage(ChatColor.RED + "Error, check server logs.");
return; return;
} }
} }
int changes = edits.size(); final int changes = edits.size();
player.sendMessage(ChatColor.GREEN + "" + changes + " Changes found."); player.sendMessage(ChatColor.GREEN + "" + changes + " Changes found.");
PerformRollback perform = new PerformRollback(edits, this); final PerformRollback perform = new PerformRollback(edits, this);
long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
int taskID = logblock.getServer().getScheduler().scheduleSyncRepeatingTask(logblock, perform, 0, 1); final int taskID = logblock.getServer().getScheduler().scheduleSyncRepeatingTask(logblock, perform, 0, 1);
if (taskID == -1) { if (taskID == -1) {
player.sendMessage(ChatColor.RED + "Failed to schedule rollback task"); player.sendMessage(ChatColor.RED + "Failed to schedule rollback task");
return; return;
@@ -95,7 +96,7 @@ public class Rollback implements Runnable
synchronized (this) { synchronized (this) {
try { try {
this.wait(); this.wait();
} catch (InterruptedException e) { } catch (final InterruptedException e) {
log.severe("[LogBlock Rollback] Interrupted"); log.severe("[LogBlock Rollback] Interrupted");
} }
} }
@@ -129,15 +130,15 @@ public class Rollback implements Runnable
while (!edits.isEmpty() && counter < 1000) while (!edits.isEmpty() && counter < 1000)
{ {
switch (edits.poll().perform()) { switch (edits.poll().perform()) {
case SUCCESS: case SUCCESS:
successes++; successes++;
break; break;
case ERROR: case ERROR:
errors++; errors++;
break; break;
case BLACKLISTED: case BLACKLISTED:
blacklisteds++; blacklisteds++;
break; break;
} }
counter++; counter++;
} }
@@ -152,7 +153,7 @@ public class Rollback implements Runnable
private enum PerformResult { private enum PerformResult {
ERROR, SUCCESS, BLACKLISTED, NO_ACTION ERROR, SUCCESS, BLACKLISTED, NO_ACTION
} }
private class Edit private class Edit
{ {
final int type, replaced; final int type, replaced;
@@ -174,22 +175,22 @@ public class Rollback implements Runnable
if (config.dontRollback.contains(replaced)) if (config.dontRollback.contains(replaced))
return PerformResult.BLACKLISTED; return PerformResult.BLACKLISTED;
try { try {
Block block = world.getBlockAt(x, y, z); final Block block = world.getBlockAt(x, y, z);
if (!world.isChunkLoaded(block.getChunk())) if (!world.isChunkLoaded(block.getChunk()))
world.loadChunk(block.getChunk()); world.loadChunk(block.getChunk());
if (equalsType(block.getTypeId(), type) || config.replaceAnyway.contains(block.getTypeId()) || (type == 0 && replaced == 0)) { if (equalsType(block.getTypeId(), type) || config.replaceAnyway.contains(block.getTypeId()) || type == 0 && replaced == 0) {
if (block.setTypeIdAndData(replaced, data, false)) if (block.setTypeIdAndData(replaced, data, false))
return PerformResult.SUCCESS; return PerformResult.SUCCESS;
else else
return PerformResult.ERROR; return PerformResult.ERROR;
} else } else
return PerformResult.NO_ACTION; return PerformResult.NO_ACTION;
} catch (Exception ex) { } catch (final Exception ex) {
log.severe("[LogBlock Rollback] " + ex.toString()); log.severe("[LogBlock Rollback] " + ex.toString());
return PerformResult.ERROR; return PerformResult.ERROR;
} }
} }
private boolean equalsType(int type1, int type2) { private boolean equalsType(int type1, int type2) {
if ((type1 == 2 || type1 == 3) && (type2 == 2 || type2 == 3)) if ((type1 == 2 || type1 == 3) && (type2 == 2 || type2 == 3))
return true; return true;

View File

@@ -35,8 +35,8 @@ public class WriteLogFile implements Runnable
public void run() { public void run() {
PreparedStatement ps = null; PreparedStatement ps = null;
ResultSet rs = null; ResultSet rs = null;
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss"); final SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss");
String newline = System.getProperty("line.separator"); final String newline = System.getProperty("line.separator");
String msg; String msg;
try { try {
if (conn == null) { if (conn == null) {
@@ -51,14 +51,14 @@ public class WriteLogFile implements Runnable
ps = conn.prepareStatement("SELECT * FROM `" + table + "` LEFT JOIN `" + table + "-sign` USING (id) INNER JOIN `lb-players` USING (playerid) WHERE playername = ? ORDER BY date ASC"); ps = conn.prepareStatement("SELECT * FROM `" + table + "` LEFT JOIN `" + table + "-sign` USING (id) INNER JOIN `lb-players` USING (playerid) WHERE playername = ? ORDER BY date ASC");
ps.setString(1, name); ps.setString(1, name);
rs = ps.executeQuery(); rs = ps.executeQuery();
File file = new File ("plugins/LogBlock/log/" + name + ".log"); final File file = new File ("plugins/LogBlock/log/" + name + ".log");
file.getParentFile().mkdirs(); file.getParentFile().mkdirs();
FileWriter writer = new FileWriter(file); final FileWriter writer = new FileWriter(file);
player.sendMessage(ChatColor.GREEN + "Creating " + file.getName()); player.sendMessage(ChatColor.GREEN + "Creating " + file.getName());
while (rs.next()) { while (rs.next()) {
msg = formatter.format(rs.getTimestamp("date")) + " " + rs.getString("playername") + " "; msg = formatter.format(rs.getTimestamp("date")) + " " + rs.getString("playername") + " ";
int type = rs.getInt("type"); final int type = rs.getInt("type");
int replaced = rs.getInt("replaced"); final int replaced = rs.getInt("replaced");
if ((type == 63 || type == 68) && rs.getString("signtext") != null) if ((type == 63 || type == 68) && rs.getString("signtext") != null)
msg += "created " + rs.getString("signtext"); msg += "created " + rs.getString("signtext");
else if (type == replaced) { else if (type == replaced) {
@@ -74,10 +74,10 @@ public class WriteLogFile implements Runnable
} }
writer.close(); writer.close();
player.sendMessage(ChatColor.GREEN + "Done"); player.sendMessage(ChatColor.GREEN + "Done");
} catch (SQLException ex) { } catch (final SQLException ex) {
player.sendMessage(ChatColor.RED + "SQL exception"); player.sendMessage(ChatColor.RED + "SQL exception");
log.log(Level.SEVERE, "[LogBlock WriteLogFile] SQL exception", ex); log.log(Level.SEVERE, "[LogBlock WriteLogFile] SQL exception", ex);
} catch (IOException ex) { } catch (final IOException ex) {
player.sendMessage(ChatColor.RED + "IO exception"); player.sendMessage(ChatColor.RED + "IO exception");
log.log(Level.SEVERE, "[LogBlock WriteLogFile] IO exception", ex); log.log(Level.SEVERE, "[LogBlock WriteLogFile] IO exception", ex);
} finally { } finally {
@@ -88,7 +88,7 @@ public class WriteLogFile implements Runnable
ps.close(); ps.close();
if (conn != null) if (conn != null)
conn.close(); conn.close();
} catch (SQLException ex) { } catch (final SQLException ex) {
log.log(Level.SEVERE, "[LogBlock BlockStats] SQL exception on close", ex); log.log(Level.SEVERE, "[LogBlock BlockStats] SQL exception on close", ex);
} }
} }