diff --git a/application/build.gradle b/application/build.gradle index 320ccc6f19..08282a6890 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'org.xerial:sqlite-jdbc:3.45.0.0' + classpath 'org.xerial:sqlite-jdbc:3.46.1.0' } } @@ -46,7 +46,7 @@ dependencies { implementation project(':utils') implementation project(':formatter') - implementation 'net.dv8tion:JDA:5.0.0-beta.21' + implementation 'net.dv8tion:JDA:5.1.0' implementation 'org.apache.logging.log4j:log4j-core:2.23.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.18.0' @@ -57,7 +57,7 @@ dependencies { implementation 'io.mikael:urlbuilder:2.0.9' - implementation 'org.jsoup:jsoup:1.17.1' + implementation 'org.jsoup:jsoup:1.18.1' implementation 'org.scilab.forge:jlatexmath:1.0.7' implementation 'org.scilab.forge:jlatexmath-font-greek:1.0.7' @@ -75,16 +75,16 @@ dependencies { implementation 'com.github.ben-manes.caffeine:caffeine:3.1.1' - implementation 'org.kohsuke:github-api:1.321' + implementation 'org.kohsuke:github-api:1.324' implementation 'org.apache.commons:commons-text:1.12.0' - implementation 'com.apptasticsoftware:rssreader:3.6.0' + implementation 'com.apptasticsoftware:rssreader:3.8.1' testImplementation 'org.mockito:mockito-core:5.12.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.1' implementation "com.theokanning.openai-gpt3-java:api:$chatGPTVersion" implementation "com.theokanning.openai-gpt3-java:service:$chatGPTVersion" diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java b/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java index e01a879e82..12ee788fa1 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java @@ -104,7 +104,7 @@ private RestAction createAIResponse(ThreadChannel threadChannel, Messag } private static boolean isContextSufficient(Message message) { - return !MessageUtils.containsImage(message) + return !MessageUtils.containsAttachments(message) && !LinkDetection.containsLink(message.getContentRaw()); } diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadLifecycleListener.java b/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadLifecycleListener.java index 3c2e778ba1..3669ed2517 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadLifecycleListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadLifecycleListener.java @@ -1,5 +1,6 @@ package org.togetherjava.tjbot.features.help; +import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; import net.dv8tion.jda.api.entities.channel.forums.ForumTag; import net.dv8tion.jda.api.events.channel.update.ChannelUpdateAppliedTagsEvent; @@ -75,14 +76,25 @@ private void handleThreadStatus(ThreadChannel threadChannel) { boolean isArchived = threadChannel.isArchived(); if (isArchived) { - handleArchiveStatus(closedAt, threadChannel); + handleArchiveStatus(closedAt, threadId, threadChannel.getJDA()); return; } updateThreadStatusToActive(threadId); } - void handleArchiveStatus(Instant closedAt, ThreadChannel threadChannel) { + void handleArchiveStatus(Instant closedAt, long id, JDA jda) { + ThreadChannel threadChannel = jda.getThreadChannelById(id); + if (threadChannel == null) { + logger.info("thread with id: {} no longer exists, marking archived in records", id); + database.write(context -> context.update(HELP_THREADS) + .set(HELP_THREADS.CLOSED_AT, closedAt) + .set(HELP_THREADS.TICKET_STATUS, HelpSystemHelper.TicketStatus.ARCHIVED.val) + .where(HELP_THREADS.CHANNEL_ID.eq(id)) + .execute()); + return; + } + long threadId = threadChannel.getIdLong(); int messageCount = threadChannel.getMessageCount(); int participantsExceptAuthor = threadChannel.getMemberCount() - 1; @@ -96,6 +108,7 @@ void handleArchiveStatus(Instant closedAt, ThreadChannel threadChannel) { .execute()); logger.info("Thread with id: {}, updated to archived status in database", threadId); + } private void updateThreadStatusToActive(long threadId) { diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/MarkHelpThreadCloseInDBRoutine.java b/application/src/main/java/org/togetherjava/tjbot/features/help/MarkHelpThreadCloseInDBRoutine.java index ec96d77c72..65cca49c6b 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/MarkHelpThreadCloseInDBRoutine.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/MarkHelpThreadCloseInDBRoutine.java @@ -1,7 +1,6 @@ package org.togetherjava.tjbot.features.help; import net.dv8tion.jda.api.JDA; -import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,13 +58,12 @@ private void updateTicketStatus(JDA jda) { .map(HelpThreadsRecord::getChannelId) .toList()); - threadIdsToClose.forEach(id -> { try { - ThreadChannel threadChannel = jda.getThreadChannelById(id); - helpThreadLifecycleListener.handleArchiveStatus(now, threadChannel); + helpThreadLifecycleListener.handleArchiveStatus(now, id, jda); } catch (Exception exception) { - logger.warn("unable to mark thread as close with id :{}", id, exception); + logger.warn("Failed to update status of thread with id: {} to archived", id, + exception); } }); } diff --git a/application/src/main/java/org/togetherjava/tjbot/features/jshell/JShellCommand.java b/application/src/main/java/org/togetherjava/tjbot/features/jshell/JShellCommand.java index 629ff3acd9..f5ebe81f3f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/jshell/JShellCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/jshell/JShellCommand.java @@ -111,12 +111,11 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { private void handleVersionCommand(SlashCommandInteractionEvent event) { String code = """ - System.out.println("```"); System.out.println("Version: " + Runtime.version()); System.out.println("Vendor: " + System.getProperty("java.vendor")); System.out.println("OS: " + System.getProperty("os.name")); System.out.println("Arch: " + System.getProperty("os.arch")); - System.out.println("```");"""; + """; handleEval(event, null, false, code, false); } diff --git a/application/src/main/java/org/togetherjava/tjbot/features/utils/MessageUtils.java b/application/src/main/java/org/togetherjava/tjbot/features/utils/MessageUtils.java index cb04c9e634..615e379a3c 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/utils/MessageUtils.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/utils/MessageUtils.java @@ -221,16 +221,16 @@ public static Optional extractCode(String fullMessage) { } /** - * Checks if a given message contains any image attachments. - * + * Checks if a given message contains any attachments. + * * @param message the message to be checked - * @return {@code true} if the message contains at least one image attachment + * @return {@code true} if the message contains at least one attachment * * @see Message * @see Message.Attachment */ - public static boolean containsImage(Message message) { - return message.getAttachments().stream().anyMatch(Message.Attachment::isImage); + public static boolean containsAttachments(Message message) { + return !message.getAttachments().isEmpty(); } } diff --git a/build.gradle b/build.gradle index 3f6d5863ff..3afbde256d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id "com.diffplug.spotless" version "6.25.0" - id "org.sonarqube" version "5.0.0.4638" + id "org.sonarqube" version "5.1.0.4882" id "name.remal.sonarlint" version "4.2.2" } diff --git a/database/build.gradle b/database/build.gradle index f9e56dfb72..9f996e19fb 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -2,12 +2,12 @@ plugins { id 'java' } -var sqliteVersion = "3.45.0.0" +var sqliteVersion = "3.46.1.0" dependencies { implementation 'com.google.code.findbugs:jsr305:3.0.2' implementation "org.xerial:sqlite-jdbc:${sqliteVersion}" - implementation 'org.flywaydb:flyway-core:10.13.0' + implementation 'org.flywaydb:flyway-core:10.17.2' implementation "org.jooq:jooq:$jooqVersion" implementation project(':utils') diff --git a/formatter/build.gradle b/formatter/build.gradle index d86473ff90..aeda44f388 100644 --- a/formatter/build.gradle +++ b/formatter/build.gradle @@ -7,7 +7,7 @@ dependencies { implementation project(':utils') testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.0' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.11.1' }