/** * PermissionsEx * Copyright (C) zml and PermissionsEx contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ninja.leaping.permissionsex.command; import ninja.leaping.permissionsex.PermissionsEx; import ninja.leaping.permissionsex.data.ImmutableSubjectData; import ninja.leaping.permissionsex.subject.CalculatedSubject; import ninja.leaping.permissionsex.util.command.CommandContext; import ninja.leaping.permissionsex.util.command.CommandException; import ninja.leaping.permissionsex.util.command.CommandSpec; import ninja.leaping.permissionsex.util.command.Commander; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import static ninja.leaping.permissionsex.util.Translations.t; public class InfoCommand { public static CommandSpec getInfoCommand(PermissionsEx pex) { return CommandSpec.builder() .setAliases("info", "i", "who") .setDescription(t("Provide information about a subject")) .setExecutor(new SubjectInfoPrintingExecutor(pex)) .build(); } // TODO: Pagination builder private static class SubjectInfoPrintingExecutor extends PermissionsExExecutor { private static final String INDENT = " "; private static final String DOUBLE_INDENT = INDENT + INDENT; private final PermissionsEx pex; private SubjectInfoPrintingExecutor(PermissionsEx pex) { super(pex); this.pex = pex; } @Override public <TextType> void execute(Commander<TextType> src, CommandContext args) throws CommandException { CalculatedSubject subject = subjectOrSelf(src, args); checkSubjectPermission(src, subject.getIdentifier(), "permissionsex.info"); final ImmutableSubjectData transientData = subject.transientData().get(); final ImmutableSubjectData data = subject.data().get(); src.msg(src.fmt().header(src.fmt().tr(t("Information for %s", src.fmt().subject(subject))))); if (!data.getAllPermissions().isEmpty() || !data.getAllDefaultValues().isEmpty()) { src.msg(src.fmt().hl(src.fmt().tr(t("Permissions:")))); printPermissions(src, data); } if (!transientData.getAllPermissions().isEmpty() || !transientData.getAllDefaultValues().isEmpty()) { src.msg(src.fmt().hl(src.fmt().tr(t("Transient permissions:")))); printPermissions(src, transientData); } if (!data.getAllOptions().isEmpty()) { src.msg(src.fmt().hl(src.fmt().tr(t("Options:")))); printOptions(src, data); } if (!transientData.getAllOptions().isEmpty()) { src.msg(src.fmt().hl(src.fmt().tr(t("Transient options:")))); printOptions(src, transientData); } if (!data.getAllParents().isEmpty()) { src.msg(src.fmt().hl(src.fmt().tr(t("Parents:")))); printParents(src, data); } if (!transientData.getAllParents().isEmpty()) { src.msg(src.fmt().hl(src.fmt().tr(t("Transient parents:")))); printParents(src, transientData); } } private <TextType> void printPermissions(Commander<TextType> src, ImmutableSubjectData data) { Set<Set<Map.Entry<String, String>>> targetContexts = new HashSet<>(); targetContexts.addAll(data.getAllPermissions().keySet()); targetContexts.addAll(data.getAllDefaultValues().keySet()); for (Set<Map.Entry<String, String>> entry : targetContexts) { src.msg(src.fmt().combined(INDENT, formatContexts(src, entry), ":")); src.msg(src.fmt().combined(DOUBLE_INDENT, src.fmt().hl(src.fmt().tr(t("Default permission: %s", data.getDefaultValue(entry)))))); for (Map.Entry<String, Integer> ent : data.getPermissions(entry).entrySet()) { src.msg(src.fmt().combined(DOUBLE_INDENT, src.fmt().permission(ent.getKey(), ent.getValue()))); } } } private <TextType> void printOptions(Commander<TextType> src, ImmutableSubjectData data) { for (Map.Entry<Set<Map.Entry<String, String>>, Map<String, String>> ent : data.getAllOptions().entrySet()) { src.msg(src.fmt().combined(INDENT, formatContexts(src, ent.getKey()), ":")); for (Map.Entry<String, String> option : ent.getValue().entrySet()) { src.msg(src.fmt().combined(DOUBLE_INDENT, src.fmt().option(option.getKey(), option.getValue()))); } } } private <TextType> void printParents(Commander<TextType> src, ImmutableSubjectData data) { for (Map.Entry<Set<Map.Entry<String, String>>, List<Map.Entry<String, String>>> ent : data.getAllParents().entrySet()) { src.msg(src.fmt().combined(INDENT, formatContexts(src, ent.getKey()), ":")); for (Map.Entry<String, String> parent : ent.getValue()) { src.msg(src.fmt().combined(DOUBLE_INDENT, src.fmt().subject(parent))); } } } } }