diff --git a/.gitignore b/.gitignore index c177e3a..dfba200 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ /database/ /.idea/ nb*.xml -*.conf \ No newline at end of file +*.conf +/nbproject/ \ No newline at end of file diff --git a/images/NoAvatar.png b/images/NoAvatar.png index 14fd0ca..6621980 100644 --- a/images/NoAvatar.png +++ b/images/NoAvatar.png Binary files differ diff --git a/images/NoAvatar_old.png b/images/NoAvatar_old.png new file mode 100644 index 0000000..14fd0ca --- /dev/null +++ b/images/NoAvatar_old.png Binary files differ diff --git a/lists/copypastas.txt b/lists/copypastas.txt index 396f7d4..cb752a7 100644 --- a/lists/copypastas.txt +++ b/lists/copypastas.txt @@ -17,6 +17,7 @@ // Unicode Bob || /▌ && /\ && This is bob Lennipede || ╚═(███)═╝ && Lenn +Doge || ▐▄█▀▒▒▒▒▄▀█▄ && ▐▄█▄█▌▄▒▀▒ && ▒▀▀▄▄▒▒▒▄▒ // Text Navy Seals || say about me && ll have you know I && I am trained && Think again && Not only am I extensively trained && kid diff --git a/lists/referral_domains.txt b/lists/referral_domains.txt index 725fa70..40636ec 100644 --- a/lists/referral_domains.txt +++ b/lists/referral_domains.txt @@ -40,6 +40,7 @@ yoütu.be yoütübe.co yoütübe.com +youtubeshort.watch // Ad sites adblade.com @@ -110,6 +111,7 @@ // Scams amazingsexdating.com easter-event.com +ezrobux.gg fortnite.cards fortnite.events fortnite-christmas.com diff --git a/pom.xml b/pom.xml index 59c5962..c910073 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ jcenter jcenter-bintray - http://jcenter.bintray.com + https://jcenter.bintray.com @@ -24,7 +24,7 @@ net.dv8tion JDA - 4.0.0_52 + 4.1.1_110 com.jagrosh @@ -52,6 +52,18 @@ config 1.3.2 + + junit + junit + 4.12 + test + + + org.hamcrest + hamcrest-core + 1.3 + test + @@ -82,4 +94,4 @@ - \ No newline at end of file + diff --git a/src/main/java/com/jagrosh/vortex/Constants.java b/src/main/java/com/jagrosh/vortex/Constants.java index b4a7937..96dfc7c 100644 --- a/src/main/java/com/jagrosh/vortex/Constants.java +++ b/src/main/java/com/jagrosh/vortex/Constants.java @@ -33,6 +33,7 @@ public final static String HELP_REACTION = SUCCESS.replaceAll("", "$1:$2"); public final static String ERROR_REACTION = ERROR.replaceAll("", "$1:$2"); public final static String VORTEX_EMOJI = "<:Vortex:386971287282515970>"; + public final static int DEFAULT_CACHE_SIZE = 8000; 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, diff --git a/src/main/java/com/jagrosh/vortex/Listener.java b/src/main/java/com/jagrosh/vortex/Listener.java index b01c424..50a2efd 100644 --- a/src/main/java/com/jagrosh/vortex/Listener.java +++ b/src/main/java/com/jagrosh/vortex/Listener.java @@ -27,6 +27,7 @@ import net.dv8tion.jda.api.events.guild.GuildBanEvent; import net.dv8tion.jda.api.events.guild.GuildUnbanEvent; import net.dv8tion.jda.api.events.guild.member.*; +import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateNicknameEvent; import net.dv8tion.jda.api.events.guild.voice.GuildVoiceJoinEvent; import net.dv8tion.jda.api.events.guild.voice.GuildVoiceLeaveEvent; import net.dv8tion.jda.api.events.guild.voice.GuildVoiceMoveEvent; @@ -170,9 +171,9 @@ { vortex.getBasicLogger().logNameChange((UserUpdateDiscriminatorEvent)event); } - else if (event instanceof GuildMemberNickChangeEvent) + else if (event instanceof GuildMemberUpdateNicknameEvent) { - vortex.getAutoMod().dehoist(((GuildMemberNickChangeEvent) event).getMember()); + vortex.getAutoMod().dehoist(((GuildMemberUpdateNicknameEvent) event).getMember()); } else if (event instanceof UserUpdateAvatarEvent) { diff --git a/src/main/java/com/jagrosh/vortex/Vortex.java b/src/main/java/com/jagrosh/vortex/Vortex.java index b031495..10c7afd 100644 --- a/src/main/java/com/jagrosh/vortex/Vortex.java +++ b/src/main/java/com/jagrosh/vortex/Vortex.java @@ -15,6 +15,8 @@ */ package com.jagrosh.vortex; +import club.minnced.discord.webhook.WebhookClient; +import club.minnced.discord.webhook.WebhookClientBuilder; import com.jagrosh.vortex.commands.tools.LookupCmd; import com.jagrosh.vortex.commands.automod.*; import com.jagrosh.vortex.commands.general.*; @@ -32,7 +34,6 @@ import com.jagrosh.vortex.commands.CommandExceptionListener; import java.util.concurrent.ScheduledExecutorService; import net.dv8tion.jda.api.OnlineStatus; -import net.dv8tion.jda.api.entities.Game; import com.jagrosh.vortex.database.Database; import com.jagrosh.vortex.logging.BasicLogger; import com.jagrosh.vortex.logging.MessageCache; @@ -45,8 +46,11 @@ import com.typesafe.config.ConfigFactory; import java.util.EnumSet; import java.util.concurrent.TimeUnit; +import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.exceptions.PermissionException; +import net.dv8tion.jda.api.sharding.DefaultShardManagerBuilder; +import net.dv8tion.jda.api.sharding.ShardManager; import net.dv8tion.jda.api.utils.cache.CacheFlag; /** @@ -66,6 +70,7 @@ private final WebhookClient logwebhook; private final AutoMod automod; private final StrikeHandler strikehandler; + private final CommandExceptionListener listener; public Vortex() throws Exception { @@ -83,15 +88,16 @@ logwebhook = new WebhookClientBuilder(config.getString("webhook-url")).build(); automod = new AutoMod(this, config); strikehandler = new StrikeHandler(this); + listener = new CommandExceptionListener(); CommandClient client = new CommandClientBuilder() .setPrefix(Constants.PREFIX) - .setGame(Game.playing(Constants.Wiki.SHORT_WIKI)) + .setActivity(Activity.playing(Constants.Wiki.SHORT_WIKI)) .setOwnerId(Constants.OWNER_ID) .setServerInvite(Constants.SERVER_INVITE) .setEmojis(Constants.SUCCESS, Constants.WARNING, Constants.ERROR) .setLinkedCacheSize(0) .setGuildSettingsManager(database.settings) - .setListener(new CommandExceptionListener()) + .setListener(listener) .setScheduleExecutor(threadpool) .setShutdownAutomatically(false) .addCommands( @@ -107,6 +113,7 @@ new KickCmd(this), new BanCmd(this), new SoftbanCmd(this), + new SilentbanCmd(this), new UnbanCmd(this), new CleanCmd(this), new VoicemoveCmd(this), @@ -177,10 +184,10 @@ .setToken(config.getString("bot-token")) .addEventListeners(new Listener(this), client, waiter) .setStatus(OnlineStatus.DO_NOT_DISTURB) - .setGame(Game.playing("loading...")) + .setActivity(Activity.playing("loading...")) .setBulkDeleteSplittingEnabled(false) .setRequestTimeoutRetry(true) - .setDisabledCacheFlags(EnumSet.of(CacheFlag.EMOTE, CacheFlag.GAME)) //TODO: dont disable GAME + .setDisabledCacheFlags(EnumSet.of(CacheFlag.EMOTE, CacheFlag.ACTIVITY)) //TODO: dont disable GAME .setSessionController(new BlockingSessionController()) .build(); @@ -248,6 +255,11 @@ return strikehandler; } + public CommandExceptionListener getListener() + { + return listener; + } + // Global methods public void cleanPremium() diff --git a/src/main/java/com/jagrosh/vortex/automod/AutoMod.java b/src/main/java/com/jagrosh/vortex/automod/AutoMod.java index 9206735..500bcac 100644 --- a/src/main/java/com/jagrosh/vortex/automod/AutoMod.java +++ b/src/main/java/com/jagrosh/vortex/automod/AutoMod.java @@ -23,6 +23,7 @@ import com.jagrosh.vortex.automod.URLResolver.*; import com.jagrosh.vortex.utils.FixedCache; import com.jagrosh.vortex.utils.OtherUtil; +import com.jagrosh.vortex.utils.Usage; import com.typesafe.config.Config; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; @@ -35,6 +36,7 @@ import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.entities.Guild.VerificationLevel; @@ -70,6 +72,7 @@ private final CopypastaResolver copypastaResolver = new CopypastaResolver(); private final FixedCache spams = new FixedCache<>(3000); private final HashMap latestGuildJoin = new HashMap<>(); + private final Usage usage = new Usage(); public AutoMod(Vortex vortex, Config config) { @@ -94,6 +97,11 @@ this.refLinkList = OtherUtil.readLines("referral_domains"); } + public Usage getUsage() + { + return usage; + } + public void enableRaidMode(Guild guild, Member moderator, OffsetDateTime now, String reason) { vortex.getDatabase().settings.enableRaidMode(guild); @@ -153,8 +161,8 @@ else if(ams.useAutoRaidMode()) { // find the time that we should be looking after, and count the number of people that joined after that - OffsetDateTime min = event.getMember().getJoinDate().minusSeconds(ams.raidmodeTime); - long recent = event.getGuild().getMemberCache().stream().filter(m -> !m.getUser().isBot() && m.getJoinDate().isAfter(min)).count(); + OffsetDateTime min = event.getMember().getTimeJoined().minusSeconds(ams.raidmodeTime); + long recent = event.getGuild().getMemberCache().stream().filter(m -> !m.getUser().isBot() && m.getTimeJoined().isAfter(min)).count(); if(recent>=ams.raidmodeNumber) { enableRaidMode(event.getGuild(), event.getGuild().getSelfMember(), now, "Maximum join rate exceeded ("+ams.raidmodeNumber+"/"+ams.raidmodeTime+"s)"); @@ -169,7 +177,7 @@ { try { - event.getGuild().getController().kick(event.getMember(), "Anti-Raid Mode").queue(); + event.getGuild().kick(event.getMember(), "Anti-Raid Mode").queue(); }catch(Exception ignore){} }); } @@ -179,8 +187,8 @@ { try { - event.getGuild().getController() - .addSingleRoleToMember(event.getMember(), vortex.getDatabase().settings.getSettings(event.getGuild()).getMutedRole(event.getGuild())) + event.getGuild() + .addRoleToMember(event.getMember(), vortex.getDatabase().settings.getSettings(event.getGuild()).getMutedRole(event.getGuild())) .reason(RESTORE_MUTE_ROLE_AUDIT).queue(); } catch(Exception ignore){} } @@ -245,6 +253,7 @@ try { + usage.increment(member.getGuild().getIdLong()); OtherUtil.dehoist(member, settings.dehoistChar); } catch(Exception ignore) {} @@ -271,6 +280,7 @@ List inviteWhitelist = !preventInvites ? Collections.emptyList() : vortex.getDatabase().inviteWhitelist.readWhitelist(message.getGuild()); List filters = vortex.getDatabase().filters.getFilters(message.getGuild()); + usage.increment(message.getGuild().getIdLong()); boolean shouldDelete = false; String channelWarning = null; @@ -421,6 +431,7 @@ LOG.trace("Found "+invites.size()+" invites."); for(String inviteCode : invites) { + LOG.info("Resolving invite in " + message.getGuild().getId() + ": " + inviteCode); long gid = inviteResolver.resolve(message.getJDA(), inviteCode); if(gid != message.getGuild().getIdLong() && !inviteWhitelist.contains(gid)) { @@ -478,7 +489,9 @@ { if(preventInvites && resolved.matches(INVITE_LINK)) { - long invite = inviteResolver.resolve(message.getJDA(), resolved.replaceAll(INVITE_LINK, "$1")); + String code = resolved.replaceAll(INVITE_LINK, "$1"); + LOG.info("Delayed resolving invite in " + message.getGuild().getId() + ": " + code); + long invite = inviteResolver.resolve(message.getJDA(), code); if(invite != message.getGuild().getIdLong() && !inviteWhitelist.contains(invite)) containsInvite = true; } @@ -487,7 +500,6 @@ if(resolved.matches(REF.pattern()) || isReferralUrl(resolved.replaceAll(BASE_URL.pattern(), "$1"))) containsRef = true; } - } if((containsInvite || !preventInvites) && (containsRef || settings.refStrikes<1)) break; @@ -510,16 +522,29 @@ private void purgeMessages(Guild guild, Predicate predicate) { - vortex.getMessageCache().getMessages(guild, predicate).forEach(m -> + vortex.getMessageCache().getMessages(guild, predicate).stream() + .collect(Collectors.groupingBy(CachedMessage::getTextChannelId)).entrySet().forEach(entry -> { try { + TextChannel mtc = guild.getTextChannelById(entry.getKey()); + if(mtc != null) + mtc.purgeMessagesById(entry.getValue().stream().map(CachedMessage::getId).collect(Collectors.toList())); + } + catch(PermissionException ignore) {} + catch(Exception ex) { LOG.error("Error in purging messages: ", ex); } + });//*/ + /*vortex.getMessageCache().getMessages(guild, predicate).forEach(m -> + { + + try + { TextChannel mtc = m.getTextChannel(guild); if(mtc!=null) mtc.deleteMessageById(m.getIdLong()).queue(s->{}, f->{}); } catch(PermissionException ignore) {} - }); + });//*/ } private boolean isReferralUrl(String url) @@ -546,7 +571,7 @@ private static OffsetDateTime latestTime(Message m) { - return m.isEdited() ? m.getEditedTime() : m.getTimeCreated(); + return m.isEdited() ? m.getTimeEdited(): m.getTimeCreated(); } private class DupeStatus diff --git a/src/main/java/com/jagrosh/vortex/automod/Filter.java b/src/main/java/com/jagrosh/vortex/automod/Filter.java index 3e5c605..cfb0710 100644 --- a/src/main/java/com/jagrosh/vortex/automod/Filter.java +++ b/src/main/java/com/jagrosh/vortex/automod/Filter.java @@ -30,7 +30,7 @@ public final static int MAX_CONTENT_LENGTH = 255; public final static int MAX_STRIKES = 100; - private final static String[] TEST_CASES = {"welcome", "i will follow the rules"}; + private final static String[] TEST_CASES = {"welcome", "i will follow the rules", "this is a sentence"}; public final String name; public final int strikes; @@ -150,15 +150,21 @@ glob = glob.replaceAll("\\*+", "*"); // remove double wildcards this.startWildcard = glob.startsWith("*"); this.endWildcard = glob.endsWith("*"); - this.glob = (startWildcard ? "" : " ") - + glob.substring(startWildcard ? 1 : 0, endWildcard ? glob.length()-1 : glob.length()) - + (endWildcard ? "" : " "); + this.glob = glob.substring(startWildcard ? 1 : 0, endWildcard ? glob.length()-1 : glob.length()); } @Override public boolean test(String message) { - return (" " + message.replaceAll("\\s+", " ").toLowerCase() + " ").contains(glob); + String lower = message.toLowerCase(); + int index = -1; + while((index = lower.indexOf(glob, index + 1)) > -1) + { + if((startWildcard || isWordBoundary(lower, index - 1)) + && (endWildcard || isWordBoundary(lower, index + glob.length()))) + return true; + } + return false; } @Override @@ -166,6 +172,14 @@ { return (startWildcard ? "*" : "") + glob.trim() + (endWildcard ? "*" : ""); } + + private static boolean isWordBoundary(String str, int index) + { + if(index < 0 || index >= str.length()) + return true; + char c = str.charAt(index); + return !(c >= 'a' && c <= 'z') && !(c >= 'A' && c <= 'Z') && !(c >= '0' && c <= '9'); + } } public static class Quote extends Item diff --git a/src/main/java/com/jagrosh/vortex/automod/InviteResolver.java b/src/main/java/com/jagrosh/vortex/automod/InviteResolver.java index ae6bc20..54d3a6e 100644 --- a/src/main/java/com/jagrosh/vortex/automod/InviteResolver.java +++ b/src/main/java/com/jagrosh/vortex/automod/InviteResolver.java @@ -18,6 +18,8 @@ import com.jagrosh.vortex.utils.FixedCache; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Invite; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @@ -25,15 +27,17 @@ */ public class InviteResolver { - private final FixedCache cached = new FixedCache<>(200); + private final Logger log = LoggerFactory.getLogger(InviteResolver.class); + private final FixedCache cached = new FixedCache<>(5000); public long resolve(JDA jda, String code) { + log.debug("Attempting to resolve " + code); if(cached.contains(code)) return cached.get(code); try { - Invite i = Invite.resolve(jda, code).complete(); + Invite i = Invite.resolve(jda, code).complete(false); cached.put(code, i.getGuild().getIdLong()); return i.getGuild().getIdLong(); } diff --git a/src/main/java/com/jagrosh/vortex/automod/StrikeHandler.java b/src/main/java/com/jagrosh/vortex/automod/StrikeHandler.java index 5580dcf..8266044 100644 --- a/src/main/java/com/jagrosh/vortex/automod/StrikeHandler.java +++ b/src/main/java/com/jagrosh/vortex/automod/StrikeHandler.java @@ -88,7 +88,7 @@ if(punishments.stream().anyMatch(p -> p.action==Action.BAN) && canBan) { OtherUtil.safeDM(target, dmmsg + punish(Action.BAN, moderator.getGuild()), isMember, - () -> moderator.getGuild().getController().ban(target, 7, notimeaudit).queue()); + () -> moderator.getGuild().ban(target, 7, notimeaudit).queue()); vortex.getDatabase().tempbans.clearBan(moderator.getGuild(), target.getIdLong()); return; } @@ -107,7 +107,7 @@ { int finalBanDuration = banDuration; OtherUtil.safeDM(target, dmmsg + punishTime(Action.TEMPBAN, moderator.getGuild(), banDuration), isMember, - () -> moderator.getGuild().getController().ban(target, 7, LogUtil.auditStrikeReasonFormat(moderator, finalBanDuration, counts[0], counts[1], reason)).queue()); + () -> moderator.getGuild().ban(target, 7, LogUtil.auditStrikeReasonFormat(moderator, finalBanDuration, counts[0], counts[1], reason)).queue()); vortex.getDatabase().tempbans.setBan(moderator.getGuild(), target.getIdLong(), now.plus(banDuration, ChronoUnit.MINUTES)); if(muteDuration>0) vortex.getDatabase().tempmutes.setMute(moderator.getGuild(), target.getIdLong(), muteTime(now, muteDuration)); @@ -116,8 +116,8 @@ if(punishments.stream().anyMatch(p -> p.action==Action.SOFTBAN) && canBan) { OtherUtil.safeDM(target, dmmsg + punish(Action.SOFTBAN, moderator.getGuild()), isMember, - () -> moderator.getGuild().getController().ban(target, 7, notimeaudit).queue( - s -> moderator.getGuild().getController().unban(target).reason(notimeaudit).queueAfter(4, TimeUnit.SECONDS))); + () -> moderator.getGuild().ban(target, 7, notimeaudit).queue( + s -> moderator.getGuild().unban(target).reason(notimeaudit).queueAfter(4, TimeUnit.SECONDS))); if(muteDuration>0) vortex.getDatabase().tempmutes.setMute(moderator.getGuild(), target.getIdLong(), muteTime(now, muteDuration)); return; @@ -128,7 +128,7 @@ if(moderator.getGuild().isMember(target)) { OtherUtil.safeDM(target, dmmsg + punish(Action.KICK, moderator.getGuild()), isMember, - () -> moderator.getGuild().getController().kick(target.getId(), notimeaudit).queue()); + () -> moderator.getGuild().kick(target.getId(), notimeaudit).queue()); } else { @@ -158,7 +158,7 @@ } else { - moderator.getGuild().getController().addSingleRoleToMember(mem, muted) + moderator.getGuild().addRoleToMember(mem, muted) .reason(muteDuration==Integer.MAX_VALUE ? notimeaudit : LogUtil.auditStrikeReasonFormat(moderator, muteDuration, counts[0], counts[1], reason)) .queue(); } diff --git a/src/main/java/com/jagrosh/vortex/commands/CommandExceptionListener.java b/src/main/java/com/jagrosh/vortex/commands/CommandExceptionListener.java index 63a097b..fdd7873 100644 --- a/src/main/java/com/jagrosh/vortex/commands/CommandExceptionListener.java +++ b/src/main/java/com/jagrosh/vortex/commands/CommandExceptionListener.java @@ -18,6 +18,8 @@ import com.jagrosh.jdautilities.command.Command; import com.jagrosh.jdautilities.command.CommandEvent; import com.jagrosh.jdautilities.command.CommandListener; +import com.jagrosh.vortex.utils.Usage; +import net.dv8tion.jda.api.entities.ChannelType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,6 +30,7 @@ public class CommandExceptionListener implements CommandListener { private final Logger log = LoggerFactory.getLogger("Command"); + private final Usage usage = new Usage(); @Override public void onCommandException(CommandEvent event, Command command, Throwable throwable) @@ -55,4 +58,16 @@ super(message); } } + + @Override + public void onCommand(CommandEvent event, Command command) + { + if(event.isFromType(ChannelType.TEXT)) + usage.increment(event.getGuild().getIdLong()); + } + + public Usage getUsage() + { + return usage; + } } diff --git a/src/main/java/com/jagrosh/vortex/commands/automod/AntiduplicateCmd.java b/src/main/java/com/jagrosh/vortex/commands/automod/AntiduplicateCmd.java index 594430d..ff72560 100644 --- a/src/main/java/com/jagrosh/vortex/commands/automod/AntiduplicateCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/automod/AntiduplicateCmd.java @@ -17,7 +17,6 @@ import com.jagrosh.jdautilities.command.Command; import com.jagrosh.jdautilities.command.CommandEvent; -import com.jagrosh.vortex.Constants; import net.dv8tion.jda.api.Permission; import com.jagrosh.vortex.Vortex; import com.jagrosh.vortex.database.managers.PunishmentManager; @@ -48,7 +47,7 @@ if(event.getArgs().isEmpty() || event.getArgs().equalsIgnoreCase("help")) { event.replySuccess("The Anti-Duplicate system prevents and punishes users for sending the same message repeatedly.\n" - + "Usage: `"+Constants.PREFIX+name+" "+arguments+"`\n" + + "Usage: `"+event.getClient().getPrefix()+name+" "+arguments+"`\n" + "`` - the number of duplicates at which strikes should start being assigned\n" + "`[delete threshold]` - the number of duplicates at which a user's messages should start being deleted\n" + "`[strikes]` - the number of strikes to assign on each duplicate after the strike threshold is met"); diff --git a/src/main/java/com/jagrosh/vortex/commands/automod/AutodehoistCmd.java b/src/main/java/com/jagrosh/vortex/commands/automod/AutodehoistCmd.java index ed659ac..b039870 100644 --- a/src/main/java/com/jagrosh/vortex/commands/automod/AutodehoistCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/automod/AutodehoistCmd.java @@ -19,7 +19,6 @@ import com.jagrosh.jdautilities.command.CommandEvent; import net.dv8tion.jda.api.Permission; import com.jagrosh.vortex.Vortex; -import com.jagrosh.vortex.automod.AutoMod; import com.jagrosh.vortex.commands.CommandExceptionListener; import com.jagrosh.vortex.database.managers.PunishmentManager; import com.jagrosh.vortex.utils.OtherUtil; diff --git a/src/main/java/com/jagrosh/vortex/commands/automod/BlacklistCmd.java b/src/main/java/com/jagrosh/vortex/commands/automod/BlacklistCmd.java deleted file mode 100644 index ebab9bd..0000000 --- a/src/main/java/com/jagrosh/vortex/commands/automod/BlacklistCmd.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.automod; - -import com.jagrosh.jdautilities.command.Command; -import com.jagrosh.jdautilities.command.CommandEvent; -import com.jagrosh.vortex.Vortex; -import net.dv8tion.jda.api.Permission; - -/** - * - * @author John Grosh (john.a.grosh@gmail.com) - */ -public class BlacklistCmd extends Command -{ - private final Vortex vortex; - - public BlacklistCmd(Vortex vortex) - { - this.vortex = vortex; - this.guildOnly = true; - this.name = "blacklist"; - this.category = new Category("AutoMod"); - this.arguments = "[word]"; - this.help = "shows/edits the word blacklist"; - this.userPermissions = new Permission[]{Permission.MANAGE_SERVER}; - } - - @Override - protected void execute(CommandEvent event) - { - - } -} diff --git a/src/main/java/com/jagrosh/vortex/commands/automod/FilterCmd.java b/src/main/java/com/jagrosh/vortex/commands/automod/FilterCmd.java index 2cd0d92..15238b9 100644 --- a/src/main/java/com/jagrosh/vortex/commands/automod/FilterCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/automod/FilterCmd.java @@ -57,7 +57,7 @@ + "quote can be checked for by surrounding the word in double quotation marks (\"). \n"); for(Command cmd: children) { - sb.append("\n`").append(Constants.PREFIX).append(name).append(" ").append(cmd.getName()) + sb.append("\n`").append(event.getClient().getPrefix()).append(name).append(" ").append(cmd.getName()) .append(cmd.getArguments() == null ? "" : " " + cmd.getArguments()).append("` - ").append(cmd.getHelp()); } event.reply(sb.toString()); 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 42dd3ad..73c8439 100644 --- a/src/main/java/com/jagrosh/vortex/commands/automod/IgnoreCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/automod/IgnoreCmd.java @@ -37,7 +37,8 @@ } @Override - protected void execute(CommandEvent event) { + protected void execute(CommandEvent event) + { if(event.getArgs().isEmpty()) { EmbedBuilder ebuilder = new EmbedBuilder(); 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 7b40ae2..0110f36 100644 --- a/src/main/java/com/jagrosh/vortex/commands/automod/UnignoreCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/automod/UnignoreCmd.java @@ -18,7 +18,6 @@ import com.jagrosh.jdautilities.command.Command; import com.jagrosh.jdautilities.command.CommandEvent; import com.jagrosh.jdautilities.commons.utils.FinderUtil; -import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.Vortex; import java.util.List; import net.dv8tion.jda.api.Permission; @@ -79,7 +78,7 @@ event.replySuccess("Automod is no longer ignoring role `"+roles.get(0).getName()+"`"); else event.replyError("Automod was not ignoring role `"+roles.get(0).getName()+"`" - + "\n"+Constants.WARNING+" If this role is still listed when using `"+Constants.PREFIX+"ignore`:" + + "\n"+event.getClient().getWarning()+" If this role is still listed when using `"+event.getClient().getPrefix()+"ignore`:" + "\n`[can't interact]` - the role is above "+event.getSelfUser().getName()+"'s highest role; try moving the '"+event.getSelfUser().getName()+"' role higher" + "\n`[elevated perms]` - the role has one of the following permissions: Kick Members, Ban Members, Manage Server, Manage Messages, Administrator"); } 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 13949c0..a90b39f 100644 --- a/src/main/java/com/jagrosh/vortex/commands/general/UserinfoCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/general/UserinfoCmd.java @@ -27,9 +27,9 @@ import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.OnlineStatus; import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.utils.MiscUtil; /** * @@ -89,16 +89,16 @@ else roles=roles.substring(3)+"`"; str+="\n"+LINESTART+"Roles: "+roles; - str+="\n"+LINESTART+"Status: "+statusToEmote(member.getOnlineStatus(), member.getGame())+"**"+member.getOnlineStatus().name()+"**"; - Game game = member.getGame(); + str+="\n"+LINESTART+"Status: "+statusToEmote(member.getOnlineStatus(), member.getActivities())+"**"+member.getOnlineStatus().name()+"**"; + Activity game = member.getActivities().isEmpty() ? null : member.getActivities().get(0); if(game!=null) str+=" ("+formatGame(game)+")"; - str+="\n"+LINESTART+"Account Creation: **"+MiscUtil.getDateTimeString(MiscUtil.getCreationTime(user))+"**"; + str+="\n"+LINESTART+"Account Creation: **"+user.getTimeCreated().format(DateTimeFormatter.RFC_1123_DATE_TIME)+"**"; List joins = new ArrayList<>(event.getGuild().getMembers()); - Collections.sort(joins, (Member a, Member b) -> a.getJoinDate().compareTo(b.getJoinDate())); + Collections.sort(joins, (Member a, Member b) -> a.getTimeJoined().compareTo(b.getTimeJoined())); int index = joins.indexOf(member); - str+="\n"+LINESTART+"Guild Join Date: **"+member.getJoinDate().format(DateTimeFormatter.RFC_1123_DATE_TIME) + "** `(#"+(index+1)+")`"; + str+="\n"+LINESTART+"Guild Join Date: **"+member.getTimeJoined().format(DateTimeFormatter.RFC_1123_DATE_TIME) + "** `(#"+(index+1)+")`"; index-=3; if(index<0) index=0; @@ -119,7 +119,7 @@ } event.reply(new MessageBuilder() - .append(title) + .append(FormatUtil.filterEveryone(title)) .setEmbed(new EmbedBuilder() .setDescription(str) .setThumbnail(user.getEffectiveAvatarUrl()) @@ -127,9 +127,10 @@ .build()); } - private static String statusToEmote(OnlineStatus status, Game game) + private static String statusToEmote(OnlineStatus status, List games) { - if(game!=null && game.getType()==Game.GameType.STREAMING && game.getUrl()!=null && Game.isValidStreamingUrl(game.getUrl())) + Activity game = games.isEmpty() ? null : games.get(0); + if(game!=null && game.getType()==Activity.ActivityType.STREAMING && game.getUrl()!=null && Activity.isValidStreamingUrl(game.getUrl())) return "<:streaming:313956277132853248>"; switch(status) { case ONLINE: return "<:online:313956277808005120>"; @@ -141,7 +142,7 @@ } } - private static String formatGame(Game game) + private static String formatGame(Activity game) { String str; switch(game.getType()) diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/BanCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/BanCmd.java index 6a6efdf..0048356 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/BanCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/BanCmd.java @@ -36,6 +36,8 @@ */ public class BanCmd extends ModCommand { + protected int daysToDelete = 1; + public BanCmd(Vortex vortex) { super(vortex, Permission.BAN_MEMBERS); @@ -102,7 +104,7 @@ long uid = ids.get(i); String id = Long.toString(uid); boolean last = i+1 == ids.size(); - event.getGuild().ban(id, 1, reason).queue(success -> + event.getGuild().ban(id, daysToDelete, reason).queue(success -> { builder.append("\n").append(event.getClient().getSuccess()).append(" Successfully banned <@").append(id).append(">").append(time); if(minutes>0) diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/RaidCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/RaidCmd.java index 21bbfc1..b7ce068 100644 --- a/src/main/java/com/jagrosh/vortex/commands/moderation/RaidCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/RaidCmd.java @@ -16,7 +16,6 @@ package com.jagrosh.vortex.commands.moderation; import com.jagrosh.jdautilities.command.CommandEvent; -import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.Vortex; import com.jagrosh.vortex.commands.ModCommand; import net.dv8tion.jda.api.Permission; @@ -65,8 +64,8 @@ else { event.replySuccess("Anti-Raid Mode is currently `"+(active ? "ACTIVE" : "NOT ACTIVE")+"`\n\n" - + "`"+Constants.PREFIX+name+" ON` to enable Anti-Raid Mode\n" - + "`"+Constants.PREFIX+name+" OFF` to disable Anti-Raid Mode"); + + "`"+event.getClient().getPrefix()+name+" ON` to enable Anti-Raid Mode\n" + + "`"+event.getClient().getPrefix()+name+" OFF` to disable Anti-Raid Mode"); } } } diff --git a/src/main/java/com/jagrosh/vortex/commands/moderation/SilentbanCmd.java b/src/main/java/com/jagrosh/vortex/commands/moderation/SilentbanCmd.java new file mode 100644 index 0000000..e59ee70 --- /dev/null +++ b/src/main/java/com/jagrosh/vortex/commands/moderation/SilentbanCmd.java @@ -0,0 +1,34 @@ +/* + * Copyright 2019 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.moderation; + +import com.jagrosh.vortex.Vortex; + +/** + * + * @author John Grosh (john.a.grosh@gmail.com) + */ +public class SilentbanCmd extends BanCmd +{ + public SilentbanCmd(Vortex vortex) + { + super(vortex); + this.name = "silentban"; + this.aliases = new String[]{}; + this.help = "bans users without deleting messages"; + this.daysToDelete = 0; + } +} 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 12370a4..c234bed 100644 --- a/src/main/java/com/jagrosh/vortex/commands/owner/DebugCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/owner/DebugCmd.java @@ -51,7 +51,7 @@ + "\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" + + "\nAverage Ping: **"+vortex.getShardManager().getAverageGatewayPing()+"**ms" + "\nShard Total: **"+vortex.getShardManager().getShardsTotal()+"**" + "\nShard Connectivity: ```diff"); vortex.getShardManager().getShards().forEach(jda -> sb.append("\n").append(jda.getStatus()==JDA.Status.CONNECTED ? "+ " : "- ") diff --git a/src/main/java/com/jagrosh/vortex/commands/owner/PremiumCmd.java b/src/main/java/com/jagrosh/vortex/commands/owner/PremiumCmd.java index c91ffe7..365cf26 100644 --- a/src/main/java/com/jagrosh/vortex/commands/owner/PremiumCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/owner/PremiumCmd.java @@ -17,7 +17,6 @@ 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.PremiumManager; import com.jagrosh.vortex.database.managers.PremiumManager.PremiumInfo; @@ -77,6 +76,6 @@ PremiumInfo before = vortex.getDatabase().premium.getPremiumInfo(guild); vortex.getDatabase().premium.addPremium(guild, PremiumManager.Level.PRO, seconds, ChronoUnit.SECONDS); PremiumInfo after = vortex.getDatabase().premium.getPremiumInfo(guild); - event.replySuccess("Before: " + before + "\n" + Constants.SUCCESS + " After: " + after); + event.replySuccess("Before: " + before + "\n" + event.getClient().getSuccess() + " After: " + after); } } diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/PrefixCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/PrefixCmd.java index bad623e..5ea0a6a 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/PrefixCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/PrefixCmd.java @@ -17,7 +17,6 @@ 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.api.Permission; @@ -46,7 +45,7 @@ { if(event.getArgs().isEmpty()) { - event.replyError("Please include a prefix. The server's current prefix can be seen via the `"+Constants.PREFIX+"settings` command"); + event.replyError("Please include a prefix. The server's current prefix can be seen via the `"+event.getClient().getPrefix()+"settings` command"); return; } @@ -65,6 +64,6 @@ 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."); + + "Note that the default prefix (`"+event.getClient().getPrefix()+"`) cannot be removed and will work in addition to the custom prefix."); } } 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 3328dfb..1a1b472 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/SettingsCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/SettingsCmd.java @@ -18,9 +18,8 @@ import com.jagrosh.jdautilities.command.Command; import com.jagrosh.jdautilities.command.CommandEvent; import com.jagrosh.vortex.Vortex; -import com.jagrosh.vortex.database.managers.PremiumManager; import com.jagrosh.vortex.database.managers.PremiumManager.PremiumInfo; -import java.time.Instant; +import com.jagrosh.vortex.utils.FormatUtil; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.Permission; @@ -48,7 +47,7 @@ { PremiumInfo pi = vortex.getDatabase().premium.getPremiumInfo(event.getGuild()); event.getChannel().sendMessage(new MessageBuilder() - .append("**"+event.getSelfUser().getName()+"** settings on **"+event.getGuild().getName()+"**:") + .append(FormatUtil.filterEveryone("**" + 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())) diff --git a/src/main/java/com/jagrosh/vortex/commands/settings/SetupCmd.java b/src/main/java/com/jagrosh/vortex/commands/settings/SetupCmd.java index 559ebdc..fa9f35b 100644 --- a/src/main/java/com/jagrosh/vortex/commands/settings/SetupCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/settings/SetupCmd.java @@ -56,7 +56,7 @@ { StringBuilder sb = new StringBuilder("The following commands can be used to set up a **").append(event.getSelfUser().getName()).append("** feature:\n"); for(Command cmd: children) - sb.append("\n`").append(Constants.PREFIX).append(name).append(" ").append(cmd.getName()).append("` - ").append(cmd.getHelp()); + sb.append("\n`").append(event.getClient().getPrefix()).append(name).append(" ").append(cmd.getName()).append("` - ").append(cmd.getHelp()); event.replySuccess(sb.toString()); } @@ -83,54 +83,54 @@ event.getChannel().sendTyping().queue(); StringBuilder sb = new StringBuilder("**Automod setup complete!**"); if(vortex.getDatabase().actions.useDefaultSettings(event.getGuild())) - sb.append("\n").append(Constants.SUCCESS).append(" Set up default punishments"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Set up default punishments"); AutomodSettings ams = vortex.getDatabase().automod.getSettings(event.getGuild()); if(ams.inviteStrikes==0) { vortex.getDatabase().automod.setInviteStrikes(event.getGuild(), 2); - sb.append("\n").append(Constants.SUCCESS).append(" Anti-invite set to `2` strikes"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Anti-invite set to `2` strikes"); } if(ams.refStrikes==0) { vortex.getDatabase().automod.setRefStrikes(event.getGuild(), 3); - sb.append("\n").append(Constants.SUCCESS).append(" Anti-referral set to `3` strikes"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Anti-referral set to `3` strikes"); } if(!ams.useAntiDuplicate()) { vortex.getDatabase().automod.setDupeSettings(event.getGuild(), 1, 2, 4); - sb.append("\n").append(Constants.SUCCESS).append(" Anti-duplicate will start deleting at duplicate `2`, and will assign `1` strike each duplicate starting at duplicate `4`"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Anti-duplicate will start deleting at duplicate `2`, and will assign `1` strike each duplicate starting at duplicate `4`"); } if(ams.copypastaStrikes==0) { vortex.getDatabase().automod.setCopypastaStrikes(event.getGuild(), 1); - sb.append("\n").append(Constants.SUCCESS).append(" Anti-copypasta set to `1` strikes"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Anti-copypasta set to `1` strikes"); } if(ams.maxMentions==0) { vortex.getDatabase().automod.setMaxMentions(event.getGuild(), 10); - sb.append("\n").append(Constants.SUCCESS).append(" Maximum mentions set to `10` mentions"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Maximum mentions set to `10` mentions"); } if(ams.maxRoleMentions==0) { vortex.getDatabase().automod.setMaxRoleMentions(event.getGuild(), 4); - sb.append("\n").append(Constants.SUCCESS).append(" Maximum role mentions set to `4` mentions"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Maximum role mentions set to `4` mentions"); } if(ams.maxLines==0) { vortex.getDatabase().automod.setMaxLines(event.getGuild(), 10); - sb.append("\n").append(Constants.SUCCESS).append(" Maximum lines set to `10` lines"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Maximum lines set to `10` lines"); } if(!ams.useAutoRaidMode()) { vortex.getDatabase().automod.setAutoRaidMode(event.getGuild(), 10, 10); - sb.append("\n").append(Constants.SUCCESS).append(" Anti-Raid Mode will activate upon `10` joins in `10` seconds"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Anti-Raid Mode will activate upon `10` joins in `10` seconds"); } if(ams.dehoistChar==(char)0) { vortex.getDatabase().automod.setDehoistChar(event.getGuild(), '!'); - sb.append("\n").append(Constants.SUCCESS).append(" Names starting with `!` will be dehoisted"); + sb.append("\n").append(event.getClient().getSuccess()).append(" Names starting with `!` will be dehoisted"); } - sb.append("\n").append(Constants.WARNING).append(" Any settings not shown here were not set due to being already set. Please check the automod section of the wiki (<") + sb.append("\n").append(event.getClient().getWarning()).append(" Any settings not shown here were not set due to being already set. Please check the automod section of the wiki (<") .append(Constants.Wiki.AUTOMOD).append(">) for more information about the automod."); event.replySuccess(sb.toString()); }); @@ -179,7 +179,7 @@ private void setUpMutedRole(CommandEvent event, Role role) { - StringBuilder sb = new StringBuilder(Constants.SUCCESS+" Muted role setup started!\n"); + StringBuilder sb = new StringBuilder(event.getClient().getSuccess()+" Muted role setup started!\n"); event.reply(sb + Constants.LOADING+" Initializing role...", m -> event.async(() -> { try @@ -187,14 +187,14 @@ Role mutedRole; if(role==null) { - mutedRole = event.getGuild().getController().createRole().setName("Muted").setPermissions().setColor(1).complete(); + mutedRole = event.getGuild().createRole().setName("Muted").setPermissions().setColor(1).complete(); } else { role.getManager().setPermissions().complete(); mutedRole = role; } - sb.append(Constants.SUCCESS+" Role initialized!\n"); + sb.append(event.getClient().getSuccess()).append(" Role initialized!\n"); m.editMessage(sb + Constants.LOADING+" Making Category overrides...").complete(); PermissionOverride po; for(net.dv8tion.jda.api.entities.Category cat: event.getGuild().getCategories()) @@ -205,7 +205,7 @@ else po.getManager().deny(Permission.MESSAGE_WRITE, Permission.MESSAGE_ADD_REACTION, Permission.VOICE_CONNECT, Permission.VOICE_SPEAK).complete(); } - sb.append(Constants.SUCCESS+" Category overrides complete!\n"); + sb.append(event.getClient().getSuccess()).append(" Category overrides complete!\n"); m.editMessage(sb + Constants.LOADING + " Making Text Channel overrides...").complete(); for(TextChannel tc: event.getGuild().getTextChannels()) { @@ -215,7 +215,7 @@ else po.getManager().deny(Permission.MESSAGE_WRITE, Permission.MESSAGE_ADD_REACTION).complete(); } - sb.append(Constants.SUCCESS+" Text Channel overrides complete!\n"); + sb.append(event.getClient().getSuccess()).append(" Text Channel overrides complete!\n"); m.editMessage(sb + Constants.LOADING + " Making Voice Channel overrides...").complete(); for(VoiceChannel vc: event.getGuild().getVoiceChannels()) { @@ -225,11 +225,11 @@ else po.getManager().deny(Permission.VOICE_CONNECT, Permission.VOICE_SPEAK).complete(); } - m.editMessage(sb + Constants.SUCCESS+" Voice Channel overrides complete!\n\n" + Constants.SUCCESS+" Muted role setup has completed!").queue(); + m.editMessage(sb + event.getClient().getSuccess()+" Voice Channel overrides complete!\n\n" + event.getClient().getSuccess()+" Muted role setup has completed!").queue(); } catch(Exception ex) { - m.editMessage(sb + Constants.ERROR+" An error occurred setting up the Muted role. Please check that I have the Administrator permission and that the Muted role is below my roles.").queue(); + m.editMessage(sb + event.getClient().getError()+" An error occurred setting up the Muted role. Please check that I have the Administrator permission and that the Muted role is below my roles.").queue(); } })); } @@ -240,7 +240,7 @@ .setChoices(CONFIRM, CANCEL) .setEventWaiter(vortex.getEventWaiter()) .setTimeout(1, TimeUnit.MINUTES) - .setText(Constants.WARNING+" "+message+"\n\n"+CONFIRM+" Continue\n"+CANCEL+" Cancel") + .setText(event.getClient().getWarning()+" "+message+"\n\n"+CONFIRM+" Continue\n"+CANCEL+" Cancel") .setFinalAction(m -> m.delete().queue(s->{}, f->{})) .setUsers(event.getAuthor()) .setAction(re -> diff --git a/src/main/java/com/jagrosh/vortex/commands/tools/AuditCmd.java b/src/main/java/com/jagrosh/vortex/commands/tools/AuditCmd.java index aca09dd..b42af66 100644 --- a/src/main/java/com/jagrosh/vortex/commands/tools/AuditCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/tools/AuditCmd.java @@ -18,7 +18,6 @@ import com.jagrosh.jdautilities.command.Command; import com.jagrosh.jdautilities.command.CommandEvent; import com.jagrosh.jdautilities.commons.utils.FinderUtil; -import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.commands.CommandExceptionListener.CommandErrorException; import com.jagrosh.vortex.commands.CommandExceptionListener.CommandWarningException; import com.jagrosh.vortex.utils.FormatUtil; @@ -28,6 +27,7 @@ import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.audit.ActionType; +import net.dv8tion.jda.api.audit.AuditLogChange; import net.dv8tion.jda.api.entities.Emote; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.TextChannel; @@ -99,9 +99,9 @@ break; default: throw new CommandErrorException("Valid subcommands:\n\n" - + "`" + Constants.PREFIX + name + " all` - shows recent audit log entries\n" - + "`" + Constants.PREFIX + name + " from ` - shows recent entries by a user\n" - + "`" + Constants.PREFIX + name + " action ` shows recent entries of a certain action"); + + "`" + event.getClient().getPrefix() + name + " all` - shows recent audit log entries\n" + + "`" + event.getClient().getPrefix() + name + " from ` - shows recent entries by a user\n" + + "`" + event.getClient().getPrefix() + name + " action ` shows recent entries of a certain action"); } event.getChannel().sendTyping().queue(); action.queue(list -> @@ -155,10 +155,12 @@ } ale.getChanges().keySet().forEach(change -> { - sb.append("\n").append(LINESTART).append(fixCase(change)).append(": ") - .append(ale.getChangeByKey(change).getOldValue()==null ? "" : "**"+ale.getChangeByKey(change).getOldValue()+"**") - .append(ale.getChangeByKey(change).getOldValue()==null || ale.getChangeByKey(change).getNewValue()==null ? "" : " → ") - .append(ale.getChangeByKey(change).getNewValue()==null ? "" : "**"+ale.getChangeByKey(change).getNewValue()+"**"); + AuditLogChange alc = ale.getChangeByKey(change); + if(alc != null) + sb.append("\n").append(LINESTART).append(fixCase(change)).append(": ") + .append(alc.getOldValue()==null ? "" : "**"+alc.getOldValue()+"**") + .append(alc.getOldValue()==null || alc.getNewValue()==null ? "" : " → ") + .append(alc.getNewValue()==null ? "" : "**"+alc.getNewValue()+"**"); }); ale.getOptions().keySet().forEach(option -> { @@ -172,7 +174,7 @@ eb.addField(actionToEmote(ale.getType())+" "+fixCase(ale.getType().name()), str, true); }); event.reply(new MessageBuilder() - .setContent(Constants.SUCCESS+" Recent Audit Logs in **"+FormatUtil.filterEveryone(event.getGuild().getName())+"**:") + .setContent(event.getClient().getSuccess()+" Recent Audit Logs in **"+FormatUtil.filterEveryone(event.getGuild().getName())+"**:") .setEmbed(eb.build()).build()); }, f -> event.replyWarning("Failed to retrieve audit logs")); } diff --git a/src/main/java/com/jagrosh/vortex/commands/tools/InvitepruneCmd.java b/src/main/java/com/jagrosh/vortex/commands/tools/InvitepruneCmd.java index bc48c86..d5e3dcd 100644 --- a/src/main/java/com/jagrosh/vortex/commands/tools/InvitepruneCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/tools/InvitepruneCmd.java @@ -91,7 +91,7 @@ .setChoices(CONFIRM, CANCEL) .setEventWaiter(vortex.getEventWaiter()) .setTimeout(1, TimeUnit.MINUTES) - .setText(Constants.WARNING+" "+message+"\n\n"+CONFIRM+" Continue\n"+CANCEL+" Cancel") + .setText(event.getClient().getWarning()+" "+message+"\n\n"+CONFIRM+" Continue\n"+CANCEL+" Cancel") .setFinalAction(m -> m.delete().queue(s->{}, f->{})) .setUsers(event.getAuthor()) .setAction(re -> diff --git a/src/main/java/com/jagrosh/vortex/commands/tools/LookupCmd.java b/src/main/java/com/jagrosh/vortex/commands/tools/LookupCmd.java index fdb9acf..dd69e91 100644 --- a/src/main/java/com/jagrosh/vortex/commands/tools/LookupCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/tools/LookupCmd.java @@ -18,6 +18,7 @@ import com.jagrosh.jdautilities.command.Command; import com.jagrosh.jdautilities.command.CommandEvent; import com.jagrosh.vortex.Vortex; +import com.jagrosh.vortex.utils.FormatUtil; import java.time.format.DateTimeFormatter; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.MessageBuilder; @@ -28,6 +29,8 @@ import net.dv8tion.jda.api.utils.MiscUtil; import net.dv8tion.jda.api.utils.WidgetUtil; import net.dv8tion.jda.api.utils.WidgetUtil.Widget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @@ -40,7 +43,9 @@ private final static String GUILD_EMOJI = "\uD83D\uDDA5"; // 🖥 private final static String LINESTART = "\u25AB"; // ▫ + private final Logger log = LoggerFactory.getLogger(LookupCmd.class); private final Vortex vortex; + private boolean debug = true; public LookupCmd(Vortex vortex) { @@ -55,6 +60,11 @@ @Override protected void execute(CommandEvent event) { + if(event.isFromType(ChannelType.TEXT) && event.getMember().getRoles().isEmpty()) + { + event.reactError(); + return; + } if(event.getArgs().isEmpty()) { event.replyError("Please provide a User ID, Server ID, or Invite Code\n" @@ -63,6 +73,12 @@ return; } event.getChannel().sendTyping().queue(); + log.info(event.getGuild().getId() + " - " + event.getMember().getUser().getId() + ": " + event.getMessage().getContentRaw()); + if(debug && event.getGuild().getMemberById(113156185389092864L)==null && event.getGuild().getMemberById(194257036828082176L)==null) + { + event.reactError(); + return; + } event.async(() -> { try @@ -82,9 +98,9 @@ String str = LINESTART+"Discord ID: **"+u.getId()+"**"; if(u.getAvatarId()!=null && u.getAvatarId().startsWith("a_")) str+= " <:nitro:314068430611415041>"; - str+="\n"+LINESTART+"Account Creation: **"+MiscUtil.getDateTimeString(u.getTimeCreated())+"**"; + str+="\n"+LINESTART+"Account Creation: **"+u.getTimeCreated().format(DateTimeFormatter.RFC_1123_DATE_TIME)+"**"; eb.setDescription(str); - event.reply(new MessageBuilder().append(text).setEmbed(eb.build()).build()); + event.reply(new MessageBuilder().append(FormatUtil.filterEveryone(text)).setEmbed(eb.build()).build()); return; } @@ -124,7 +140,7 @@ } } eb.setDescription(str); - event.reply(new MessageBuilder().append(text).setEmbed(eb.build()).build()); + event.reply(new MessageBuilder().append(FormatUtil.filterEveryone(text)).setEmbed(eb.build()).build()); return; } } @@ -174,7 +190,7 @@ eb.setImage(inv.getGuild().getSplashUrl()+"?size=1024"); } eb.addField("Guild Info", str, false); - event.reply(new MessageBuilder().append(text).setEmbed(eb.build()).build()); + event.reply(new MessageBuilder().append(FormatUtil.filterEveryone(text)).setEmbed(eb.build()).build()); }); } } 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 e9647e0..d46cb22 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/AutomodManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/AutomodManager.java @@ -20,6 +20,7 @@ import com.jagrosh.easysql.SQLColumn; import com.jagrosh.easysql.columns.*; import com.jagrosh.vortex.Action; +import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.utils.FixedCache; import java.sql.ResultSet; import java.sql.SQLException; @@ -60,7 +61,7 @@ public final static SQLColumn DEHOIST_CHAR = new IntegerColumn("DEHOIST_CHAR", false, 0); // Cache - private final FixedCache cache = new FixedCache<>(1000); + private final FixedCache cache = new FixedCache<>(Constants.DEFAULT_CACHE_SIZE); private final AutomodSettings blankSettings = new AutomodSettings(); public AutomodManager(DatabaseConnector connector) diff --git a/src/main/java/com/jagrosh/vortex/database/managers/FilterManager.java b/src/main/java/com/jagrosh/vortex/database/managers/FilterManager.java index 58ea5b2..96b79e5 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/FilterManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/FilterManager.java @@ -20,6 +20,7 @@ import com.jagrosh.easysql.SQLColumn; import com.jagrosh.easysql.columns.*; import com.jagrosh.vortex.Action; +import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.automod.Filter; import com.jagrosh.vortex.utils.FixedCache; import java.util.ArrayList; @@ -42,7 +43,7 @@ public final static SQLColumn STRIKES = new IntegerColumn("STRIKES", false, 0); public final static SQLColumn CONTENT = new StringColumn("CONTENT", false, "", Filter.MAX_CONTENT_LENGTH); - private final FixedCache> cache = new FixedCache<>(1000); + private final FixedCache> cache = new FixedCache<>(Constants.DEFAULT_CACHE_SIZE); public FilterManager(DatabaseConnector connector) { 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 e1e49ab..6b97446 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/GuildSettingsDataManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/GuildSettingsDataManager.java @@ -63,7 +63,7 @@ // level to set permission when finished // Cache - private final FixedCache cache = new FixedCache<>(1000); + private final FixedCache cache = new FixedCache<>(Constants.DEFAULT_CACHE_SIZE); private final GuildSettings blankSettings = new GuildSettings(); public GuildSettingsDataManager(DatabaseConnector connector) diff --git a/src/main/java/com/jagrosh/vortex/database/managers/IgnoreManager.java b/src/main/java/com/jagrosh/vortex/database/managers/IgnoreManager.java index 577eb47..1920919 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/IgnoreManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/IgnoreManager.java @@ -19,11 +19,12 @@ import com.jagrosh.easysql.DatabaseConnector; import com.jagrosh.easysql.SQLColumn; import com.jagrosh.easysql.columns.*; +import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.utils.FixedCache; -import java.sql.ResultSet; -import java.util.LinkedList; +import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; @@ -39,7 +40,7 @@ public final static SQLColumn ENTITY_ID = new LongColumn("ENTITY_ID",false,0L,true); public final static SQLColumn TYPE = new IntegerColumn("TYPE",false,0); - private final FixedCache> cache = new FixedCache<>(1000); + private final FixedCache> cache = new FixedCache<>(Constants.DEFAULT_CACHE_SIZE); public IgnoreManager(DatabaseConnector connector) { @@ -48,32 +49,45 @@ public boolean isIgnored(TextChannel tc) { - return read(select(ENTITY_ID.is(tc.getIdLong()), ENTITY_ID), ResultSet::next); + return getIgnores(tc.getGuild()).contains(tc.getIdLong()); } public boolean isIgnored(Member member) { - if(cache.contains(member.getGuild().getIdLong())) - { - for(long rid: cache.get(member.getGuild().getIdLong())) - if(member.getRoles().stream().anyMatch(r -> r.getIdLong()==rid)) - return true; - return false; - } - return read(select(GUILD_ID.is(member.getGuild().getId())+" AND "+TYPE.is(Type.ROLE.ordinal()), ENTITY_ID), rs -> - { - while(rs.next()) - { - long id = ENTITY_ID.getValue(rs); - if(member.getRoles().stream().anyMatch(r -> r.getIdLong()==id)) - return true; - } - return false; - }); + Set ignored = getIgnores(member.getGuild()); + return member.getRoles().stream().anyMatch(r -> ignored.contains(r.getIdLong())); } + public List getIgnoredChannels(Guild guild) + { + return getIgnores(guild).stream().map(l -> guild.getTextChannelById(l)).filter(t -> t != null).collect(Collectors.toList()); + } + + public List getIgnoredRoles(Guild guild) + { + return getIgnores(guild).stream().map(l -> guild.getRoleById(l)).filter(r -> r != null).collect(Collectors.toList()); + } + + private Set getIgnores(Guild guild) + { + long gid = guild.getIdLong(); + if(cache.contains(gid)) + return cache.get(gid); + Set ret = read(selectAll(GUILD_ID.is(gid)), rs -> + { + Set set = new HashSet<>(); + while(rs.next()) + set.add(ENTITY_ID.getValue(rs)); + return set; + }); + cache.put(gid, ret); + return ret; + } + + // set things in database public boolean ignore(TextChannel tc) { + invalidateCache(tc.getGuild()); return readWrite(selectAll(GUILD_ID.is(tc.getGuild().getIdLong())+" AND "+ENTITY_ID.is(tc.getIdLong())), rs -> { if(rs.next()) @@ -103,49 +117,9 @@ }); } - public List getIgnoredChannels(Guild guild) - { - return read(selectAll(GUILD_ID.is(guild.getIdLong())+" AND "+TYPE.is(Type.TEXT_CHANNEL.ordinal())), rs -> - { - List list = new LinkedList<>(); - while(rs.next()) - { - TextChannel tc = guild.getTextChannelById(ENTITY_ID.getValue(rs)); - if(tc!=null) - list.add(tc); - } - return list; - }); - } - - public List getIgnoredRoles(Guild guild) - { - if(cache.contains(guild.getIdLong())) - { - List list = new LinkedList<>(); - for(long rid: cache.get(guild.getIdLong())) - { - Role role = guild.getRoleById(rid); - if(role!=null) - list.add(role); - } - return list; - } - return read(selectAll(GUILD_ID.is(guild.getIdLong())+" AND "+TYPE.is(Type.ROLE.ordinal())), rs -> - { - List list = new LinkedList<>(); - while(rs.next()) - { - Role role = guild.getRoleById(ENTITY_ID.getValue(rs)); - if(role!=null) - list.add(role); - } - return list; - }); - } - public boolean unignore(TextChannel tc) { + invalidateCache(tc.getGuild()); return readWrite(selectAll(GUILD_ID.is(tc.getGuild().getIdLong())+" AND "+ENTITY_ID.is(tc.getIdLong())), rs -> { if(rs.next()) diff --git a/src/main/java/com/jagrosh/vortex/database/managers/InviteWhitelistManager.java b/src/main/java/com/jagrosh/vortex/database/managers/InviteWhitelistManager.java index cd9bd7a..9656c35 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/InviteWhitelistManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/InviteWhitelistManager.java @@ -4,6 +4,7 @@ import com.jagrosh.easysql.DatabaseConnector; import com.jagrosh.easysql.SQLColumn; import com.jagrosh.easysql.columns.LongColumn; +import com.jagrosh.vortex.Constants; import com.jagrosh.vortex.utils.FixedCache; import net.dv8tion.jda.api.entities.Guild; import org.slf4j.LoggerFactory; @@ -26,7 +27,7 @@ public static final SQLColumn GUILD_ID = new LongColumn("GUILD_ID", false, 0L); public static final SQLColumn WHITELIST_ID = new LongColumn("WL_ID", false, 0L); - private final FixedCache> cache = new FixedCache<>(1000); + private final FixedCache> cache = new FixedCache<>(Constants.DEFAULT_CACHE_SIZE); public InviteWhitelistManager(DatabaseConnector connector) { diff --git a/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java b/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java index fd17caf..b2b20a5 100644 --- a/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java +++ b/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java @@ -19,6 +19,7 @@ import com.jagrosh.vortex.logging.MessageCache.CachedMessage; import com.jagrosh.vortex.utils.FormatUtil; import com.jagrosh.vortex.utils.LogUtil; +import com.jagrosh.vortex.utils.Usage; import com.typesafe.config.Config; import java.awt.Color; import java.time.OffsetDateTime; @@ -62,6 +63,7 @@ private final Vortex vortex; private final AvatarSaver avatarSaver; + private final Usage usage = new Usage(); public BasicLogger(Vortex vortex, Config config) { @@ -69,10 +71,16 @@ this.avatarSaver = new AvatarSaver(config); } + public Usage getUsage() + { + return usage; + } + private void log(OffsetDateTime now, TextChannel tc, String emote, String message, MessageEmbed embed) { try { + usage.increment(tc.getGuild().getIdLong()); tc.sendMessage(new MessageBuilder() .append(FormatUtil.filterEveryone(LogUtil.basiclogFormat(now, vortex.getDatabase().settings.getSettings(tc.getGuild()).getTimezone(), emote, message))) .setEmbed(embed) @@ -85,9 +93,9 @@ { try { - tc.sendFile(file, filename, new MessageBuilder() - .append(FormatUtil.filterEveryone(LogUtil.basiclogFormat(now, vortex.getDatabase().settings.getSettings(tc.getGuild()).getTimezone(), emote, message))) - .build()).queue(); + usage.increment(tc.getGuild().getIdLong()); + tc.sendMessage(FormatUtil.filterEveryone(LogUtil.basiclogFormat(now, vortex.getDatabase().settings.getSettings(tc.getGuild()).getTimezone(), emote, message))) + .addFile(file, filename).queue(); } catch(PermissionException ignore) {} } diff --git a/src/main/java/com/jagrosh/vortex/logging/MessageCache.java b/src/main/java/com/jagrosh/vortex/logging/MessageCache.java index 965c6d1..12dd3e6 100644 --- a/src/main/java/com/jagrosh/vortex/logging/MessageCache.java +++ b/src/main/java/com/jagrosh/vortex/logging/MessageCache.java @@ -113,6 +113,11 @@ return g.getTextChannelById(channel); } + public long getTextChannelId() + { + return channel; + } + public TextChannel getTextChannel(Guild guild) { return guild.getTextChannelById(channel); diff --git a/src/main/java/com/jagrosh/vortex/logging/ModLogger.java b/src/main/java/com/jagrosh/vortex/logging/ModLogger.java index 9faa9ec..f4cce32 100644 --- a/src/main/java/com/jagrosh/vortex/logging/ModLogger.java +++ b/src/main/java/com/jagrosh/vortex/logging/ModLogger.java @@ -214,7 +214,7 @@ Role mRole = gs.getMutedRole(guild); try { - List list = guild.getAuditLogs().cache(false).limit(limit).submit().get(30, TimeUnit.SECONDS); + List list = guild.retrieveAuditLogs().cache(false).limit(limit).submit().get(30, TimeUnit.SECONDS); for(AuditLogEntry ale: vortex.getDatabase().auditcache.filterUncheckedEntries(list)) { Action act = null; diff --git a/src/main/java/com/jagrosh/vortex/utils/FormatUtil.java b/src/main/java/com/jagrosh/vortex/utils/FormatUtil.java index d467911..91c4565 100644 --- a/src/main/java/com/jagrosh/vortex/utils/FormatUtil.java +++ b/src/main/java/com/jagrosh/vortex/utils/FormatUtil.java @@ -45,7 +45,8 @@ public static String filterEveryone(String input) { - return input.replace("@everyone","@\u0435veryone") // cyrillic e + return input.replace("\u202E","") // RTL override + .replace("@everyone","@\u0435veryone") // cyrillic e .replace("@here","@h\u0435re") // cyrillic e .replace("discord.gg/", "dis\u0441ord.gg/"); // cyrillic c } @@ -259,7 +260,7 @@ if(event.getArgs().isEmpty()) { commandsInCategory = Collections.EMPTY_LIST; - content = Constants.SUCCESS+" **"+event.getSelfUser().getName()+"** Commands Categories:"; + content = event.getClient().getSuccess()+" **"+event.getSelfUser().getName()+"** Commands Categories:"; } else { @@ -272,29 +273,29 @@ return cmd.getCategory().getName().toLowerCase().startsWith(event.getArgs().toLowerCase()); }).collect(Collectors.toList()); if(commandsInCategory.isEmpty()) - content = Constants.WARNING+" No Category `"+event.getArgs()+"` found."; + content = event.getClient().getWarning()+" No Category `"+event.getArgs()+"` found."; else - content = Constants.SUCCESS+" **"+event.getSelfUser().getName()+"** " + content = event.getClient().getSuccess()+" **"+event.getSelfUser().getName()+"** " +(commandsInCategory.get(0).getCategory()==null ? "General" : commandsInCategory.get(0).getCategory().getName()) +" Commands:"; } if(commandsInCategory.isEmpty()) { - builder.addField(CMD_EMOJI+" General Commands", "[**"+Constants.PREFIX+"help general**]("+Constants.Wiki.COMMANDS+"#-general-commands)\n\u200B", false); + builder.addField(CMD_EMOJI+" General Commands", "[**"+event.getClient().getPrefix()+"help general**]("+Constants.Wiki.COMMANDS+"#-general-commands)\n\u200B", false); event.getClient().getCommands().stream().filter(cmd -> cmd.getCategory()!=null).map(cmd -> cmd.getCategory().getName()).distinct() - .forEach(cat -> builder.addField(CMD_EMOJI+" "+cat+" Commands", "[**"+Constants.PREFIX+"help "+cat.toLowerCase()+"**](" + .forEach(cat -> builder.addField(CMD_EMOJI+" "+cat+" Commands", "[**"+event.getClient().getPrefix()+"help "+cat.toLowerCase()+"**](" +Constants.Wiki.COMMANDS+"#-"+cat.toLowerCase()+"-commands)\n\u200B", false)); } else { - commandsInCategory.forEach(cmd -> builder.addField(Constants.PREFIX+cmd.getName()+(cmd.getArguments()==null ? "" : " "+cmd.getArguments()), + commandsInCategory.forEach(cmd -> builder.addField(event.getClient().getPrefix()+cmd.getName()+(cmd.getArguments()==null ? "" : " "+cmd.getArguments()), "[**"+cmd.getHelp()+"**]("+Constants.Wiki.COMMANDS+"#-"+(cmd.getCategory()==null?"general":cmd.getCategory().getName().toLowerCase())+"-commands)\n\u200B", false)); } builder.addField("Additional Help", helpLinks(event), false); - return new MessageBuilder().append(content).setEmbed(builder.build()).build(); + return new MessageBuilder().append(filterEveryone(content)).setEmbed(builder.build()).build(); } public static String helpLinks(CommandEvent event) diff --git a/src/main/java/com/jagrosh/vortex/utils/Usage.java b/src/main/java/com/jagrosh/vortex/utils/Usage.java new file mode 100644 index 0000000..b0803a6 --- /dev/null +++ b/src/main/java/com/jagrosh/vortex/utils/Usage.java @@ -0,0 +1,46 @@ +/* + * Copyright 2020 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.utils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +/** + * + * @author John Grosh (john.a.grosh@gmail.com) + */ +public class Usage +{ + private final HashMap map = new HashMap<>(); + + public void increment(long key) + { + map.put(key, map.getOrDefault(key, 0) + 1); + } + + public Map getMap() + { + return map; + } + + public List> higher(int val) + { + return map.entrySet().stream().filter(e -> e.getValue() >= val).collect(Collectors.toList()); + } +} diff --git a/src/test/java/com/jagrosh/vortex/FilterTest.java b/src/test/java/com/jagrosh/vortex/FilterTest.java new file mode 100644 index 0000000..24bc007 --- /dev/null +++ b/src/test/java/com/jagrosh/vortex/FilterTest.java @@ -0,0 +1,67 @@ +/* + * Copyright 2019 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; + +import com.jagrosh.vortex.automod.Filter.Glob; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author John Grosh (john.a.grosh@gmail.com) + */ +public class FilterTest +{ + @Test + public void globTest() + { + Glob glob; + + assertTrue('0' < '9'); + + glob = new Glob("get"); + assertFalse(glob.test("go together now")); + assertFalse(glob.test("go to gether now")); + assertFalse(glob.test("go toget her now")); + assertTrue(glob.test("go to get her now")); + + glob = new Glob("*get"); + assertFalse(glob.test("go together now")); + assertFalse(glob.test("go to gether now")); + assertTrue(glob.test("go toget her now")); + assertTrue(glob.test("go to get her now")); + + glob = new Glob("get*"); + assertFalse(glob.test("go together now")); + assertTrue(glob.test("go to gether now")); + assertFalse(glob.test("go toget her now")); + assertTrue(glob.test("go to get her now")); + + glob = new Glob("*get*"); + assertTrue(glob.test("go together now")); + assertTrue(glob.test("go to gether now")); + assertTrue(glob.test("go toget her now")); + assertTrue(glob.test("go to get her now")); + + glob = new Glob("get"); + assertTrue(glob.test("I for get")); + assertFalse(glob.test("I forget")); + + glob = new Glob("get"); + assertTrue(glob.test("get the food")); + assertFalse(glob.test("getthe food")); + } +}