diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/AutoBanBypassCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/AutoBanBypassCommand.java index 2085d9422..3d6ce09e4 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/AutoBanBypassCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/AutoBanBypassCommand.java @@ -18,8 +18,14 @@ package me.duncte123.skybot.commands.guild.mod; +import me.duncte123.skybot.Variables; import me.duncte123.skybot.database.AbstractDatabase; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; import net.dv8tion.jda.api.utils.MiscUtil; import org.jetbrains.annotations.NotNull; @@ -33,6 +39,49 @@ public AutoBanBypassCommand() { this.usage = ""; } + @Override + protected void configureSlashSupport(@NotNull SlashCommandData baseData) { + baseData.addOptions( + new OptionData( + OptionType.USER, + "user_id", + "The id of the user that you want to create the bypass for.", + true + ) + ); + } + + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + final var checkId = event.getOption("user_id").getAsLong(); + + final var database = variables.getDatabase(); + final var guildId = event.getGuild().getIdLong(); + + event.deferReply().queue(); + + database.getBanBypass(guildId, checkId).thenAccept((byPass) -> { + if (byPass == null) { + database.createBanBypass(guildId, checkId); + event.getHook() + .editOriginal("Single use bypass created, please note that this bypass will expire after a week if unused." + + "\nPlease keep in mind that this has not unbanned any user, meaning that you will have to unban the user yourself if they are banned") + .queue(); + return; + } + + event.getHook() + .editOriginal("A bypass already exists for this user") + .queue(); + }).exceptionally((thr) -> { + event.getHook() + .editOriginal("Something went wrong: " + thr.getMessage()) + .queue(); + + return null; + }); + } + @Override public void execute(@NotNull CommandContext ctx) { final long checkId; diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/BanCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/BanCommand.java index 63a030348..397293e22 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/BanCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/BanCommand.java @@ -18,14 +18,23 @@ package me.duncte123.skybot.commands.guild.mod; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; import static me.duncte123.botcommons.messaging.MessageUtils.sendMsg; @@ -60,6 +69,59 @@ public BanCommand() { }; } + @Override + protected void configureSlashSupport(@NotNull SlashCommandData baseData) { + baseData.addOptions( + new OptionData( + OptionType.USER, + "user", + "The user that you want to ban.", + true + ), + new OptionData( + OptionType.STRING, + "reason", + "The reason for this ban", + false + ), + new OptionData( + OptionType.BOOLEAN, + "nodel", + "Prevents the deletion of any messages", + false + ) + ); + } + + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + final var toBanMember = event.getOption("user").getAsMember(); + final var moderator = event.getMember(); + + if (!canInteract(moderator, toBanMember, "ban", event.getChannel())) { + return; + } + + final var reason = Optional.ofNullable(event.getOption("reason")) + .map(OptionMapping::getAsString) + .orElse("No reason given"); + final var nodel = Optional.ofNullable(event.getOption("nodel")) + .map(OptionMapping::getAsBoolean) + .orElse(false); + + final int delDays = nodel ? 0 : 1; + final var modUser = moderator.getUser(); + + guild.ban(toBanMember, delDays, TimeUnit.DAYS) + .reason(String.format("%#s: %s", modUser, reason)) + .queue( + (m) -> { + modLog(modUser, toBanMember.getUser(), "banned", reason, null, guild); + event.reply("User has been banned").queue(); + } + ); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List args = ctx.getArgs(); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/CleanupCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/CleanupCommand.java index e9e224c31..0f7be33b6 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/CleanupCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/CleanupCommand.java @@ -22,16 +22,20 @@ import gnu.trove.map.hash.TLongObjectHashMap; import io.sentry.Sentry; import me.duncte123.botcommons.messaging.MessageConfig; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import me.duncte123.skybot.utils.AirUtils; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.requests.ErrorResponse; import net.dv8tion.jda.api.requests.Request; import net.dv8tion.jda.api.requests.RestFuture; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.lang.reflect.Field; @@ -80,6 +84,11 @@ public CleanupCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final long channelId = ctx.getChannel().getIdLong(); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/HackbanCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/HackbanCommand.java index e795a6b29..85051a4c6 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/HackbanCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/HackbanCommand.java @@ -19,14 +19,18 @@ package me.duncte123.skybot.commands.guild.mod; import io.sentry.Sentry; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.UserSnowflake; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.exceptions.HierarchyException; import net.dv8tion.jda.internal.requests.RestActionImpl; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.ArrayList; @@ -56,6 +60,11 @@ public HackbanCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final Map> parsedFlags = ctx.getParsedFlags(this); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/KickCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/KickCommand.java index 75dd27eb9..3ebce016f 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/KickCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/KickCommand.java @@ -19,15 +19,24 @@ package me.duncte123.skybot.commands.guild.mod; import me.duncte123.botcommons.messaging.MessageUtils; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import me.duncte123.skybot.utils.ModerationUtils; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; +import java.util.Optional; import static me.duncte123.botcommons.messaging.MessageUtils.sendMsg; import static me.duncte123.skybot.utils.ModerationUtils.canInteract; @@ -55,6 +64,47 @@ public KickCommand() { }; } + @Override + protected void configureSlashSupport(@NotNull SlashCommandData baseData) { + baseData.addOptions( + new OptionData( + OptionType.USER, + "user", + "The user to kick.", + true + ), + new OptionData( + OptionType.STRING, + "reason", + "Reason for kicking", + false + ) + ); + } + + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + final var toKickMember = event.getOption("user").getAsMember(); + final var moderator = event.getMember(); + + if (!canInteract(moderator, toKickMember, "kick", event.getChannel())) { + return; + } + + final var reason = Optional.ofNullable(event.getOption("reason")) + .map(OptionMapping::getAsString) + .orElse("No reason given"); + + guild.kick(toKickMember) + .reason(String.format("%#s: %s", moderator, reason)) + .queue( + (ignored) -> { + ModerationUtils.modLog(moderator.getUser(), toKickMember.getUser(), "kicked", reason, null, guild); + event.reply("User has been kicked").queue(); + } + ); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List mentioned = ctx.getMentionedArg(0); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/ModBaseCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/ModBaseCommand.java index d13ca9160..3c39e9454 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/ModBaseCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/ModBaseCommand.java @@ -40,7 +40,5 @@ protected void configureSlashSupport(@NotNull SlashCommandData baseData) { } @Override - public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { - event.reply("soontm").queue(); - } + public abstract void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables); } diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/MuteCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/MuteCommand.java index 26e0f1789..e29550758 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/MuteCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/MuteCommand.java @@ -19,15 +19,25 @@ package me.duncte123.skybot.commands.guild.mod; import com.dunctebot.models.settings.GuildSetting; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import me.duncte123.skybot.utils.ModerationUtils; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; +import java.util.Optional; import static me.duncte123.botcommons.messaging.MessageUtils.sendMsg; import static me.duncte123.botcommons.messaging.MessageUtils.sendSuccess; @@ -56,6 +66,62 @@ public MuteCommand() { }; } + @Override + protected void configureSlashSupport(@NotNull SlashCommandData baseData) { + baseData.addOptions( + new OptionData( + OptionType.USER, + "user", + "The user to mute.", + true + ), + new OptionData( + OptionType.STRING, + "reason", + "Reason for muting", + false + ) + ); + } + + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + final GuildSetting settings = guild.getSettings(); + + if (settings.getMuteRoleId() <= 0) { + event.reply("No mute/spamrole is currently set. Use `/settings muteRole set:@role` to set one") + .setEphemeral(true) + .queue(); + return; + } + + final Member mod = event.getMember(); + final Member self = guild.getSelfMember(); + final Member toMute = event.getOption("user").getAsMember(); + final Role role = guild.getRoleById(settings.getMuteRoleId()); + + if (canNotProceed(event, mod, toMute, role, self)) { + return; + } + + event.deferReply().queue(); + + final var reason = Optional.ofNullable(event.getOption("reason")) + .map(OptionMapping::getAsString) + .orElse("No reason given"); + + final User user = event.getUser(); + + guild.addRoleToMember(toMute, role) + .reason("Muted by " + String.format("%#s: %s", user, reason)).queue(success -> { + ModerationUtils.modLog(user, toMute.getUser(), "muted", null, null, guild); + event.getHook() + .editOriginal("User has been muted") + .queue(); + } + ); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List args = ctx.getArgs(); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/PurgeChannelCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/PurgeChannelCommand.java index e275d8555..aba09923c 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/PurgeChannelCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/PurgeChannelCommand.java @@ -19,9 +19,13 @@ package me.duncte123.skybot.commands.guild.mod; import com.jagrosh.jdautilities.commons.utils.FinderUtil; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; @@ -46,6 +50,11 @@ public PurgeChannelCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List channels = FinderUtil.findTextChannels(ctx.getArgsRaw(), ctx.getGuild()); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/PurgeUserCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/PurgeUserCommand.java index 4c2e9ed7c..961a65549 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/PurgeUserCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/PurgeUserCommand.java @@ -19,12 +19,16 @@ package me.duncte123.skybot.commands.guild.mod; import io.sentry.Sentry; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; @@ -56,6 +60,11 @@ public PurgeUserCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List mentionedMembers = ctx.getMentionedArg(0); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/SoftbanCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/SoftbanCommand.java index a5ebcaad9..1dbf696b4 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/SoftbanCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/SoftbanCommand.java @@ -19,12 +19,16 @@ package me.duncte123.skybot.commands.guild.mod; import me.duncte123.botcommons.messaging.MessageUtils; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import me.duncte123.skybot.utils.ModerationUtils; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; @@ -55,6 +59,11 @@ public SoftbanCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List args = ctx.getArgs(); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/TempBanCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/TempBanCommand.java index ba669a18c..1ed787867 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/TempBanCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/TempBanCommand.java @@ -20,11 +20,15 @@ import me.duncte123.durationparser.DurationParser; import me.duncte123.durationparser.ParsedDuration; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -58,6 +62,11 @@ public TempBanCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List args = ctx.getArgs(); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/TempMuteCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/TempMuteCommand.java index 1bb02feb8..ee784404a 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/TempMuteCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/TempMuteCommand.java @@ -20,6 +20,8 @@ import com.dunctebot.models.settings.GuildSetting; import me.duncte123.durationparser.ParsedDuration; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import me.duncte123.skybot.utils.ModerationUtils; @@ -28,6 +30,8 @@ import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; @@ -62,6 +66,11 @@ public TempMuteCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List mentioned = ctx.getMentionedArg(0); @@ -166,4 +175,28 @@ public void execute(@Nonnull CommandContext ctx) { return false; } + + /* package */ static boolean canNotProceed(@Nonnull SlashCommandInteractionEvent event, Member mod, Member toMute, Role role, Member self) { + if (role == null) { + event.reply("The current mute role does not exist on this server, please contact your server administrator about this.") + .setEphemeral(true) + .queue(); + + return true; + } + + if (!canInteract(mod, toMute, "mute", event.getChannel())) { + return true; + } + + if (!self.canInteract(role)) { + event.reply("I cannot mute this member, is the mute role above mine? If so, please move it below my role.") + .setEphemeral(true) + .queue(); + + return true; + } + + return false; + } } diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnbanCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnbanCommand.java index adf8d17e5..8dc4ac696 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnbanCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnbanCommand.java @@ -18,11 +18,15 @@ package me.duncte123.skybot.commands.guild.mod; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; @@ -54,6 +58,11 @@ public UnbanCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final var flags = ctx.getParsedFlags(this); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnmuteCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnmuteCommand.java index 3fd731506..788701ef0 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnmuteCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnmuteCommand.java @@ -19,12 +19,16 @@ package me.duncte123.skybot.commands.guild.mod; import com.dunctebot.models.settings.GuildSetting; +import me.duncte123.skybot.Variables; +import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import me.duncte123.skybot.objects.command.Flag; import me.duncte123.skybot.utils.ModerationUtils; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; @@ -53,6 +57,11 @@ public UnmuteCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List mentioned = ctx.getMentionedArg(0); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnwarnCommand.java b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnwarnCommand.java index 7ea6d8eb0..749f860ac 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnwarnCommand.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/guild/mod/UnwarnCommand.java @@ -18,11 +18,14 @@ package me.duncte123.skybot.commands.guild.mod; +import me.duncte123.skybot.Variables; import me.duncte123.skybot.entities.jda.DunctebotGuild; import me.duncte123.skybot.objects.command.CommandContext; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import java.util.List; @@ -41,6 +44,11 @@ public UnwarnCommand() { }; } + @Override + public void handleEvent(@NotNull SlashCommandInteractionEvent event, @NotNull DunctebotGuild guild, @NotNull Variables variables) { + event.reply("This command does not yet support slash commands").setEphemeral(true).queue(); + } + @Override public void execute(@Nonnull CommandContext ctx) { final List mentioned = ctx.getMentionedArg(0); diff --git a/bot/src/main/java/me/duncte123/skybot/commands/image/ImageCommandBase.java b/bot/src/main/java/me/duncte123/skybot/commands/image/ImageCommandBase.java index 6e3b73e25..42fba3f32 100644 --- a/bot/src/main/java/me/duncte123/skybot/commands/image/ImageCommandBase.java +++ b/bot/src/main/java/me/duncte123/skybot/commands/image/ImageCommandBase.java @@ -39,7 +39,8 @@ import java.io.File; import java.io.IOException; import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.file.Files; import java.util.List; @@ -120,7 +121,7 @@ protected String getImageFromCommand(CommandContext ctx) { // I hate this so much // But I won't change one pmd rule just for the sake of using !isEmpty here - if (ctx.getMessage().getAttachments().isEmpty()) { + if (!ctx.getMessage().getAttachments().isEmpty()) { url = tryGetAttachment(ctx); } else if (!mentionedUsers.isEmpty()) { url = getAvatarUrl(mentionedUsers.getFirst()); @@ -173,9 +174,9 @@ private String tryGetAttachment(CommandContext ctx) { @Nullable private String tryGetUrl(CommandContext ctx, String url) { try { - return new URL(url).toString(); + return new URI(url).toURL().toString(); } - catch (MalformedURLException ignored) { + catch (MalformedURLException | URISyntaxException ignored) { sendMsg(ctx, "That does not look like a valid url"); return null; } diff --git a/bot/src/main/java/me/duncte123/skybot/utils/AudioUtils.java b/bot/src/main/java/me/duncte123/skybot/utils/AudioUtils.java index e73a50f0d..0910272b7 100644 --- a/bot/src/main/java/me/duncte123/skybot/utils/AudioUtils.java +++ b/bot/src/main/java/me/duncte123/skybot/utils/AudioUtils.java @@ -43,10 +43,10 @@ public AudioUtils(Variables variables) { } @Nullable("If the playlist is not a search result") - public List searchYoutube(long guildId, String query) { + public List searchForSong(long guildId, String query) { final LavalinkLoadResult result = LavalinkManager.INS.getLavalink() .getOrCreateLink(guildId) - .loadItem("ytsearch:" + query) + .loadItem("dzsearch:" + query) .block(); if (result instanceof SearchResult playlist) { diff --git a/bot/src/main/java/me/duncte123/skybot/utils/ModerationUtils.java b/bot/src/main/java/me/duncte123/skybot/utils/ModerationUtils.java index ca367b892..e1904948f 100644 --- a/bot/src/main/java/me/duncte123/skybot/utils/ModerationUtils.java +++ b/bot/src/main/java/me/duncte123/skybot/utils/ModerationUtils.java @@ -56,11 +56,13 @@ public class ModerationUtils { public static final int COLOUR_LEAVE = 0xcf362b; private static final String[] PROFESSIONAL_RESPONSES = { - "WHy?", + "Why?", "Nope", "LOL no", "YoU cAnNoT iNtErAcT wItH ThIs MeMbEr", - "" + "", + "Ok, but why would you ever want to {{ action }} yourself?", + "Computer says no" }; private static final Logger LOG = LoggerFactory.getLogger(ModerationUtils.class); diff --git a/bot/src/main/kotlin/me/duncte123/skybot/commands/mod/DeHoistUtils.kt b/bot/src/main/kotlin/me/duncte123/skybot/commands/mod/DeHoistUtils.kt index 4961689ba..bb788e578 100644 --- a/bot/src/main/kotlin/me/duncte123/skybot/commands/mod/DeHoistUtils.kt +++ b/bot/src/main/kotlin/me/duncte123/skybot/commands/mod/DeHoistUtils.kt @@ -82,6 +82,10 @@ private fun shouldDehoist(member: Member): Boolean { } private fun canAutoDehoist(member: Member, variables: Variables): Boolean { + if (member.user.isBot) { + return false + } + return shouldDehoist(member) && GuildSettingsUtils.getGuild(member.guild.idLong, variables).isAutoDeHoist } diff --git a/bot/src/main/kotlin/me/duncte123/skybot/commands/music/PlayCommand.kt b/bot/src/main/kotlin/me/duncte123/skybot/commands/music/PlayCommand.kt index cc1602f27..f1ec150a0 100644 --- a/bot/src/main/kotlin/me/duncte123/skybot/commands/music/PlayCommand.kt +++ b/bot/src/main/kotlin/me/duncte123/skybot/commands/music/PlayCommand.kt @@ -95,14 +95,14 @@ open class PlayCommand(private val skipParsing: Boolean = false) : MusicCommand( } if (!AirUtils.isURL(toPlay) && !toPlay.startsWith("OCR", true)) { - val vidId = searchYt(ctx.guildId, toPlay, ctx.variables) + val songUrl = searchSong(ctx.guildId, toPlay, ctx.variables) - if (vidId == null) { + if (songUrl == null) { MessageUtils.sendError(ctx.message) sendMsg(ctx, "No tracks were found") return } - toPlay = "https://www.youtube.com/watch?v=$vidId" + toPlay = songUrl } handlePlay(toPlay, ctx) @@ -128,14 +128,14 @@ open class PlayCommand(private val skipParsing: Boolean = false) : MusicCommand( return true } - private fun searchYt(guildId: Long, search: String, variables: Variables): String? { - val playlist = variables.audioUtils.searchYoutube(guildId, search) + private fun searchSong(guildId: Long, search: String, variables: Variables): String? { + val playlist = variables.audioUtils.searchForSong(guildId, search) if (playlist.isNullOrEmpty()) { return null } - return playlist[0].info.identifier + return playlist[0].info.uri } private fun handlePlay(toPlay: String, ctx: CommandContext) { @@ -194,14 +194,14 @@ open class PlayCommand(private val skipParsing: Boolean = false) : MusicCommand( } if (!AirUtils.isURL(toPlay) && !toPlay.startsWith("OCR", true)) { - val vidId = searchYt(event.guild!!.idLong, toPlay, variables) + val songUrl = searchSong(event.guild!!.idLong, toPlay, variables) - if (vidId == null) { + if (songUrl == null) { event.reply("No tracks were found").queue() return } - toPlay = "https://www.youtube.com/watch?v=$vidId" + toPlay = songUrl } handlePlay(toPlay, variables, event) diff --git a/bot/src/main/kotlin/me/duncte123/skybot/commands/music/SearchCommand.kt b/bot/src/main/kotlin/me/duncte123/skybot/commands/music/SearchCommand.kt index 87d6dbab7..bc684f762 100644 --- a/bot/src/main/kotlin/me/duncte123/skybot/commands/music/SearchCommand.kt +++ b/bot/src/main/kotlin/me/duncte123/skybot/commands/music/SearchCommand.kt @@ -60,7 +60,7 @@ class SearchCommand : MusicCommand() { val searchLimit = if (isPatron) 20 else 5 val toPlay = ctx.argsRaw - val res = ctx.audioUtils.searchYoutube(ctx.guildId, toPlay) + val res = ctx.audioUtils.searchForSong(ctx.guildId, toPlay) if (res.isNullOrEmpty()) { sendMsg(ctx, "$SEARCH_EMOTE No results found.") diff --git a/settings.gradle.kts b/settings.gradle.kts index bf9b80c88..39c5830a3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -42,7 +42,7 @@ fun VersionCatalogBuilder.common() { library("sentry", "io.sentry", "sentry-logback").version("5.4.0") library("org-json", "org.json", "json").version("20220924") - library("jda", "net.dv8tion", "JDA").version("5.0.0-beta.21") + library("jda", "net.dv8tion", "JDA").version("5.1.0") library("trove", "net.sf.trove4j", "trove4j").version("3.0.3")