Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.1.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
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
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 @@ -18,28 +38,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.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 @@ -125,7 +123,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