use of net.robinfriedli.aiode.exceptions.InvalidCommandException in project aiode by robinfriedli.
the class HelpCommand method showCommandHelp.
private void showCommandHelp() {
getManager().getCommand(getContext(), getCommandInput()).ifPresentOrElse(command -> {
String prefix;
GuildSpecification specification = getContext().getGuildContext().getSpecification();
String setPrefix = specification.getPrefix();
String botName = specification.getBotName();
if (!Strings.isNullOrEmpty(setPrefix)) {
prefix = setPrefix;
} else if (!Strings.isNullOrEmpty(botName)) {
prefix = botName + " ";
} else {
prefix = PrefixProperty.DEFAULT_FALLBACK + " ";
}
char argumentPrefix = ArgumentPrefixProperty.getForCurrentContext().getArgumentPrefix();
EmbedBuilder embedBuilder = new EmbedBuilder();
embedBuilder.setTitle("Command " + command.getIdentifier() + ":");
String descriptionFormat = command.getDescription();
String descriptionText = String.format(descriptionFormat, prefix, argumentPrefix);
embedBuilder.setDescription(descriptionText);
Guild guild = getContext().getGuild();
Optional<AccessConfiguration> accessConfiguration = Aiode.get().getSecurityManager().getAccessConfiguration(command.getPermissionTarget(), guild);
if (accessConfiguration.isPresent()) {
String title = "Available to roles: ";
String text;
List<Role> roles = accessConfiguration.get().getRoles(guild);
if (!roles.isEmpty()) {
text = StringList.create(roles, Role::getName).toSeparatedString(", ");
} else {
text = "Guild owner and administrator roles only";
}
embedBuilder.addField(title, text, false);
}
ArgumentController argumentController = command.getArgumentController();
if (argumentController.hasArguments()) {
embedBuilder.addField("__Arguments__", "Keywords that alter the command behavior or define a search scope.", false);
argumentController.getArguments().values().stream().sorted(Comparator.comparing(CommandArgument::getIdentifier)).forEach(argument -> embedBuilder.addField(argumentPrefix + argument.getIdentifier(), String.format(argument.getDescription(), prefix, argumentPrefix), false));
}
List<XmlElement> examples = command.getCommandContribution().query(tagName("example")).collect();
if (!examples.isEmpty()) {
embedBuilder.addField("__Examples__", "Practical usage examples for this command.", false);
for (XmlElement example : examples) {
String exampleText = String.format(example.getTextContent(), prefix, argumentPrefix);
String titleText = String.format(example.getAttribute("title").getValue(), prefix, argumentPrefix);
embedBuilder.addField(titleText, exampleText, false);
}
}
sendMessage(embedBuilder);
}, () -> {
throw new InvalidCommandException(String.format("No command found for '%s'", getCommandInput()));
});
}
use of net.robinfriedli.aiode.exceptions.InvalidCommandException in project aiode by robinfriedli.
the class PermissionCommand method getSelectedTargets.
private Set<? extends PermissionTarget> getSelectedTargets() {
Set<? extends PermissionTarget> selectedRootTargets = getSelectedRootTargets();
if (!argumentSet("argument")) {
return selectedRootTargets;
}
String argumentValue;
if (argumentSet("all")) {
argumentValue = getArgumentValueOrElse("argument", getCommandInput());
} else {
argumentValue = getArgumentValueWithTypeOrElse("argument", String.class, null);
}
if (argumentValue == null) {
return getAllArguments(selectedRootTargets);
}
List<String> argumentIdentifiers = COMMA_SPLITTER.splitToList(argumentValue);
if (argumentIdentifiers.isEmpty()) {
return getAllArguments(selectedRootTargets);
}
Set<CommandArgument> selectedArguments = Sets.newHashSet();
for (String argumentIdentifier : argumentIdentifiers) {
for (PermissionTarget selectedRootTarget : selectedRootTargets) {
if (selectedRootTarget instanceof CommandContribution) {
CommandContribution commandContribution = (CommandContribution) selectedRootTarget;
CommandArgument argument = commandContribution.getArgument(argumentIdentifier);
if (argument != null) {
selectedArguments.add(argument);
} else {
throw new InvalidCommandException(String.format("No such argument '%s' on command '%s'.", argumentIdentifier, commandContribution.getIdentifier()));
}
} else {
throw new InvalidCommandException(String.format("Cannot find argument '%s' on permission target '%s' as it is not a command.", argumentIdentifier, selectedRootTarget.getFullPermissionTargetIdentifier()));
}
}
}
return selectedArguments;
}
use of net.robinfriedli.aiode.exceptions.InvalidCommandException in project aiode by robinfriedli.
the class PermissionCommand method deleteCustomPermissionTarget.
private void deleteCustomPermissionTarget() {
SecurityManager securityManager = Aiode.get().getSecurityManager();
String identifier = getCommandInput();
CommandContext context = getContext();
Session session = context.getSession();
Optional<? extends PermissionTarget> existingPermissionTarget = securityManager.getPermissionTarget(identifier);
if (existingPermissionTarget.isEmpty()) {
throw new InvalidCommandException(String.format("No such permission target '%s'.", identifier));
}
PermissionTarget permissionTarget = existingPermissionTarget.get();
if (!(permissionTarget instanceof CustomPermissionTarget)) {
throw new InvalidCommandException(String.format("Permission target '%s' cannot be deleted as it is not a custom target.", identifier));
}
CustomPermissionTarget customPermissionTarget = (CustomPermissionTarget) permissionTarget;
invoke(() -> {
Optional<AccessConfiguration> accessConfiguration = securityManager.getAccessConfiguration(customPermissionTarget, context.getGuild());
if (accessConfiguration.isPresent()) {
for (GrantedRole role : accessConfiguration.get().getRoles()) {
session.delete(role);
}
session.delete(accessConfiguration);
}
session.delete(customPermissionTarget);
});
}
use of net.robinfriedli.aiode.exceptions.InvalidCommandException in project aiode by robinfriedli.
the class PermissionCommand method getSelectedRoles.
private Set<Role> getSelectedRoles(String argument) {
String roleString;
if (argumentSet("all")) {
roleString = getArgumentValueOrElse(argument, getCommandInput());
} else {
roleString = getArgumentValue(argument);
}
Guild guild = getContext().getGuild();
Set<Role> selectedRoles = Sets.newHashSet();
List<String> roles = COMMA_SPLITTER.splitToList(roleString);
for (String role : roles) {
List<Role> rolesByName = guild.getRolesByName(role, true);
if (rolesByName.isEmpty()) {
throw new InvalidCommandException("No such role " + role);
}
selectedRoles.addAll(rolesByName);
}
if (selectedRoles.isEmpty()) {
throw new InvalidCommandException("No roles selected. Either use the $to argument or, if the $all argument is used, provide the roles as command input.");
}
return selectedRoles;
}
use of net.robinfriedli.aiode.exceptions.InvalidCommandException in project aiode by robinfriedli.
the class PermissionCommand method createCustomPermissionTarget.
private void createCustomPermissionTarget() {
SecurityManager securityManager = Aiode.get().getSecurityManager();
String identifier = getCommandInput();
CommandContext context = getContext();
Session session = context.getSession();
Optional<? extends PermissionTarget> existingPermissionTarget = securityManager.getPermissionTarget(identifier);
if (existingPermissionTarget.isPresent()) {
throw new InvalidCommandException(String.format("Permission target '%s' already exists.", identifier));
}
Guild guild = context.getGuild();
User user = context.getUser();
CustomPermissionTarget customPermissionTarget = new CustomPermissionTarget(identifier, guild, user);
invoke(() -> session.persist(customPermissionTarget));
}
Aggregations