/*
* PermissionsEx - Permissions plugin for Bukkit
* Copyright (C) 2011 t3hk0d3 http://www.tehkode.ru
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package pex.permissions.bukkit.commands;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.List;
import java.util.Map;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumChatFormatting;
import pex.permissions.PermissionBackend;
import pex.permissions.PermissionManager;
import pex.permissions.bukkit.PermissionsEx;
import pex.permissions.commands.Command;
import pex.permissions.commands.CommandsManager.CommandBinding;
public class UtilityCommands extends PermissionsCommand {
@Command(name = "pex", syntax = "reload", permission = "permissions.manage.reload", description = "Reload environment")
public void reload(Object plugin, ICommandSender sender, Map<String, String> args) {
PermissionsEx.getPermissionManager().reset();
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Permissions reloaded");
}
@Command(name = "pex", syntax = "config <node> [value]", permission = "permissions.manage.config", description = "Print or set <node> [value]")
public void config(Object plugin, ICommandSender sender, Map<String, String> args) {
if (!(plugin instanceof PermissionsEx)) {
return;
}
PermissionsEx.sendChatToPlayer(sender, "disabled");
/*
*
* String nodeName = args.get("node"); if (nodeName == null ||
* nodeName.isEmpty()) { return; }
*
* Configuration config = ((PermissionsEx)plugin).getConfig();
*
* if (args.get("value") != null) { config.get(category, key,
* defaultValue).set(nodeName, this.parseValue(args.get("value"))); try
* { config.save(); } catch (Throwable e) {
* PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED +
* "[PermissionsEx] Failed to save configuration: " + e.getMessage()); }
* }
*
* Object node = config.get(nodeName); if (node instanceof Map) {
* PermissionsEx.sendChatToPlayer(sender, "Node \"" + nodeName +
* "\": "); for (Map.Entry<String, Object> entry : ((Map<String,
* Object>) node).entrySet()) { PermissionsEx.sendChatToPlayer(sender,
* " " + entry.getKey() + " = " + entry.getValue()); } } else if (node
* instanceof List) { PermissionsEx.sendChatToPlayer(sender, "Node \"" +
* nodeName + "\": "); for (String item : ((List<String>) node)) {
* PermissionsEx.sendChatToPlayer(sender, " - " + item); } } else {
* PermissionsEx.sendChatToPlayer(sender, "Node \"" + nodeName +
* "\" = \"" + node + "\""); }
*/
}
@Command(name = "pex", syntax = "backend", permission = "permissions.manage.backend", description = "Print currently used backend")
public void getBackend(Object plugin, ICommandSender sender, Map<String, String> args) {
PermissionsEx.sendChatToPlayer(sender, "Current backend: " + PermissionsEx.getPermissionManager().getBackend());
}
@Command(name = "pex", syntax = "backend <backend>", permission = "permissions.manage.backend", description = "Change permission backend on the fly (Use with caution!)")
public void setBackend(Object plugin, ICommandSender sender, Map<String, String> args) {
if (args.get("backend") == null) {
return;
}
try {
PermissionsEx.getPermissionManager().setBackend(args.get("backend"));
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "Permission backend changed!");
} catch (RuntimeException e) {
if (e.getCause() instanceof ClassNotFoundException) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Specified backend not found.");
} else {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Error during backend initialization.");
e.printStackTrace();
}
}
}
@Command(name = "pex", syntax = "hierarchy [world]", permission = "permissions.manage.users", description = "Print complete user/group hierarchy")
public void printHierarhy(Object plugin, ICommandSender sender, Map<String, String> args) {
PermissionsEx.sendChatToPlayer(sender, "User/Group inheritance hierarchy:");
sendMessage(sender, printHierarchy(null, this.autoCompleteWorldName(args.get("world")), 0));
}
@Command(name = "pex", syntax = "dump <backend> <filename>", permission = "permissions.dump", description = "Dump users/groups to selected <backend> format")
public void dumpData(Object plugin, ICommandSender sender, Map<String, String> args) {
if (!(plugin instanceof PermissionsEx)) {
return; // User informing is disabled
}
try {
PermissionBackend backend = PermissionBackend.getBackend(args.get("backend"), PermissionsEx.getPermissionManager(), PermissionsEx.instance.getConfig(), null);
File dstFile = new File("plugins/PermissionsEx/", args.get("filename"));
FileOutputStream outStream = new FileOutputStream(dstFile);
backend.dumpData(new OutputStreamWriter(outStream, "UTF-8"));
outStream.close();
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.WHITE + "[PermissionsEx] Data dumped in \"" + dstFile.getName() + "\" ");
} catch (RuntimeException e) {
if (e.getCause() instanceof ClassNotFoundException) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Specified backend not found!");
} else {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "Error: " + e.getMessage());
logger.severe("Error: " + e.getMessage());
e.printStackTrace();
}
} catch (IOException e) {
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.RED + "IO Error: " + e.getMessage());
}
}
@Command(name = "pex", syntax = "toggle debug", permission = "permissions.debug", description = "Enable/disable debug mode")
public void toggleFeature(Object plugin, ICommandSender sender, Map<String, String> args) {
PermissionManager manager = PermissionsEx.getPermissionManager();
manager.setDebug(!manager.isDebug());
String debugStatusMessage = "[PermissionsEx] Debug mode " + (manager.isDebug() ? "enabled" : "disabled");
if (sender instanceof EntityPlayer) {
PermissionsEx.sendChatToPlayer(sender, debugStatusMessage);
}
logger.warning(debugStatusMessage);
}
@Command(name = "pex", syntax = "help [page] [count]", permission = "permissions.manage", description = "PermissionsEx commands help")
public void showHelp(Object plugin, ICommandSender sender, Map<String, String> args) {
List<CommandBinding> commands = manager.getCommands();
int count = args.containsKey("count") ? Integer.parseInt(args.get("count")) : 4;
int page = args.containsKey("page") ? Integer.parseInt(args.get("page")) : 1;
if (page < 1) {
PermissionsEx.sendChatToPlayer(sender, "Page couldn't be lower than 1");
return;
}
int totalPages = (int) Math.ceil(commands.size() / count);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.BLUE + "PermissionsEx" + EnumChatFormatting.WHITE + " commands (page " + EnumChatFormatting.GOLD + page + "/" + totalPages + EnumChatFormatting.WHITE + "): ");
int base = count * (page - 1);
for (int i = base; i < base + count; i++) {
if (i >= commands.size()) {
break;
}
Command command = commands.get(i).getMethodAnnotation();
String commandName = String.format("/%s %s", command.name(), command.syntax()).replace("<", EnumChatFormatting.BOLD.toString() + EnumChatFormatting.RED + "<").replace(">", ">" + EnumChatFormatting.RESET + EnumChatFormatting.GOLD.toString()).replace("[", EnumChatFormatting.BOLD.toString() + EnumChatFormatting.BLUE + "[")
.replace("]", "]" + EnumChatFormatting.RESET + EnumChatFormatting.GOLD.toString());
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.GOLD + commandName);
PermissionsEx.sendChatToPlayer(sender, EnumChatFormatting.AQUA + " " + command.description());
}
}
}