/* * 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.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Logger; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.WorldServer; import pex.permissions.IPermissionEntity; import pex.permissions.PermissionGroup; import pex.permissions.PermissionUser; import pex.permissions.bukkit.PermissionsEx; import pex.permissions.commands.CommandListener; import pex.permissions.commands.CommandsManager; import pex.permissions.commands.exceptions.AutoCompleteChoicesException; import pex.utils.StringUtils; public abstract class PermissionsCommand implements CommandListener { protected static final Logger logger = Logger.getLogger("Minecraft"); protected CommandsManager manager; @Override public void onRegistered(CommandsManager manager) { this.manager = manager; } protected void informGroup(Object plugin, PermissionGroup group, String message) { for (PermissionUser user : group.getUsers()) { informPlayer(plugin, user.getName(), message); } } protected void informPlayer(Object plugin, String playerName, String message) { if (!(plugin instanceof PermissionsEx) || !((PermissionsEx) plugin).getConfig().get("permissions", "informplayers_changes", false).getBoolean(false)) { return; // User informing is disabled } EntityPlayer player = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(playerName); if (player == null) { return; } PermissionsEx.sendChatToPlayer(player, EnumChatFormatting.BLUE + "[PermissionsEx] " + EnumChatFormatting.WHITE + message); // player.sendChatToPlayer(ChatColor.BLUE + "[PermissionsEx] " + // ChatColor.WHITE + message); } protected String autoCompletePlayerName(String playerName) { return autoCompletePlayerName(playerName, "user"); } protected void printEntityInheritance(ICommandSender sender, PermissionGroup[] groups) { for (PermissionGroup group : groups) { String rank = "not ranked"; if (group.isRanked()) { rank = "rank " + group.getRank() + " @ " + group.getRankLadder(); } PermissionsEx.sendChatToPlayer(sender, " " + group.getName() + " (" + rank + ")"); // sender.sendChatToPlayer(" " + group.getName() + " (" + rank + // ")"); } } protected String autoCompletePlayerName(String playerName, String argName) { if (playerName == null) { return null; } List<String> players = new LinkedList<String>(); // Collect online Player names for (String player : MinecraftServer.getServer().getConfigurationManager().getAllUsernames()) { if (player.equalsIgnoreCase(playerName)) { return player; } if (player.toLowerCase().startsWith(playerName.toLowerCase()) && !players.contains(player)) { players.add(player); } } // Collect registered PEX user names for (PermissionUser user : PermissionsEx.getPermissionManager().getUsers()) { if (user.getName().equalsIgnoreCase(playerName)) { return user.getName(); } if (user.getName().toLowerCase().startsWith(playerName.toLowerCase()) && !players.contains(user.getName())) { players.add(user.getName()); } } if (players.size() > 1) { throw new AutoCompleteChoicesException(players.toArray(new String[0]), argName); } else if (players.size() == 1) { return players.get(0); } // Nothing found return playerName; } protected String getSenderName(ICommandSender sender) { if (sender instanceof EntityPlayer) { return ((EntityPlayer) sender).username; } return "console"; } protected String autoCompleteGroupName(String groupName) { return this.autoCompleteGroupName(groupName, "group"); } protected String autoCompleteGroupName(String groupName, String argName) { List<String> groups = new LinkedList<String>(); for (PermissionGroup group : PermissionsEx.getPermissionManager().getGroups()) { if (group.getName().equalsIgnoreCase(groupName)) { return group.getName(); } if (group.getName().toLowerCase().startsWith(groupName.toLowerCase()) && !groups.contains(group.getName())) { groups.add(group.getName()); } } if (groups.size() > 1) { // Found several choices throw new AutoCompleteChoicesException(groups.toArray(new String[0]), argName); } else if (groups.size() == 1) { // Found one name return groups.get(0); } // Nothing found return groupName; } protected String autoCompleteWorldName(String worldName) { return this.autoCompleteWorldName(worldName, "world"); } protected String autoCompleteWorldName(String worldName, String argName) { if (worldName == null || worldName.isEmpty()) { return null; } List<String> worlds = new LinkedList<String>(); for (WorldServer world : MinecraftServer.getServer().worldServers) { String name = String.valueOf(world.provider.dimensionId); if (name.equalsIgnoreCase(worldName)) { return name; } if (name.toLowerCase().startsWith(worldName.toLowerCase()) && !worlds.contains(name)) { worlds.add(name); } } if (worlds.size() > 1) { // Found several choices throw new AutoCompleteChoicesException(worlds.toArray(new String[0]), argName); } else if (worlds.size() == 1) { // Found one name return worlds.get(0); } return worldName; } protected String getSafeWorldName(String worldName, String userName) { if (worldName == null) { EntityPlayer player = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(userName); if (player != null) { worldName = String.valueOf(player.worldObj.provider.dimensionId); } else { worldName = "0"; } } return worldName; } protected String autoCompletePermission(IPermissionEntity entity, String permission, String worldName) { return this.autoCompletePermission(entity, permission, worldName, "permission"); } protected String autoCompletePermission(IPermissionEntity entity, String permission, String worldName, String argName) { if (permission == null) { return permission; } Set<String> permissions = new HashSet<String>(); for (String currentPermission : entity.getPermissions(worldName)) { if (currentPermission.equalsIgnoreCase(permission)) { return currentPermission; } if (currentPermission.toLowerCase().startsWith(permission.toLowerCase())) { permissions.add(currentPermission); } } if (permissions.size() > 0) { String[] permissionArray = permissions.toArray(new String[0]); if (permissionArray.length == 1) { return permissionArray[0]; } throw new AutoCompleteChoicesException(permissionArray, argName); } return permission; } protected int getPosition(String permission, String[] permissions) { try { // permission is permission index int position = Integer.parseInt(permission) - 1; if (position < 0 || position >= permissions.length) { throw new RuntimeException("Wrong permission index specified!"); } return position; } catch (NumberFormatException e) { // permission is permission text for (int i = 0; i < permissions.length; i++) { if (permission.equalsIgnoreCase(permissions[i])) { return i; } } } throw new RuntimeException("Specified permission not found"); } protected String printHierarchy(PermissionGroup parent, String worldName, int level) { StringBuilder buffer = new StringBuilder(); PermissionGroup[] groups; if (parent == null) { groups = PermissionsEx.getPermissionManager().getGroups(); } else { groups = parent.getChildGroups(worldName); } for (PermissionGroup group : groups) { if (parent == null && group.getParentGroups(worldName).length > 0) { continue; } buffer.append(StringUtils.repeat(" ", level)).append(" - ").append(group.getName()).append("\n"); // Groups buffer.append(printHierarchy(group, worldName, level + 1)); for (PermissionUser user : group.getUsers(worldName)) { buffer.append(StringUtils.repeat(" ", level + 1)).append(" + ").append(user.getName()).append("\n"); } } return buffer.toString(); } protected String mapPermissions(String worldName, IPermissionEntity entity, int level) { StringBuilder builder = new StringBuilder(); int index = 1; for (String permission : getPermissionsTree(entity, worldName, 0)) { if (level > 0) { builder.append(" "); } else { builder.append(index++).append(") "); } builder.append(permission); if (level > 0) { builder.append(" (from ").append(entity.getName()).append(")"); } else { builder.append(" (own)"); } builder.append("\n"); } PermissionGroup[] parents; if (entity instanceof PermissionUser) { parents = ((PermissionUser) entity).getGroups(worldName); } else if (entity instanceof PermissionGroup) { parents = ((PermissionGroup) entity).getParentGroups(worldName); } else { throw new RuntimeException("Unknown class in hierarchy. Nag t3hk0d3 please."); } level++; // Just increment level once for (PermissionGroup group : parents) { builder.append(mapPermissions(worldName, group, level)); } return builder.toString(); } protected List<String> getPermissionsTree(IPermissionEntity entity, String world, int level) { List<String> permissions = new LinkedList<String>(); Map<String, String[]> allPermissions = entity.getAllPermissions(); String[] worldsPermissions = allPermissions.get(world); if (worldsPermissions != null) { permissions.addAll(sprintPermissions(world, worldsPermissions)); } for (String parentWorld : PermissionsEx.getPermissionManager().getWorldInheritance(world)) { if (parentWorld != null && !parentWorld.isEmpty()) { permissions.addAll(getPermissionsTree(entity, parentWorld, level + 1)); } } if (level == 0 && allPermissions.get("") != null) { // default world // permissions permissions.addAll(sprintPermissions("common", allPermissions.get(""))); } return permissions; } protected List<String> sprintPermissions(String world, String[] permissions) { List<String> permissionList = new LinkedList<String>(); if (permissions == null) { return permissionList; } for (String permission : permissions) { permissionList.add(permission + (world != null ? " @" + world : "")); } return permissionList; } protected Object parseValue(String value) { if (value == null) { return null; } if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("false")) { return Boolean.parseBoolean(value); } try { return Integer.parseInt(value); } catch (NumberFormatException e) { } try { return Double.parseDouble(value); } catch (NumberFormatException e) { } return value; } protected void sendMessage(ICommandSender sender, String message) { for (String messagePart : message.split("\n")) { PermissionsEx.sendChatToPlayer(sender, messagePart); // sender.sendChatToPlayer(messagePart); } } }