Search in sources :

Example 21 with PermissionException

use of net.dv8tion.jda.core.exceptions.PermissionException in project FlareBot by FlareBot.

the class ModlogHandler method handleAction.

/**
 * Handle a ModAction, this will do a bunch of checks and if they pass it will handle said action. For example if
 * you want to ban someone it will do checks like if you can ban that user, ig they're the owner, if you're trying
 * to ban yourself etc. After those pass it will then do the actual banning, post to the modlog and handle any tmp
 * stuff if needed.<br />
 * See also {@link #handleAction(GuildWrapper, TextChannel, User, User, ModAction, String)}
 *
 * @param wrapper   The GuildWrapper of the guild this is being done in.
 * @param channel   The channel this was executed, this is used for failire messages in the checks.
 * @param sender    The person who sent that said action, the user responsible.
 * @param target    The target user to have the action taken against.
 * @param modAction The ModAction to be performed.
 * @param reason    The reason this was done, if this is null it will default to "No Reason Given".
 * @param duration  The duration of said action, this only applies to temp actions, -1 should be passed otherwise.
 */
public void handleAction(GuildWrapper wrapper, TextChannel channel, User sender, User target, ModAction modAction, String reason, long duration) {
    String rsn = (reason == null ? "No reason given!" : "(`" + reason.replaceAll("`", "'") + "`)");
    Member member = null;
    if (target != null) {
        member = wrapper.getGuild().getMember(target);
    }
    if (channel == null)
        return;
    if (member == null && modAction != ModAction.FORCE_BAN && modAction != ModAction.UNBAN) {
        MessageUtils.sendErrorMessage("That user isn't in this server!" + (modAction == ModAction.KICK ? " You can forceban with `{%}forceban <id>` to keep them from coming back." : ""), channel);
        return;
    }
    // Make sure the target user isn't the guild owner
    if (member != null && member.isOwner()) {
        MessageUtils.sendErrorMessage(String.format("Cannot %s **%s** because they're the guild owner!", modAction.getLowercaseName(), MessageUtils.getTag(target)), channel);
        return;
    }
    // Make sure the target user isn't themselves
    if (target != null && sender != null && target.getIdLong() == sender.getIdLong()) {
        MessageUtils.sendErrorMessage(String.format("You cannot %s yourself you daft person!", modAction.getLowercaseName()), channel);
        return;
    }
    if (target != null && target.getIdLong() == FlareBot.instance().getClient().getSelfUser().getIdLong()) {
        if (modAction == ModAction.UNBAN || modAction == ModAction.UNMUTE)
            MessageUtils.sendWarningMessage("W-why would you want to do that in the first place. Meanie :(", channel);
        else
            MessageUtils.sendWarningMessage(String.format("T-that's meannnnnnn :( I can't %s myself and I hope you don't want to either :(", modAction.getLowercaseName()), channel);
        return;
    }
    // Check if the person is below the target in role hierarchy
    if (member != null && sender != null && !canInteract(wrapper.getGuild().getMember(sender), member, wrapper)) {
        MessageUtils.sendErrorMessage(String.format("You cannot %s a user who is higher than you in the role hierarchy!", modAction.getLowercaseName()), channel);
        return;
    }
    // not just kick, ban etc.
    if (member != null && !wrapper.getGuild().getSelfMember().canInteract(member)) {
        MessageUtils.sendErrorMessage(String.format("Cannot " + modAction.getLowercaseName() + " %s! " + "Their highest role is higher than my highest role or they're the guild owner.", MessageUtils.getTag(target)), channel);
        return;
    }
    try {
        // BAN
        switch(modAction) {
            case BAN:
                channel.getGuild().getController().ban(target, 7, reason).queue(aVoid -> channel.sendMessage(new EmbedBuilder().setColor(Color.GREEN).setDescription("The ban hammer has been struck on " + target.getName() + " <:banhammer:368861419602575364>\nReason: " + rsn).setImage(channel.getGuild().getIdLong() == Constants.OFFICIAL_GUILD ? "https://flarebot.stream/img/banhammer.png" : null).build()).queue());
                break;
            case FORCE_BAN:
                channel.getGuild().getController().ban(target.getId(), 7, reason).queue(aVoid -> channel.sendMessage(new EmbedBuilder().setColor(Color.GREEN).setDescription("The ban hammer has been forcefully struck on " + target.getName() + " <:banhammer:368861419602575364>\nReason: " + rsn).setImage(channel.getGuild().getIdLong() == Constants.OFFICIAL_GUILD ? "https://flarebot.stream/img/banhammer.png" : null).build()).queue());
                break;
            case TEMP_BAN:
                {
                    Period period = new Period(duration);
                    channel.getGuild().getController().ban(channel.getGuild().getMember(target), 7, reason).queue(aVoid -> {
                        channel.sendMessage(new EmbedBuilder().setDescription("The ban hammer has been struck on " + target.getName() + " for " + FormatUtils.formatJodaTime(period) + "\nReason: " + rsn).setImage(channel.getGuild().getIdLong() == Constants.OFFICIAL_GUILD ? "https://flarebot.stream/img/banhammer.png" : null).setColor(Color.WHITE).build()).queue();
                        Scheduler.queueFutureAction(channel.getGuild().getIdLong(), channel.getIdLong(), sender.getIdLong(), target.getIdLong(), reason, period, FutureAction.Action.TEMP_BAN);
                    });
                    break;
                }
            case UNBAN:
                wrapper.getGuild().getController().unban(target).queue();
                MessageUtils.sendSuccessMessage("Unbanned " + target.getAsMention() + "!", channel, sender);
                // MUTE
                break;
            case MUTE:
                try {
                    wrapper.getModeration().muteUser(wrapper, wrapper.getGuild().getMember(target));
                } catch (HierarchyException e) {
                    MessageUtils.sendErrorMessage("Cannot apply the mute role, make sure it is below FlareBot in the " + "role hierarchy.", channel);
                    return;
                }
                MessageUtils.sendSuccessMessage("Muted " + target.getAsMention() + "\nReason: " + rsn, channel, sender);
                break;
            case TEMP_MUTE:
                {
                    try {
                        wrapper.getModeration().muteUser(wrapper, wrapper.getGuild().getMember(target));
                    } catch (HierarchyException e) {
                        MessageUtils.sendErrorMessage("Cannot apply the mute role, make sure it is below FlareBot in the " + "role hierarchy.", channel);
                        return;
                    }
                    Period period = new Period(duration);
                    Scheduler.queueFutureAction(channel.getGuild().getIdLong(), channel.getIdLong(), sender.getIdLong(), target.getIdLong(), reason, period, FutureAction.Action.TEMP_MUTE);
                    MessageUtils.sendSuccessMessage("Temporarily Muted " + target.getAsMention() + " for " + FormatUtils.formatJodaTime(period) + "\nReason: " + rsn, channel, sender);
                    break;
                }
            case UNMUTE:
                if (wrapper.getMutedRole() != null && wrapper.getGuild().getMember(target).getRoles().contains(wrapper.getMutedRole())) {
                    wrapper.getModeration().unmuteUser(wrapper, member);
                    MessageUtils.sendSuccessMessage("Unmuted " + target.getAsMention(), channel, sender);
                } else {
                    MessageUtils.sendErrorMessage("That user isn't muted!!", channel);
                }
                // KICK and WARN
                break;
            case KICK:
                channel.getGuild().getController().kick(member, reason).queue(aVoid -> MessageUtils.sendSuccessMessage(target.getName() + " has been kicked from the server!\nReason: " + rsn, channel, sender));
                break;
            case WARN:
                wrapper.addWarning(target, (reason != null ? reason : "No reason provided - action done by " + sender.getName()));
                EmbedBuilder eb = new EmbedBuilder();
                eb.appendDescription("\u26A0 Warned " + MessageUtils.getTag(target) + "\nReason: " + rsn).setColor(Color.WHITE);
                channel.sendMessage(eb.build()).queue();
                break;
            default:
                throw new IllegalArgumentException("An illegal ModAction was attempted to be handled - " + modAction.toString());
        }
    } catch (PermissionException e) {
        MessageUtils.sendErrorMessage(String.format("Cannot " + modAction.getLowercaseName() + " %s! " + "I do not have the `" + e.getPermission().getName() + "` permission!", MessageUtils.getTag(target)), channel);
        return;
    }
    // TODO: Infraction
    postToModlog(wrapper, modAction.getEvent(), target, sender, rsn);
}
Also used : Color(java.awt.Color) Period(org.joda.time.Period) net.dv8tion.jda.core.entities(net.dv8tion.jda.core.entities) FlareBot(stream.flarebot.flarebot.FlareBot) HierarchyException(net.dv8tion.jda.core.exceptions.HierarchyException) GuildWrapper(stream.flarebot.flarebot.objects.GuildWrapper) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) PermissionException(net.dv8tion.jda.core.exceptions.PermissionException) FormatUtils(stream.flarebot.flarebot.util.general.FormatUtils) Permission(net.dv8tion.jda.core.Permission) Scheduler(stream.flarebot.flarebot.scheduler.Scheduler) FutureAction(stream.flarebot.flarebot.scheduler.FutureAction) Constants(stream.flarebot.flarebot.util.Constants) MessageUtils(stream.flarebot.flarebot.util.MessageUtils) PermissionException(net.dv8tion.jda.core.exceptions.PermissionException) HierarchyException(net.dv8tion.jda.core.exceptions.HierarchyException) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) Period(org.joda.time.Period)

