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.
254 lines
8.6 KiB
254 lines
8.6 KiB
package ru.simsonic.rscPermissions.Bukkit.Commands; |
|
|
|
import java.util.ArrayList; |
|
import java.util.Collections; |
|
import java.util.logging.Level; |
|
import org.bukkit.command.CommandSender; |
|
import org.bukkit.entity.Player; |
|
import ru.simsonic.rscCommonsLibrary.RestartableThread; |
|
import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; |
|
import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; |
|
import ru.simsonic.rscPermissions.API.Settings; |
|
import ru.simsonic.rscPermissions.Bukkit.BukkitDatabaseFetcher; |
|
import ru.simsonic.rscPermissions.BukkitPluginMain; |
|
import ru.simsonic.rscPermissions.Engine.Matchers; |
|
import ru.simsonic.rscPermissions.Engine.Phrases; |
|
import ru.simsonic.rscPermissions.Engine.ResolutionResult; |
|
|
|
public class BukkitCommands |
|
{ |
|
private final BukkitPluginMain rscp; |
|
private final CommandLock cmdLock; |
|
private final CommandFetch cmdFetch; |
|
private final CommandDebug cmdDebug; |
|
private final CommandReload cmdReload; |
|
public final BukkitDatabaseFetcher threadFetchDatabaseContents; |
|
public BukkitCommands(final BukkitPluginMain plugin) |
|
{ |
|
this.rscp = plugin; |
|
cmdLock = new CommandLock(rscp); |
|
cmdFetch = new CommandFetch(rscp); |
|
cmdDebug = new CommandDebug(rscp); |
|
cmdReload = new CommandReload(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.chatPrefix |
|
+ "Migration from PermissionsEx (MySQL backend) done!")); |
|
sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix |
|
+ "Check the latest database row 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); |
|
help.add("{_WH}" + rscp.getDescription().getName() + " v" + rscp.getDescription().getVersion() |
|
+ " © " + rscp.getDescription().getAuthors().get(0)); |
|
help.add(Phrases.HELP_HEADER_1.toString()); |
|
help.add("{_LB}{_U}" + rscp.getDescription().getWebsite()); |
|
if(args.length == 0) |
|
throw new CommandAnswerException(help); |
|
help.add(Phrases.HELP_HEADER_2.toString().replace("{SERVER-ID}", rscp.getServer().getServerId())); |
|
final String mm = rscp.settings.getMaintenanceMode(); |
|
if(sender.hasPermission("rscp.admin.lock") && !"".equals(mm)) |
|
help.add("{_LS}Server is in maintenance mode \'{_LG}" + mm + "{_LS}\' now!"); |
|
help.add(Phrases.HELP_USAGE.toString()); |
|
if(sender.hasPermission("rscp.admin")) |
|
{ |
|
help.add(Phrases.HELP_CMD_USER_LP.toString()); |
|
help.add(Phrases.HELP_CMD_USER_LG.toString()); |
|
help.add(Phrases.HELP_CMD_USER_P.toString()); |
|
help.add(Phrases.HELP_CMD_USER_S.toString()); |
|
} |
|
if(sender.hasPermission("rscp.admin.lock")) |
|
{ |
|
help.add(Phrases.HELP_CMD_LOCK.toString()); |
|
help.add(Phrases.HELP_CMD_UNLOCK.toString()); |
|
} |
|
if(sender.hasPermission("rscp.admin")) |
|
{ |
|
help.add("{_YL}/rscp examplerows {_LS}-- insert some fake rows into database"); |
|
help.add("{_YL}/rscp 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 "user": |
|
onCommandHubUser(sender, args); |
|
break; |
|
case "lock": |
|
cmdLock.executeLock(sender, args); |
|
return; |
|
case "unlock": |
|
cmdLock.executeUnlock(sender); |
|
return; |
|
case "examplerows": |
|
/* rscp examplerows */ |
|
if(sender.hasPermission("rscp.admin")) |
|
{ |
|
threadInsertExampleRows(sender); |
|
throw new CommandAnswerException("Example rows have been added into database."); |
|
} |
|
break; |
|
case "import": |
|
if(sender.hasPermission("rscp.admin")) |
|
{ |
|
if(args.length > 1) |
|
switch(args[1].toLowerCase()) |
|
{ |
|
case "pex-sql": |
|
threadMigrateFromPExSQL(sender); |
|
throw new CommandAnswerException("Trying to import PEX database into rscPermissions..."); |
|
} |
|
throw new CommandAnswerException(new String[] |
|
{ |
|
"Usage: {_YL}/rscp import <importer> [options]", |
|
"Available importers:", |
|
"{_LG}pex-sql {_LS}-- (PermissionsEx SQL Backend)", |
|
}); |
|
} |
|
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 "help": |
|
default: |
|
break; |
|
} |
|
throw new CommandAnswerException(help); |
|
} |
|
private void onCommandHubUser(CommandSender sender, String[] args) throws CommandAnswerException |
|
{ |
|
if(sender.hasPermission("rscp.admin") == false) |
|
throw new CommandAnswerException("Not enough permissions."); |
|
if(args.length < 3) |
|
return; |
|
final Player player = rscp.bridgeForBukkit.findPlayer(args[1]); |
|
if(player != null) |
|
args[1] = player.getName(); |
|
final ResolutionResult result = (player != null) |
|
? rscp.permissionManager.getResult(player) |
|
: rscp.permissionManager.getResult(args[1]); |
|
final ArrayList<String> answer = new ArrayList<>(); |
|
if(Matchers.isCorrectDashlessUUID(args[1])) |
|
args[1] = Matchers.uuidAddDashes(args[1]); |
|
switch(args[2].toLowerCase()) |
|
{ |
|
case "lp": |
|
answer.add("Permission list for user {_YL}" + args[1] + "{_LS}:"); |
|
final ArrayList<String> sorted_keys = new ArrayList<>(result.permissions.keySet()); |
|
Collections.sort(sorted_keys); |
|
for(String perm : sorted_keys) |
|
answer.add((result.permissions.get(perm) ? "{_LG}" : "{_LR}") + perm); |
|
throw new CommandAnswerException(answer); |
|
case "lg": |
|
answer.add("Group list for user {_YL}" + args[1] + "{_LS}:"); |
|
for(String group : result.getOrderedGroups()) |
|
answer.add("{_LG}" + group); |
|
throw new CommandAnswerException(answer); |
|
case "p": |
|
case "prefix": |
|
answer.add("Calculated prefix for user {_YL}" + args[1] + "{_LS} is:"); |
|
answer.add("{_R}\"" + result.prefix + "{_R}\""); |
|
throw new CommandAnswerException(answer); |
|
case "s": |
|
case "suffix": |
|
answer.add("Calculated suffix for user {_YL}" + args[1] + "{_LS} is:"); |
|
answer.add("{_R}\"" + result.suffix + "{_R}\""); |
|
throw new CommandAnswerException(answer); |
|
} |
|
} |
|
public static boolean argumentToBoolean(String arg, Boolean prevForToggle) throws IllegalArgumentException |
|
{ |
|
if(arg == null || "".equals(arg)) |
|
throw new IllegalArgumentException("Argument is null or empty."); |
|
switch(arg.toLowerCase()) |
|
{ |
|
case "enable": |
|
case "true": |
|
case "yes": |
|
case "on": |
|
return true; |
|
case "disable": |
|
case "false": |
|
case "no": |
|
case "off": |
|
return false; |
|
case "toggle": |
|
if(prevForToggle != null) |
|
return !prevForToggle; |
|
else |
|
throw new IllegalArgumentException("Previous value is unknown."); |
|
} |
|
throw new IllegalArgumentException("Cannot understand boolean value."); |
|
} |
|
public static int argumentToInteger(String arg) throws IllegalArgumentException |
|
{ |
|
if(arg == null || "".equals(arg)) |
|
throw new IllegalArgumentException("Argument is null or empty."); |
|
try |
|
{ |
|
return Integer.parseInt(arg); |
|
} catch(NumberFormatException ex) { |
|
throw new IllegalArgumentException(ex.getMessage()); |
|
} |
|
} |
|
}
|
|
|