forked from LogBlock/LogBlock
v0.4
This commit is contained in:
@@ -22,14 +22,16 @@ public class AreaBlockSearch implements Runnable
|
|||||||
private int type;
|
private int type;
|
||||||
private int size;
|
private int size;
|
||||||
private Connection conn = null;
|
private Connection conn = null;
|
||||||
|
private String table;
|
||||||
|
|
||||||
AreaBlockSearch(Connection conn, Player player, int type, int size)
|
AreaBlockSearch(Connection conn, Player player, int type, int size, String table)
|
||||||
{
|
{
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.location = player.getLocation();
|
this.location = player.getLocation();
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.conn = conn;
|
this.conn = conn;
|
||||||
|
this.table = table;
|
||||||
}
|
}
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
@@ -41,7 +43,7 @@ public class AreaBlockSearch implements Runnable
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
conn.setAutoCommit(false);
|
conn.setAutoCommit(false);
|
||||||
ps = conn.prepareStatement("SELECT * from blocks where (type = ? or replaced = ?) and y > ? and y < ? and x > ? and x < ? and z > ? and z < ? order by date desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("SELECT * FROM `" + table + "` WHERE (type = ? or replaced = ?) and y > ? and y < ? and x > ? and x < ? and z > ? and z < ? order by date desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
||||||
ps.setInt(1, type);
|
ps.setInt(1, type);
|
||||||
ps.setInt(2, type);
|
ps.setInt(2, type);
|
||||||
ps.setInt(3, location.getBlockY() - size);
|
ps.setInt(3, location.getBlockY() - size);
|
||||||
|
@@ -18,12 +18,14 @@ public class AreaStats implements Runnable
|
|||||||
private Player player;
|
private Player player;
|
||||||
private int size;
|
private int size;
|
||||||
private Connection conn = null;
|
private Connection conn = null;
|
||||||
|
private String table;
|
||||||
|
|
||||||
AreaStats(Connection conn, Player player, int size)
|
AreaStats(Connection conn, Player player, int size, String table)
|
||||||
{
|
{
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.conn = conn;
|
this.conn = conn;
|
||||||
|
this.table = table;
|
||||||
}
|
}
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
@@ -36,7 +38,7 @@ public class AreaStats implements Runnable
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
conn.setAutoCommit(false);
|
conn.setAutoCommit(false);
|
||||||
ps = conn.prepareStatement("SELECT player, count(player) as num from blocks where type > 0 and y > ? and y < ? and x > ? and x < ? and z > ? and z < ? group by player order by count(player) desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("SELECT player, count(player) as num from `" + table + "` where type > 0 and y > ? and y < ? and x > ? and x < ? and z > ? and z < ? group by player order by count(player) desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
||||||
ps.setInt(1, player.getLocation().getBlockY()-size);
|
ps.setInt(1, player.getLocation().getBlockY()-size);
|
||||||
ps.setInt(2, player.getLocation().getBlockY()+size);
|
ps.setInt(2, player.getLocation().getBlockY()+size);
|
||||||
ps.setInt(3, player.getLocation().getBlockX()-size);
|
ps.setInt(3, player.getLocation().getBlockX()-size);
|
||||||
@@ -52,7 +54,7 @@ public class AreaStats implements Runnable
|
|||||||
rs.close();
|
rs.close();
|
||||||
ps.close();
|
ps.close();
|
||||||
|
|
||||||
ps = conn.prepareStatement("SELECT player, count(player) as num from blocks where replaced > 0 and y > ? and y < ? and x > ? and x < ? and z > ? and z < ? group by player order by count(player) desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("SELECT player, count(player) as num from `" + table + "` where replaced > 0 and y > ? and y < ? and x > ? and x < ? and z > ? and z < ? group by player order by count(player) desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
||||||
ps.setInt(1, player.getLocation().getBlockY()-size);
|
ps.setInt(1, player.getLocation().getBlockY()-size);
|
||||||
ps.setInt(2, player.getLocation().getBlockY()+size);
|
ps.setInt(2, player.getLocation().getBlockY()+size);
|
||||||
ps.setInt(3, player.getLocation().getBlockX()-size);
|
ps.setInt(3, player.getLocation().getBlockX()-size);
|
||||||
|
@@ -19,7 +19,6 @@ import java.util.logging.Logger;
|
|||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
@@ -36,15 +35,19 @@ import org.bukkit.plugin.PluginDescriptionFile;
|
|||||||
import org.bukkit.plugin.PluginLoader;
|
import org.bukkit.plugin.PluginLoader;
|
||||||
import org.bukkit.plugin.PluginManager;
|
import org.bukkit.plugin.PluginManager;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
import bootswithdefer.JDCBPool.JDCConnectionDriver;
|
import bootswithdefer.JDCBPool.JDCConnectionDriver;
|
||||||
|
|
||||||
import com.nijikokun.bukkit.Permissions.Permissions;
|
import com.nijikokun.bukkit.Permissions.Permissions;
|
||||||
|
|
||||||
public class LogBlock extends JavaPlugin
|
public class LogBlock extends JavaPlugin
|
||||||
{
|
{
|
||||||
private LBLPlayerListener lblPlayerListener = new LBLPlayerListener();
|
private LBLPlayerListener lblPlayerListener = new LBLPlayerListener();
|
||||||
private LBLBlockListener lblBlockListener = new LBLBlockListener();
|
private LBLBlockListener lblBlockListener = new LBLBlockListener();
|
||||||
|
//private LBLEntityListener lblEntityListener = new LBLEntityListener();
|
||||||
static final Logger log = Logger.getLogger("Minecraft");
|
static final Logger log = Logger.getLogger("Minecraft");
|
||||||
List<World> worlds = getServer().getWorlds();
|
private List<String> worldNames;
|
||||||
|
private List<String> worldTables;
|
||||||
private boolean usePermissions = false;
|
private boolean usePermissions = false;
|
||||||
private String dbDriver = "com.mysql.jdbc.Driver";
|
private String dbDriver = "com.mysql.jdbc.Driver";
|
||||||
private String dbUrl = "";
|
private String dbUrl = "";
|
||||||
@@ -68,11 +71,9 @@ public class LogBlock extends JavaPlugin
|
|||||||
@Override
|
@Override
|
||||||
public void onEnable()
|
public void onEnable()
|
||||||
{
|
{
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
File file = new File (getDataFolder(), "config.yml");
|
File file = new File (getDataFolder(), "config.yml");
|
||||||
if (!file.exists())
|
if (!file.exists()) {
|
||||||
{
|
|
||||||
file.getParentFile().mkdirs();
|
file.getParentFile().mkdirs();
|
||||||
FileWriter writer = new FileWriter(file);
|
FileWriter writer = new FileWriter(file);
|
||||||
String crlf = System.getProperty("line.separator");
|
String crlf = System.getProperty("line.separator");
|
||||||
@@ -86,7 +87,9 @@ public class LogBlock extends JavaPlugin
|
|||||||
+ "tool-block-remove : true" + crlf
|
+ "tool-block-remove : true" + crlf
|
||||||
+ "default-distance : 20" + crlf
|
+ "default-distance : 20" + crlf
|
||||||
+ "usePermissions : false" + crlf
|
+ "usePermissions : false" + crlf
|
||||||
+ "keepLogDays : -1");
|
+ "keepLogDays : false" + crlf
|
||||||
|
+ "worldNames : [world]" + crlf
|
||||||
|
+ "worldTables : [lb-main]");
|
||||||
writer.close();
|
writer.close();
|
||||||
log.info(name + " Config created");
|
log.info(name + " Config created");
|
||||||
}
|
}
|
||||||
@@ -101,47 +104,49 @@ public class LogBlock extends JavaPlugin
|
|||||||
toolblockRemove = getConfiguration().getBoolean("tool-block-remove", true);
|
toolblockRemove = getConfiguration().getBoolean("tool-block-remove", true);
|
||||||
defaultDist = getConfiguration().getInt("default-distance", 20);
|
defaultDist = getConfiguration().getInt("default-distance", 20);
|
||||||
keepLogDays = getConfiguration().getInt("keepLogDays", -1);
|
keepLogDays = getConfiguration().getInt("keepLogDays", -1);
|
||||||
if (getConfiguration().getBoolean("usePermissions", false))
|
worldNames = getConfiguration().getStringList("worldNames", null);
|
||||||
{
|
worldTables = getConfiguration().getStringList("worldTables", null);
|
||||||
if (getServer().getPluginManager().getPlugin("Permissions") != null)
|
if (getConfiguration().getBoolean("usePermissions", false)) {
|
||||||
{
|
if (getServer().getPluginManager().getPlugin("Permissions") != null) {
|
||||||
usePermissions = true;
|
usePermissions = true;
|
||||||
log.info(name + " Permissions enabled");
|
log.info(name + " Permissions enabled");
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
log.info(name + " Permissions plugin not found. Use default permissions.");
|
log.info(name + " Permissions plugin not found. Use default permissions.");
|
||||||
}
|
}
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
log.log(Level.SEVERE, name + " Exception while reading config.yml", e);
|
log.log(Level.SEVERE, name + " Exception while reading config.yml", e);
|
||||||
getServer().getPluginManager().disablePlugin(this);
|
getServer().getPluginManager().disablePlugin(this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
new JDCConnectionDriver(dbDriver, dbUrl, dbUsername, dbPassword);
|
new JDCConnectionDriver(dbDriver, dbUrl, dbUsername, dbPassword);
|
||||||
}
|
} catch (Exception ex) {
|
||||||
catch (Exception ex)
|
log.log(Level.SEVERE, name + "Exception while creation database connection pool", ex);
|
||||||
{
|
|
||||||
log.log(Level.SEVERE, name + ": exception while creation database connection pool", ex);
|
|
||||||
getServer().getPluginManager().disablePlugin(this);
|
getServer().getPluginManager().disablePlugin(this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!checkTables())
|
if (worldNames == null || worldTables == null || worldNames.size() == 0 || worldNames.size() != worldTables.size()) {
|
||||||
{
|
log.log(Level.SEVERE, name + ": worldNames or worldTables not set porperly");
|
||||||
log.log(Level.SEVERE, name + " Errors while loading, check logs for more information.");
|
getServer().getPluginManager().disablePlugin(this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < worldNames.size(); i++) {
|
||||||
|
if (!checkTables(worldTables.get(i))) {
|
||||||
|
log.log(Level.SEVERE, name + " Errors while checking tables. They may not exist.");
|
||||||
|
getServer().getPluginManager().disablePlugin(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (keepLogDays >= 0)
|
if (keepLogDays >= 0)
|
||||||
dropOldLogs();
|
dropOldLogs();
|
||||||
PluginManager pm = getServer().getPluginManager();
|
PluginManager pm = getServer().getPluginManager();
|
||||||
pm.registerEvent(Type.PLAYER_COMMAND, lblPlayerListener, Event.Priority.Normal, this);
|
pm.registerEvent(Type.PLAYER_COMMAND, lblPlayerListener, Event.Priority.Normal, this);
|
||||||
pm.registerEvent(Type.BLOCK_RIGHTCLICKED, lblBlockListener, Event.Priority.Monitor, this);
|
pm.registerEvent(Type.BLOCK_RIGHTCLICKED, lblBlockListener, Event.Priority.Monitor, this);
|
||||||
|
pm.registerEvent(Type.PLAYER_ITEM, lblPlayerListener, Event.Priority.Monitor, this);
|
||||||
pm.registerEvent(Type.BLOCK_PLACED, lblBlockListener, Event.Priority.Monitor, this);
|
pm.registerEvent(Type.BLOCK_PLACED, lblBlockListener, Event.Priority.Monitor, this);
|
||||||
pm.registerEvent(Type.BLOCK_BREAK, lblBlockListener, Event.Priority.Monitor, this);
|
pm.registerEvent(Type.BLOCK_BREAK, lblBlockListener, Event.Priority.Monitor, this);
|
||||||
pm.registerEvent(Type.SIGN_CHANGE, lblBlockListener, Event.Priority.Monitor, this);
|
pm.registerEvent(Type.SIGN_CHANGE, lblBlockListener, Event.Priority.Monitor, this);
|
||||||
pm.registerEvent(Type.PLAYER_ITEM, lblPlayerListener, Event.Priority.Monitor, this);
|
//pm.registerEvent(Type.ENTITY_EXPLODE, lblEntityListener, Event.Priority.Monitor, this);
|
||||||
consumer = new Consumer();
|
consumer = new Consumer();
|
||||||
new Thread(consumer).start();
|
new Thread(consumer).start();
|
||||||
log.info("Logblock v" + getDescription().getVersion() + " enabled.");
|
log.info("Logblock v" + getDescription().getVersion() + " enabled.");
|
||||||
@@ -150,8 +155,7 @@ public class LogBlock extends JavaPlugin
|
|||||||
@Override
|
@Override
|
||||||
public void onDisable()
|
public void onDisable()
|
||||||
{
|
{
|
||||||
if (consumer != null)
|
if (consumer != null) {
|
||||||
{
|
|
||||||
consumer.stop();
|
consumer.stop();
|
||||||
consumer = null;
|
consumer = null;
|
||||||
}
|
}
|
||||||
@@ -163,23 +167,21 @@ public class LogBlock extends JavaPlugin
|
|||||||
return DriverManager.getConnection("jdbc:jdc:jdcpool");
|
return DriverManager.getConnection("jdbc:jdc:jdcpool");
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkTables()
|
private boolean checkTables(String table)
|
||||||
{
|
{
|
||||||
Connection conn = null;
|
Connection conn = null;
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
try {
|
try {
|
||||||
conn = getConnection();
|
conn = getConnection();
|
||||||
DatabaseMetaData dbm = conn.getMetaData();
|
DatabaseMetaData dbm = conn.getMetaData();
|
||||||
rs = dbm.getTables(null, null, "blocks", null);
|
rs = dbm.getTables(null, null, table, null);
|
||||||
if (!rs.next())
|
if (!rs.next()) {
|
||||||
{
|
log.log(Level.SEVERE, name + " table " + table + " doesn't exist.");
|
||||||
log.log(Level.SEVERE, name + " blocks table doesn't exist.");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
rs = dbm.getTables(null, null, "extra", null);
|
rs = dbm.getTables(null, null, table + "-extra", null);
|
||||||
if (!rs.next())
|
if (!rs.next()) {
|
||||||
{
|
log.log(Level.SEVERE, name + " table " + table + "-extra doesn't exist.");
|
||||||
log.log(Level.SEVERE, name + " extra table doesn't exist.");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -205,8 +207,10 @@ public class LogBlock extends JavaPlugin
|
|||||||
try {
|
try {
|
||||||
conn = getConnection();
|
conn = getConnection();
|
||||||
state = conn.createStatement();
|
state = conn.createStatement();
|
||||||
int deleted = state.executeUpdate("DELETE FROM blocks WHERE date < date_sub(now(), INTERVAL " + keepLogDays + " DAY)");
|
for (String table : worldTables) {
|
||||||
log.info(name + "Cleared out database. Deleted " + deleted + " entries.");
|
int deleted = state.executeUpdate("DELETE FROM `" + table + "` WHERE date < date_sub(now(), INTERVAL " + keepLogDays + " DAY)");
|
||||||
|
log.info(name + "Cleared out table " + table + ". Deleted " + deleted + " entries.");
|
||||||
|
}
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
log.log(Level.SEVERE, name + " SQL exception", ex);
|
log.log(Level.SEVERE, name + " SQL exception", ex);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -231,11 +235,14 @@ public class LogBlock extends JavaPlugin
|
|||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
Timestamp date;
|
Timestamp date;
|
||||||
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd hh:mm:ss");
|
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd hh:mm:ss");
|
||||||
|
int idx = worldNames.indexOf(player.getWorld().getName());
|
||||||
|
if (idx == -1)
|
||||||
|
return;
|
||||||
|
String table = worldTables.get(idx);
|
||||||
try {
|
try {
|
||||||
conn = getConnection();
|
conn = getConnection();
|
||||||
conn.setAutoCommit(false);
|
conn.setAutoCommit(false);
|
||||||
ps = conn.prepareStatement("SELECT * from blocks left join extra using (id) where y = ? and x = ? and z = ? order by date desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("SELECT * from `" + table + "` left join `" + table + "-extra` using (id) where y = ? and x = ? and z = ? order by date desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
||||||
ps.setInt(1, b.getY());
|
ps.setInt(1, b.getY());
|
||||||
ps.setInt(2, b.getX());
|
ps.setInt(2, b.getX());
|
||||||
ps.setInt(3, b.getZ());
|
ps.setInt(3, b.getZ());
|
||||||
@@ -281,15 +288,20 @@ public class LogBlock extends JavaPlugin
|
|||||||
{
|
{
|
||||||
if (block == null || typeBefore < 0 || typeAfter < 0)
|
if (block == null || typeBefore < 0 || typeAfter < 0)
|
||||||
return;
|
return;
|
||||||
BlockRow row = new BlockRow(playerName, typeBefore, typeAfter, data, block.getX(), block.getY(), block.getZ());
|
int idx = worldNames.indexOf(block.getWorld().getName());
|
||||||
boolean result = bqueue.offer(row);
|
if (idx == -1)
|
||||||
if (!result)
|
return;
|
||||||
|
BlockRow row = new BlockRow(worldTables.get(idx), playerName, typeBefore, typeAfter, data, block.getX(), block.getY(), block.getZ());
|
||||||
|
if (!bqueue.offer(row))
|
||||||
log.info(name + " failed to queue block for " + playerName);
|
log.info(name + " failed to queue block for " + playerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void queueSign(String playerName, Block block, String[] signText)
|
private void queueSign(String playerName, Block block, String[] signText)
|
||||||
{
|
{
|
||||||
BlockRow row = new BlockRow(playerName, 0, 63, block.getData(), block.getX(), block.getY(), block.getZ());
|
int idx = worldNames.indexOf(block.getWorld().getName());
|
||||||
|
if (idx == -1)
|
||||||
|
return;
|
||||||
|
BlockRow row = new BlockRow(worldTables.get(idx), playerName, 0, block.getTypeId(), block.getData(), block.getX(), block.getY(), block.getZ());
|
||||||
String text = "sign";
|
String text = "sign";
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
text += " [" + signText[i] + "]";
|
text += " [" + signText[i] + "]";
|
||||||
@@ -344,6 +356,10 @@ public class LogBlock extends JavaPlugin
|
|||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
if (split[0].equalsIgnoreCase("/lb")) {
|
if (split[0].equalsIgnoreCase("/lb")) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
int idx = worldNames.indexOf(player.getWorld().getName());
|
||||||
|
if (idx == -1)
|
||||||
|
return;
|
||||||
|
String table = worldTables.get(idx);
|
||||||
if (!CheckPermission(event.getPlayer(),"logblock.area"))
|
if (!CheckPermission(event.getPlayer(),"logblock.area"))
|
||||||
{
|
{
|
||||||
event.getPlayer().sendMessage("<EFBFBD>cInsufficient permissions");
|
event.getPlayer().sendMessage("<EFBFBD>cInsufficient permissions");
|
||||||
@@ -359,51 +375,56 @@ public class LogBlock extends JavaPlugin
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (split.length == 1) {
|
if (split.length == 1) {
|
||||||
AreaStats th = new AreaStats(conn, player, defaultDist);
|
AreaStats th = new AreaStats(conn, player, defaultDist, table);
|
||||||
new Thread(th).start();
|
new Thread(th).start();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (split.length == 2) {
|
else if (split[1].equalsIgnoreCase("world")) {
|
||||||
if (split[1].equalsIgnoreCase("world")) {
|
PlayerWorldStats th = new PlayerWorldStats(conn, player, table);
|
||||||
PlayerWorldStats th = new PlayerWorldStats(conn, player);
|
new Thread(th).start();
|
||||||
new Thread(th).start();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
player.sendMessage("<EFBFBD>cIncorrect usage.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (split.length == 3) {
|
else if (split[1].equalsIgnoreCase("player")) {
|
||||||
if (split[1].equalsIgnoreCase("player")) {
|
PlayerAreaStats th;
|
||||||
PlayerAreaStats th = new PlayerAreaStats(conn, player, split[2], defaultDist);
|
if (split.length == 4)
|
||||||
new Thread(th).start();
|
th = new PlayerAreaStats(conn, player, split[2], Integer.parseInt(split[3]), table);
|
||||||
return;
|
else
|
||||||
}
|
th = new PlayerAreaStats(conn, player, split[2], defaultDist, table);
|
||||||
else if (split[1].equalsIgnoreCase("area")) {
|
new Thread(th).start();
|
||||||
AreaStats th = new AreaStats(conn, player, Integer.parseInt(split[2]));
|
return;
|
||||||
new Thread(th).start();
|
}
|
||||||
return;
|
else if (split[1].equalsIgnoreCase("area")) {
|
||||||
}
|
AreaStats th = new AreaStats(conn, player, Integer.parseInt(split[2]), table);
|
||||||
else if (split[1].equalsIgnoreCase("block")) {
|
new Thread(th).start();
|
||||||
int type;
|
return;
|
||||||
if (Material.matchMaterial(split[2]) != null)
|
}
|
||||||
type = Material.matchMaterial(split[2]).getId();
|
else if (split[1].equalsIgnoreCase("block")) {
|
||||||
else
|
int type;
|
||||||
type = Integer.parseInt(split[2]);
|
if (Material.matchMaterial(split[2]) != null)
|
||||||
AreaBlockSearch th = new AreaBlockSearch(conn, player, type, defaultDist);
|
type = Material.matchMaterial(split[2]).getId();
|
||||||
new Thread(th).start();
|
else
|
||||||
return;
|
type = Integer.parseInt(split[2]);
|
||||||
}
|
AreaBlockSearch th;
|
||||||
|
if (split.length == 4)
|
||||||
|
th = new AreaBlockSearch(conn, player, type, Integer.parseInt(split[3]), table);
|
||||||
|
else
|
||||||
|
th = new AreaBlockSearch(conn, player, type, defaultDist, table);
|
||||||
|
new Thread(th).start();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
player.sendMessage("<EFBFBD>cIncorrect usage.");
|
player.sendMessage("<EFBFBD>cIncorrect usage.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (split[0].equalsIgnoreCase("/rollback"))
|
if (split[0].equalsIgnoreCase("/rollback")) {
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
if (!CheckPermission(event.getPlayer(),"logblock.rollback"))
|
if (!CheckPermission(event.getPlayer(),"logblock.rollback")) {
|
||||||
{
|
event.getPlayer().sendMessage("<EFBFBD>cInsufficient permissions");
|
||||||
event.getPlayer().sendMessage("<EFBFBD>cInsufficient permissions");
|
return;
|
||||||
return;
|
}
|
||||||
}
|
int idx = worldNames.indexOf(player.getWorld().getName());
|
||||||
|
if (idx == -1)
|
||||||
|
return;
|
||||||
|
String table = worldTables.get(idx);
|
||||||
int minutes;
|
int minutes;
|
||||||
String name;
|
String name;
|
||||||
if (split.length < 3)
|
if (split.length < 3)
|
||||||
@@ -413,9 +434,7 @@ public class LogBlock extends JavaPlugin
|
|||||||
}
|
}
|
||||||
name = split[1];
|
name = split[1];
|
||||||
minutes = parseTimeSpec(event.getMessage().substring(event.getMessage().indexOf(' ', 11) + 1));
|
minutes = parseTimeSpec(event.getMessage().substring(event.getMessage().indexOf(' ', 11) + 1));
|
||||||
|
|
||||||
player.sendMessage("<EFBFBD>cRolling back " + name + " by " + minutes + " minutes.");
|
player.sendMessage("<EFBFBD>cRolling back " + name + " by " + minutes + " minutes.");
|
||||||
|
|
||||||
Connection conn;
|
Connection conn;
|
||||||
try {
|
try {
|
||||||
conn = getConnection();
|
conn = getConnection();
|
||||||
@@ -424,16 +443,20 @@ public class LogBlock extends JavaPlugin
|
|||||||
player.sendMessage("<EFBFBD>cError, check server logs.");
|
player.sendMessage("<EFBFBD>cError, check server logs.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Rollback rb = new Rollback(conn, name, minutes);
|
Rollback rb = new Rollback(conn, name, minutes, player.getWorld(), table);
|
||||||
player.sendMessage("<EFBFBD>cEdit count: " + rb.count());
|
player.sendMessage("<EFBFBD>cEdit count: " + rb.count());
|
||||||
new Thread(rb).start();
|
new Thread(rb).start();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (split[0].equalsIgnoreCase("/getworldname")) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
event.getPlayer().sendMessage("The world you are in is called: " + event.getPlayer().getWorld().getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onPlayerItem(PlayerItemEvent event)
|
public void onPlayerItem(PlayerItemEvent event)
|
||||||
{
|
{
|
||||||
if (event.getPlayer().getWorld() == worlds.get(0)) {
|
if (!event.isCancelled()) {
|
||||||
if (event.getMaterial() == Material.WATER_BUCKET)
|
if (event.getMaterial() == Material.WATER_BUCKET)
|
||||||
queueBlock(event.getPlayer().getName(), event.getBlockClicked().getFace(event.getBlockFace()), 0, 9, (byte)0);
|
queueBlock(event.getPlayer().getName(), event.getBlockClicked().getFace(event.getBlockFace()), 0, 9, (byte)0);
|
||||||
else if (event.getMaterial() == Material.LAVA_BUCKET)
|
else if (event.getMaterial() == Material.LAVA_BUCKET)
|
||||||
@@ -448,13 +471,13 @@ public class LogBlock extends JavaPlugin
|
|||||||
{
|
{
|
||||||
public void onBlockRightClick(BlockRightClickEvent event)
|
public void onBlockRightClick(BlockRightClickEvent event)
|
||||||
{
|
{
|
||||||
if (event.getItemInHand().getTypeId() == toolID && CheckPermission(event.getPlayer(), "logblock.lookup") && event.getPlayer().getWorld() == worlds.get(0))
|
if (event.getItemInHand().getTypeId()== toolID)
|
||||||
showBlockHistory(event.getPlayer(), event.getBlock());
|
showBlockHistory(event.getPlayer(), event.getBlock());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onBlockPlace(BlockPlaceEvent event)
|
public void onBlockPlace(BlockPlaceEvent event)
|
||||||
{
|
{
|
||||||
if (event.getPlayer().getWorld() == worlds.get(0)) {
|
if (!event.isCancelled()) {
|
||||||
if (event.getItemInHand().getTypeId() == toolblockID && CheckPermission(event.getPlayer(), "logblock.lookup"))
|
if (event.getItemInHand().getTypeId() == toolblockID && CheckPermission(event.getPlayer(), "logblock.lookup"))
|
||||||
{
|
{
|
||||||
showBlockHistory(event.getPlayer(), event.getBlockPlaced());
|
showBlockHistory(event.getPlayer(), event.getBlockPlaced());
|
||||||
@@ -468,35 +491,48 @@ public class LogBlock extends JavaPlugin
|
|||||||
|
|
||||||
public void onBlockBreak(BlockBreakEvent event)
|
public void onBlockBreak(BlockBreakEvent event)
|
||||||
{
|
{
|
||||||
if (event.getPlayer().getWorld() == worlds.get(0))
|
if (!event.isCancelled())
|
||||||
queueBlock(event.getPlayer().getName(), event.getBlock(), event.getBlock().getTypeId(), 0, event.getBlock().getData());
|
queueBlock(event.getPlayer().getName(), event.getBlock(), event.getBlock().getTypeId(), 0, event.getBlock().getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSignChange(SignChangeEvent event) {
|
public void onSignChange(SignChangeEvent event) {
|
||||||
if (event.getPlayer().getWorld() == worlds.get(0))
|
if (!event.isCancelled())
|
||||||
queueSign(event.getPlayer().getName(), event.getBlock(), event.getLines());
|
queueSign(event.getPlayer().getName(), event.getBlock(), event.getLines());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//private class LBLEntityListener extends EntityListener
|
||||||
|
//{
|
||||||
|
// public void onEntityExplode(EntityExplodeEvent event) {
|
||||||
|
// if (!event.isCancelled()) {
|
||||||
|
// if (event.getEntity() == null) {
|
||||||
|
// log.info("Exploding tnt at: " + event.getLocation().getBlockX() + ":" + event.getLocation().getBlockY() + ":" + event.getLocation().getBlockZ());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
private class Consumer implements Runnable
|
private class Consumer implements Runnable
|
||||||
{
|
{
|
||||||
private boolean stop = false;
|
private boolean stop = false;
|
||||||
Consumer() { stop = false; }
|
|
||||||
public void stop() { stop = true; }
|
Consumer() {
|
||||||
public void run()
|
stop = false;
|
||||||
{
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
stop = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
Connection conn = null;
|
Connection conn = null;
|
||||||
BlockRow b;
|
BlockRow b;
|
||||||
|
while (!stop) {
|
||||||
while (!stop)
|
long start = System.currentTimeMillis()/1000L;
|
||||||
{
|
|
||||||
long start = System.currentTimeMillis()/1000L;
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
if (bqueue.size() > 100)
|
if (bqueue.size() > 100)
|
||||||
log.info(name + " queue size " + bqueue.size());
|
log.info(name + " queue size " + bqueue.size());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
conn = getConnection();
|
conn = getConnection();
|
||||||
conn.setAutoCommit(false);
|
conn.setAutoCommit(false);
|
||||||
@@ -506,7 +542,7 @@ public class LogBlock extends JavaPlugin
|
|||||||
|
|
||||||
if (b == null)
|
if (b == null)
|
||||||
continue;
|
continue;
|
||||||
ps = conn.prepareStatement("INSERT INTO blocks (date, player, replaced, type, data, x, y, z) VALUES (now(),?,?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("INSERT INTO `" + b.table + "` (date, player, replaced, type, data, x, y, z) VALUES (now(),?,?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
|
||||||
ps.setString(1, b.name);
|
ps.setString(1, b.name);
|
||||||
ps.setInt(2, b.replaced);
|
ps.setInt(2, b.replaced);
|
||||||
ps.setInt(3, b.type);
|
ps.setInt(3, b.type);
|
||||||
@@ -516,18 +552,16 @@ public class LogBlock extends JavaPlugin
|
|||||||
ps.setInt(7, b.z);
|
ps.setInt(7, b.z);
|
||||||
ps.executeUpdate();
|
ps.executeUpdate();
|
||||||
|
|
||||||
if (b.extra != null)
|
if (b.extra != null) {
|
||||||
{
|
|
||||||
ResultSet keys = ps.getGeneratedKeys();
|
ResultSet keys = ps.getGeneratedKeys();
|
||||||
keys.next();
|
keys.next();
|
||||||
int key = keys.getInt(1);
|
int key = keys.getInt(1);
|
||||||
|
|
||||||
ps = conn.prepareStatement("INSERT INTO extra (id, extra) values (?,?)");
|
ps = conn.prepareStatement("INSERT INTO `" + b.table + "-extra` (id, extra) values (?,?)");
|
||||||
ps.setInt(1, key);
|
ps.setInt(1, key);
|
||||||
ps.setString(2, b.extra);
|
ps.setString(2, b.extra);
|
||||||
ps.executeUpdate();
|
ps.executeUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
conn.commit();
|
conn.commit();
|
||||||
@@ -551,14 +585,15 @@ public class LogBlock extends JavaPlugin
|
|||||||
|
|
||||||
private class BlockRow
|
private class BlockRow
|
||||||
{
|
{
|
||||||
|
public String table;
|
||||||
public String name;
|
public String name;
|
||||||
public int replaced, type;
|
public int replaced, type;
|
||||||
public byte data;
|
public byte data;
|
||||||
public int x, y, z;
|
public int x, y, z;
|
||||||
public String extra;
|
public String extra;
|
||||||
|
|
||||||
BlockRow(String name, int replaced, int type, byte data, int x, int y, int z)
|
BlockRow(String table, String name, int replaced, int type, byte data, int x, int y, int z) {
|
||||||
{
|
this.table = table;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.replaced = replaced;
|
this.replaced = replaced;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
@@ -569,112 +604,12 @@ public class LogBlock extends JavaPlugin
|
|||||||
this.extra = null;
|
this.extra = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addExtra(String extra)
|
public void addExtra(String extra) {
|
||||||
{
|
|
||||||
this.extra = extra;
|
this.extra = extra;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString()
|
public String toString() {
|
||||||
{
|
|
||||||
return("name: " + name + " before type: " + replaced + " type: " + type + " x: " + x + " y: " + y + " z: " + z);
|
return("name: " + name + " before type: " + replaced + " type: " + type + " x: " + x + " y: " + y + " z: " + z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Rollback implements Runnable
|
|
||||||
{
|
|
||||||
private LinkedBlockingQueue<Edit> edits = new LinkedBlockingQueue<Edit>();
|
|
||||||
|
|
||||||
Rollback(Connection conn, String name, int minutes)
|
|
||||||
{
|
|
||||||
String query = "select type, data, replaced, x, y, z from blocks where player = ? and date > date_sub(now(), interval ? minute) order by date desc";
|
|
||||||
PreparedStatement ps = null;
|
|
||||||
ResultSet rs = null;
|
|
||||||
edits.clear();
|
|
||||||
|
|
||||||
try {
|
|
||||||
conn.setAutoCommit(false);
|
|
||||||
ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
|
|
||||||
ps.setString(1, name);
|
|
||||||
ps.setInt(2, minutes);
|
|
||||||
rs = ps.executeQuery();
|
|
||||||
|
|
||||||
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"));
|
|
||||||
edits.offer(e);
|
|
||||||
}
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
log.log(Level.SEVERE, this.getClass().getName() + " SQL exception", ex);
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if (rs != null)
|
|
||||||
rs.close();
|
|
||||||
if (ps != null)
|
|
||||||
ps.close();
|
|
||||||
if (conn != null)
|
|
||||||
conn.close();
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
log.log(Level.SEVERE, this.getClass().getName() + " SQL exception on close", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public int count()
|
|
||||||
{
|
|
||||||
return edits.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
Edit e = edits.poll();
|
|
||||||
|
|
||||||
while (e != null)
|
|
||||||
{
|
|
||||||
e.perform();
|
|
||||||
e.log();
|
|
||||||
e = edits.poll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Edit
|
|
||||||
{
|
|
||||||
int type, replaced;
|
|
||||||
int x, y, z;
|
|
||||||
byte data;
|
|
||||||
|
|
||||||
Edit(int type, int replaced, byte data, int x, int y, int z)
|
|
||||||
{
|
|
||||||
this.type = type;
|
|
||||||
this.replaced = replaced;
|
|
||||||
this.data = data;
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
this.z = z;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void perform()
|
|
||||||
{
|
|
||||||
Block block = getServer().getWorlds().get(0).getBlockAt(x, y, z);
|
|
||||||
if (block.getTypeId() == type || (block.getTypeId() >= 8 && block.getTypeId() <= 11))
|
|
||||||
{
|
|
||||||
if (block.setTypeId(replaced)) {
|
|
||||||
block.setData(data);
|
|
||||||
log.info("R (" + x + ", " + y + ", " + z + ") " + replaced + " " + type);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
log.info("r (" + x + ", " + y + ", " + z + ") " + replaced + " " + type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void log()
|
|
||||||
{
|
|
||||||
int current = getServer().getWorlds().get(0).getBlockTypeIdAt(x, y, z);
|
|
||||||
if (current == type)
|
|
||||||
log.info("+ (" + x + ", " + y + ", " + z + ") " + replaced + " " + type);
|
|
||||||
else
|
|
||||||
log.info("- (" + x + ", " + y + ", " + z + ") " + replaced + " " + type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -20,13 +20,15 @@ public class PlayerAreaStats implements Runnable
|
|||||||
private String name;
|
private String name;
|
||||||
private int size;
|
private int size;
|
||||||
private Connection conn = null;
|
private Connection conn = null;
|
||||||
|
private String table;
|
||||||
|
|
||||||
PlayerAreaStats(Connection conn, Player player, String name, int size)
|
PlayerAreaStats(Connection conn, Player player, String name, int size, String table)
|
||||||
{
|
{
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.conn = conn;
|
this.conn = conn;
|
||||||
|
this.table = table;
|
||||||
}
|
}
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
@@ -39,7 +41,7 @@ public class PlayerAreaStats implements Runnable
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
conn.setAutoCommit(false);
|
conn.setAutoCommit(false);
|
||||||
ps = conn.prepareStatement("SELECT type, count(type) as num from blocks where type > 0 and player = ? and y > 0 and x > ? and x < ? and z > ? and z < ? group by type order by count(replaced) desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("SELECT type, count(type) as num from `" + table + "` where type > 0 and player = ? and y > 0 and x > ? and x < ? and z > ? and z < ? group by type order by count(replaced) desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
||||||
ps.setString(1, name);
|
ps.setString(1, name);
|
||||||
ps.setInt(2, player.getLocation().getBlockX()-size);
|
ps.setInt(2, player.getLocation().getBlockX()-size);
|
||||||
ps.setInt(3, player.getLocation().getBlockX()+size);
|
ps.setInt(3, player.getLocation().getBlockX()+size);
|
||||||
@@ -54,7 +56,7 @@ public class PlayerAreaStats implements Runnable
|
|||||||
rs.close();
|
rs.close();
|
||||||
ps.close();
|
ps.close();
|
||||||
|
|
||||||
ps = conn.prepareStatement("SELECT replaced, count(replaced) as num from blocks where replaced > 0 and player = ? and y > 0 and x > ? and x < ? and z > ? and z < ? group by replaced order by count(replaced) desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("SELECT replaced, count(replaced) as num from `" + table + "` where replaced > 0 and player = ? and y > 0 and x > ? and x < ? and z > ? and z < ? group by replaced order by count(replaced) desc limit 10", Statement.RETURN_GENERATED_KEYS);
|
||||||
ps.setString(1, name);
|
ps.setString(1, name);
|
||||||
ps.setInt(2, player.getLocation().getBlockX()-size);
|
ps.setInt(2, player.getLocation().getBlockX()-size);
|
||||||
ps.setInt(3, player.getLocation().getBlockX()+size);
|
ps.setInt(3, player.getLocation().getBlockX()+size);
|
||||||
|
@@ -17,11 +17,13 @@ public class PlayerWorldStats implements Runnable
|
|||||||
static final Logger log = Logger.getLogger("Minecraft");
|
static final Logger log = Logger.getLogger("Minecraft");
|
||||||
private Player player;
|
private Player player;
|
||||||
private Connection conn = null;
|
private Connection conn = null;
|
||||||
|
private String table;
|
||||||
|
|
||||||
PlayerWorldStats(Connection conn, Player player)
|
PlayerWorldStats(Connection conn, Player player, String table)
|
||||||
{
|
{
|
||||||
this.player = player;
|
this.player = player;
|
||||||
this.conn = conn;
|
this.conn = conn;
|
||||||
|
this.table = table;
|
||||||
}
|
}
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
@@ -34,7 +36,7 @@ public class PlayerWorldStats implements Runnable
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
conn.setAutoCommit(false);
|
conn.setAutoCommit(false);
|
||||||
ps = conn.prepareStatement("SELECT player, count(player) as num from blocks where type > 0 group by player order by count(player) desc limit 5", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("SELECT player, count(player) as num from `" + table + "` where type > 0 group by player order by count(player) desc limit 5", Statement.RETURN_GENERATED_KEYS);
|
||||||
rs = ps.executeQuery();
|
rs = ps.executeQuery();
|
||||||
while (rs.next())
|
while (rs.next())
|
||||||
{
|
{
|
||||||
@@ -44,7 +46,7 @@ public class PlayerWorldStats implements Runnable
|
|||||||
rs.close();
|
rs.close();
|
||||||
ps.close();
|
ps.close();
|
||||||
|
|
||||||
ps = conn.prepareStatement("SELECT player, count(player) as num from blocks where replaced > 0 group by player order by count(player) desc limit 5", Statement.RETURN_GENERATED_KEYS);
|
ps = conn.prepareStatement("SELECT player, count(player) as num from `" + table + "` where replaced > 0 group by player order by count(player) desc limit 5", Statement.RETURN_GENERATED_KEYS);
|
||||||
rs = ps.executeQuery();
|
rs = ps.executeQuery();
|
||||||
while (rs.next())
|
while (rs.next())
|
||||||
{
|
{
|
||||||
|
110
src/de/diddiz/LogBlock/Rollback.java
Normal file
110
src/de/diddiz/LogBlock/Rollback.java
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
package de.diddiz.LogBlock;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
|
||||||
|
public class Rollback implements Runnable
|
||||||
|
{
|
||||||
|
static final Logger log = Logger.getLogger("Minecraft");
|
||||||
|
private LinkedBlockingQueue<Edit> edits = new LinkedBlockingQueue<Edit>();
|
||||||
|
|
||||||
|
Rollback(Connection conn, String name, int minutes, World world, String table)
|
||||||
|
{
|
||||||
|
PreparedStatement ps = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
edits.clear();
|
||||||
|
try {
|
||||||
|
conn.setAutoCommit(false);
|
||||||
|
ps = conn.prepareStatement("SELECT type, data, replaced, x, y, z FROM `" + table + "` WHERE player = ? AND date > date_sub(now(), INTERVAL ? MINUTE) ORDERr BY date DESC", Statement.RETURN_GENERATED_KEYS);
|
||||||
|
ps.setString(1, name);
|
||||||
|
ps.setInt(2, minutes);
|
||||||
|
rs = ps.executeQuery();
|
||||||
|
|
||||||
|
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"), world);
|
||||||
|
edits.offer(e);
|
||||||
|
}
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
log.log(Level.SEVERE, this.getClass().getName() + " SQL exception", ex);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (rs != null)
|
||||||
|
rs.close();
|
||||||
|
if (ps != null)
|
||||||
|
ps.close();
|
||||||
|
if (conn != null)
|
||||||
|
conn.close();
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
log.log(Level.SEVERE, this.getClass().getName() + " SQL exception on close", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int count()
|
||||||
|
{
|
||||||
|
return edits.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
Edit e = edits.poll();
|
||||||
|
|
||||||
|
while (e != null)
|
||||||
|
{
|
||||||
|
e.perform();
|
||||||
|
e.log();
|
||||||
|
e = edits.poll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Edit
|
||||||
|
{
|
||||||
|
int type, replaced;
|
||||||
|
int x, y, z;
|
||||||
|
byte data;
|
||||||
|
World world;
|
||||||
|
|
||||||
|
Edit(int type, int replaced, byte data, int x, int y, int z, World world)
|
||||||
|
{
|
||||||
|
this.type = type;
|
||||||
|
this.replaced = replaced;
|
||||||
|
this.data = data;
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void perform()
|
||||||
|
{
|
||||||
|
Block block = world.getBlockAt(x, y, z);
|
||||||
|
if (block.getTypeId() == type || (block.getTypeId() >= 8 && block.getTypeId() <= 11))
|
||||||
|
{
|
||||||
|
if (block.setTypeId(replaced)) {
|
||||||
|
block.setData(data);
|
||||||
|
log.info("R (" + x + ", " + y + ", " + z + ") " + replaced + " " + type);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
log.info("r (" + x + ", " + y + ", " + z + ") " + replaced + " " + type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void log()
|
||||||
|
{
|
||||||
|
int current = world.getBlockTypeIdAt(x, y, z);
|
||||||
|
if (current == type)
|
||||||
|
log.info("+ (" + x + ", " + y + ", " + z + ") " + replaced + " " + type);
|
||||||
|
else
|
||||||
|
log.info("- (" + x + ", " + y + ", " + z + ") " + replaced + " " + type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
name: LogBlock
|
name: LogBlock
|
||||||
version: 0.3
|
version: 0.4
|
||||||
author: DiddiZ, bootswithdefer
|
author: DiddiZ, bootswithdefer
|
||||||
website: http://www.diddiz.de/minecraft/
|
website: http://www.diddiz.de/minecraft/
|
||||||
main: de.diddiz.LogBlock.LogBlock
|
main: de.diddiz.LogBlock.LogBlock
|
||||||
|
Reference in New Issue
Block a user