You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
6.4 KiB

package ru.simsonic.rscPermissions.Bukkit.Commands;
import java.util.ArrayList;
import java.util.logging.Level;
import org.bukkit.command.CommandSender;
import ru.simsonic.rscCommonsLibrary.RestartableThread;
import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException;
import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes;
import ru.simsonic.rscMinecraftLibrary.Bukkit.Tools;
import ru.simsonic.rscPermissions.API.Settings;
import ru.simsonic.rscPermissions.Bukkit.BukkitDatabaseFetcher;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.Engine.Phrases;
public class BukkitCommands
{
private final BukkitPluginMain rscp;
private final CommandEntity cmdEntity;
private final CommandLock cmdLock;
private final CommandFetch cmdFetch;
private final CommandDebug cmdDebug;
private final CommandReload cmdReload;
private final CommandUpdate cmdUpdate;
public final BukkitDatabaseFetcher threadFetchDatabaseContents;
public BukkitCommands(final BukkitPluginMain plugin)
{
this.rscp = plugin;
cmdEntity = new CommandEntity(rscp);
cmdLock = new CommandLock (rscp);
cmdFetch = new CommandFetch (rscp);
cmdDebug = new CommandDebug (rscp);
cmdReload = new CommandReload(rscp);
cmdUpdate = new CommandUpdate(rscp);
threadFetchDatabaseContents = new BukkitDatabaseFetcher(rscp);
}
public Thread threadMigrateFromPExSQL(final CommandSender sender)
{
final Thread result = new Thread()
{
@Override
public void run()
{
try
{
setName("rscp:MigrateFromPermissionsEx-SQL");
rscp.connection.executeUpdateT("Migrate_from_PermissionsEx");
threadFetchDatabaseContents.join();
rscp.getServer().getScheduler().runTask(rscp, new Runnable()
{
@Override
public void run()
{
sender.sendMessage(GenericChatCodes.processStringStatic(
Settings.CHAT_PREFIX + "Migration from PermissionsEx (MySQL backend) done!"));
sender.sendMessage(GenericChatCodes.processStringStatic(
Settings.CHAT_PREFIX + "Check the latest database rows for new data."));
}
});
} catch(InterruptedException ex) {
BukkitPluginMain.consoleLog.log(Level.SEVERE, "[rscp] Exception in MigrateFromPExSQL(): {0}", ex);
}
}
};
result.start();
return result;
}
public RestartableThread threadInsertExampleRows(final CommandSender sender)
{
final RestartableThread threadInsertExampleRows = new RestartableThread()
{
@Override
public void run()
{
Thread.currentThread().setName("rscp:InsertExampleRows");
rscp.connection.insertExampleRows();
rscp.getServer().getScheduler().runTask(rscp, new Runnable()
{
@Override
public void run()
{
sender.sendMessage("Database tables were filled with example rows.");
}
});
}
};
threadInsertExampleRows.startDeamon();
return threadInsertExampleRows;
}
public void onCommandHub(CommandSender sender, String[] args) throws CommandAnswerException
{
final ArrayList<String> help = new ArrayList<>(64);
final boolean isAdmin = sender.hasPermission("rscp.admin");
final boolean isLocker = sender.hasPermission("rscp.admin.lock");
help.addAll(Tools.getPluginWelcome(rscp, Phrases.HELP_HEADER_1.toString()));
if(isLocker)
help.add(Phrases.HELP_HEADER_2.toString().replace("{:SERVERID}", rscp.getServer().getServerId()));
final String mmode = rscp.settings.getMaintenanceMode();
if(isLocker && !"".equals(mmode))
help.add(Phrases.HELP_HEADER_3.toString().replace("{:MMODE}", mmode));
if(args.length == 0)
throw new CommandAnswerException(help);
// Generating full help page
help.add(Phrases.HELP_USAGE.toString());
if(isAdmin)
help.addAll(cmdEntity.getHelp());
if(isLocker)
{
help.add(Phrases.HELP_CMD_LOCK.toString());
help.add(Phrases.HELP_CMD_UNLOCK.toString());
}
if(isAdmin)
{
help.add("{_YL}/rscp {_LR}examplerows {_LS}- insert some fake rows into database");
help.add("{_YL}/rscp {_LR}import pex-sql {_LS}- import data from pex's database (in the same schema)");
help.add(Phrases.HELP_CMD_DEBUG.toString());
help.add(Phrases.HELP_CMD_FETCH.toString());
help.add(Phrases.HELP_CMD_RELOAD.toString());
}
help.add(Phrases.HELP_CMD_HELP.toString());
switch(args[0].toLowerCase())
{
case "listgroups":
case "groups":
case "lg":
case "gs":
cmdEntity.listGroups(sender);
return;
case "listusers":
case "users":
case "lu":
case "us":
cmdEntity.listUsers(sender);
return;
case "group":
case "g":
cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.GROUP, args);
return;
case "user":
case "u":
cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.USER, args);
return;
case "player":
case "p":
cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.PLAYER, args);
return;
case "lock":
cmdLock.executeLock(sender, args);
return;
case "unlock":
cmdLock.executeUnlock(sender);
return;
case "fetch":
/* rscp fetch */
cmdFetch.execute(sender);
return;
case "debug":
/* rscp debug [<boolean variant>|toggle] */
cmdDebug.execute(sender, args);
return;
case "reload":
/* rscp reload */
cmdReload.execute(sender);
return;
case "update":
cmdUpdate.execute(sender, args);
return;
case "examplerows":
/* DEPRECATED: rscp examplerows */
if(sender.hasPermission("rscp.admin"))
{
threadInsertExampleRows(sender);
throw new CommandAnswerException("Example rows have been added into database.");
}
break;
case "import":
/* DEPRECATED: rscp import pex-sql*/
if(sender.hasPermission("rscp.admin"))
{
if(args.length <= 1)
throw new CommandAnswerException(new String[]
{
"Usage: {_YL}/rscp import <importer> [options]",
"Available importers:",
"{_LG}pex-sql {_LS}- (PermissionsEx's SQL backend)",
});
switch(args[1].toLowerCase())
{
case "pex-sql":
threadMigrateFromPExSQL(sender);
throw new CommandAnswerException("Trying to import PEX database into rscPermissions...");
default:
break;
}
}
return;
case "help":
default:
break;
}
throw new CommandAnswerException(help);
}
}