2011-05-06 15:46:49 +02:00
package de.diddiz.LogBlock ;
2011-06-01 14:13:08 +02:00
import static de.diddiz.util.BukkitUtils.giveTool ;
2011-06-20 13:28:54 +02:00
import static de.diddiz.util.BukkitUtils.saveSpawnHeight ;
2011-05-22 04:01:43 +02:00
import java.io.Closeable ;
2011-05-06 15:46:49 +02:00
import java.io.File ;
import java.io.FileWriter ;
import java.sql.Connection ;
import java.sql.ResultSet ;
import java.sql.SQLException ;
import java.sql.Statement ;
import java.text.SimpleDateFormat ;
2011-05-22 04:01:43 +02:00
import java.util.ArrayList ;
2011-05-06 15:46:49 +02:00
import java.util.Arrays ;
import java.util.List ;
import java.util.logging.Level ;
import java.util.logging.Logger ;
import org.bukkit.ChatColor ;
import org.bukkit.Location ;
import org.bukkit.command.Command ;
import org.bukkit.command.CommandExecutor ;
import org.bukkit.command.CommandSender ;
import org.bukkit.entity.Player ;
2011-05-22 04:01:43 +02:00
import org.bukkit.scheduler.BukkitScheduler ;
2011-05-06 15:46:49 +02:00
import de.diddiz.LogBlock.QueryParams.BlockChangeType ;
2011-05-22 04:01:43 +02:00
import de.diddiz.LogBlock.QueryParams.Order ;
2011-05-06 15:46:49 +02:00
import de.diddiz.LogBlock.QueryParams.SummarizationMode ;
2011-05-22 04:01:43 +02:00
import de.diddiz.LogBlockQuestioner.LogBlockQuestioner ;
2011-05-06 15:46:49 +02:00
public class CommandsHandler implements CommandExecutor
{
private final Logger log ;
private final LogBlock logblock ;
private final Config config ;
2011-05-22 04:01:43 +02:00
private final BukkitScheduler scheduler ;
private final LogBlockQuestioner questioner ;
2011-05-06 15:46:49 +02:00
2011-05-22 04:01:43 +02:00
CommandsHandler ( LogBlock logblock ) {
2011-05-06 15:46:49 +02:00
this . logblock = logblock ;
log = logblock . getServer (). getLogger ();
config = logblock . getConfig ();
2011-05-22 04:01:43 +02:00
scheduler = logblock . getServer (). getScheduler ();
questioner = ( LogBlockQuestioner ) logblock . getServer (). getPluginManager (). getPlugin ( "LogBlockQuestioner" );
2011-05-06 15:46:49 +02:00
}
@Override
2011-05-22 04:01:43 +02:00
public boolean onCommand ( CommandSender sender , Command cmd , String commandLabel , String [] args ) {
2011-05-06 15:46:49 +02:00
if ( ! cmd . getName (). equalsIgnoreCase ( "lb" ))
return false ;
if ( args . length == 0 ) {
sender . sendMessage ( ChatColor . LIGHT_PURPLE + "LogBlock v" + logblock . getDescription (). getVersion () + " by DiddiZ" );
2011-06-11 16:14:13 +02:00
sender . sendMessage ( ChatColor . LIGHT_PURPLE + logblock . getUpdater (). checkVersion ());
2011-05-06 15:46:49 +02:00
sender . sendMessage ( ChatColor . LIGHT_PURPLE + "Type /lb help for help" );
2011-05-22 04:01:43 +02:00
} else {
final String command = args [ 0 ] . toLowerCase ();
if ( command . equals ( "help" )) {
sender . sendMessage ( ChatColor . DARK_AQUA + "LogBlock Help:" );
sender . sendMessage ( ChatColor . GOLD + "For the commands list type '/lb commands'" );
sender . sendMessage ( ChatColor . GOLD + "For the parameters list type '/lb params'" );
sender . sendMessage ( ChatColor . GOLD + "For the list of permissions you got type '/lb permissions'" );
} else if ( command . equals ( "commands" )) {
sender . sendMessage ( ChatColor . DARK_AQUA + "LogBlock Commands:" );
sender . sendMessage ( ChatColor . GOLD + "/lb tool -- Gives you the lb tool" );
sender . sendMessage ( ChatColor . GOLD + "/lb tool [on|off] -- Enables/Disables tool" );
sender . sendMessage ( ChatColor . GOLD + "/lb tool [params] -- Sets the tool lookup query" );
sender . sendMessage ( ChatColor . GOLD + "/lb toolblock -- Analog to tool" );
sender . sendMessage ( ChatColor . GOLD + "/lb hide -- Hides you from log" );
sender . sendMessage ( ChatColor . GOLD + "/lb rollback [params] -- Rollback" );
sender . sendMessage ( ChatColor . GOLD + "/lb redo [params] -- Redo" );
sender . sendMessage ( ChatColor . GOLD + "/lb tp [params] -- Teleports you to the location of griefing" );
sender . sendMessage ( ChatColor . GOLD + "/lb writelogfile [params] -- Writes a log file" );
sender . sendMessage ( ChatColor . GOLD + "/lb lookup [params] -- Lookup" );
sender . sendMessage ( ChatColor . GOLD + "/lb me -- Displays your stats" );
sender . sendMessage ( ChatColor . GOLD + "Look at diddiz.insane-architects.net/logblock for the full commands reference" );
} else if ( command . equals ( "params" )) {
sender . sendMessage ( ChatColor . DARK_AQUA + "LogBlock Query Parameters:" );
sender . sendMessage ( ChatColor . GOLD + "Use doublequotes to escape a keyword: world \"world\"" );
sender . sendMessage ( ChatColor . GOLD + "player [name1] <name2> <name3> -- List of players" );
sender . sendMessage ( ChatColor . GOLD + "block [type1] <type2> <type3> -- List of block types" );
sender . sendMessage ( ChatColor . GOLD + "created, destroyed -- Show only created/destroyed blocks" );
sender . sendMessage ( ChatColor . GOLD + "chestaccess -- Show only chest accesses" );
sender . sendMessage ( ChatColor . GOLD + "area <radius> -- Area around you" );
sender . sendMessage ( ChatColor . GOLD + "selection, sel -- Inside current WorldEdit selection" );
sender . sendMessage ( ChatColor . GOLD + "world [worldname] -- Changes the world" );
sender . sendMessage ( ChatColor . GOLD + "time [number] [minutes|hours|days] -- Limits time" );
sender . sendMessage ( ChatColor . GOLD + "since <dd.MM.yyyy> <HH:mm:ss> -- Limits time to a fixed point" );
2011-06-28 23:17:11 +02:00
sender . sendMessage ( ChatColor . GOLD + "before <dd.MM.yyyy> <HH:mm:ss> -- Affects only blocks before a fixed time" );
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . GOLD + "limit <row count> -- Limits the result to count of rows" );
sender . sendMessage ( ChatColor . GOLD + "sum [none|blocks|players] -- Sums the result" );
sender . sendMessage ( ChatColor . GOLD + "asc, desc -- Changes the order of the displayed log" );
2011-06-28 23:17:11 +02:00
sender . sendMessage ( ChatColor . GOLD + "coords -- Shows coordinates for each block" );
2011-05-22 04:01:43 +02:00
} else if ( command . equals ( "permissions" )) {
sender . sendMessage ( ChatColor . DARK_AQUA + "You've got the following permissions:" );
if ( logblock . hasPermission ( sender , "logblock.tool" ))
sender . sendMessage ( ChatColor . GOLD + "logblock.tool" );
if ( logblock . hasPermission ( sender , "logblock.toolblock" ))
sender . sendMessage ( ChatColor . GOLD + "logblock.toolblock" );
2011-06-28 23:17:11 +02:00
if ( logblock . hasPermission ( sender , "logblock.lookup" ))
sender . sendMessage ( ChatColor . GOLD + "logblock.lookup" );
2011-05-22 04:01:43 +02:00
if ( logblock . hasPermission ( sender , "logblock.me" ))
sender . sendMessage ( ChatColor . GOLD + "logblock.me" );
if ( logblock . hasPermission ( sender , "logblock.tp" ))
sender . sendMessage ( ChatColor . GOLD + "logblock.tp" );
if ( logblock . hasPermission ( sender , "logblock.rollback" ))
sender . sendMessage ( ChatColor . GOLD + "logblock.rollback" );
2011-05-25 02:30:03 +02:00
if ( logblock . hasPermission ( sender , "logblock.clearlog" ))
sender . sendMessage ( ChatColor . GOLD + "logblock.clearlog" );
2011-05-22 04:01:43 +02:00
if ( logblock . hasPermission ( sender , "logblock.hide" ))
sender . sendMessage ( ChatColor . GOLD + "logblock.hide" );
} else if ( command . equals ( "tool" )) {
if ( sender instanceof Player ) {
final Player player = ( Player ) sender ;
if ( args . length == 1 ) {
if ( logblock . hasPermission ( player , "logblock.tool" ))
2011-06-01 14:13:08 +02:00
giveTool ( player , config . toolID );
2011-05-22 04:01:43 +02:00
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
} else if ( args [ 1 ] . equalsIgnoreCase ( "enable" ) || args [ 1 ] . equalsIgnoreCase ( "on" )) {
logblock . getSession ( player . getName ()). toolEnabled = true ;
player . sendMessage ( ChatColor . GREEN + "Tool enabled." );
} else if ( args [ 1 ] . equalsIgnoreCase ( "disable" ) || args [ 1 ] . equalsIgnoreCase ( "off" )) {
logblock . getSession ( player . getName ()). toolEnabled = false ;
player . sendMessage ( ChatColor . GREEN + "Tool disabled." );
2011-06-09 22:47:20 +02:00
} else if ( args [ 1 ] . equalsIgnoreCase ( "mode" )) {
final Session session = logblock . getSession ( player . getName ());
if ( args . length == 3 ) {
final ToolMode mode ;
try {
mode = ToolMode . valueOf ( args [ 2 ] . toUpperCase ());
} catch ( final IllegalArgumentException ex ) {
sender . sendMessage ( ChatColor . RED + "Can't find mode " + args [ 2 ] );
return true ;
}
if ( logblock . hasPermission ( player , mode . getPermission ())) {
session . toolMode = mode ;
sender . sendMessage ( ChatColor . GREEN + "Tool mode set to " + args [ 2 ] );
} else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to use mode " + args [ 2 ] );
} else
player . sendMessage ( ChatColor . RED + "No mode specified" );
2011-05-22 04:01:43 +02:00
} else if ( logblock . hasPermission ( player , "logblock.lookup" ))
try {
final QueryParams params = new QueryParams ( logblock , sender , ArgsToList ( args , 1 ));
logblock . getSession ( player . getName ()). toolQuery = params ;
sender . sendMessage ( ChatColor . GREEN + "Set tool query to: " + params . getTitle ());
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
2011-05-06 15:46:49 +02:00
else
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
2011-05-06 15:46:49 +02:00
} else
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . RED + "You have to be a player." );
} else if ( command . equals ( "toolblock" )) {
if ( sender instanceof Player ) {
final Player player = ( Player ) sender ;
if ( args . length == 1 ) {
if ( logblock . hasPermission ( player , "logblock.toolblock" ))
2011-06-01 14:13:08 +02:00
giveTool ( player , config . toolblockID );
2011-05-22 04:01:43 +02:00
else
player . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
} else if ( args [ 1 ] . equalsIgnoreCase ( "enable" ) || args [ 1 ] . equalsIgnoreCase ( "on" )) {
logblock . getSession ( player . getName ()). toolBlockEnabled = true ;
player . sendMessage ( ChatColor . GREEN + "Tool block enabled." );
} else if ( args [ 1 ] . equalsIgnoreCase ( "disable" ) || args [ 1 ] . equalsIgnoreCase ( "off" )) {
logblock . getSession ( player . getName ()). toolBlockEnabled = false ;
player . sendMessage ( ChatColor . GREEN + "Tool block disabled." );
2011-06-09 22:47:20 +02:00
} else if ( args [ 1 ] . equalsIgnoreCase ( "mode" )) {
final Session session = logblock . getSession ( player . getName ());
if ( args . length == 3 ) {
final ToolMode mode ;
try {
mode = ToolMode . valueOf ( args [ 2 ] . toUpperCase ());
} catch ( final IllegalArgumentException ex ) {
sender . sendMessage ( ChatColor . RED + "Can't find mode " + args [ 2 ] );
return true ;
}
if ( logblock . hasPermission ( player , mode . getPermission ())) {
session . toolBlockMode = mode ;
sender . sendMessage ( ChatColor . GREEN + "Toolblock mode set to " + args [ 2 ] );
} else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to use mode " + args [ 2 ] );
} else
player . sendMessage ( ChatColor . RED + "No mode specified" );
2011-05-22 04:01:43 +02:00
} else if ( logblock . hasPermission ( player , "logblock.lookup" ))
try {
final QueryParams params = new QueryParams ( logblock , sender , ArgsToList ( args , 1 ));
logblock . getSession ( player . getName ()). toolBlockQuery = params ;
sender . sendMessage ( ChatColor . GREEN + "Set tool block query to: " + params . getTitle ());
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
2011-05-06 15:46:49 +02:00
} else
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . RED + "You have to be a player." );
} else if ( command . equals ( "hide" )) {
if ( sender instanceof Player ) {
if ( logblock . hasPermission ( sender , "logblock.hide" )) {
if ( logblock . getConsumer (). hide (( Player ) sender ))
sender . sendMessage ( ChatColor . GREEN + "You are now hided and won't appear in any log. Type '/lb hide' again to unhide" );
else
2011-06-09 22:47:20 +02:00
sender . sendMessage ( ChatColor . GREEN + "You aren't hidden anylonger." );
2011-05-22 04:01:43 +02:00
} else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
} else
sender . sendMessage ( ChatColor . RED + "You have to be a player." );
} else if ( args [ 0 ] . equalsIgnoreCase ( "savequeue" )) {
if ( logblock . hasPermission ( sender , "logblock.rollback" ))
2011-05-06 15:46:49 +02:00
try {
2011-06-16 22:31:13 +02:00
new CommandSaveQueue ( sender , null , true );
2011-05-06 15:46:49 +02:00
} catch ( final Exception ex ) {
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
2011-05-06 15:46:49 +02:00
}
2011-05-22 04:01:43 +02:00
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
} else if ( command . equals ( "rollback" ) || command . equals ( "undo" ) || command . equals ( "rb" )) {
if ( logblock . hasPermission ( sender , "logblock.rollback" ))
try {
final QueryParams params = new QueryParams ( logblock );
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 ;
2011-06-16 22:31:13 +02:00
new CommandRollback ( sender , params , true );
2011-05-22 04:01:43 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
} else if ( command . equals ( "redo" )) {
if ( logblock . hasPermission ( sender , "logblock.rollback" ))
try {
final QueryParams params = new QueryParams ( logblock );
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 ;
2011-06-16 22:31:13 +02:00
new CommandRedo ( sender , params , true );
2011-05-22 04:01:43 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
} else if ( command . equals ( "me" )) {
if ( sender instanceof Player ) {
if ( logblock . hasPermission ( sender , "logblock.me" ))
try {
final Player player = ( Player ) sender ;
final QueryParams params = new QueryParams ( logblock );
params . setPlayer ( player . getName ());
params . sum = SummarizationMode . TYPES ;
params . world = player . getWorld ();
2011-06-16 22:31:13 +02:00
new CommandLookup ( sender , params , true );
2011-05-22 04:01:43 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this." );
2011-05-06 15:46:49 +02:00
} else
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . RED + "You have to be a player." );
} else if ( command . equals ( "writelogfile" )) {
if ( logblock . hasPermission ( sender , "logblock.rollback" ))
try {
final QueryParams params = new QueryParams ( logblock , sender , ArgsToList ( args , 1 ));
params . limit = - 1 ;
params . bct = BlockChangeType . ALL ;
params . sum = SummarizationMode . NONE ;
2011-06-16 22:31:13 +02:00
new CommandWriteLogFile ( sender , params , true );
2011-05-22 04:01:43 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this" );
} else if ( command . equals ( "clearlog" )) {
if ( logblock . hasPermission ( sender , "logblock.clearlog" ))
try {
final QueryParams params = new QueryParams ( logblock , sender , ArgsToList ( args , 1 ));
params . bct = BlockChangeType . ALL ;
params . limit = - 1 ;
2011-06-16 22:31:13 +02:00
new CommandClearLog ( sender , params , true );
2011-05-22 04:01:43 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this" );
} else if ( command . equals ( "tp" )) {
if ( sender instanceof Player ) {
if ( logblock . hasPermission ( sender , "logblock.tp" ))
try {
2011-06-16 22:31:13 +02:00
new CommandTeleport ( sender , new QueryParams ( logblock , sender , ArgsToList ( args , 1 )), true );
2011-05-22 04:01:43 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
else
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this" );
} else
sender . sendMessage ( ChatColor . RED + "You have to be a player." );
} else if ( command . equals ( "lookup" ) || QueryParams . isKeyWord ( args [ 0 ] )) {
if ( logblock . hasPermission ( sender , "logblock.lookup" ))
try {
final List < String > argsList = new ArrayList < String > ( Arrays . asList ( args ));
if ( command . equals ( "lookup" ))
argsList . remove ( 0 );
2011-06-16 22:31:13 +02:00
new CommandLookup ( sender , new QueryParams ( logblock , sender , argsList ), true );
2011-05-22 04:01:43 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
else
2011-05-06 15:46:49 +02:00
sender . sendMessage ( ChatColor . RED + "You aren't allowed to do this" );
} else
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . RED + "Unknown command '" + args [ 0 ] + "'" );
2011-05-06 15:46:49 +02:00
}
return true ;
}
2011-05-22 04:01:43 +02:00
public abstract class LBCommand implements Runnable , Closeable
2011-05-06 15:46:49 +02:00
{
protected final CommandSender sender ;
protected final QueryParams params ;
protected Connection conn = null ;
protected Statement state = null ;
protected ResultSet rs = null ;
2011-06-16 22:31:13 +02:00
protected LBCommand ( CommandSender sender , QueryParams params , boolean async ) throws Exception {
2011-05-06 15:46:49 +02:00
this . sender = sender ;
this . params = params ;
2011-05-22 04:01:43 +02:00
conn = logblock . getConnection ();
state = conn . createStatement ();
2011-06-16 22:31:13 +02:00
if ( async ) {
if ( scheduler . scheduleAsyncDelayedTask ( logblock , this ) == - 1 )
throw new Exception ( "Failed to schedule the command" );
} else
run ();
2011-05-06 15:46:49 +02:00
}
2011-05-22 04:01:43 +02:00
@Override
public final void close () {
2011-05-06 15:46:49 +02:00
try {
if ( conn != null )
conn . close ();
if ( state != null )
state . close ();
if ( rs != null )
rs . close ();
} catch ( final SQLException ex ) {
2011-06-12 22:24:52 +02:00
log . log ( Level . SEVERE , "[LogBlock CommandsHandler] SQL exception on close" , ex );
2011-05-06 15:46:49 +02:00
}
}
}
2011-05-22 04:01:43 +02:00
public class CommandLookup extends LBCommand
2011-05-06 15:46:49 +02:00
{
2011-06-16 22:31:13 +02:00
public CommandLookup ( CommandSender sender , QueryParams params , boolean async ) throws Exception {
super ( sender , params , async );
2011-05-06 15:46:49 +02:00
}
@Override
public void run () {
try {
2011-06-10 02:19:31 +02:00
rs = state . executeQuery ( params . getLookupQuery ());
2011-05-06 15:46:49 +02:00
sender . sendMessage ( ChatColor . DARK_AQUA + params . getTitle ());
if ( rs . next ()) {
rs . beforeFirst ();
2011-05-22 04:01:43 +02:00
final SummarizationMode sum = params . sum ;
2011-06-22 20:54:52 +02:00
final HistoryFormatter histformatter = new HistoryFormatter ( sum , params . coords , ( sender instanceof Player ? 2 / 3f : 1 ));
2011-05-06 15:46:49 +02:00
if ( sum == SummarizationMode . TYPES )
2011-06-22 20:54:52 +02:00
sender . sendMessage ( ChatColor . GOLD + "Created - Destroyed - Block" );
2011-05-06 15:46:49 +02:00
else if ( sum == SummarizationMode . PLAYERS )
2011-06-22 20:54:52 +02:00
sender . sendMessage ( ChatColor . GOLD + "Created - Destroyed - Player" );
2011-05-06 15:46:49 +02:00
while ( rs . next ())
2011-06-22 20:54:52 +02:00
sender . sendMessage ( ChatColor . GOLD + histformatter . format ( rs ));
2011-05-06 15:46:49 +02:00
} else
sender . sendMessage ( ChatColor . DARK_AQUA + "No results found." );
2011-06-12 22:24:52 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + "Exception, check error log" );
log . log ( Level . SEVERE , "[LogBlock Lookup] Exception: " , ex );
2011-05-06 15:46:49 +02:00
} finally {
close ();
}
}
}
2011-05-22 04:01:43 +02:00
public class CommandWriteLogFile extends LBCommand
2011-05-06 15:46:49 +02:00
{
2011-06-16 22:31:13 +02:00
CommandWriteLogFile ( CommandSender sender , QueryParams params , boolean async ) throws Exception {
super ( sender , params , async );
2011-05-06 15:46:49 +02:00
}
@Override
public void run () {
2011-06-06 11:19:25 +02:00
File file = null ;
2011-05-06 15:46:49 +02:00
try {
2011-06-13 13:01:07 +02:00
file = new File ( "plugins/LogBlock/log/" + params . getTitle (). replace ( ":" , "." ) + ".log" );
sender . sendMessage ( ChatColor . GREEN + "Creating " + file . getName ());
2011-06-10 02:19:31 +02:00
rs = state . executeQuery ( params . getLookupQuery ());
2011-06-13 13:01:07 +02:00
file . getParentFile (). mkdirs ();
2011-05-22 04:01:43 +02:00
file . createNewFile ();
2011-05-06 15:46:49 +02:00
final FileWriter writer = new FileWriter ( file );
final String newline = System . getProperty ( "line.separator" );
2011-06-22 20:54:52 +02:00
final HistoryFormatter histformatter = new HistoryFormatter ( params . sum , params . coords , 1 );
2011-05-06 15:46:49 +02:00
file . getParentFile (). mkdirs ();
2011-06-13 13:01:07 +02:00
int counter = 0 ;
while ( rs . next ()) {
2011-06-22 20:54:52 +02:00
writer . write ( histformatter . format ( rs ) + newline );
2011-06-13 13:01:07 +02:00
counter ++ ;
}
2011-05-06 15:46:49 +02:00
writer . close ();
2011-06-13 13:01:07 +02:00
sender . sendMessage ( ChatColor . GREEN + "Wrote " + counter + " lines." );
2011-06-12 22:24:52 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + "Exception, check error log" );
log . log ( Level . SEVERE , "[LogBlock WriteLogFile] Exception (file was " + file . getAbsolutePath () + "): " , ex );
2011-05-06 15:46:49 +02:00
} finally {
close ();
}
}
}
2011-05-22 04:01:43 +02:00
public class CommandSaveQueue extends LBCommand
2011-05-06 15:46:49 +02:00
{
2011-06-16 22:31:13 +02:00
public CommandSaveQueue ( CommandSender sender , QueryParams params , boolean async ) throws Exception {
super ( sender , params , async );
2011-05-06 15:46:49 +02:00
}
@Override
public void run () {
final Consumer consumer = logblock . getConsumer ();
sender . sendMessage ( ChatColor . DARK_AQUA + "Current queue size: " + consumer . getQueueSize ());
2011-05-22 04:01:43 +02:00
while ( consumer . getQueueSize () > 0 )
2011-05-06 15:46:49 +02:00
consumer . run ();
sender . sendMessage ( ChatColor . GREEN + "Queue saved successfully" );
}
}
2011-05-22 04:01:43 +02:00
public class CommandTeleport extends LBCommand
2011-05-06 15:46:49 +02:00
{
2011-06-16 22:31:13 +02:00
public CommandTeleport ( CommandSender sender , QueryParams params , boolean async ) throws Exception {
super ( sender , params , async );
2011-05-06 15:46:49 +02:00
}
@Override
public void run () {
try {
2011-06-20 13:28:54 +02:00
rs = state . executeQuery ( "SELECT x, y, z FROM `" + params . getTable () + "` INNER JOIN `lb-players` USING (playerid) " + params . getWhere () + params . getOrderBy () + " LIMIT 1" );
2011-05-06 15:46:49 +02:00
if ( rs . next ()) {
final Player player = ( Player ) sender ;
2011-06-20 13:28:54 +02:00
final int y = rs . getInt ( 2 );
final Location loc = new Location ( params . world , rs . getInt ( 1 ) + 0 . 5 , y , rs . getInt ( 3 ) + 0 . 5 , player . getLocation (). getYaw (), 90 );
final int y2 = saveSpawnHeight ( loc );
loc . setY ( y2 );
player . teleport ( loc );
sender . sendMessage ( ChatColor . GREEN + "You were teleported " + Math . abs ( y2 - y ) + " blocks " + ( y2 - y > 0 ? "above" : "below" ));
2011-05-06 15:46:49 +02:00
} else
2011-06-20 13:28:54 +02:00
sender . sendMessage ( ChatColor . RED + "No blockchange found to teleport to" );
2011-06-12 22:24:52 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + "Exception, check error log" );
log . log ( Level . SEVERE , "[LogBlock Teleport] Exception: " , ex );
2011-05-06 15:46:49 +02:00
} finally {
close ();
}
}
}
2011-05-22 04:01:43 +02:00
public class CommandRollback extends LBCommand
2011-05-06 15:46:49 +02:00
{
2011-06-16 22:31:13 +02:00
public CommandRollback ( CommandSender sender , QueryParams params , boolean async ) throws Exception {
super ( sender , params , async );
2011-05-06 15:46:49 +02:00
}
@Override
public void run () {
try {
2011-06-12 23:50:52 +02:00
if ( logblock . getConsumer (). getQueueSize () > 50 )
2011-06-01 14:13:08 +02:00
try {
2011-06-16 22:31:13 +02:00
new CommandSaveQueue ( sender , null , true );
2011-06-01 14:13:08 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + ex . getMessage ());
}
2011-06-12 23:50:52 +02:00
if ( ! params . silent )
sender . sendMessage ( ChatColor . DARK_AQUA + "Searching " + params . getTitle () + ":" );
2011-06-10 01:54:18 +02:00
rs = state . executeQuery ( params . getRollbackQuery ());
2011-05-22 04:01:43 +02:00
final WorldEditor editor = new WorldEditor ( logblock , params . world );
while ( rs . next ())
2011-06-29 21:43:07 +02:00
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" ));
2011-05-06 15:46:49 +02:00
final int changes = editor . getSize ();
2011-06-12 23:50:52 +02:00
if ( ! params . silent )
sender . sendMessage ( ChatColor . GREEN . toString () + changes + " blocks found." );
2011-06-01 14:13:08 +02:00
if ( changes == 0 ) {
2011-06-12 23:50:52 +02:00
if ( ! params . silent )
sender . sendMessage ( ChatColor . RED + "Rollback aborted" );
2011-06-01 14:13:08 +02:00
return ;
}
2011-06-12 23:50:52 +02:00
if ( ! params . silent && config . askRollbacks && questioner != null && sender instanceof Player && ! questioner . ask (( Player ) sender , "Are you sure you want to continue?" , "yes" , "no" ). equals ( "yes" )) {
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . RED + "Rollback aborted" );
2011-05-06 15:46:49 +02:00
return ;
}
2011-05-22 04:01:43 +02:00
editor . start ();
2011-06-13 18:49:42 +02:00
sender . sendMessage ( ChatColor . GREEN + "Rollback finished successfully (" + editor . getElapsedTime () + " ms, " + editor . getSuccesses () + "/" + changes + " blocks" + ( editor . getErrors () > 0 ? ", " + ChatColor . RED + editor . getErrors () + " errors" + ChatColor . GREEN : "" ) + ( editor . getBlacklistCollisions () > 0 ? ", " + editor . getBlacklistCollisions () + " blacklist collisions" : "" ) + ")" );
2011-06-12 22:24:52 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + "Exception, check error log" );
log . log ( Level . SEVERE , "[LogBlock Rollback] Exception: " , ex );
2011-05-06 15:46:49 +02:00
} finally {
close ();
}
}
}
2011-05-22 04:01:43 +02:00
public class CommandRedo extends LBCommand
2011-05-06 15:46:49 +02:00
{
2011-06-16 22:31:13 +02:00
public CommandRedo ( CommandSender sender , QueryParams params , boolean async ) throws Exception {
super ( sender , params , async );
2011-05-06 15:46:49 +02:00
}
@Override
public void run () {
try {
2011-06-10 01:54:18 +02:00
rs = state . executeQuery ( params . getRollbackQuery ());
2011-06-12 23:50:52 +02:00
if ( ! params . silent )
sender . sendMessage ( ChatColor . DARK_AQUA + "Searching " + params . getTitle () + ":" );
2011-05-22 04:01:43 +02:00
final WorldEditor editor = new WorldEditor ( logblock , params . world );
2011-06-29 21:43:07 +02:00
2011-05-22 04:01:43 +02:00
while ( rs . next ())
2011-06-29 21:43:07 +02:00
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" ) * - 1 ), rs . getByte ( "itemdata" ));
2011-05-06 15:46:49 +02:00
final int changes = editor . getSize ();
2011-06-12 23:50:52 +02:00
if ( ! params . silent )
sender . sendMessage ( ChatColor . GREEN . toString () + changes + " blocks found." );
2011-06-01 14:13:08 +02:00
if ( changes == 0 ) {
2011-06-12 23:50:52 +02:00
if ( ! params . silent )
sender . sendMessage ( ChatColor . RED + "Redo aborted" );
2011-06-01 14:13:08 +02:00
return ;
}
2011-06-12 23:50:52 +02:00
if ( ! params . silent && config . askRedos && questioner != null && sender instanceof Player && ! questioner . ask (( Player ) sender , "Are you sure you want to continue?" , "yes" , "no" ). equals ( "yes" )) {
2011-05-22 04:01:43 +02:00
sender . sendMessage ( ChatColor . RED + "Redo aborted" );
2011-05-06 15:46:49 +02:00
return ;
}
2011-05-22 04:01:43 +02:00
editor . start ();
2011-06-13 18:49:42 +02:00
sender . sendMessage ( ChatColor . GREEN + "Redo finished successfully (" + editor . getElapsedTime () + " ms, " + editor . getSuccesses () + "/" + changes + " blocks" + ( editor . getErrors () > 0 ? ", " + ChatColor . RED + editor . getErrors () + " errors" + ChatColor . GREEN : "" ) + ( editor . getBlacklistCollisions () > 0 ? ", " + editor . getBlacklistCollisions () + " blacklist collisions" : "" ) + ")" );
2011-06-12 22:24:52 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + "Exception, check error log" );
log . log ( Level . SEVERE , "[LogBlock Redo] Exception: " , ex );
2011-05-06 15:46:49 +02:00
} finally {
close ();
}
}
}
2011-05-22 04:01:43 +02:00
public class CommandClearLog extends LBCommand
{
2011-06-16 22:31:13 +02:00
public CommandClearLog ( CommandSender sender , QueryParams params , boolean async ) throws Exception {
super ( sender , params , async );
2011-05-22 04:01:43 +02:00
}
@Override
public void run () {
try {
final File dumpFolder = new File ( logblock . getDataFolder (), "dumb" );
2011-05-26 16:58:07 +02:00
final SimpleDateFormat formatter = new SimpleDateFormat ( "yyMMddHHmmss" );
2011-05-22 04:01:43 +02:00
int deleted ;
2011-05-26 16:58:07 +02:00
final String table = params . getTable ();
2011-06-01 14:13:08 +02:00
final String join ;
if ( params . players . size () > 0 )
join = "INNER JOIN `lb-players` USING (playerid) " ;
else
join = "" ;
rs = state . executeQuery ( "SELECT count(*) FROM `" + table + "` " + join + params . getWhere ());
2011-05-26 16:58:07 +02:00
rs . next ();
if (( deleted = rs . getInt ( 1 )) > 0 ) {
2011-06-12 23:50:52 +02:00
if ( ! params . silent && config . askClearLogs && sender instanceof Player && questioner != null ) {
2011-05-26 16:58:07 +02:00
sender . sendMessage ( ChatColor . DARK_AQUA + "Searching " + params . getTitle () + ":" );
sender . sendMessage ( ChatColor . GREEN . toString () + deleted + " blocks found." );
2011-06-11 01:53:24 +02:00
if ( ! questioner . ask (( Player ) sender , "Are you sure you want to continue?" , "yes" , "no" ). equals ( "yes" )) {
2011-05-26 16:58:07 +02:00
sender . sendMessage ( ChatColor . RED + "ClearLog aborted" );
return ;
2011-05-22 04:01:43 +02:00
}
}
2011-05-26 16:58:07 +02:00
if ( config . dumpDeletedLog )
try {
2011-06-09 22:47:20 +02:00
state . execute ( "SELECT * FROM `" + table + "` " + join + params . getWhere () + "INTO OUTFILE '" + new File ( dumpFolder , formatter . format ( System . currentTimeMillis ()) + " " + table + " " + params . getTitle (). replace ( ":" , "." ) + ".csv" ). getAbsolutePath (). replace ( "\\" , "\\\\" ) + "' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'" );
2011-05-26 16:58:07 +02:00
} 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 ;
}
2011-06-01 14:13:08 +02:00
state . execute ( "DELETE `" + table + "` FROM `" + table + "` " + join + params . getWhere ());
2011-05-26 16:58:07 +02:00
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." );
2011-05-22 04:01:43 +02:00
}
2011-06-12 22:24:52 +02:00
} catch ( final Exception ex ) {
sender . sendMessage ( ChatColor . RED + "Exception, check error log" );
log . log ( Level . SEVERE , "[LogBlock ClearLog] Exception: " , ex );
2011-05-22 04:01:43 +02:00
} finally {
close ();
}
}
}
2011-06-01 14:13:08 +02:00
private static List < String > ArgsToList ( String [] arr , int offset ) {
2011-05-22 04:01:43 +02:00
final List < String > list = new ArrayList < String > ( Arrays . asList ( arr ));
for ( int i = 0 ; i < offset ; i ++ )
list . remove ( 0 );
return list ;
2011-05-06 15:46:49 +02:00
}
}