Aggregations

PermissionException (net.dv8tion.jda.core.exceptions.PermissionException)21 Permission (net.dv8tion.jda.core.Permission)8 net.dv8tion.jda.core.entities (net.dv8tion.jda.core.entities)8 DBGuild (net.kodehawa.mantarobot.db.entities.DBGuild)7 Slf4j (lombok.extern.slf4j.Slf4j)6 GuildMessageReceivedEvent (net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent)6 BotException (tk.ardentbot.core.misc.logging.BotException)6 Subscribe (com.google.common.eventbus.Subscribe)5 Random (java.util.Random)5 CommandRegistry (net.kodehawa.mantarobot.core.CommandRegistry)5 MantaroData (net.kodehawa.mantarobot.data.MantaroData)5 EmoteReference (net.kodehawa.mantarobot.utils.commands.EmoteReference)5 List (java.util.List)4 EmbedBuilder (net.dv8tion.jda.core.EmbedBuilder)4 Module (net.kodehawa.mantarobot.core.modules.Module)4 SimpleCommand (net.kodehawa.mantarobot.core.modules.commands.SimpleCommand)4 Category (net.kodehawa.mantarobot.core.modules.commands.base.Category)4 Utils (net.kodehawa.mantarobot.utils.Utils)4 Date (java.util.Date)3 Message (net.dv8tion.jda.core.entities.Message)3