Added QueryParams column selection. All plugins using

getBlockChanges() will break.
This commit is contained in:
Robin Kupper
2011-08-02 18:08:51 +02:00
parent 303262f268
commit 5429d986e2
7 changed files with 125 additions and 69 deletions

View File

@@ -9,7 +9,7 @@ import org.bukkit.Location;
public class BlockChange public class BlockChange
{ {
private final static SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss"); private final static SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss");
public final long date; public final long id, date;
public final Location loc; public final Location loc;
public final String playerName; public final String playerName;
public final int replaced, type; public final int replaced, type;
@@ -18,6 +18,7 @@ public class BlockChange
public final ChestAccess ca; public final ChestAccess ca;
public BlockChange(long date, Location loc, String playerName, int replaced, int type, byte data, String signtext, ChestAccess ca) { public BlockChange(long date, Location loc, String playerName, int replaced, int type, byte data, String signtext, ChestAccess ca) {
id = 0;
this.date = date; this.date = date;
this.loc = loc; this.loc = loc;
this.playerName = playerName; this.playerName = playerName;
@@ -28,20 +29,25 @@ public class BlockChange
this.ca = ca; this.ca = ca;
} }
public BlockChange(ResultSet rs, boolean coords) throws SQLException { public BlockChange(ResultSet rs, QueryParams p) throws SQLException {
date = rs.getTimestamp("date").getTime(); id = p.needId ? rs.getInt("id") : 0;
loc = coords ? new Location(null, rs.getInt("x"), rs.getInt("y"), rs.getInt("z")) : null; date = p.needDate ? rs.getTimestamp("date").getTime() : 0;
playerName = rs.getString("playername"); loc = p.needCoords ? new Location(null, rs.getInt("x"), rs.getInt("y"), rs.getInt("z")) : null;
replaced = rs.getInt("replaced"); playerName = p.needPlayer ? rs.getString("playername") : null;
type = rs.getInt("type"); replaced = p.needType ? rs.getInt("replaced") : 0;
data = (byte)0; type = p.needType ? rs.getInt("type") : 0;
signtext = type == 63 || type == 68 || replaced == 63 || replaced == 68 ? rs.getString("signtext") : null; data = p.needData ? rs.getByte("data") : (byte)0;
ca = type == replaced && (type == 23 || type == 54 || type == 61 || type == 62) ? new ChestAccess(rs.getShort("itemtype"), rs.getShort("itemamount"), (byte)0) : null; signtext = p.needSignText ? rs.getString("signtext") : null;
ca = p.needChestAccess && rs.getShort("itemtype") != 0 && rs.getShort("itemamount") != 0 ? new ChestAccess(rs.getShort("itemtype"), rs.getShort("itemamount"), rs.getByte("itemdata")) : null;
} }
@Override @Override
public String toString() { public String toString() {
final StringBuilder msg = new StringBuilder(formatter.format(date) + " " + playerName + " "); final StringBuilder msg = new StringBuilder();
if (date > 0)
msg.append(formatter.format(date) + " ");
if (playerName != null)
msg.append(playerName + " ");
if (signtext != null) { if (signtext != null) {
final String action = type == 0 ? "destroyed " : "created "; final String action = type == 0 ? "destroyed " : "created ";
if (!signtext.contains("\0")) if (!signtext.contains("\0"))
@@ -55,19 +61,21 @@ public class BlockChange
if (ca.itemType == 0 || ca.itemAmount == 0) if (ca.itemType == 0 || ca.itemAmount == 0)
msg.append("looked inside " + materialName(type)); msg.append("looked inside " + materialName(type));
else if (ca.itemAmount < 0) else if (ca.itemAmount < 0)
msg.append("took " + ca.itemAmount * -1 + "x " + materialName(ca.itemType)); msg.append("took " + ca.itemAmount * -1 + "x " + materialName(ca.itemType, ca.itemData));
else else
msg.append("put in " + ca.itemAmount + "x " + materialName(ca.itemType)); msg.append("put in " + ca.itemAmount + "x " + materialName(ca.itemType, ca.itemData));
} else if (type == 69) } else if (type == 23 || type == 54 || type == 61 || type == 62)
msg.append("opened " + materialName(type));
else if (type == 69)
msg.append("swiched " + materialName(type)); msg.append("swiched " + materialName(type));
else if (type == 77) else if (type == 77)
msg.append("pressed " + materialName(type)); msg.append("pressed " + materialName(type));
} else if (type == 0) } else if (type == 0)
msg.append("destroyed " + materialName(replaced)); msg.append("destroyed " + materialName(replaced, data));
else if (replaced == 0) else if (replaced == 0)
msg.append("created " + materialName(type)); msg.append("created " + materialName(type, data));
else else
msg.append("replaced " + materialName(replaced) + " with " + materialName(type)); msg.append("replaced " + materialName(replaced, (byte)0) + " with " + materialName(type, data));
if (loc != null) if (loc != null)
msg.append(" at " + loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ()); msg.append(" at " + loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ());
return msg.toString(); return msg.toString();

View File

@@ -262,11 +262,8 @@ public class CommandsHandler implements CommandExecutor
if (logblock.hasPermission(sender, "logblock.rollback")) { if (logblock.hasPermission(sender, "logblock.rollback")) {
final QueryParams params = new QueryParams(logblock); final QueryParams params = new QueryParams(logblock);
params.minutes = logblock.getConfig().defaultTime; params.minutes = logblock.getConfig().defaultTime;
params.parseArgs(sender, argsToList(args, 1));
params.limit = -1;
params.order = Order.DESC;
params.sum = SummarizationMode.NONE;
params.bct = BlockChangeType.ALL; params.bct = BlockChangeType.ALL;
params.parseArgs(sender, argsToList(args, 1));
new CommandRollback(sender, params, true); new CommandRollback(sender, params, true);
} else } else
sender.sendMessage(ChatColor.RED + "You aren't allowed to do this."); sender.sendMessage(ChatColor.RED + "You aren't allowed to do this.");
@@ -274,11 +271,8 @@ public class CommandsHandler implements CommandExecutor
if (logblock.hasPermission(sender, "logblock.rollback")) { if (logblock.hasPermission(sender, "logblock.rollback")) {
final QueryParams params = new QueryParams(logblock); final QueryParams params = new QueryParams(logblock);
params.minutes = logblock.getConfig().defaultTime; params.minutes = logblock.getConfig().defaultTime;
params.parseArgs(sender, argsToList(args, 1));
params.limit = -1;
params.order = Order.ASC;
params.sum = SummarizationMode.NONE;
params.bct = BlockChangeType.ALL; params.bct = BlockChangeType.ALL;
params.parseArgs(sender, argsToList(args, 1));
new CommandRedo(sender, params, true); new CommandRedo(sender, params, true);
} else } else
sender.sendMessage(ChatColor.RED + "You aren't allowed to do this."); sender.sendMessage(ChatColor.RED + "You aren't allowed to do this.");
@@ -411,24 +405,32 @@ public class CommandsHandler implements CommandExecutor
@Override @Override
public void run() { public void run() {
try { try {
params.needDate = true;
params.needType = true;
params.needData = true;
params.needPlayer = true;
if (params.types.size() == 0 || params.types.contains(63) || params.types.contains(68))
params.needSignText = true;
if (params.types.size() == 0 || params.types.contains(23) || params.types.contains(54) || params.types.contains(61) || params.types.contains(62))
params.needChestAccess = true;
conn = logblock.getConnection(); conn = logblock.getConnection();
state = conn.createStatement(); state = conn.createStatement();
if (params.limit == 15 && params.sum == SummarizationMode.NONE) if (params.limit == 15 && params.sum == SummarizationMode.NONE)
params.limit = config.linesLimit; params.limit = config.linesLimit;
rs = state.executeQuery(params.getLookupQuery()); rs = state.executeQuery(params.getQuery());
sender.sendMessage(ChatColor.DARK_AQUA + params.getTitle() + ":"); sender.sendMessage(ChatColor.DARK_AQUA + params.getTitle() + ":");
final List<BlockChange> blockchanges = new ArrayList<BlockChange>(); final List<BlockChange> blockchanges = new ArrayList<BlockChange>();
if (rs.next()) { if (rs.next()) {
rs.beforeFirst(); rs.beforeFirst();
if (params.sum == SummarizationMode.NONE) { if (params.sum == SummarizationMode.NONE) {
while (rs.next()) while (rs.next())
blockchanges.add(new BlockChange(rs, params.coords)); blockchanges.add(new BlockChange(rs, params));
logblock.getSession(senderName(sender)).lookupCache = blockchanges.toArray(new BlockChange[blockchanges.size()]); logblock.getSession(senderName(sender)).lookupCache = blockchanges.toArray(new BlockChange[blockchanges.size()]);
if (blockchanges.size() > config.linesPerPage) if (blockchanges.size() > config.linesPerPage)
sender.sendMessage(ChatColor.DARK_AQUA.toString() + blockchanges.size() + " changes found." + (blockchanges.size() == config.linesLimit ? " Use 'limit -1' to see all changes." : "")); sender.sendMessage(ChatColor.DARK_AQUA.toString() + blockchanges.size() + " changes found." + (blockchanges.size() == config.linesLimit ? " Use 'limit -1' to see all changes." : ""));
showPage(sender, 1); showPage(sender, 1);
} else { } else {
final HistoryFormatter histformatter = new HistoryFormatter(params.sum, params.coords, (sender instanceof Player ? 2 / 3f : 1)); final HistoryFormatter histformatter = new HistoryFormatter(params, (sender instanceof Player ? 2 / 3f : 1));
sender.sendMessage(ChatColor.GOLD + "Created - Destroyed - " + (params.sum == SummarizationMode.TYPES ? "Block" : "Player")); sender.sendMessage(ChatColor.GOLD + "Created - Destroyed - " + (params.sum == SummarizationMode.TYPES ? "Block" : "Player"));
while (rs.next()) while (rs.next())
sender.sendMessage(ChatColor.GOLD + histformatter.format(rs)); sender.sendMessage(ChatColor.GOLD + histformatter.format(rs));
@@ -457,16 +459,24 @@ public class CommandsHandler implements CommandExecutor
public void run() { public void run() {
File file = null; File file = null;
try { try {
params.needDate = true;
params.needType = true;
params.needData = true;
params.needPlayer = true;
if (params.types.size() == 0 || params.types.contains(63) || params.types.contains(68))
params.needSignText = true;
if (params.types.size() == 0 || params.types.contains(23) || params.types.contains(54) || params.types.contains(61) || params.types.contains(62))
params.needChestAccess = true;
conn = logblock.getConnection(); conn = logblock.getConnection();
state = conn.createStatement(); state = conn.createStatement();
file = new File("plugins/LogBlock/log/" + params.getTitle().replace(":", ".") + ".log"); file = new File("plugins/LogBlock/log/" + params.getTitle().replace(":", ".") + ".log");
sender.sendMessage(ChatColor.GREEN + "Creating " + file.getName()); sender.sendMessage(ChatColor.GREEN + "Creating " + file.getName());
rs = state.executeQuery(params.getLookupQuery()); rs = state.executeQuery(params.getQuery());
file.getParentFile().mkdirs(); file.getParentFile().mkdirs();
file.createNewFile(); file.createNewFile();
final FileWriter writer = new FileWriter(file); final FileWriter writer = new FileWriter(file);
final String newline = System.getProperty("line.separator"); final String newline = System.getProperty("line.separator");
final HistoryFormatter histformatter = new HistoryFormatter(params.sum, params.coords, 1); final HistoryFormatter histformatter = new HistoryFormatter(params, 1);
file.getParentFile().mkdirs(); file.getParentFile().mkdirs();
int counter = 0; int counter = 0;
while (rs.next()) { while (rs.next()) {
@@ -511,9 +521,11 @@ public class CommandsHandler implements CommandExecutor
@Override @Override
public void run() { public void run() {
try { try {
params.needCoords = true;
params.limit = 1;
conn = logblock.getConnection(); conn = logblock.getConnection();
state = conn.createStatement(); state = conn.createStatement();
rs = state.executeQuery("SELECT x, y, z FROM `" + params.getTable() + "` INNER JOIN `lb-players` USING (playerid) " + params.getWhere() + params.getOrderBy() + " LIMIT 1"); rs = state.executeQuery(params.getQuery());
if (rs.next()) { if (rs.next()) {
final Player player = (Player)sender; final Player player = (Player)sender;
final int y = rs.getInt(2); final int y = rs.getInt(2);
@@ -542,6 +554,14 @@ public class CommandsHandler implements CommandExecutor
@Override @Override
public void run() { public void run() {
try { try {
params.needCoords = true;
params.needType = true;
params.needData = true;
params.needSignText = true;
params.needChestAccess = true;
params.limit = -1;
params.order = Order.DESC;
params.sum = SummarizationMode.NONE;
conn = logblock.getConnection(); conn = logblock.getConnection();
state = conn.createStatement(); state = conn.createStatement();
if (!checkRestrictions(sender, params)) if (!checkRestrictions(sender, params))
@@ -550,7 +570,7 @@ public class CommandsHandler implements CommandExecutor
new CommandSaveQueue(sender, null, false); new CommandSaveQueue(sender, null, false);
if (!params.silent) if (!params.silent)
sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":"); sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":");
rs = state.executeQuery(params.getRollbackQuery()); rs = state.executeQuery(params.getQuery());
final WorldEditor editor = new WorldEditor(logblock, params.world); final WorldEditor editor = new WorldEditor(logblock, params.world);
while (rs.next()) while (rs.next())
editor.queueEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("replaced"), rs.getInt("type"), rs.getByte("data"), rs.getString("signtext"), rs.getShort("itemtype"), rs.getShort("itemamount"), rs.getByte("itemdata")); editor.queueEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("replaced"), rs.getInt("type"), rs.getByte("data"), rs.getString("signtext"), rs.getShort("itemtype"), rs.getShort("itemamount"), rs.getByte("itemdata"));
@@ -594,15 +614,22 @@ public class CommandsHandler implements CommandExecutor
@Override @Override
public void run() { public void run() {
try { try {
params.needCoords = true;
params.needType = true;
params.needData = true;
params.needSignText = true;
params.needChestAccess = true;
params.limit = -1;
params.order = Order.ASC;
params.sum = SummarizationMode.NONE;
conn = logblock.getConnection(); conn = logblock.getConnection();
state = conn.createStatement(); state = conn.createStatement();
if (!checkRestrictions(sender, params)) if (!checkRestrictions(sender, params))
return; return;
rs = state.executeQuery(params.getRollbackQuery()); rs = state.executeQuery(params.getQuery());
if (!params.silent) if (!params.silent)
sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":"); sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":");
final WorldEditor editor = new WorldEditor(logblock, params.world); final WorldEditor editor = new WorldEditor(logblock, params.world);
while (rs.next()) while (rs.next())
editor.queueEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("type"), rs.getInt("replaced"), rs.getByte("data"), rs.getString("signtext"), rs.getShort("itemtype"), (short)-rs.getShort("itemamount"), rs.getByte("itemdata")); editor.queueEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("type"), rs.getInt("replaced"), rs.getByte("data"), rs.getString("signtext"), rs.getShort("itemtype"), (short)-rs.getShort("itemamount"), rs.getByte("itemdata"));
final int changes = editor.getSize(); final int changes = editor.getSize();
@@ -641,7 +668,9 @@ public class CommandsHandler implements CommandExecutor
state = conn.createStatement(); state = conn.createStatement();
if (!checkRestrictions(sender, params)) if (!checkRestrictions(sender, params))
return; return;
final File dumpFolder = new File(logblock.getDataFolder(), "dumb"); final File dumpFolder = new File(logblock.getDataFolder(), "dump");
if (!dumpFolder.exists())
dumpFolder.mkdirs();
final SimpleDateFormat formatter = new SimpleDateFormat("yyMMddHHmmss"); final SimpleDateFormat formatter = new SimpleDateFormat("yyMMddHHmmss");
int deleted; int deleted;
final String table = params.getTable(); final String table = params.getTable();

View File

@@ -8,23 +8,21 @@ import de.diddiz.LogBlock.QueryParams.SummarizationMode;
public class HistoryFormatter public class HistoryFormatter
{ {
private final SummarizationMode sum; private final QueryParams params;
private final boolean coords;
private final float factor; private final float factor;
HistoryFormatter(SummarizationMode sum, boolean coords, float factor) { HistoryFormatter(QueryParams params, float factor) {
this.sum = sum; this.params = params;
this.coords = coords;
this.factor = factor; this.factor = factor;
} }
String format(ResultSet rs) throws SQLException { String format(ResultSet rs) throws SQLException {
if (sum == SummarizationMode.NONE) if (params.sum == SummarizationMode.NONE)
return new BlockChange(rs, coords).toString(); return new BlockChange(rs, params).toString();
String c1 = String.valueOf(rs.getInt(2)), c2 = String.valueOf(rs.getInt(3)); String c1 = String.valueOf(rs.getInt(2)), c2 = String.valueOf(rs.getInt(3));
c1 += spaces((int)((10 - c1.length()) / factor)); c1 += spaces((int)((10 - c1.length()) / factor));
c2 += spaces((int)((10 - c2.length()) / factor)); c2 += spaces((int)((10 - c2.length()) / factor));
if (sum == SummarizationMode.TYPES) if (params.sum == SummarizationMode.TYPES)
return c1 + c2 + materialName(rs.getInt(1)); return c1 + c2 + materialName(rs.getInt(1));
return c1 + c2 + rs.getString(1); return c1 + c2 + rs.getString(1);
} }

View File

@@ -267,12 +267,11 @@ public class LogBlock extends JavaPlugin
if (conn == null) if (conn == null)
throw new SQLException("No connection"); throw new SQLException("No connection");
try { try {
params.getLookupQuery();
state = conn.createStatement(); state = conn.createStatement();
rs = state.executeQuery(params.getLookupQuery()); rs = state.executeQuery(params.getQuery());
final List<BlockChange> blockchanges = new ArrayList<BlockChange>(); final List<BlockChange> blockchanges = new ArrayList<BlockChange>();
while (rs.next()) while (rs.next())
blockchanges.add(new BlockChange(rs, params.coords)); blockchanges.add(new BlockChange(rs, params));
return blockchanges; return blockchanges;
} finally { } finally {
if (state != null) if (state != null)

View File

@@ -30,12 +30,12 @@ public class QueryParams implements Cloneable
public Location loc = null; public Location loc = null;
public Order order = Order.DESC; public Order order = Order.DESC;
public List<String> players = new ArrayList<String>(); public List<String> players = new ArrayList<String>();
public boolean excludePlayersMode = false; public boolean excludePlayersMode = false, prepareToolQuery = false, silent = false;
public boolean prepareToolQuery = false, coords = false, silent = false;
public Selection sel = null; public Selection sel = null;
public SummarizationMode sum = SummarizationMode.NONE; public SummarizationMode sum = SummarizationMode.NONE;
public List<Integer> types = new ArrayList<Integer>(); public List<Integer> types = new ArrayList<Integer>();
public World world = null; public World world = null;
public boolean needId = false, needDate = false, needType = false, needData = false, needPlayer = false, needCoords = false, needSignText = false, needChestAccess = false;
private final LogBlock logblock; private final LogBlock logblock;
public QueryParams(LogBlock logblock) { public QueryParams(LogBlock logblock) {
@@ -52,38 +52,46 @@ public class QueryParams implements Cloneable
} }
public String getLimit() { public String getLimit() {
return limit != -1 ? "LIMIT " + limit : ""; return limit > 0 ? "LIMIT " + limit : "";
} }
public String getOrderBy() { // public String getRollbackQuery() {
return "ORDER BY date " + order + ", id " + order + " "; // return "SELECT replaced, type, data, x, y, z, signtext, itemtype, itemamount, itemdata FROM `" + getTable() + "` " + (players.size() > 0 ? "INNER JOIN `lb-players` USING (playerid) " : "") + "LEFT JOIN `" + getTable() + "-sign` USING (id) LEFT JOIN `" + getTable() + "-chest` USING (id) " + getWhere() + getOrderBy() + getLimit();
} // }
public String getLookupQuery() { public String getQuery() {
if (sum == SummarizationMode.NONE) { if (sum == SummarizationMode.NONE) {
String select = "SELECT date, replaced, type, playername"; String select = "SELECT ";
String from = "FROM `" + getTable() + "` INNER JOIN `lb-players` USING (playerid) "; String from = "FROM `" + getTable() + "` ";
if (coords) if (needId)
select += ", x, y, z"; select += "`" + getTable() + "`.id, ";
if (types.size() == 0 || types.contains(63) || types.contains(68)) { if (needDate)
select += ", signtext"; select += "date, ";
if (needType)
select += "replaced, type, ";
if (needData)
select += "data, ";
if (needPlayer)
select += "playername, ";
if (needPlayer || players.size() > 0)
from += "INNER JOIN `lb-players` USING (playerid) ";
if (needCoords)
select += "x, y, z, ";
if (needSignText) {
select += "signtext, ";
from += "LEFT JOIN `" + getTable() + "-sign` USING (id) "; from += "LEFT JOIN `" + getTable() + "-sign` USING (id) ";
} }
if (types.size() == 0 || types.contains(23) || types.contains(54) || types.contains(61)) { if (needChestAccess) {
select += ", itemtype, itemamount, itemdata"; select += "itemtype, itemamount, itemdata, ";
from += "LEFT JOIN `" + getTable() + "-chest` USING (id) "; from += "LEFT JOIN `" + getTable() + "-chest` USING (id) ";
} }
return select + " " + from + getWhere() + getOrderBy() + getLimit(); return select.substring(0, select.length() - 2) + " " + from + getWhere() + "ORDER BY date " + order + ", id " + order + " " + getLimit();
} else if (sum == SummarizationMode.TYPES) } else if (sum == SummarizationMode.TYPES)
return "SELECT type, SUM(created) AS created, SUM(destroyed) AS destroyed FROM ((SELECT type, count(type) AS created, 0 AS destroyed FROM `" + getTable() + "` INNER JOIN `lb-players` USING (playerid) " + getWhere() + "AND type > 0 GROUP BY type) UNION (SELECT replaced AS type, 0 AS created, count(replaced) AS destroyed FROM `" + getTable() + "` INNER JOIN `lb-players` USING (playerid) " + getWhere() + "AND replaced > 0 GROUP BY replaced)) AS t GROUP BY type ORDER BY SUM(created) + SUM(destroyed) " + order + " " + getLimit(); return "SELECT type, SUM(created) AS created, SUM(destroyed) AS destroyed FROM ((SELECT type, count(type) AS created, 0 AS destroyed FROM `" + getTable() + "` INNER JOIN `lb-players` USING (playerid) " + getWhere() + "AND type > 0 GROUP BY type) UNION (SELECT replaced AS type, 0 AS created, count(replaced) AS destroyed FROM `" + getTable() + "` INNER JOIN `lb-players` USING (playerid) " + getWhere() + "AND replaced > 0 GROUP BY replaced)) AS t GROUP BY type ORDER BY SUM(created) + SUM(destroyed) " + order + " " + getLimit();
else else
return "SELECT playername, SUM(created) AS created, SUM(destroyed) AS destroyed FROM ((SELECT playerid, count(type) AS created, 0 AS destroyed FROM `" + getTable() + "` " + getWhere() + "AND type > 0 GROUP BY playerid) UNION (SELECT playerid, 0 AS created, count(replaced) AS destroyed FROM `" + getTable() + "` " + getWhere() + "AND replaced > 0 GROUP BY playerid)) AS t INNER JOIN `lb-players` USING (playerid) GROUP BY playerid ORDER BY SUM(created) + SUM(destroyed) " + order + " " + getLimit(); return "SELECT playername, SUM(created) AS created, SUM(destroyed) AS destroyed FROM ((SELECT playerid, count(type) AS created, 0 AS destroyed FROM `" + getTable() + "` " + getWhere() + "AND type > 0 GROUP BY playerid) UNION (SELECT playerid, 0 AS created, count(replaced) AS destroyed FROM `" + getTable() + "` " + getWhere() + "AND replaced > 0 GROUP BY playerid)) AS t INNER JOIN `lb-players` USING (playerid) GROUP BY playerid ORDER BY SUM(created) + SUM(destroyed) " + order + " " + getLimit();
} }
public String getRollbackQuery() {
return "SELECT replaced, type, data, x, y, z, signtext, itemtype, itemamount, itemdata FROM `" + getTable() + "` " + (players.size() > 0 ? "INNER JOIN `lb-players` USING (playerid) " : "") + "LEFT JOIN `" + getTable() + "-sign` USING (id) LEFT JOIN `" + getTable() + "-chest` USING (id) " + getWhere() + getOrderBy() + getLimit();
}
public String getTable() { public String getTable() {
return logblock.getConfig().worlds.get(world.getName().hashCode()).table; return logblock.getConfig().worlds.get(world.getName().hashCode()).table;
} }
@@ -182,7 +190,7 @@ public class QueryParams implements Cloneable
where.append("replaced > 0 AND "); where.append("replaced > 0 AND ");
break; break;
case CHESTACCESS: case CHESTACCESS:
where.append("type = replaced AND (type = 23 OR type = 54 OR type = 61) AND "); where.append("type = replaced AND (type = 23 OR type = 54 OR type = 61 OR type = 62) AND ");
break; break;
} }
if (!players.isEmpty() && sum != SummarizationMode.PLAYERS) if (!players.isEmpty() && sum != SummarizationMode.PLAYERS)
@@ -328,7 +336,7 @@ public class QueryParams implements Cloneable
else if (param.equals("desc")) else if (param.equals("desc"))
order = Order.DESC; order = Order.DESC;
else if (param.equals("coords")) else if (param.equals("coords"))
coords = true; needCoords = true;
else if (param.equals("silent")) else if (param.equals("silent"))
silent = true; silent = true;
else else

View File

@@ -160,7 +160,7 @@ public class WorldEditor implements Runnable
return PerformResult.NO_ACTION; return PerformResult.NO_ACTION;
return PerformResult.SUCCESS; return PerformResult.SUCCESS;
} }
if (!(equalTypes(block.getTypeId(), type) || config.replaceAnyway.contains(block.getTypeId()))) if (!(equalTypes(block.getTypeId(), type) ^ config.replaceAnyway.contains(block.getTypeId())))
return PerformResult.NO_ACTION; return PerformResult.NO_ACTION;
if (state instanceof ContainerBlock) { if (state instanceof ContainerBlock) {
((ContainerBlock)state).getInventory().clear(); ((ContainerBlock)state).getInventory().clear();

View File

@@ -20,6 +20,7 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.TNTPrimed;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
public class BukkitUtils public class BukkitUtils
{ {
@@ -125,6 +126,19 @@ public class BukkitUtils
return mat != null ? mat.toString().replace('_', ' ').toLowerCase() : String.valueOf(type); return mat != null ? mat.toString().replace('_', ' ').toLowerCase() : String.valueOf(type);
} }
public static String materialName(int type, byte rawData) {
final Material mat = Material.getMaterial(type);
if (mat != null) {
if (type == 6 || type == 17 || type == 18 || type == 35 || type == 43 || type == 44) {
final MaterialData data = mat.getNewData(rawData);
if (data != null)
return data.toString().toLowerCase().replace('_', ' ').replaceAll("[^a-z ]", "");
}
return mat.toString().replace('_', ' ').toLowerCase();
}
return String.valueOf(type);
}
public static String senderName(CommandSender sender) { public static String senderName(CommandSender sender) {
if (sender instanceof Player) if (sender instanceof Player)
return ((Player)sender).getName(); return ((Player)sender).getName();