Fixed clearlog, added hiddenPlayers and implemented 2 block

items rollback (doors nad beds)
This commit is contained in:
Robin Kupper
2011-05-26 16:58:07 +02:00
parent ba082ffc9a
commit f38f729ed4
10 changed files with 148 additions and 99 deletions

View File

@@ -511,46 +511,46 @@ public class CommandsHandler implements CommandExecutor
public void run() {
try {
final File dumpFolder = new File(logblock.getDataFolder(), "dumb");
final SimpleDateFormat formatter = new SimpleDateFormat("yyMMddHHmmss");
int deleted;
for (final String table : config.tables.values()) {
rs = state.executeQuery("SELECT count(*) FROM `" + table + "` " + params.getWhere());
rs.next();
if ((deleted = rs.getInt(1)) > 0) {
if (config.askClearLogs && sender instanceof Player && questioner != null) {
sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":");
sender.sendMessage(ChatColor.GREEN.toString() + deleted + " blocks found.");
if (!questioner.askQuestion((Player)sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) {
sender.sendMessage(ChatColor.RED + "ClearLog aborted");
return;
}
final String table = params.getTable();
rs = state.executeQuery("SELECT count(*) FROM `" + table + "` " + params.getWhere());
rs.next();
if ((deleted = rs.getInt(1)) > 0) {
if (config.askClearLogs && sender instanceof Player && questioner != null) {
sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":");
sender.sendMessage(ChatColor.GREEN.toString() + deleted + " blocks found.");
if (!questioner.askQuestion((Player)sender, "Are you sure you want to continue?", "yes", "no").equals("yes")) {
sender.sendMessage(ChatColor.RED + "ClearLog aborted");
return;
}
if (config.dumpDeletedLog)
try {
state.execute("SELECT * FROM `" + table + "` " + params.getWhere() + "INTO OUTFILE '" + new File(dumpFolder, table + " " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
} catch (final SQLException ex) {
sender.sendMessage(ChatColor.RED + "Error while dumping log. Make sure your MySQL user has access to the LogBlock folder, or disable clearlog.dumpDeletedLog");
log.log(Level.SEVERE, "[LogBlock ClearLog] Exception while dumping", ex);
return;
}
state.execute("DELETE FROM `" + table + "` " + params.getWhere());
sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + ". Deleted " + deleted + " entries.");
}
rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL");
rs.next();
if ((deleted = rs.getInt(1)) > 0) {
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 " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
state.execute("DELETE `" + table + "-sign` FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL;");
sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + "-sign. Deleted " + deleted + " entries.");
}
rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL");
rs.next();
if ((deleted = rs.getInt(1)) > 0) {
if (config.dumpDeletedLog)
state.execute("SELECT id, itemtype, itemamount, itemdata, FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, table + "-chest " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
state.execute("DELETE `" + table + "-chest` FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL;");
sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + "-chest. Deleted " + deleted + " entries.");
}
if (config.dumpDeletedLog)
try {
state.execute("SELECT * FROM `" + table + "` " + params.getWhere() + "INTO OUTFILE '" + new File(dumpFolder, formatter.format(System.currentTimeMillis()) + " " + table + " " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
} catch (final SQLException ex) {
sender.sendMessage(ChatColor.RED + "Error while dumping log. Make sure your MySQL user has access to the LogBlock folder, or disable clearlog.dumpDeletedLog");
log.log(Level.SEVERE, "[LogBlock ClearLog] Exception while dumping", ex);
return;
}
state.execute("DELETE FROM `" + table + "` " + params.getWhere());
sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + ". Deleted " + deleted + " entries.");
}
rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL");
rs.next();
if ((deleted = rs.getInt(1)) > 0) {
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, formatter.format(System.currentTimeMillis()) + " " + table + "-sign " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
state.execute("DELETE `" + table + "-sign` FROM `" + table + "-sign` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL;");
sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + "-sign. Deleted " + deleted + " entries.");
}
rs = state.executeQuery("SELECT COUNT(*) FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL");
rs.next();
if ((deleted = rs.getInt(1)) > 0) {
if (config.dumpDeletedLog)
state.execute("SELECT id, itemtype, itemamount, itemdata FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL INTO OUTFILE '" + new File(dumpFolder, formatter.format(System.currentTimeMillis()) + " " + table + "-chest " + params.getTitle() + ".csv").getAbsolutePath().replace("\\", "\\\\") + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'");
state.execute("DELETE `" + table + "-chest` FROM `" + table + "-chest` LEFT JOIN `" + table + "` USING (id) WHERE `" + table + "`.id IS NULL;");
sender.sendMessage(ChatColor.GREEN + "Cleared out table " + table + "-chest. Deleted " + deleted + " entries.");
}
} catch (final SQLException ex) {
sender.sendMessage(ChatColor.RED + "SQL exception");

View File

@@ -45,6 +45,7 @@ public class Config
public final boolean askRollbacks;
public final boolean askRedos;
public final boolean askClearLogs;
public final Set<Integer> hiddenPlayers;
public static enum LogKillsLevel {
PLAYERS, MONSTERS, ANIMALS
@@ -117,6 +118,8 @@ public class Config
config.setProperty("logging.logKills", false);
if (!subkeys.contains("logKillsLevel"))
config.setProperty("logging.logKillsLevel", "PLAYERS");
if (!subkeys.contains("hiddenPlayers"))
config.setProperty("logging.hiddenPlayers", Arrays.asList(new String[]{"Nessie", "Bigfoot", "Chewbacca"}));
subkeys = config.getKeys("rollback");
if (subkeys == null)
subkeys = new ArrayList<String>();
@@ -176,6 +179,9 @@ public class Config
} catch (final IllegalArgumentException ex) {
throw new Exception("lookup.toolblockID doesn't appear to be a valid log level. Allowed are 'PLAYERS', 'MONSTERS' and 'ANIMALS'");
}
hiddenPlayers = new HashSet<Integer>();
for (final String playerName : config.getStringList("hiddenPlayers", new ArrayList<String>()))
hiddenPlayers.add(playerName.hashCode());
dontRollback = new HashSet<Integer>(config.getIntList("rollback.dontRollback", null));
replaceAnyway = new HashSet<Integer>(config.getIntList("rollback.replaceAnyway", null));
try {

View File

@@ -6,6 +6,7 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.TimerTask;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
@@ -25,7 +26,7 @@ public class Consumer extends TimerTask
{
private final LinkedBlockingQueue<BlockRow> bqueue = new LinkedBlockingQueue<BlockRow>();
private final Config config;
private final HashSet<Integer> hiddenplayers = new HashSet<Integer>();
private final Set<Integer> hiddenplayers;
private final LinkedBlockingQueue<KillRow> kqueue = new LinkedBlockingQueue<KillRow>();
private final HashMap<Integer, Integer> lastAttackedEntity = new HashMap<Integer, Integer>();
private final HashMap<Integer, Long> lastAttackTime = new HashMap<Integer, Long>();
@@ -37,6 +38,7 @@ public class Consumer extends TimerTask
this.logblock = logblock;
log = logblock.getServer().getLogger();
config = logblock.getConfig();
hiddenplayers = config.hiddenPlayers;
readPlayers();
}

View File

@@ -14,8 +14,8 @@ import org.bukkit.event.block.SignChangeEvent;
class LBBlockListener extends BlockListener
{
private final Consumer consumer;
private final boolean logSignTexts;
private final boolean logChestAccess;
private final boolean logSignTexts;
LBBlockListener(LogBlock logblock) {
consumer = logblock.getConsumer();
@@ -23,6 +23,25 @@ class LBBlockListener extends BlockListener
logChestAccess = logblock.getConfig().logChestAccess;
}
@Override
public void onBlockBreak(BlockBreakEvent event) {
if (!event.isCancelled()) {
final int type = event.getBlock().getTypeId();
if (logSignTexts && (type == 63 || type == 68))
consumer.queueSignBreak(event.getPlayer().getName(), (Sign)event.getBlock().getState());
else if (logChestAccess && (type == 23 || type == 54 || type == 61))
consumer.queueContainerBreak(event.getPlayer().getName(), event.getBlock().getState());
else
consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlock().getState());
}
}
@Override
public void onBlockBurn(BlockBurnEvent event) {
if (!event.isCancelled())
consumer.queueBlockBreak("Fire", event.getBlock().getState());
}
@Override
public void onBlockFromTo(BlockFromToEvent event) {
if (!event.isCancelled()) {
@@ -55,16 +74,9 @@ class LBBlockListener extends BlockListener
}
@Override
public void onBlockBreak(BlockBreakEvent event) {
if (!event.isCancelled()) {
final int type = event.getBlock().getTypeId();
if (logSignTexts && (type == 63 || type == 68))
consumer.queueSignBreak(event.getPlayer().getName(), (Sign)event.getBlock().getState());
else if (logChestAccess && (type == 23 || type == 54 || type == 61))
consumer.queueContainerBreak(event.getPlayer().getName(), event.getBlock().getState());
else
consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlock().getState());
}
public void onLeavesDecay(LeavesDecayEvent event) {
if (!event.isCancelled())
consumer.queueBlockBreak("LeavesDecay", event.getBlock().getState());
}
@Override
@@ -72,16 +84,4 @@ class LBBlockListener extends BlockListener
if (!event.isCancelled())
consumer.queueSignPlace(event.getPlayer().getName(), event.getBlock().getLocation(), event.getBlock().getTypeId(), event.getBlock().getData(), event.getLines());
}
@Override
public void onBlockBurn(BlockBurnEvent event) {
if (!event.isCancelled())
consumer.queueBlockBreak("Fire", event.getBlock().getState());
}
@Override
public void onLeavesDecay(LeavesDecayEvent event) {
if (!event.isCancelled())
consumer.queueBlockBreak("LeavesDecay", event.getBlock().getState());
}
}

View File

@@ -17,10 +17,10 @@ import org.bukkit.event.entity.EntityListener;
class LBEntityListener extends EntityListener
{
private final Consumer consumer;
private final boolean logSignTexts;
private final boolean logChestAccess;
private final boolean logCreeperExplosionsAsPlayer;
private final Config.LogKillsLevel logKillsLevel;
private final boolean logSignTexts;
LBEntityListener(LogBlock logblock) {
consumer = logblock.getConsumer();
@@ -30,6 +30,21 @@ class LBEntityListener extends EntityListener
logKillsLevel = logblock.getConfig().logKillsLevel;
}
@Override
public void onEntityDamage(EntityDamageEvent event) {
if (event.isCancelled() || !(event instanceof EntityDamageByEntityEvent) || !(event.getEntity() instanceof LivingEntity))
return;
final LivingEntity victim = (LivingEntity)event.getEntity();
final Entity killer = ((EntityDamageByEntityEvent)event).getDamager();
if (victim.getHealth() - event.getDamage() > 0 || victim.getHealth() <= 0)
return;
if (logKillsLevel == Config.LogKillsLevel.PLAYERS && !(victim instanceof Player && killer instanceof Player))
return;
else if (logKillsLevel == Config.LogKillsLevel.MONSTERS && !((victim instanceof Player || victim instanceof Monster) && killer instanceof Player || killer instanceof Monster))
return;
consumer.queueKill(killer, victim);
}
@Override
public void onEntityExplode(EntityExplodeEvent event) {
if (!event.isCancelled()) {
@@ -60,19 +75,4 @@ class LBEntityListener extends EntityListener
}
}
}
@Override
public void onEntityDamage(EntityDamageEvent event) {
if (event.isCancelled() || !(event instanceof EntityDamageByEntityEvent) || !(event.getEntity() instanceof LivingEntity))
return;
final LivingEntity victim = (LivingEntity)event.getEntity();
final Entity killer = ((EntityDamageByEntityEvent)event).getDamager();
if (victim.getHealth() - event.getDamage() > 0 || victim.getHealth() <= 0)
return;
if (logKillsLevel == Config.LogKillsLevel.PLAYERS && !(victim instanceof Player && killer instanceof Player))
return;
else if (logKillsLevel == Config.LogKillsLevel.MONSTERS && !((victim instanceof Player || victim instanceof Monster) && killer instanceof Player || killer instanceof Monster))
return;
consumer.queueKill(killer, victim);
}
}

View File

@@ -13,12 +13,6 @@ class LBPlayerListener extends PlayerListener
consumer = logblock.getConsumer();
}
@Override
public void onPlayerBucketFill(PlayerBucketFillEvent event) {
if (!event.isCancelled())
consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlockClicked().getState());
}
@Override
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) {
if (event.getBucket() == Material.WATER_BUCKET)
@@ -26,4 +20,10 @@ class LBPlayerListener extends PlayerListener
else if (event.getBucket() == Material.LAVA_BUCKET)
consumer.queueBlockPlace(event.getPlayer().getName(), event.getBlockClicked().getFace(event.getBlockFace()).getLocation(), 11, (byte)0);
}
@Override
public void onPlayerBucketFill(PlayerBucketFillEvent event) {
if (!event.isCancelled())
consumer.queueBlockBreak(event.getPlayer().getName(), event.getBlockClicked().getState());
}
}

