diff --git a/src/main/java/com/jagrosh/vortex/Action.java b/src/main/java/com/jagrosh/vortex/Action.java index 2736375..649b4a7 100644 --- a/src/main/java/com/jagrosh/vortex/Action.java +++ b/src/main/java/com/jagrosh/vortex/Action.java @@ -21,6 +21,7 @@ */ public enum Action { + NORAIDMODE("", "\uD83D\uDD13", 15), PARDON( "pardoned", "\uD83C\uDFF3", 14), RAIDMODE( "", "\uD83D\uDD12", 13), STRIKE( "", "\uD83D\uDEA9", 12), diff --git a/src/main/java/com/jagrosh/vortex/Constants.java b/src/main/java/com/jagrosh/vortex/Constants.java index d87c91d..5c9104a 100644 --- a/src/main/java/com/jagrosh/vortex/Constants.java +++ b/src/main/java/com/jagrosh/vortex/Constants.java @@ -15,27 +15,37 @@ */ package com.jagrosh.vortex; +import java.time.OffsetDateTime; import net.dv8tion.jda.core.Permission; /** * * @author John Grosh (jagrosh) */ -public class Constants { - - public final static String PREFIX = "<<"; - public final static String SUCCESS = "<:vSuccess:390202497827864597>"; - public final static String WARNING = "<:vWarning:390208158699618306>"; - public final static String ERROR = "<:vError:390229421228949504>"; - public final static String LOADING = ""; +public class Constants +{ + public final static OffsetDateTime STARTUP = OffsetDateTime.now(); + public final static String PREFIX = "))"; + public final static String SUCCESS = "<:vSuccess:390202497827864597>"; + public final static String WARNING = "<:vWarning:390208158699618306>"; + public final static String ERROR = "<:vError:390229421228949504>"; + public final static String LOADING = ""; + public final static String HELP_REACTION = SUCCESS.replaceAll("", "$1:$2"); public final static Permission[] PERMISSIONS = {Permission.ADMINISTRATOR, Permission.BAN_MEMBERS, Permission.KICK_MEMBERS, Permission.MANAGE_ROLES, Permission.MANAGE_SERVER, Permission.MESSAGE_ADD_REACTION, Permission.MESSAGE_ATTACH_FILES, Permission.MESSAGE_READ, Permission.MESSAGE_WRITE,Permission.MESSAGE_EMBED_LINKS, Permission.MESSAGE_HISTORY, Permission.MESSAGE_EXT_EMOJI, Permission.MESSAGE_MANAGE, Permission.VOICE_CONNECT, Permission.VOICE_MOVE_OTHERS, Permission.VOICE_DEAF_OTHERS, Permission.VOICE_MUTE_OTHERS, Permission.NICKNAME_CHANGE, Permission.NICKNAME_MANAGE, Permission.VIEW_AUDIT_LOGS}; public final static String SERVER_INVITE = "https://discord.gg/0p9LSGoRLu6Pet0k"; - public final static String BOT_INVITE = "https://discordapp.com/oauth2/authorize?client_id=240254129333731328&scope=bot&permissions="+Permission.getRaw(PERMISSIONS); - //public final static String NEED_MENTION = ERROR+" Please mention at least 1 %s!"; - //public final static String NEED_X = ERROR+" Please include at least 1 %s"; - public final static String OWNER_ID = "113156185389092864"; + //public final static String BOT_INVITE = "https://discordapp.com/oauth2/authorize?client_id=240254129333731328&scope=bot&permissions="+Permission.getRaw(PERMISSIONS); + public final static String BOT_INVITE = "https://discordapp.com/oauth2/authorize?client_id=169463754382114816&scope=bot&permissions="+Permission.getRaw(PERMISSIONS); + public final static String OWNER_ID = "113156185389092864"; + + public final static class WIKI + { + public final static String WIKI_BASE = "https://github.com/jagrosh/Vortex/wiki/"; + public final static String LOG_TIMEZONE = WIKI_BASE + "/Log-Timezone"; + public final static String RAID_MODE = WIKI_BASE + "/Raid-Mode"; + public final static String FULL_COMMAND_REFERENCE = WIKI_BASE + "/Full-Command-Reference"; + } } diff --git a/src/main/java/com/jagrosh/vortex/Vortex.java b/src/main/java/com/jagrosh/vortex/Vortex.java index 8b8cc50..28e21aa 100644 --- a/src/main/java/com/jagrosh/vortex/Vortex.java +++ b/src/main/java/com/jagrosh/vortex/Vortex.java @@ -15,8 +15,6 @@ */ package com.jagrosh.vortex; -import com.jagrosh.jdautilities.command.Command; -import com.jagrosh.jdautilities.command.Command.Category; import com.jagrosh.vortex.commands.automod.AntimentionCmd; import com.jagrosh.vortex.commands.automod.AntiduplicateCmd; import com.jagrosh.vortex.commands.automod.AutoraidmodeCmd; @@ -34,7 +32,6 @@ import java.util.concurrent.Executors; import com.jagrosh.jdautilities.command.CommandClient; import com.jagrosh.jdautilities.command.CommandClientBuilder; -import com.jagrosh.jdautilities.command.CommandEvent; import com.jagrosh.jdautilities.commons.waiter.EventWaiter; import com.jagrosh.jdautilities.examples.command.*; import com.jagrosh.vortex.automod.AutoMod; @@ -42,18 +39,15 @@ import java.util.concurrent.ScheduledExecutorService; import net.dv8tion.jda.core.OnlineStatus; import net.dv8tion.jda.core.entities.Game; -import com.jagrosh.vortex.commands.*; import com.jagrosh.vortex.database.Database; import com.jagrosh.vortex.logging.BasicLogger; import com.jagrosh.vortex.logging.MessageCache; import com.jagrosh.vortex.logging.ModLogger; import com.jagrosh.vortex.logging.TextUploader; import com.jagrosh.vortex.utils.FormatUtil; -import java.util.function.Consumer; import net.dv8tion.jda.bot.sharding.DefaultShardManagerBuilder; import net.dv8tion.jda.bot.sharding.ShardManager; import net.dv8tion.jda.core.entities.ChannelType; -import net.dv8tion.jda.core.entities.User; import net.dv8tion.jda.core.exceptions.PermissionException; import net.dv8tion.jda.webhook.WebhookClient; import net.dv8tion.jda.webhook.WebhookClientBuilder; @@ -104,7 +98,7 @@ CommandClient client = new CommandClientBuilder() .setPrefix(Constants.PREFIX) - .setGame(Game.watching("Type "+Constants.PREFIX+"help")) + .setGame(Game.watching("Type "+Constants.PREFIX+"help | Vortex Beta (Formerly Spectra Beta)")) .setOwnerId(Constants.OWNER_ID) .setServerInvite(Constants.SERVER_INVITE) .setEmojis(Constants.SUCCESS, Constants.WARNING, Constants.ERROR) @@ -138,7 +132,9 @@ new MessagelogCmd(this), new ModlogCmd(this), new ServerlogCmd(this), + new TimezoneCmd(this), new ModroleCmd(this), + new PrefixCmd(this), new SettingsCmd(this), // Automoderation @@ -158,7 +154,7 @@ if(event.isFromType(ChannelType.TEXT)) try { - event.getMessage().addReaction(Constants.SUCCESS.replaceAll("", "$1:$2")).queue(); + event.getMessage().addReaction(Constants.HELP_REACTION).queue(); } catch(PermissionException ex) {} }, t -> event.replyWarning("Help cannot be sent because you are blocking Direct Messages."))) //.setDiscordBotsKey(tokens.get(1)) diff --git a/src/main/java/com/jagrosh/vortex/automod/AutoMod.java b/src/main/java/com/jagrosh/vortex/automod/AutoMod.java index 317ac99..d081fe6 100644 --- a/src/main/java/com/jagrosh/vortex/automod/AutoMod.java +++ b/src/main/java/com/jagrosh/vortex/automod/AutoMod.java @@ -128,8 +128,13 @@ if(kicking) { OtherUtil.safeDM(event.getUser(), - "Sorry, **"+event.getGuild().getName()+"** is currently under lockdown. Please try joining again later. Sorry for the inconvenience.", - () -> event.getGuild().getController().kick(event.getMember(), "Anti-Raid Mode").queue()); + "Sorry, **"+event.getGuild().getName()+"** is currently under lockdown. Please try joining again later. Sorry for the inconvenience.", () -> + { + try + { + event.getGuild().getController().kick(event.getMember(), "Anti-Raid Mode").queue(); + }catch(Exception ex){} + }); } else { diff --git a/src/main/java/com/jagrosh/vortex/commands/ModCommand.java b/src/main/java/com/jagrosh/vortex/commands/ModCommand.java index 56e92ec..b6ece0c 100644 --- a/src/main/java/com/jagrosh/vortex/commands/ModCommand.java +++ b/src/main/java/com/jagrosh/vortex/commands/ModCommand.java @@ -41,7 +41,20 @@ Role modrole = vortex.getDatabase().settings.getSettings(event.getGuild()).getModeratorRole(event.getGuild()); if(modrole!=null && event.getMember().getRoles().contains(modrole)) return true; - return event.getMember().hasPermission(altPerms); + if(event.getMember().hasPermission(altPerms)) + return true; + event.replyError("You must have the following permissions to use that: "+listPerms(altPerms)); + return false; }); } + + private static String listPerms(Permission... perms) + { + if(perms.length==0) + return ""; + StringBuilder sb = new StringBuilder(perms[0].getName()); + for(int i=1; i"); + + "\nFor more information, check out the wiki: <"+Constants.WIKI.RAID_MODE+">"); return; } else @@ -73,6 +74,6 @@ seconds = Integer.parseInt(parts[1]); } vortex.getDatabase().automod.setAutoRaidMode(event.getGuild(), joins, seconds); - event.replySuccess("Anti-Raid mode will be enabled automatically when there are `"+joins+"` in `"+seconds+"` seconds."); + event.replySuccess("Anti-Raid mode will be enabled automatically when there are `"+joins+"` joins in `"+seconds+"` seconds."); } } diff --git a/src/main/java/com/jagrosh/vortex/commands/automod/IgnoreCmd.java b/src/main/java/com/jagrosh/vortex/commands/automod/IgnoreCmd.java index 4294613..ab78eb4 100644 --- a/src/main/java/com/jagrosh/vortex/commands/automod/IgnoreCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/automod/IgnoreCmd.java @@ -31,7 +31,7 @@ this.name = "ignore"; this.aliases = new String[]{"addignore","ignored","ignores"}; this.category = new Category("AutoMod"); - this.arguments = ""; + this.arguments = ""; this.help = "shows ignores, or sets automod to ignore a role or channel"; this.userPermissions = new Permission[]{Permission.MANAGE_SERVER}; } diff --git a/src/main/java/com/jagrosh/vortex/commands/automod/UnignoreCmd.java b/src/main/java/com/jagrosh/vortex/commands/automod/UnignoreCmd.java index 6a4e287..b749cd9 100644 --- a/src/main/java/com/jagrosh/vortex/commands/automod/UnignoreCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/automod/UnignoreCmd.java @@ -31,8 +31,8 @@ this.name = "unignore"; this.aliases = new String[]{"deignore","delignore","removeignore"}; this.category = new Category("AutoMod"); - this.arguments = ""; - this.help = "sets the automod to stop ignoring a role or channel"; + this.arguments = ""; + this.help = "stop ignoring a role or channel"; this.userPermissions = new Permission[]{Permission.MANAGE_SERVER}; } diff --git a/src/main/java/com/jagrosh/vortex/commands/general/InviteCmd.java b/src/main/java/com/jagrosh/vortex/commands/general/InviteCmd.java index 61c36d5..9f40d0e 100644 --- a/src/main/java/com/jagrosh/vortex/commands/general/InviteCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/general/InviteCmd.java @@ -28,7 +28,7 @@ public InviteCmd() { this.name = "invite"; - this.help = "shows how to invite the bot"; + this.help = "invite the bot"; this.guildOnly = false; } diff --git a/src/main/java/com/jagrosh/vortex/commands/general/UserinfoCmd.java b/src/main/java/com/jagrosh/vortex/commands/general/UserinfoCmd.java index c04e5bc..c119988 100644 --- a/src/main/java/com/jagrosh/vortex/commands/general/UserinfoCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/general/UserinfoCmd.java @@ -42,7 +42,7 @@ { this.name = "userinfo"; this.aliases = new String[]{"user","uinfo"}; - this.help = "shows info on a user in the server"; + this.help = "shows info on a member"; this.arguments = "[user]"; this.guildOnly = true; this.botPermissions = new Permission[]{Permission.MESSAGE_EMBED_LINKS}; diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/KickCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/KickCmd.java index 9777828..2c28bad 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/KickCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/KickCmd.java @@ -67,7 +67,7 @@ args.unresolved.forEach(un -> builder.append("\n").append(event.getClient().getWarning()).append(" Could not resolve `").append(un).append("` to a member")); - args.users.forEach(u -> builder.append("\n").append(event.getClient().getWarning()).append("The user ").append(u.getAsMention()).append(" is not in this server.")); + args.users.forEach(u -> builder.append("\n").append(event.getClient().getWarning()).append("The user ").append(FormatUtil.formatUser(u)).append(" is not in this server.")); args.ids.forEach(id -> builder.append("\n").append(event.getClient().getWarning()).append("The user <@").append(id).append("> is not in this server.")); @@ -86,12 +86,12 @@ boolean last = i+1 == toKick.size(); event.getGuild().getController().kick(m, reason).queue(success -> { - builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully kicked ").append(m.getUser().getAsMention()); + builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully kicked ").append(FormatUtil.formatUser(m.getUser())); if(last) event.reply(builder.toString()); }, failure -> { - builder.append("\n").append(event.getClient().getError()).append(" Failed to kick ").append(m.getUser().getAsMention()); + builder.append("\n").append(event.getClient().getError()).append(" Failed to kick ").append(FormatUtil.formatUser(m.getUser())); if(last) event.reply(builder.toString()); }); diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/MuteCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/MuteCmd.java index dc89ee6..2903213 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/MuteCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/MuteCmd.java @@ -39,7 +39,7 @@ { super(vortex, Permission.MANAGE_ROLES); this.name = "mute"; - this.arguments = "<@users...> [reason]"; + this.arguments = "<@users...> [time] [reason]"; this.help = "applies a muted role to provided users"; this.botPermissions = new Permission[]{Permission.MANAGE_ROLES}; this.guildOnly = true; @@ -115,7 +115,7 @@ boolean last = i+1 == toMute.size(); event.getGuild().getController().addSingleRoleToMember(m, muteRole).reason(reason).queue(success -> { - builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully muted ").append(m.getUser().getAsMention()); + builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully muted ").append(FormatUtil.formatUser(m.getUser())); if(minutes>0) vortex.getDatabase().tempmutes.overrideMute(event.getGuild(), m.getUser().getIdLong(), unmuteTime); else diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/PardonCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/PardonCmd.java index 4cf4769..9273542 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/PardonCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/PardonCmd.java @@ -73,20 +73,29 @@ builder.append("\n").append(event.getClient().getError()).append(" You do not have permission to interact with ").append(FormatUtil.formatUser(m.getUser())); else if(!event.getSelfMember().canInteract(m)) builder.append("\n").append(event.getClient().getError()).append(" I am unable to interact with ").append(FormatUtil.formatUser(m.getUser())); + else if(m.getUser().isBot()) + builder.append("\n").append(event.getClient().getError()).append(" Strikes cannot be taken from bots (").append(FormatUtil.formatFullUser(m.getUser())).append(")"); else args.ids.add(m.getUser().getIdLong()); }); args.unresolved.forEach(un -> builder.append("\n").append(event.getClient().getWarning()).append(" Could not resolve `").append(un).append("` to a user ID")); - args.users.forEach(u -> args.ids.add(u.getIdLong())); + args.users.forEach(u -> + { + if(u.isBot()) + builder.append("\n").append(event.getClient().getError()).append(" Strikes cannot be taken from bots (").append(FormatUtil.formatFullUser(u)).append(")"); + else + args.ids.add(u.getIdLong()); + }); int fnumstrikes = numstrikes; args.ids.forEach(id -> { vortex.getStrikeHandler().pardonStrikes(event.getMember(), event.getMessage().getCreationTime(), id, fnumstrikes, args.reason); - builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully pardoned `").append(fnumstrikes).append("` strikes from <@").append(id).append(">"); + builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully pardoned `").append(fnumstrikes) + .append("` strikes from ").append(event.getJDA().getUserById(id)==null ? "<@"+id+">" : FormatUtil.formatUser(event.getJDA().getUserById(id))); }); event.reply(builder.toString()); } diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/SoftbanCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/SoftbanCmd.java index 55a1652..3dd88df 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/SoftbanCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/SoftbanCmd.java @@ -53,6 +53,7 @@ return; } String reason = LogUtil.auditReasonFormat(event.getMember(), args.reason); + String unbanreason = LogUtil.auditReasonFormat(event.getMember(), "Softban Unban"); StringBuilder builder = new StringBuilder(); List toSoftban = new LinkedList<>(); @@ -87,13 +88,13 @@ boolean last = i+1 == toSoftban.size(); event.getGuild().getController().ban(m, 1, reason).queue(success -> { - builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully softbanned ").append(m.getUser().getAsMention()); - event.getGuild().getController().unban(m.getUser().getId()).reason("Softban Unban").queueAfter(7, TimeUnit.SECONDS); + builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully softbanned ").append(FormatUtil.formatUser(m.getUser())); + event.getGuild().getController().unban(m.getUser().getId()).reason(unbanreason).queueAfter(7, TimeUnit.SECONDS); if(last) event.reply(builder.toString()); }, failure -> { - builder.append("\n").append(event.getClient().getError()).append(" Failed to softban ").append(m.getUser().getAsMention()); + builder.append("\n").append(event.getClient().getError()).append(" Failed to softban ").append(FormatUtil.formatUser(m.getUser())); if(last) event.reply(builder.toString()); }); diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/StrikeCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/StrikeCmd.java index 721b4f4..ffeeffe 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/StrikeCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/StrikeCmd.java @@ -60,9 +60,14 @@ return; } ResolvedArgs args = ArgsUtil.resolve(str, event.getGuild()); + if(args.isEmpty()) + { + event.replyError("Please provide at least one user!"); + return; + } if(args.reason==null || args.reason.isEmpty()) { - event.replyError("Please provide a reason!"); + event.replyError("Please provide a reason for the strike(s)!"); return; } StringBuilder builder = new StringBuilder(); @@ -73,20 +78,29 @@ builder.append("\n").append(event.getClient().getError()).append(" You do not have permission to interact with ").append(FormatUtil.formatUser(m.getUser())); else if(!event.getSelfMember().canInteract(m)) builder.append("\n").append(event.getClient().getError()).append(" I am unable to interact with ").append(FormatUtil.formatUser(m.getUser())); + else if(m.getUser().isBot()) + builder.append("\n").append(event.getClient().getError()).append(" Strikes cannot be given to bots (").append(FormatUtil.formatFullUser(m.getUser())).append(")"); else args.ids.add(m.getUser().getIdLong()); }); args.unresolved.forEach(un -> builder.append("\n").append(event.getClient().getWarning()).append(" Could not resolve `").append(un).append("` to a user ID")); - args.users.forEach(u -> args.ids.add(u.getIdLong())); + args.users.forEach(u -> + { + if(u.isBot()) + builder.append("\n").append(event.getClient().getError()).append(" Strikes cannot be given to bots (").append(FormatUtil.formatFullUser(u)).append(")"); + else + args.ids.add(u.getIdLong()); + }); int fnumstrikes = numstrikes; args.ids.forEach(id -> { vortex.getStrikeHandler().applyStrikes(event.getMember(), event.getMessage().getCreationTime(), id, fnumstrikes, args.reason); - builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully gave `").append(fnumstrikes).append("` strikes to <@").append(id).append(">"); + builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully gave `").append(fnumstrikes) + .append("` strikes to ").append(event.getJDA().getUserById(id)==null ? "<@"+id+">" : FormatUtil.formatUser(event.getJDA().getUserById(id))); }); event.reply(builder.toString()); } diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/UnmuteCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/UnmuteCmd.java index 2bbe5da..2b80282 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/UnmuteCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/UnmuteCmd.java @@ -106,7 +106,7 @@ boolean last = i+1 == toUnmute.size(); event.getGuild().getController().removeSingleRoleFromMember(m, muteRole).reason(reason).queue(success -> { - builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully unmuted ").append(m.getUser().getAsMention()); + builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully unmuted ").append(FormatUtil.formatUser(m.getUser())); if(last) event.reply(builder.toString()); }, failure -> diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/VoicemoveCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/VoicemoveCmd.java index 36bda1c..315b599 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/VoicemoveCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/VoicemoveCmd.java @@ -52,7 +52,7 @@ } if(event.getArgs().isEmpty() && !event.getMember().getVoiceState().inVoiceChannel()) { - event.replyError("You must specify a voice channel or be in a voice channel to connect"); + event.replyError("You must be in or specify a voice channel to move users from!"); return; } VoiceChannel vc; diff --git a/src/main/java/com/jagrosh/vortex/commands/owner/DebugCmd.java b/src/main/java/com/jagrosh/vortex/commands/owner/DebugCmd.java index 3fd0c64..fb81a16 100644 --- a/src/main/java/com/jagrosh/vortex/commands/owner/DebugCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/owner/DebugCmd.java @@ -18,6 +18,7 @@ import java.time.OffsetDateTime; import com.jagrosh.jdautilities.command.Command; import com.jagrosh.jdautilities.command.CommandEvent; +import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.Vortex; import com.jagrosh.vortex.utils.FormatUtil; import java.time.temporal.ChronoUnit; @@ -29,7 +30,6 @@ */ public class DebugCmd extends Command { - private final OffsetDateTime start = OffsetDateTime.now(); private final Vortex vortex; public DebugCmd(Vortex vortex) @@ -48,7 +48,7 @@ long totalMb = Runtime.getRuntime().totalMemory()/(1024*1024); long usedMb = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/(1024*1024); StringBuilder sb = new StringBuilder("**"+event.getSelfUser().getName()+"** statistics:" - + "\nLast Startup: "+FormatUtil.secondsToTime(start.until(OffsetDateTime.now(), ChronoUnit.SECONDS))+" ago" + + "\nLast Startup: "+FormatUtil.secondsToTime(Constants.STARTUP.until(OffsetDateTime.now(), ChronoUnit.SECONDS))+" ago" + "\nGuilds: **"+vortex.getShardManager().getGuildCache().size()+"**" + "\nMemory: **"+usedMb+"**Mb / **"+totalMb+"**Mb" + "\nAverage Ping: **"+vortex.getShardManager().getAveragePing()+"**ms" diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/MessagelogCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/MessagelogCmd.java index 529dbcc..ad66078 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/MessagelogCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/MessagelogCmd.java @@ -38,7 +38,7 @@ { TextChannel tc = vortex.getDatabase().settings.getSettings(event.getGuild()).getMessageLogChannel(event.getGuild()); if(tc==null) - event.replyWarning("Message Logs are not currently enabled on the server."); + event.replyWarning("Message Logs are not currently enabled on the server. Please include a channel name."); else event.replySuccess("Message Logs are currently being sent in "+tc.getAsMention() +(event.getSelfMember().hasPermission(tc, REQUIRED_PERMS) ? "" : "\n"+event.getClient().getWarning()+String.format(REQUIRED_ERROR, tc.getAsMention()))); diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/ModlogCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/ModlogCmd.java index 989ae13..62223c7 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/ModlogCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/ModlogCmd.java @@ -40,7 +40,7 @@ { TextChannel tc = vortex.getDatabase().settings.getSettings(event.getGuild()).getModLogChannel(event.getGuild()); if(tc==null) - event.replyWarning("Moderation Logs are not currently enabled on the server."); + event.replyWarning("Moderation Logs are not currently enabled on the server. Please include a channel name."); else event.replySuccess("Moderation Logs are currently being sent in "+tc.getAsMention() +(event.getSelfMember().hasPermission(tc, REQUIRED_PERMS) ? "" : "\n"+event.getClient().getWarning()+String.format(REQUIRED_ERROR, tc.getAsMention()))); diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/ModroleCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/ModroleCmd.java index 88f3e90..5179e49 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/ModroleCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/ModroleCmd.java @@ -18,15 +18,9 @@ import com.jagrosh.jdautilities.command.Command; import com.jagrosh.jdautilities.command.CommandEvent; import com.jagrosh.jdautilities.commons.utils.FinderUtil; -import com.jagrosh.vortex.Action; -import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.Vortex; -import com.jagrosh.vortex.database.managers.PunishmentManager; import com.jagrosh.vortex.utils.FormatUtil; -import com.jagrosh.vortex.utils.OtherUtil; import java.util.List; -import net.dv8tion.jda.core.EmbedBuilder; -import net.dv8tion.jda.core.MessageBuilder; import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.Role; @@ -55,6 +49,7 @@ { if(event.getArgs().isEmpty()) { + event.replyError("Please include the name of a role to use as the Moderator role. Members with this role will be able to use all Moderation commands."); return; } diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/PrefixCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/PrefixCmd.java new file mode 100644 index 0000000..90d31bd --- /dev/null +++ b/src/main/java/com/jagrosh/vortex/commands/settings/PrefixCmd.java @@ -0,0 +1,70 @@ +/* + * Copyright 2018 John Grosh (john.a.grosh@gmail.com). + * + * 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 com.jagrosh.vortex.commands.settings; + +import com.jagrosh.jdautilities.command.Command; +import com.jagrosh.jdautilities.command.CommandEvent; +import com.jagrosh.vortex.Constants; +import com.jagrosh.vortex.Vortex; +import com.jagrosh.vortex.database.managers.GuildSettingsDataManager; +import net.dv8tion.jda.core.Permission; + +/** + * + * @author John Grosh (john.a.grosh@gmail.com) + */ +public class PrefixCmd extends Command +{ + private final Vortex vortex; + + public PrefixCmd(Vortex vortex) + { + this.vortex = vortex; + this.name = "prefix"; + this.help = "sets the server prefix"; + this.arguments = ""; + this.category = new Category("Settings"); + this.guildOnly = true; + this.userPermissions = new Permission[]{Permission.MANAGE_SERVER}; + } + + @Override + protected void execute(CommandEvent event) + { + if(event.getArgs().isEmpty()) + { + event.replyError("Please include a prefix. The server's current prefix can be seen via the `"+Constants.PREFIX+"settings` command"); + return; + } + + if(event.getArgs().equalsIgnoreCase("none")) + { + vortex.getDatabase().settings.setPrefix(event.getGuild(), null); + event.replySuccess("The server prefix has been reset."); + return; + } + + if(event.getArgs().length()>GuildSettingsDataManager.PREFIX_MAX_LENGTH) + { + event.replySuccess("Prefixes cannot be longer than `"+GuildSettingsDataManager.PREFIX_MAX_LENGTH+"` characters."); + return; + } + + vortex.getDatabase().settings.setPrefix(event.getGuild(), event.getArgs()); + event.replySuccess("The server prefix has been set to `"+event.getArgs()+"`\n" + + "Note that the default prefix (`"+Constants.PREFIX+"`) cannot be removed and will work in addition to the custom prefix."); + } +} diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/ServerlogCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/ServerlogCmd.java index 180740c..82d23c4 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/ServerlogCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/ServerlogCmd.java @@ -38,7 +38,7 @@ { TextChannel tc = vortex.getDatabase().settings.getSettings(event.getGuild()).getServerLogChannel(event.getGuild()); if(tc==null) - event.replyWarning("Server Logs are not currently enabled on the server."); + event.replyWarning("Server Logs are not currently enabled on the server. Please include a channel name."); else event.replySuccess("Server Logs are currently being sent in "+tc.getAsMention() +(event.getSelfMember().hasPermission(tc, REQUIRED_PERMS) ? "" : "\n"+event.getClient().getWarning()+String.format(REQUIRED_ERROR, tc.getAsMention()))); diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/SetstrikesCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/SetstrikesCmd.java index 071d7d4..73403b3 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/SetstrikesCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/SetstrikesCmd.java @@ -44,7 +44,7 @@ { this.vortex = vortex; this.name = "setstrikes"; - this.help = "sets the number of strikes for a punishment"; + this.help = "sets strikes for a punishment"; this.aliases = new String[]{"setstrike"}; this.arguments = " [time]"; this.category = new Category("Settings"); diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/SettingsCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/SettingsCmd.java index 7ab38a0..f0e0a38 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/SettingsCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/SettingsCmd.java @@ -45,6 +45,7 @@ event.getChannel().sendMessage(new MessageBuilder() .append("**"+event.getSelfUser().getName()+"** settings on **"+event.getGuild().getName()+"**:") .setEmbed(new EmbedBuilder() + .setThumbnail(event.getGuild().getIconId()==null ? event.getSelfUser().getEffectiveAvatarUrl() : event.getGuild().getIconUrl()) .addField(vortex.getDatabase().settings.getSettingsDisplay(event.getGuild())) .addField(vortex.getDatabase().actions.getAllPunishmentsDisplay(event.getGuild())) .addField(vortex.getDatabase().automod.getSettingsDisplay(event.getGuild())) diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/TimezoneCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/TimezoneCmd.java new file mode 100644 index 0000000..3d0e48d --- /dev/null +++ b/src/main/java/com/jagrosh/vortex/commands/settings/TimezoneCmd.java @@ -0,0 +1,71 @@ +/* + * Copyright 2018 John Grosh (john.a.grosh@gmail.com). + * + * 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 com.jagrosh.vortex.commands.settings; + +import com.jagrosh.jdautilities.command.Command; +import com.jagrosh.jdautilities.command.CommandEvent; +import com.jagrosh.vortex.Constants; +import com.jagrosh.vortex.Vortex; +import java.time.ZoneId; +import net.dv8tion.jda.core.Permission; + +/** + * + * @author John Grosh (john.a.grosh@gmail.com) + */ +public class TimezoneCmd extends Command +{ + private final Vortex vortex; + + public TimezoneCmd(Vortex vortex) + { + this.vortex = vortex; + this.name = "timezone"; + this.help = "sets the log timezone"; + this.arguments = ""; + this.category = new Category("Settings"); + this.guildOnly = true; + this.userPermissions = new Permission[]{Permission.MANAGE_SERVER}; + } + + @Override + protected void execute(CommandEvent event) + { + if(event.getArgs().isEmpty()) + { + event.replyError("Please include a time zone. A full list of timezones can be found here: <"+Constants.WIKI.LOG_TIMEZONE+">"); + return; + } + + if(event.getArgs().equalsIgnoreCase("none")) + { + vortex.getDatabase().settings.setTimezone(event.getGuild(), null); + event.replySuccess("The log timezone has been reset."); + return; + } + + try + { + ZoneId newzone = ZoneId.of(event.getArgs()); + vortex.getDatabase().settings.setTimezone(event.getGuild(), newzone); + event.replySuccess("The log timezone has been set to `"+newzone.getId()+"`"); + } + catch(Exception ex) + { + event.replyError("`"+event.getArgs()+"` is not a valid timezone! See <"+Constants.WIKI.LOG_TIMEZONE+"> for a full list."); + } + } +} diff --git a/src/main/java/com/jagrosh/vortex/database/managers/AutomodManager.java b/src/main/java/com/jagrosh/vortex/database/managers/AutomodManager.java index c2c8953..a267256 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/AutomodManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/AutomodManager.java @@ -87,8 +87,9 @@ : "Max User Mentions: " + (settings.maxMentions==0 ? "None\n" : "**" + settings.maxMentions + "**\n") + "Max Role Mentions: " + (settings.maxRoleMentions==0 ? "None\n\n" : "**" + settings.maxRoleMentions + "**\n\n")) + "__Auto Anti-Raid Mode__\n" + (settings.useAutoRaidMode() - ? "**" + settings.raidmodeNumber + "** joins / **" + settings.raidmodeTime + "** seconds" - : "Disabled"), true); + ? "**" + settings.raidmodeNumber + "** joins / **" + settings.raidmodeTime + "** seconds\n" + : "Disabled\n") + + "\u200B", true); } // Setters diff --git a/src/main/java/com/jagrosh/vortex/database/managers/FilterManager.java b/src/main/java/com/jagrosh/vortex/database/managers/FilterManager.java new file mode 100644 index 0000000..0bd9a6c --- /dev/null +++ b/src/main/java/com/jagrosh/vortex/database/managers/FilterManager.java @@ -0,0 +1,80 @@ +/* + * Copyright 2018 John Grosh (john.a.grosh@gmail.com). + * + * 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 com.jagrosh.vortex.database.managers; + +import com.jagrosh.easysql.DataManager; +import com.jagrosh.easysql.DatabaseConnector; +import com.jagrosh.easysql.SQLColumn; +import com.jagrosh.easysql.columns.*; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import net.dv8tion.jda.core.entities.Guild; + +/** + * + * @author John Grosh (john.a.grosh@gmail.com) + */ +public class FilterManager extends DataManager +{ + public final static SQLColumn GUILD_ID = new LongColumn("GUILD_ID",false,0L); + public final static SQLColumn NUM = new IntegerColumn("NUM", false, 0); + public final static SQLColumn TYPE = new IntegerColumn("TYPE", false, 0); + public final static SQLColumn VALUE = new StringColumn("VALUE", false, "", 60); + + public FilterManager(DatabaseConnector connector) + { + super(connector, "FILTERS"); + } + + @Override + protected String primaryKey() + { + return GUILD_ID+", "+NUM; + } + + public int addFilter(Guild guild, Type type, String value) + { + return 0; + } + + public Filter deleteFilter(Guild guild, int index) + { + return null; + } + + public List getFilters(Guild guild) + { + return null; + } + + public class Filter + { + public final String value; + public final Type type; + + private Filter(ResultSet rs) throws SQLException + { + this.value = VALUE.getValue(rs); + this.type = Type.values()[TYPE.getValue(rs)]; + } + } + + public enum Type + { + WORD, GLOB, REGEX + } +} diff --git a/src/main/java/com/jagrosh/vortex/database/managers/GuildSettingsDataManager.java b/src/main/java/com/jagrosh/vortex/database/managers/GuildSettingsDataManager.java index 3f176ba..a0870ef 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/GuildSettingsDataManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/GuildSettingsDataManager.java @@ -88,7 +88,7 @@ + "\nMod Log: "+(modlog==null ? "None" : modlog.getAsMention()) + "\nMsg Log: "+(messagelog==null ? "None" : messagelog.getAsMention()) + "\nServer Log: "+(serverlog==null ? "None" : serverlog.getAsMention()) - + "\nTimezone: **"+settings.timezone+"**", true); + + "\nTimezone: **"+settings.timezone+"**\n\u200B", true); } // Setters @@ -172,6 +172,46 @@ }); } + public void setPrefix(Guild guild, String prefix) + { + invalidateCache(guild); + readWrite(select(GUILD_ID.is(guild.getIdLong()), GUILD_ID, PREFIX), rs -> + { + if(rs.next()) + { + PREFIX.updateValue(rs, prefix); + rs.updateRow(); + } + else + { + rs.moveToInsertRow(); + GUILD_ID.updateValue(rs, guild.getIdLong()); + PREFIX.updateValue(rs, prefix); + rs.insertRow(); + } + }); + } + + public void setTimezone(Guild guild, ZoneId zone) + { + invalidateCache(guild); + readWrite(select(GUILD_ID.is(guild.getIdLong()), GUILD_ID, TIMEZONE), rs -> + { + if(rs.next()) + { + TIMEZONE.updateValue(rs, zone.getId()); + rs.updateRow(); + } + else + { + rs.moveToInsertRow(); + GUILD_ID.updateValue(rs, guild.getIdLong()); + TIMEZONE.updateValue(rs, zone.getId()); + rs.insertRow(); + } + }); + } + public void enableRaidMode(Guild guild) { invalidateCache(guild); diff --git a/src/main/java/com/jagrosh/vortex/database/managers/PunishmentManager.java b/src/main/java/com/jagrosh/vortex/database/managers/PunishmentManager.java index e86960e..c963d58 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/PunishmentManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/PunishmentManager.java @@ -153,7 +153,9 @@ for(Punishment p: punishments) if(p.numStrikes>max.numStrikes) max = p; - return Collections.singletonList(max); + if(from>=max.numStrikes) + return Collections.singletonList(max); + return Collections.EMPTY_LIST; } public Field getAllPunishmentsDisplay(Guild guild) diff --git a/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java b/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java index 6987059..26002b6 100644 --- a/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java +++ b/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java @@ -82,7 +82,7 @@ edit.addField("To:", newm.length()>1024 ? newm.substring(0,1016)+" (...)" : newm, false); else edit.appendDescription("\n**To:** "+newm); - log(newMessage.getEditedTime(), tc, "\u26A0", + log(newMessage.getEditedTime()==null ? newMessage.getCreationTime() : newMessage.getEditedTime(), tc, "\u26A0", FormatUtil.formatUser(newMessage.getAuthor())+" edited a message in "+newMessage.getTextChannel().getAsMention()+":", edit.build()); } @@ -110,6 +110,11 @@ TextChannel tc = vortex.getDatabase().settings.getSettings(text.getGuild()).getMessageLogChannel(text.getGuild()); if(tc==null) return; + if(messages.isEmpty()) + { + log(OffsetDateTime.now(), tc, "\uD83D\uDEAE", "**"+count+"** messages were deleted from "+text.getAsMention()+" (**"+messages.size()+"** logged)", null); + return; + } vortex.getTextUploader().upload(LogUtil.logMessages("Deleted Messages", messages), "DeletedMessages", (view, download) -> { log(OffsetDateTime.now(), tc, "\uD83D\uDEAE", "**"+count+"** messages were deleted from "+text.getAsMention()+" (**"+messages.size()+"** logged):", diff --git a/src/main/java/com/jagrosh/vortex/utils/FormatUtil.java b/src/main/java/com/jagrosh/vortex/utils/FormatUtil.java index a24aacb..3c1cc24 100644 --- a/src/main/java/com/jagrosh/vortex/utils/FormatUtil.java +++ b/src/main/java/com/jagrosh/vortex/utils/FormatUtil.java @@ -23,7 +23,11 @@ import net.dv8tion.jda.core.entities.VoiceChannel; import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.Vortex; +import java.awt.Color; +import net.dv8tion.jda.core.EmbedBuilder; +import net.dv8tion.jda.core.MessageBuilder; import net.dv8tion.jda.core.entities.Message; +import net.dv8tion.jda.core.entities.MessageEmbed; import net.dv8tion.jda.core.entities.TextChannel; /** @@ -181,9 +185,12 @@ return str; } - public static String formatHelp(CommandEvent event, Vortex vortex) + public static Message formatHelp(CommandEvent event, Vortex vortex) { - StringBuilder builder = new StringBuilder("**"+event.getSelfUser().getName()+"** commands:\n"); + EmbedBuilder builder = new EmbedBuilder() + .setColor(event.getGuild()==null ? Color.LIGHT_GRAY : event.getSelfMember().getColor()); + + StringBuilder sb = new StringBuilder(); Command.Category category = null; for(Command command : event.getClient().getCommands()) { @@ -193,30 +200,31 @@ { if(command.getCategory()!=null) { + builder.addField("General Commands", sb.toString()+"\u200B", true); + sb = new StringBuilder(); category = command.getCategory(); - builder.append("\n\n __").append(category==null ? "No Category" : category.getName()).append("__:\n"); } } else { if(command.getCategory()==null || !command.getCategory().getName().equals(category.getName())) { + builder.addField(category.getName()+" Commands", sb.toString()+"\u200B", true); + sb = new StringBuilder(); category = command.getCategory(); - builder.append("\n\n __").append(category==null ? "No Category" : category.getName()).append("__:\n"); } } - builder.append("\n`").append(event.getClient().getTextualPrefix()).append(event.getClient().getPrefix()==null?" ":"").append(command.getName()) - .append(command.getArguments()==null ? "`" : " "+command.getArguments()+"`") - .append(" - ").append(command.getHelp()); + sb.append("```fix\n").append(event.getClient().getTextualPrefix()).append(event.getClient().getPrefix()==null?" ":"").append(command.getName()) + .append(command.getArguments()==null ? "" : " "+command.getArguments()+"") + .append(" = ").append(command.getHelp()).append("```"); } } - User owner = vortex.getShardManager().getUserById(event.getClient().getOwnerIdLong()); - if(owner!=null) - { - builder.append("\n\nFor additional help, contact **").append(owner.getName()).append("**#").append(owner.getDiscriminator()); - if(event.getClient().getServerInvite()!=null) - builder.append(" or join ").append(event.getClient().getServerInvite()); - } - return builder.toString(); + builder.addField(category==null ? "General Commands" : category.getName()+" Commands", sb.toString()+"\u200B", true); + + builder.addField("Additional Help", "["+event.getSelfUser().getName()+" Wiki]("+Constants.WIKI.WIKI_BASE+")\n" + + "[Support Server]("+event.getClient().getServerInvite()+")\n" + + "[Full Command Reference]("+Constants.WIKI.FULL_COMMAND_REFERENCE+")", false); + + return new MessageBuilder().append(Constants.SUCCESS+" **"+event.getSelfUser().getName()+"** Commands:").setEmbed(builder.build()).build(); } } diff --git a/src/main/java/com/jagrosh/vortex/utils/LogUtil.java b/src/main/java/com/jagrosh/vortex/utils/LogUtil.java index 89e9c91..f2df0f3 100644 --- a/src/main/java/com/jagrosh/vortex/utils/LogUtil.java +++ b/src/main/java/com/jagrosh/vortex/utils/LogUtil.java @@ -92,7 +92,7 @@ public static String modlogRaidFormat(OffsetDateTime time, ZoneId zone, int caseNum, User moderator, boolean enabled, String reason) { - return String.format(MODLOG_RAID_FORMAT, timeF(time, zone), caseNum, Action.RAIDMODE.getEmoji(), moderator.getName(), + return String.format(MODLOG_RAID_FORMAT, timeF(time, zone), caseNum, enabled ? Action.RAIDMODE.getEmoji() : Action.NORAIDMODE.getEmoji(), moderator.getName(), moderator.getDiscriminator(), enabled ? "ENABLED" : "DISABLED", reasonF(reason)); }