Skip to content
16 changes: 9 additions & 7 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import com.github.jengelman.gradle.plugins.shadow.transformers.*
plugins {
java
id("com.github.johnrengelman.shadow") version "8.1.1"
id("org.springframework.boot") version "3.5.0"
id("org.springframework.boot") version "3.5.5"
id("io.spring.dependency-management") version "1.1.7"
id("org.graalvm.buildtools.native") version "0.10.6"
id("org.graalvm.buildtools.native") version "0.11.0"
checkstyle
}

Expand All @@ -27,22 +27,24 @@ repositories {
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
compileOnly("com.google.code.findbugs:jsr305:3.0.2")
compileOnly("org.jetbrains:annotations:26.0.2")

// DIH4JDA (Command Framework) & JDA
implementation("com.github.DynxstyGIT:DIH4JDA:a64b5a9dc5")
implementation("net.dv8tion:JDA:5.5.1") {
implementation("com.github.jasonlessenich:DIH4JDA:1.7.0")
//implementation("xyz.dynxsty:dih4jda:1.7.0")
implementation("net.dv8tion:JDA:6.2.0") {
exclude(module = "opus-java")
}

// Caffeine (Caching Library)
implementation("com.github.ben-manes.caffeine:caffeine:3.2.0")
implementation("com.github.ben-manes.caffeine:caffeine:3.2.2")

implementation("com.google.code.gson:gson:2.13.1")
implementation("org.yaml:snakeyaml:2.4")
implementation("com.google.re2j:re2j:1.8")
implementation("commons-validator:commons-validator:1.9.0")
implementation("commons-validator:commons-validator:1.10.0")

implementation("com.mashape.unirest:unirest-java:1.4.9")

Expand All @@ -60,7 +62,7 @@ dependencies {
testAnnotationProcessor("org.projectlombok:lombok:1.18.38")

// Sentry
implementation("io.sentry:sentry:8.13.2")
implementation("io.sentry:sentry:8.20.0")

// Spring
implementation("org.springframework.boot:spring-boot-starter-web")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand;
import net.discordjug.javabot.data.config.BotConfig;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.interactions.InteractionContextType;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandGroupData;
Expand All @@ -27,7 +28,7 @@ public DbAdminCommand(BotConfig botConfig, ExportSchemaSubcommand exportSchemaSu
setRegistrationType(RegistrationType.GUILD);
setCommandData(Commands.slash("db-admin", "(ADMIN ONLY) Administrative Commands for managing the bot's database.")
.setDefaultPermissions(DefaultMemberPermissions.enabledFor(Permission.MANAGE_SERVER))
.setGuildOnly(true)
.setContexts(InteractionContextType.GUILD)
);
addSubcommands(exportSchemaSubcommand, exportTableSubcommand, migrationsListSubcommand, migrateSubcommand, quickMigrateSubcommand);
addSubcommandGroups(SubcommandGroup.of(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package net.discordjug.javabot.data.h2db.commands;

import net.dv8tion.jda.api.modals.Modal;
import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand;
import xyz.dynxsty.dih4jda.interactions.components.ModalHandler;
import net.discordjug.javabot.annotations.AutoDetectableComponentHandler;
import net.discordjug.javabot.data.config.SystemsConfig;
import net.discordjug.javabot.util.ExceptionLogger;
import net.discordjug.javabot.util.Responses;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.components.label.Label;
import net.dv8tion.jda.api.components.textinput.TextInput;
import net.dv8tion.jda.api.components.textinput.TextInputStyle;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.modals.Modal;
import net.dv8tion.jda.api.interactions.components.text.TextInput;
import net.dv8tion.jda.api.interactions.components.text.TextInputStyle;
import net.dv8tion.jda.api.interactions.modals.ModalMapping;

import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -105,7 +105,7 @@ public void handleModal(@NotNull ModalInteractionEvent event, List<ModalMapping>
}

private @NotNull Modal buildQuickMigrateModal() {
TextInput sqlInput = TextInput.create("sql", "SQL-Statement (H2)", TextInputStyle.PARAGRAPH)
TextInput sqlInput = TextInput.create("sql", TextInputStyle.PARAGRAPH)
.setPlaceholder("""
CREATE TABLE my_table (
thread_id BIGINT PRIMARY KEY,
Expand All @@ -114,12 +114,12 @@ CREATE TABLE my_table (
""")
.setRequired(true)
.build();
TextInput confirmInput = TextInput.create("confirmation", "Confirmation", TextInputStyle.SHORT)
TextInput confirmInput = TextInput.create("confirmation", TextInputStyle.SHORT)
.setPlaceholder("Type 'CONFIRM' to confirm this action")
.setRequired(true)
.build();
return Modal.create("quick-migrate", "Quick Migrate")
.addComponents(ActionRow.of(sqlInput), ActionRow.of(confirmInput))
.addComponents(Label.of("SQL-Statement (H2)", sqlInput), Label.of("Confirmation", confirmInput))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
package net.discordjug.javabot.data.h2db.message_cache;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.discordjug.javabot.data.config.BotConfig;
import net.discordjug.javabot.data.config.guild.MessageCacheConfig;
import net.discordjug.javabot.data.h2db.message_cache.dao.MessageCacheRepository;
import net.discordjug.javabot.data.h2db.message_cache.model.CachedMessage;
import net.discordjug.javabot.systems.user_commands.IdCalculatorCommand;
import net.discordjug.javabot.util.ExceptionLogger;
import net.discordjug.javabot.util.Responses;
import net.discordjug.javabot.util.TimeUtils;
import net.discordjug.javabot.util.UserUtils;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.components.actionrow.ActionRow;
import net.dv8tion.jda.api.components.buttons.Button;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.entities.Message.Attachment;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
import net.dv8tion.jda.api.utils.FileUpload;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URI;
Expand All @@ -21,29 +41,6 @@
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.discordjug.javabot.data.config.BotConfig;
import net.discordjug.javabot.data.config.guild.MessageCacheConfig;
import net.discordjug.javabot.data.h2db.message_cache.dao.MessageCacheRepository;
import net.discordjug.javabot.data.h2db.message_cache.model.CachedMessage;
import net.discordjug.javabot.systems.user_commands.IdCalculatorCommand;
import net.discordjug.javabot.util.ExceptionLogger;
import net.discordjug.javabot.util.Responses;
import net.discordjug.javabot.util.TimeUtils;
import net.discordjug.javabot.util.UserUtils;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Message.Attachment;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.UserSnowflake;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
import net.dv8tion.jda.api.utils.FileUpload;

/**
* Listens for Incoming Messages and stores them in the Message Cache.
*/
Expand Down Expand Up @@ -128,7 +125,7 @@ public void sendUpdatedMessageToLog(Message updated, CachedMessage before) {
if (updated.getContentRaw().trim().equals(before.getMessageContent()) && updated.getAttachments().size() == before.getAttachments().size()) return;
MessageCreateAction action = config.getMessageCacheLogChannel()
.sendMessageEmbeds(buildMessageEditEmbed(updated.getGuild(), updated.getAuthor(), updated.getChannel(), before, updated))
.setActionRow(Button.link(updated.getJumpUrl(), "Jump to Message"));
.addComponents(ActionRow.of(Button.link(updated.getJumpUrl(), "Jump to Message")));
if (before.getMessageContent().length() > MessageEmbed.VALUE_MAX_LENGTH || updated.getContentRaw().length() > MessageEmbed.VALUE_MAX_LENGTH) {
action.addFiles(FileUpload.fromData(buildEditedMessageFile(updated.getAuthor(), before, updated), before.getMessageId() + ".txt"));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import net.discordjug.javabot.util.ExceptionLogger;
import net.discordjug.javabot.util.InteractionUtils;
import net.discordjug.javabot.util.StringUtils;
import net.dv8tion.jda.api.components.actionrow.ActionRow;
import net.dv8tion.jda.api.components.buttons.Button;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.components.buttons.Button;

import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -37,7 +38,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) {
if (!content.getFirst().isBlank() && !content.getSecond().isBlank()) {
event.getMessage().reply(String.format("```%s\n%s\n```", content.getSecond(), StringUtils.standardSanitizer().compute(content.getFirst())))
.setAllowedMentions(List.of())
.setActionRow(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()), Button.link(matcher.group(), "View on GitHub"))
.addComponents(ActionRow.of(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()), Button.link(matcher.group(), "View on GitHub")))
.queue();
}
}
Expand All @@ -56,7 +57,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) {
String[] segments = Arrays.copyOfRange(arr, 3, arr.length);
// The file name, split by "."
String[] file = segments[segments.length - 1].split("\\.");
Integer[] lines = Arrays.stream(file[1].split("L"))
Integer[] lines = Arrays.stream(file[file.length-1].split("L"))
.map(line -> line.replace("-", ""))
.filter(line -> line.matches("-?\\d+")) // check if the given link is a number
.map(Integer::valueOf).sorted().toArray(Integer[]::new);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.discordjug.javabot.data.config.guild.ModerationConfig;
import net.discordjug.javabot.util.InteractionUtils;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.components.actionrow.ActionRow;
import net.dv8tion.jda.api.entities.UserSnowflake;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
Expand Down Expand Up @@ -78,7 +79,7 @@ public void onChannelCreate(ChannelCreateEvent event) {
.setDescription("Since only one open post is allowed per user, older posts have been closed")
.setColor(Color.YELLOW)
.build())
.addActionRow(InteractionUtils.createDeleteButton(post.getOwnerIdLong()))
.addComponents(ActionRow.of(InteractionUtils.createDeleteButton(post.getOwnerIdLong())))
.queue();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.discordjug.javabot.data.config.BotConfig;
import net.discordjug.javabot.data.config.guild.QOTWConfig;
import net.discordjug.javabot.util.InteractionUtils;
import net.dv8tion.jda.api.components.actionrow.ActionRow;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
Expand Down Expand Up @@ -35,7 +36,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) {
Please keep in mind that messages **over 2000 characters** get split in half due to webhook limitations.
If you want to make sure that your submission is properly formatted, split your message into smaller chunks instead.""",
event.getAuthor().getAsMention())
.setActionRow(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()))
.addComponents(ActionRow.of(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong())))
.queue();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,18 @@
import net.discordjug.javabot.data.config.GuildConfig;
import net.discordjug.javabot.data.config.UnknownPropertyException;
import net.discordjug.javabot.util.Responses;
import net.dv8tion.jda.api.components.label.Label;
import net.dv8tion.jda.api.components.textinput.TextInput;
import net.dv8tion.jda.api.components.textinput.TextInputStyle;
import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.AutoCompleteQuery;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
import net.dv8tion.jda.api.interactions.components.text.TextInput;
import net.dv8tion.jda.api.interactions.components.text.TextInputStyle;
import net.dv8tion.jda.api.interactions.modals.Modal;
import net.dv8tion.jda.api.interactions.modals.ModalMapping;
import net.dv8tion.jda.api.modals.Modal;
import net.dv8tion.jda.api.requests.restaction.interactions.InteractionCallbackAction;
import xyz.dynxsty.dih4jda.interactions.AutoCompletable;
import xyz.dynxsty.dih4jda.interactions.components.ModalHandler;
Expand Down Expand Up @@ -58,9 +59,9 @@ public InteractionCallbackAction<?> handleConfigSubcommand(@Nonnull SlashCommand
}
return event.replyModal(
Modal.create(ComponentIdBuilder.build("config-set", property), "Change configuration value")
.addActionRow(TextInput.create("value", "new value", TextInputStyle.PARAGRAPH)
.addComponents(Label.of("new value", TextInput.create("value", TextInputStyle.PARAGRAPH)
.setValue(String.valueOf(resolved))
.build())
.build()))
.build());
}
String valueString = valueOption.getAsString().trim();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import net.discordjug.javabot.annotations.AutoDetectableComponentHandler;
import net.discordjug.javabot.util.Responses;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.components.buttons.Button;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import net.dv8tion.jda.api.requests.restaction.PermissionOverrideAction;
import xyz.dynxsty.dih4jda.interactions.components.ButtonHandler;
import xyz.dynxsty.dih4jda.util.ComponentIdBuilder;
Expand Down Expand Up @@ -40,7 +40,7 @@ public void handleButton(ButtonInteractionEvent event, Button button) {
Responses.error(event, "Only the VC owner can use this.").queue();
return;
}
String[] id = ComponentIdBuilder.split(button.getId());
String[] id = ComponentIdBuilder.split(button.getCustomId());
switch (id[1]) {
case MAKE_PRIVATE_ID -> changeVisibility(event, createMakePublicButton(), "This voice channel is now private.",
PermissionOverrideAction::setDenied);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.discordjug.javabot.util.ExceptionLogger;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.components.actionrow.ActionRow;
import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel;
import net.dv8tion.jda.api.entities.channel.middleman.StandardGuildChannel;
import net.dv8tion.jda.api.entities.channel.unions.AudioChannelUnion;
Expand Down Expand Up @@ -62,7 +63,7 @@ private void createCustomVC(GuildVoiceUpdateEvent event, AudioChannelUnion vcJoi
""")
.build())
.addContent(event.getMember().getAsMention())
.addActionRow(buttonHandler.createMakePrivateButton())
.addComponents(ActionRow.of(buttonHandler.createMakePrivateButton()))
.queue();
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.discordjug.javabot.systems.custom_vc.commands;

import net.dv8tion.jda.api.interactions.InteractionContextType;
import net.dv8tion.jda.api.interactions.commands.build.Commands;
import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand;

Expand All @@ -14,7 +15,7 @@ public class CustomVCControlCommand extends SlashCommand {
*/
public CustomVCControlCommand(CustomVCAddMemberSubcommand addMemberSubcommand, CustomVCRemoveMemberSubcommand removeMemberSubcommand) {
setCommandData(Commands.slash("vc-control", "Manages custom voice channels")
.setGuildOnly(true)
.setContexts(InteractionContextType.GUILD)
);
addSubcommands(addMemberSubcommand, removeMemberSubcommand);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.discordjug.javabot.util.InteractionUtils;
import net.discordjug.javabot.util.WebhookUtil;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.components.actionrow.ActionRow;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
Expand All @@ -19,6 +20,7 @@
import org.springframework.stereotype.Component;

import javax.annotation.Nonnull;

import java.util.Objects;

/**
Expand Down Expand Up @@ -126,9 +128,9 @@ void handleMessageEvent(@Nonnull MessageReceivedEvent event, boolean isFirstMess
private void sendFormatHint(MessageReceivedEvent event) {
event.getMessage()
.replyEmbeds(formatHintEmbed(event.getGuild()))
.addActionRow(
.addComponents(ActionRow.of(
InteractionUtils.createDeleteButton(event.getAuthor().getIdLong())
).queue();
)).queue();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import net.discordjug.javabot.systems.user_preferences.model.Preference;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.components.buttons.Button;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
Expand Down Expand Up @@ -104,7 +105,7 @@ private MessageEmbed createDMDormantInfo(ThreadChannel post, HelpConfig config)
}

private boolean isThanksMessage(@NotNull Message m) {
return m.getAuthor().isBot() && !m.getButtons().isEmpty() &&
m.getButtons().stream().allMatch(b -> b.getId() != null && b.getId().contains(HelpManager.HELP_THANKS_IDENTIFIER));
return m.getAuthor().isBot() && !m.getComponents().isEmpty() &&
m.getComponents().stream().allMatch(c -> c instanceof Button b && b.getCustomId() != null && b.getCustomId().contains(HelpManager.HELP_THANKS_IDENTIFIER));
}
}
Loading