View File

@@ -1,5 +1,6 @@
package de.diddiz.LogBlock;
import java.util.Map;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.block.Action;
@@ -8,26 +9,29 @@ import org.bukkit.event.player.PlayerListener;
class LBToolListener extends PlayerListener
{
private final LogBlock logblock;
private final Config config;
private final CommandsHandler handler;
private final LogBlock logblock;
private final int toolID;
private final int toolblockID;
private final Map<Integer, String> tables;
LBToolListener(LogBlock logblock) {
this.logblock = logblock;
config = logblock.getConfig();
handler = logblock.getCommandsHandler();
toolID = logblock.getConfig().toolID;
toolblockID = logblock.getConfig().toolblockID;
tables = logblock.getConfig().tables;
}
@Override
public void onPlayerInteract(PlayerInteractEvent event) {
if (!event.isCancelled()) {
final Player player = event.getPlayer();
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == config.toolID && logblock.hasPermission(player, "logblock.tool") && logblock.getSession(player.getName()).toolEnabled) {
if (config.tables.get(player.getWorld().getName().hashCode()) != null) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == toolID && logblock.hasPermission(player, "logblock.tool") && logblock.getSession(player.getName()).toolEnabled) {
if (tables.get(player.getWorld().getName().hashCode()) != null) {
try {
final QueryParams params = logblock.getSession(player.getName()).toolQuery;
params.loc = event.getClickedBlock().getLocation();
params.world = player.getWorld();
params.setLocation(event.getClickedBlock().getLocation());
handler.new CommandLookup(player, params);
} catch (final Exception ex) {
player.sendMessage(ChatColor.RED + ex.getMessage());
@@ -36,12 +40,11 @@ class LBToolListener extends PlayerListener
event.setCancelled(true);
} else
player.sendMessage("This world isn't logged");
} else if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == config.toolblockID && logblock.hasPermission(player, "logblock.toolblock") && logblock.getSession(player.getName()).toolBlockEnabled)
if (config.tables.get(player.getWorld().getName().hashCode()) != null) {
} else if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == toolblockID && logblock.hasPermission(player, "logblock.toolblock") && logblock.getSession(player.getName()).toolBlockEnabled)
if (tables.get(player.getWorld().getName().hashCode()) != null) {
try {
final QueryParams params = logblock.getSession(player.getName()).toolQuery;
params.loc = event.getClickedBlock().getFace(event.getBlockFace()).getLocation();
params.world = player.getWorld();
params.setLocation(event.getClickedBlock().getLocation());
handler.new CommandLookup(player, params);
} catch (final Exception ex) {
player.sendMessage(ChatColor.RED + ex.getMessage());

View File

@@ -13,6 +13,7 @@ import java.util.Map;
import java.util.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
@@ -110,11 +111,15 @@ public class LogBlock extends JavaPlugin
final QueryParams params = new QueryParams(this);
params.minutes = config.keepLogDays * -1440;
params.bct = BlockChangeType.ALL;
try {
commandsHandler.new CommandClearLog(new ConsoleCommandSender(getServer()), params);
} catch (final Exception ex) {
log.severe("Failed to schedule ClearLog: " + ex.getMessage());
}
for (final World world : getServer().getWorlds())
if (config.tables.containsKey(world.getName().hashCode())) {
params.world = world;
try {
commandsHandler.new CommandClearLog(new ConsoleCommandSender(getServer()), params);
} catch (final Exception ex) {
log.severe("Failed to schedule ClearLog: " + ex.getMessage());
}
}
}
final LBBlockListener lbBlockListener = new LBBlockListener(this);
final LBPlayerListener lbPlayerListener = new LBPlayerListener(this);
@@ -186,6 +191,7 @@ public class LogBlock extends JavaPlugin
return false;
try {
final DatabaseMetaData dbm = conn.getMetaData();
conn.setAutoCommit(true);
state = conn.createStatement();
if (!dbm.getTables(null, null, "lb-players", null).next()) {
log.log(Level.INFO, "[LogBlock] Crating table lb-players.");
@@ -206,6 +212,8 @@ public class LogBlock extends JavaPlugin
if (!dbm.getTables(null, null, table + "-sign", null).next())
return false;
}
if (dbm.getTables(null, null, table + "-chest", null).next() && state.executeQuery("SELECT * FROM `" + table + "-chest` LIMIT 1").getMetaData().getColumnCount() != 4) // Chest table update
state.execute("DROP TABLE `" + table + "-chest`");
if (!dbm.getTables(null, null, table + "-chest", null).next()) {
log.log(Level.INFO, "[LogBlock] Crating table " + table + "-chest.");
state.execute("CREATE TABLE `" + table + "-chest` (id INT NOT NULL, itemtype SMALLINT UNSIGNED NOT NULL, itemamount SMALLINT NOT NULL, itemdata TINYINT UNSIGNED NOT NULL, PRIMARY KEY (id))");

View File

@@ -340,11 +340,17 @@ public class QueryParams implements Cloneable
session.lastQuery = clone();
}
public void setLocation(Location loc) {
this.loc = loc;
world = loc.getWorld();
}
public void setPlayer(String playerName) {
players.clear();
players.add(playerName);
}
@Override
protected QueryParams clone() {
try {
return (QueryParams)super.clone();

View File

@@ -4,11 +4,13 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Logger;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.ContainerBlock;
import org.bukkit.block.Sign;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Bed;
import de.diddiz.util.BukkitUtils;
public class WorldEditor implements Runnable
@@ -163,6 +165,28 @@ public class WorldEditor implements Runnable
sign.setLine(i, lines[i]);
if (!sign.update())
return PerformResult.ERROR;
} else if (curtype == 26) {
final Bed bed = (Bed)block.getState().getData();
final Block secBlock;
if (!bed.isHeadOfBed())
secBlock = block.getFace(bed.getFacing());
else
secBlock = block.getFace(bed.getFacing().getOppositeFace());
if (secBlock.getTypeId() != 0)
return PerformResult.SUCCESS;
if (!secBlock.setTypeIdAndData(26, (byte)(bed.getData() ^ 8), true))
return PerformResult.ERROR;
} else if (curtype == 64 || curtype == 71) {
final Block secBlock;
final byte blockData = block.getData();
if ((blockData & 8) == 8)
secBlock = block.getFace(BlockFace.DOWN);
else
secBlock = block.getFace(BlockFace.UP);
if (secBlock.getTypeId() != 0)
return PerformResult.SUCCESS;
if (!secBlock.setTypeIdAndData(curtype, (byte)(blockData ^ 8), true))
return PerformResult.ERROR;
}
return PerformResult.SUCCESS;
} catch (final Exception ex) {