From 6c0e81897a6753de40353632bcf4a382495f69dc Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Sat, 12 Jul 2025 13:44:45 +0200 Subject: [PATCH] guild setting tracking on guild join/leave --- .../java/me/youhavetrouble/inviter/Main.java | 24 +++++++---------- .../listener/GuildJoinAndLeaveListener.java | 27 +++++++++++++++++++ .../inviter/storage/SqliteStorage.java | 22 ++++++++++++--- .../inviter/storage/Storage.java | 2 ++ 4 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 src/main/java/me/youhavetrouble/inviter/discord/listener/GuildJoinAndLeaveListener.java diff --git a/src/main/java/me/youhavetrouble/inviter/Main.java b/src/main/java/me/youhavetrouble/inviter/Main.java index 132a95d..e872332 100644 --- a/src/main/java/me/youhavetrouble/inviter/Main.java +++ b/src/main/java/me/youhavetrouble/inviter/Main.java @@ -1,5 +1,6 @@ package me.youhavetrouble.inviter; +import me.youhavetrouble.inviter.discord.listener.GuildJoinAndLeaveListener; import me.youhavetrouble.inviter.http.ApiServer; import me.youhavetrouble.inviter.discord.DiscordInviteManager; import me.youhavetrouble.inviter.storage.SqliteStorage; @@ -7,12 +8,12 @@ import me.youhavetrouble.inviter.storage.Storage; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.requests.GatewayIntent; -import net.dv8tion.jda.api.utils.cache.CacheFlag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Set; +import java.util.concurrent.Executors; public class Main { @@ -73,25 +74,14 @@ public class Main { storage = new SqliteStorage(); - jda = JDABuilder.create( - token, - Set.of(GatewayIntent.GUILD_INVITES) - ) - .disableCache( - CacheFlag.ACTIVITY, - CacheFlag.VOICE_STATE, - CacheFlag.EMOJI, - CacheFlag.STICKER, - CacheFlag.CLIENT_STATUS, - CacheFlag.ONLINE_STATUS, - CacheFlag.SCHEDULED_EVENTS - ) + jda = JDABuilder.createLight(token, Set.of(GatewayIntent.GUILD_INVITES)) + .setCallbackPool(Executors.newVirtualThreadPerTaskExecutor()) + .addEventListeners(new GuildJoinAndLeaveListener()) .build(); jda.awaitReady(); jda.getGuilds().parallelStream().forEach(guild -> storage.saveDefaultGuildSettings(guild.getIdLong())); - // TODO make sure to save default settings for guilds bot joins on runtime discordInviteManager = new DiscordInviteManager(jda); @@ -105,6 +95,10 @@ public class Main { LOGGER.info("Welcome to the Inviter Application!"); } + public static JDA getJda() { + return jda; + } + public static DiscordInviteManager getDiscordInviteMenager() { return discordInviteManager; } diff --git a/src/main/java/me/youhavetrouble/inviter/discord/listener/GuildJoinAndLeaveListener.java b/src/main/java/me/youhavetrouble/inviter/discord/listener/GuildJoinAndLeaveListener.java new file mode 100644 index 0000000..a2887a3 --- /dev/null +++ b/src/main/java/me/youhavetrouble/inviter/discord/listener/GuildJoinAndLeaveListener.java @@ -0,0 +1,27 @@ +package me.youhavetrouble.inviter.discord.listener; + +import me.youhavetrouble.inviter.Main; +import me.youhavetrouble.inviter.storage.Storage; +import net.dv8tion.jda.api.events.guild.GuildJoinEvent; +import net.dv8tion.jda.api.events.guild.GuildLeaveEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +public class GuildJoinAndLeaveListener extends ListenerAdapter { + + @Override + public void onGuildJoin(@NotNull GuildJoinEvent event) { + Storage storage = Main.getStorage(); + long guildId = event.getGuild().getIdLong(); + storage.removeGuildSettings(guildId); + storage.saveDefaultGuildSettings(guildId); + } + + @Override + public void onGuildLeave(@NotNull GuildLeaveEvent event) { + Storage storage = Main.getStorage(); + long guildId = event.getGuild().getIdLong(); + storage.removeGuildSettings(guildId); + } + +} diff --git a/src/main/java/me/youhavetrouble/inviter/storage/SqliteStorage.java b/src/main/java/me/youhavetrouble/inviter/storage/SqliteStorage.java index 15de796..30b87b8 100644 --- a/src/main/java/me/youhavetrouble/inviter/storage/SqliteStorage.java +++ b/src/main/java/me/youhavetrouble/inviter/storage/SqliteStorage.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; import java.io.File; import java.sql.Connection; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -78,7 +79,7 @@ public class SqliteStorage implements Storage { public GuildSettings getGuildSettings(@NotNull String hostname) { try (Connection connection = dataSource.getConnection()) { - var statement = connection.prepareStatement( + PreparedStatement statement = connection.prepareStatement( "SELECT * FROM guild_settings WHERE api_hostname = ?" ); statement.setString(1, hostname); @@ -98,7 +99,7 @@ public class SqliteStorage implements Storage { @Override public void saveDefaultGuildSettings(long guildId) { try (Connection connection = dataSource.getConnection()) { - var statement = connection.prepareStatement( + PreparedStatement statement = connection.prepareStatement( "INSERT OR IGNORE INTO guild_settings (guild_id) VALUES (?)" ); statement.setLong(1, guildId); @@ -108,10 +109,23 @@ public class SqliteStorage implements Storage { } } + @Override + public void removeGuildSettings(long guildId) { + try (Connection connection = dataSource.getConnection()) { + PreparedStatement statement = connection.prepareStatement( + "DELETE FROM guild_settings WHERE guild_id = ?" + ); + statement.setLong(1, guildId); + statement.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException("Failed to remove guild settings", e); + } + } + @Override public void updateDiscordApiEnabled(long guildId, boolean enabled) { try (Connection connection = dataSource.getConnection()) { - var statement = connection.prepareStatement( + PreparedStatement statement = connection.prepareStatement( "UPDATE guild_settings SET api_enabled = ? WHERE guild_id = ?" ); statement.setBoolean(1, enabled); @@ -126,7 +140,7 @@ public class SqliteStorage implements Storage { @Override public void updateDiscordApiHostname(long guildId, @Nullable String hostname) { try (Connection connection = dataSource.getConnection()) { - var statement = connection.prepareStatement( + PreparedStatement statement = connection.prepareStatement( "UPDATE guild_settings SET api_hostname = ? WHERE guild_id = ?" ); if (hostname == null || hostname.isEmpty()) { diff --git a/src/main/java/me/youhavetrouble/inviter/storage/Storage.java b/src/main/java/me/youhavetrouble/inviter/storage/Storage.java index 2305d6c..ebf9d0b 100644 --- a/src/main/java/me/youhavetrouble/inviter/storage/Storage.java +++ b/src/main/java/me/youhavetrouble/inviter/storage/Storage.java @@ -13,6 +13,8 @@ public interface Storage { void saveDefaultGuildSettings(long guildId); + void removeGuildSettings(long guildId); + void updateDiscordApiEnabled(long guildId, boolean enabled); void updateDiscordApiHostname(long guildId, @Nullable String hostname);