diff --git a/pom.xml b/pom.xml index e8a7bdd..4e292c5 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ 3.0.5 pom - + com.jagrosh EasySQL 0.3 @@ -47,6 +47,11 @@ 0.1.8 + com.squareup.okhttp3 + okhttp + 3.13.0 + + ch.qos.logback logback-classic 1.2.3 diff --git a/src/main/java/com/jagrosh/vortex/Listener.java b/src/main/java/com/jagrosh/vortex/Listener.java index e4fad8e..6bdbd9e 100644 --- a/src/main/java/com/jagrosh/vortex/Listener.java +++ b/src/main/java/com/jagrosh/vortex/Listener.java @@ -167,14 +167,21 @@ } else if (event instanceof UserUpdateNameEvent) { + // Make sure the name actually changed UserUpdateNameEvent unue = (UserUpdateNameEvent)event; - // Log the name change - vortex.getBasicLogger().logNameChange(unue); - unue.getUser().getMutualGuilds().stream().map(g -> g.getMember(unue.getUser())).forEach(m -> vortex.getAutoMod().dehoist(m)); + if(!unue.getNewName().equals(unue.getOldName())) + { + // Log the name change + vortex.getBasicLogger().logNameChange(unue); + unue.getUser().getMutualGuilds().stream().map(g -> g.getMember(unue.getUser())).forEach(m -> vortex.getAutoMod().dehoist(m)); + } } else if (event instanceof UserUpdateDiscriminatorEvent) { - vortex.getBasicLogger().logNameChange((UserUpdateDiscriminatorEvent)event); + // Make sure the discrim actually changed + UserUpdateDiscriminatorEvent udue = (UserUpdateDiscriminatorEvent) event; + if(!udue.getNewDiscriminator().equals(udue.getOldDiscriminator())) + vortex.getBasicLogger().logDiscrimChange((UserUpdateDiscriminatorEvent)event); } else if (event instanceof GuildMemberUpdateNicknameEvent) { diff --git a/src/main/java/com/jagrosh/vortex/Vortex.java b/src/main/java/com/jagrosh/vortex/Vortex.java index 7a6c890..ff01c4d 100644 --- a/src/main/java/com/jagrosh/vortex/Vortex.java +++ b/src/main/java/com/jagrosh/vortex/Vortex.java @@ -40,7 +40,8 @@ import com.jagrosh.vortex.logging.ModLogger; import com.jagrosh.vortex.logging.TextUploader; import com.jagrosh.vortex.utils.FormatUtil; -import com.jagrosh.vortex.utils.MultiBotManager; +import com.jagrosh.vortex.managers.MultiBotManager; +import com.jagrosh.vortex.managers.UptimeManager; import com.jagrosh.vortex.utils.OtherUtil; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; @@ -72,6 +73,7 @@ private final WebhookClient logwebhook; private final AutoMod automod; private final StrikeHandler strikehandler; + private final UptimeManager uptime; private final CommandExceptionListener listener; private final Config config; @@ -91,6 +93,7 @@ logwebhook = new WebhookClientBuilder(config.getString("webhook-url")).build(); automod = new AutoMod(this, config); strikehandler = new StrikeHandler(this); + uptime = new UptimeManager(logwebhook, database, threadpool, 1); listener = new CommandExceptionListener(); CommandClient client = new CommandClientBuilder() .setPrefix(Constants.PREFIX) @@ -198,6 +201,7 @@ .build(); modlog.start(); + uptime.start(); threadpool.scheduleWithFixedDelay(() -> cleanPremium(), 0, 2, TimeUnit.HOURS); threadpool.scheduleWithFixedDelay(() -> leavePointlessGuilds(), 5, 30, TimeUnit.MINUTES); 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 cc6c565..b0515d8 100644 --- a/src/main/java/com/jagrosh/vortex/commands/owner/PremiumCmd.java +++ b/src/main/java/com/jagrosh/vortex/commands/owner/PremiumCmd.java @@ -42,7 +42,7 @@ this.ownerCommand = true; this.guildOnly = false; this.hidden = true; - this.children = new Command[]{ new PremiumAddCmd(), new PremiumInfoCmd(), new PremiumUserCmd() }; + this.children = new Command[]{ new PremiumAddCmd(), new PremiumInfoCmd(), new PremiumUserCmd(), new PremiumRemoveCmd() }; } @Override @@ -161,6 +161,7 @@ { this.name = "info"; this.help = "shows premium info"; + this.arguments = ""; this.ownerCommand = true; this.guildOnly = false; this.hidden = true; @@ -178,4 +179,58 @@ }).collect(Collectors.joining("\n"))); } } + + private class PremiumRemoveCmd extends Command + { + public PremiumRemoveCmd() + { + this.name = "remove"; + this.help = "removes premium"; + this.arguments = ""; + this.ownerCommand = true; + this.guildOnly = false; + this.hidden = true; + } + + @Override + protected void execute(CommandEvent event) + { + String[] parts = event.getArgs().split("\\s+", 1); + if(parts.length < 1) + { + event.replyError("Too few arguments"); + return; + } + + Guild guild; + try + { + guild = vortex.getShardManager().getGuildById(Long.parseLong(parts[0])); + } + catch(NumberFormatException ex) + { + event.replyError("Invalid guild ID"); + return; + } + + if(guild == null) + { + event.replyError("No guild found with ID `" + parts[0] + "`"); + return; + } + + PremiumInfo before = vortex.getDatabase().premium.getPremiumInfo(guild); + if(before == null || before.level == PremiumManager.Level.NONE) + { + event.replyError("Guild `" + guild.getName() + "` does not have premium!"); + return; + } + + // remove 5 years, so that the cleanup will still happen correctly + // tbh there should be a better cleanup system + vortex.getDatabase().premium.addPremium(guild, PremiumManager.Level.NONE, -5 * 365, ChronoUnit.DAYS); + PremiumInfo after = vortex.getDatabase().premium.getPremiumInfo(guild); + event.replySuccess("Before: " + before + "\n" + event.getClient().getSuccess() + " After: " + after); + } + } } diff --git a/src/main/java/com/jagrosh/vortex/database/managers/PremiumManager.java b/src/main/java/com/jagrosh/vortex/database/managers/PremiumManager.java index f775913..3a31ec1 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/PremiumManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/PremiumManager.java @@ -20,7 +20,7 @@ import com.jagrosh.easysql.SQLColumn; import com.jagrosh.easysql.columns.*; import com.jagrosh.vortex.Constants; -import com.jagrosh.vortex.utils.MultiBotManager; +import com.jagrosh.vortex.managers.MultiBotManager; import java.sql.ResultSet; import java.sql.SQLException; import java.time.Instant; diff --git a/src/main/java/com/jagrosh/vortex/database/managers/TempBanManager.java b/src/main/java/com/jagrosh/vortex/database/managers/TempBanManager.java index 0e992c0..5cab81a 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/TempBanManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/TempBanManager.java @@ -20,7 +20,7 @@ import com.jagrosh.easysql.SQLColumn; import com.jagrosh.easysql.columns.InstantColumn; import com.jagrosh.easysql.columns.LongColumn; -import com.jagrosh.vortex.utils.MultiBotManager; +import com.jagrosh.vortex.managers.MultiBotManager; import com.jagrosh.vortex.utils.Pair; import java.time.Instant; import java.time.temporal.ChronoUnit; diff --git a/src/main/java/com/jagrosh/vortex/database/managers/TempMuteManager.java b/src/main/java/com/jagrosh/vortex/database/managers/TempMuteManager.java index 0dc6e17..3fe7764 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/TempMuteManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/TempMuteManager.java @@ -20,7 +20,7 @@ import com.jagrosh.easysql.SQLColumn; import com.jagrosh.easysql.columns.InstantColumn; import com.jagrosh.easysql.columns.LongColumn; -import com.jagrosh.vortex.utils.MultiBotManager; +import com.jagrosh.vortex.managers.MultiBotManager; import com.jagrosh.vortex.utils.Pair; import java.time.Instant; import java.time.temporal.ChronoUnit; diff --git a/src/main/java/com/jagrosh/vortex/database/managers/TempSlowmodeManager.java b/src/main/java/com/jagrosh/vortex/database/managers/TempSlowmodeManager.java index d2cd442..1d605e3 100644 --- a/src/main/java/com/jagrosh/vortex/database/managers/TempSlowmodeManager.java +++ b/src/main/java/com/jagrosh/vortex/database/managers/TempSlowmodeManager.java @@ -20,7 +20,7 @@ import com.jagrosh.easysql.SQLColumn; import com.jagrosh.easysql.columns.InstantColumn; import com.jagrosh.easysql.columns.LongColumn; -import com.jagrosh.vortex.utils.MultiBotManager; +import com.jagrosh.vortex.managers.MultiBotManager; import com.jagrosh.vortex.utils.Pair; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.Permission; diff --git a/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java b/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java index 8ed976b..c7aa917 100644 --- a/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java +++ b/src/main/java/com/jagrosh/vortex/logging/BasicLogger.java @@ -222,7 +222,7 @@ }); } - public void logNameChange(UserUpdateDiscriminatorEvent event) + public void logDiscrimChange(UserUpdateDiscriminatorEvent event) { OffsetDateTime now = OffsetDateTime.now(); event.getJDA().getMutualGuilds(event.getEntity()).stream() @@ -232,7 +232,7 @@ .forEachOrdered(tc -> { log(now, tc, NAME, "**"+event.getUser().getName()+"**#"+event.getOldDiscriminator()+" (ID:" - +event.getUser().getId()+") has changed names to "+FormatUtil.formatUser(event.getUser()), null); + +event.getUser().getId()+") has changed discrims to "+FormatUtil.formatUser(event.getUser()), null); }); } diff --git a/src/main/java/com/jagrosh/vortex/logging/MessageCache.java b/src/main/java/com/jagrosh/vortex/logging/MessageCache.java index e6a810c..6c0e1f6 100644 --- a/src/main/java/com/jagrosh/vortex/logging/MessageCache.java +++ b/src/main/java/com/jagrosh/vortex/logging/MessageCache.java @@ -16,7 +16,7 @@ package com.jagrosh.vortex.logging; import com.jagrosh.vortex.utils.FixedCache; -import com.jagrosh.vortex.utils.MultiBotManager; +import com.jagrosh.vortex.managers.MultiBotManager; import java.util.Collections; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/com/jagrosh/vortex/managers/BlockingSessionController.java b/src/main/java/com/jagrosh/vortex/managers/BlockingSessionController.java index 979f669..c612d07 100644 --- a/src/main/java/com/jagrosh/vortex/managers/BlockingSessionController.java +++ b/src/main/java/com/jagrosh/vortex/managers/BlockingSessionController.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jagrosh.vortex.utils; +package com.jagrosh.vortex.managers; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.utils.SessionControllerAdapter; diff --git a/src/main/java/com/jagrosh/vortex/managers/ConditionalEventManager.java b/src/main/java/com/jagrosh/vortex/managers/ConditionalEventManager.java index 18d813c..d6f87a2 100644 --- a/src/main/java/com/jagrosh/vortex/managers/ConditionalEventManager.java +++ b/src/main/java/com/jagrosh/vortex/managers/ConditionalEventManager.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jagrosh.vortex.utils; +package com.jagrosh.vortex.managers; import java.lang.reflect.InvocationTargetException; import java.util.List; diff --git a/src/main/java/com/jagrosh/vortex/managers/MultiBotManager.java b/src/main/java/com/jagrosh/vortex/managers/MultiBotManager.java index f1dc122..409ce6a 100644 --- a/src/main/java/com/jagrosh/vortex/managers/MultiBotManager.java +++ b/src/main/java/com/jagrosh/vortex/managers/MultiBotManager.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jagrosh.vortex.utils; +package com.jagrosh.vortex.managers; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/com/jagrosh/vortex/managers/SlowerConcurrentSessionController.java b/src/main/java/com/jagrosh/vortex/managers/SlowerConcurrentSessionController.java index 98f6d3e..a1f5ade 100644 --- a/src/main/java/com/jagrosh/vortex/managers/SlowerConcurrentSessionController.java +++ b/src/main/java/com/jagrosh/vortex/managers/SlowerConcurrentSessionController.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jagrosh.vortex.utils; +package com.jagrosh.vortex.managers; import net.dv8tion.jda.api.utils.ConcurrentSessionController; diff --git a/src/main/java/com/jagrosh/vortex/managers/UptimeManager.java b/src/main/java/com/jagrosh/vortex/managers/UptimeManager.java new file mode 100644 index 0000000..e1ca8e9 --- /dev/null +++ b/src/main/java/com/jagrosh/vortex/managers/UptimeManager.java @@ -0,0 +1,84 @@ +/* + * Copyright 2023 jagrosh. + * + * 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.managers; + +import club.minnced.discord.webhook.WebhookClient; +import com.jagrosh.vortex.Constants; +import com.jagrosh.vortex.database.Database; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * + * @author jagrosh + */ +public class UptimeManager +{ + private boolean started = false; + private int failures = 0; + private final int minPrem; + private final ScheduledExecutorService threadpool; + private final WebhookClient log; + private final Database database; + + public UptimeManager(WebhookClient log, Database database, ScheduledExecutorService threadpool, int minPrem) + { + this.log = log; + this.database = database; + this.threadpool = threadpool; + this.minPrem = minPrem; + } + + public void start() + { + if(started) + return; + started = true; + + threadpool.scheduleWithFixedDelay(()->check(), 2, 2, TimeUnit.MINUTES); + } + + private void check() + { + boolean valid = false; + try + { + boolean closed = database.getConnection().isClosed(); + int prem = database.premium.getPremiumGuilds().size(); + valid = !closed && prem >= minPrem; + } + catch(Exception ignored){} + + if(!valid) + failures++; + else + failures = 0; + + if(failures == 3) + shutdownAll(); + } + + private void shutdownAll() + { + try + { + log.send(Constants.ERROR+" Uptime failure, attempting restart...").get(); + Thread.sleep(1000); + } + catch(Exception ignored){} + System.exit(1); + } +} diff --git a/src/main/java/com/jagrosh/vortex/utils/LogUtil.java b/src/main/java/com/jagrosh/vortex/utils/LogUtil.java index 2384176..aaa332f 100644 --- a/src/main/java/com/jagrosh/vortex/utils/LogUtil.java +++ b/src/main/java/com/jagrosh/vortex/utils/LogUtil.java @@ -15,6 +15,7 @@ */ package com.jagrosh.vortex.utils; +import com.jagrosh.vortex.managers.MultiBotManager; import com.jagrosh.vortex.Action; import com.jagrosh.vortex.logging.MessageCache.CachedMessage; import java.time.OffsetDateTime;