guild setting tracking on guild join/leave

This commit is contained in:
2025-07-12 13:44:45 +02:00
parent 1affc4d3bc
commit 6c0e81897a
4 changed files with 56 additions and 19 deletions
@@ -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;
}
@@ -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);
}
}
@@ -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()) {
@@ -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);