ProjectAres/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/commands/PermissionCommands.java

139 lines
5.2 KiB
Java

package tc.oc.commons.bukkit.commands;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.minecraft.util.commands.NestedCommand;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.PluginManager;
import tc.oc.api.util.Permissions;
import tc.oc.commons.core.commands.Commands;
import tc.oc.commons.core.commands.NestedCommands;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
public class PermissionCommands implements NestedCommands {
public static class Parent implements Commands {
@Command(
aliases = {"permission", "perm"},
desc = "Commands to query permissions",
min = 1,
max = -1
)
@NestedCommand({PermissionCommands.class})
@CommandPermissions(Permissions.DEVELOPER)
public void perm() {
}
}
void sendPermissionInfo(String name, CommandSender sender) {
PluginManager pm = sender.getServer().getPluginManager();
Permission permission = pm.getPermission(name);
if(permission == null) {
sender.sendMessage(ChatColor.RED + "Permission " + name + " is unregistered");
} else {
sender.sendMessage(ChatColor.GOLD + "Permission " + ChatColor.WHITE + permission.getName());
sender.sendMessage(ChatColor.WHITE.toString() + ChatColor.ITALIC + permission.getDescription());
sender.sendMessage(ChatColor.GOLD + "Default: " + ChatColor.WHITE + permission.getDefault());
boolean first = true;
for(Permission parent : pm.getPermissions()) {
Boolean value = parent.getChildren().get(permission.getName());
if(value != null) {
if(first) {
first = false;
sender.sendMessage(ChatColor.GOLD + "Parents:");
}
if(value) {
sender.sendMessage(ChatColor.GREEN + " +" + parent.getName());
} else {
sender.sendMessage(ChatColor.RED + " -" + parent.getName());
}
}
}
first = true;
for(Map.Entry<String, Boolean> child : permission.getChildren().entrySet()) {
if(first) {
first = false;
sender.sendMessage(ChatColor.GOLD + "Children:");
}
if(child.getValue()) {
sender.sendMessage(ChatColor.GREEN + " +" + child.getKey());
} else {
sender.sendMessage(ChatColor.RED + " -" + child.getKey());
}
}
}
}
@Command(
aliases = {"info"},
desc = "Get detailed info about a permission",
usage = "<permission>",
min = 1,
max = 1
)
public void info(CommandContext args, CommandSender sender) throws CommandException {
sendPermissionInfo(args.getString(0), sender);
}
@Command(
aliases = {"test"},
desc = "Test for a specific permission",
usage = "<permission> [player]",
min = 1,
max = 2
)
public void test(CommandContext args, CommandSender sender) throws CommandException {
CommandSender player = CommandUtils.getCommandSenderOrSelf(args, sender, 1);
String perm = args.getString(0);
if(player.hasPermission(perm)) {
sender.sendMessage(ChatColor.GREEN + player.getName() + " has permission " + perm);
} else {
sender.sendMessage(ChatColor.RED + player.getName() + " does NOT have permission " + perm);
}
}
@Command(
aliases = {"list"},
desc = "List all permissions",
usage = "[player] [prefix]",
min = 0,
max = 2
)
public void list(CommandContext args, CommandSender sender) throws CommandException {
CommandSender player = CommandUtils.getCommandSenderOrSelf(args, sender, 0);
String prefix = args.getString(1, "");
sender.sendMessage(ChatColor.WHITE + "Permissions for " + player.getName() + ":");
List<PermissionAttachmentInfo> perms = new ArrayList<>(player.getEffectivePermissions());
Collections.sort(perms, new Comparator<PermissionAttachmentInfo>() {
@Override
public int compare(PermissionAttachmentInfo a, PermissionAttachmentInfo b) {
return a.getPermission().compareTo(b.getPermission());
}
});
for(PermissionAttachmentInfo perm : perms) {
if(perm.getPermission().startsWith(prefix)) {
sender.sendMessage((perm.getValue() ? ChatColor.GREEN : ChatColor.RED) +
" " + perm.getPermission() +
(perm.getAttachment() == null ? "" : " (" + perm.getAttachment().getPlugin().getName() + ")"));
}
}
}
}