From 027e0c2269fcbe13e9e341c235fc73bc7fca35dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Aug 2025 08:40:08 +0200 Subject: [PATCH 01/13] Bump jacksonVersion from 2.19.1 to 2.20.0 (#1313) Bumps `jacksonVersion` from 2.19.1 to 2.20.0. Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-csv` from 2.19.1 to 2.20.0 - [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.19.1...jackson-dataformats-text-2.20.0) Updates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.19.1 to 2.20.0 Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-xml` from 2.19.1 to 2.20.0 - [Commits](https://github.com/FasterXML/jackson-dataformat-xml/compare/jackson-dataformat-xml-2.19.1...jackson-dataformat-xml-2.20.0) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.19.1 to 2.20.0 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-csv dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310 dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-xml dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 272e5fffec..54cf4bed46 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ version '1.0-SNAPSHOT' ext { jooqVersion = '3.20.5' - jacksonVersion = '2.19.1' + jacksonVersion = '2.20.0' chatGPTVersion = '0.18.2' junitVersion = '5.13.2' } From 844a41af741dc4acdf1ac886739009122acd61c2 Mon Sep 17 00:00:00 2001 From: Zabuzard Date: Fri, 29 Aug 2025 09:57:59 +0200 Subject: [PATCH 02/13] Revert Jackson update, crashing (see #1314) https://github.com/Together-Java/TJ-Bot/issues/1314 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 54cf4bed46..272e5fffec 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ version '1.0-SNAPSHOT' ext { jooqVersion = '3.20.5' - jacksonVersion = '2.20.0' + jacksonVersion = '2.19.1' chatGPTVersion = '0.18.2' junitVersion = '5.13.2' } From 726edf2a52f01ba3491435742e78282b0ff62022 Mon Sep 17 00:00:00 2001 From: Alathreon <45936420+Alathreon@users.noreply.github.com> Date: Mon, 1 Sep 2025 09:08:58 +0200 Subject: [PATCH 03/13] GitHub API increased page size (30 to 1000), reduces load time (30s to 1s) (#1317) --- .../org/togetherjava/tjbot/features/github/GitHubCommand.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/github/GitHubCommand.java b/application/src/main/java/org/togetherjava/tjbot/features/github/GitHubCommand.java index 53a7eed187..33f9844656 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/github/GitHubCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/github/GitHubCommand.java @@ -4,7 +4,6 @@ import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionType; import org.kohsuke.github.GHIssue; -import org.kohsuke.github.GHIssueState; import org.togetherjava.tjbot.features.CommandVisibility; import org.togetherjava.tjbot.features.SlashCommandAdapter; @@ -124,7 +123,7 @@ private ToIntFunction suggestionScorer(String title) { private void updateCache() { autocompleteGHIssueCache = reference.getRepositories().stream().map(repo -> { try { - return repo.getIssues(GHIssueState.ALL); + return repo.queryIssues().pageSize(1000).list().toList(); } catch (IOException ex) { throw new UncheckedIOException(ex); } From 98e54b43671093121485d91e5925c7885410ff73 Mon Sep 17 00:00:00 2001 From: Daniel Tischner Date: Fri, 5 Sep 2025 09:04:43 +0200 Subject: [PATCH 04/13] Detect attachment scam regardless of case (jpg vs JPG) (#1319) --- .../features/moderation/scam/Attachment.java | 5 ++++- .../moderation/scam/ScamDetectorTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/Attachment.java b/application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/Attachment.java index 4a7c8ad528..b5fc89644f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/Attachment.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/Attachment.java @@ -2,6 +2,7 @@ import net.dv8tion.jda.api.entities.Message; +import java.util.Locale; import java.util.Optional; import java.util.Set; @@ -10,7 +11,9 @@ record Attachment(String fileName) { Set.of("jpg", "jpeg", "png", "gif", "webp", "tiff", "svg", "apng"); boolean isImage() { - return getFileExtension().map(IMAGE_EXTENSIONS::contains).orElse(false); + return getFileExtension().map(ext -> ext.toLowerCase(Locale.US)) + .map(IMAGE_EXTENSIONS::contains) + .orElse(false); } private Optional getFileExtension() { diff --git a/application/src/test/java/org/togetherjava/tjbot/features/moderation/scam/ScamDetectorTest.java b/application/src/test/java/org/togetherjava/tjbot/features/moderation/scam/ScamDetectorTest.java index 4cf982b3f4..52c9b3dffe 100644 --- a/application/src/test/java/org/togetherjava/tjbot/features/moderation/scam/ScamDetectorTest.java +++ b/application/src/test/java/org/togetherjava/tjbot/features/moderation/scam/ScamDetectorTest.java @@ -210,6 +210,23 @@ void ignoresHarmlessAttachments() { assertFalse(isScamResult); } + @Test + @DisplayName("Messages containing suspicious attachments are flagged even if extensions are upper-case (jpg vs JPG)") + void detectsSuspiciousAttachmentsRegardlessOfCase() { + // GIVEN an empty message containing suspicious attachments with mixed case for extensions + String content = ""; + List attachments = + List.of(createImageAttachmentMock("1.JPG"), createImageAttachmentMock("2.JPG"), + createImageAttachmentMock("3.jpg"), createImageAttachmentMock("4.jpg")); + Message message = createMessageMock(content, attachments); + + // WHEN analyzing it + boolean isScamResult = scamDetector.isScam(message); + + // THEN flags it as scam + assertTrue(isScamResult); + } + @Test @DisplayName("Suspicious messages send by trusted users are not flagged") void ignoreTrustedUser() { From a5a4314689e473dc92f6061d7014a96133593681 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:05:24 +0200 Subject: [PATCH 05/13] Bump org.flywaydb:flyway-core from 11.11.0 to 11.12.0 (#1320) Bumps [org.flywaydb:flyway-core](https://github.com/flyway/flyway) from 11.11.0 to 11.12.0. - [Release notes](https://github.com/flyway/flyway/releases) - [Commits](https://github.com/flyway/flyway/compare/flyway-11.11.0...flyway-11.12.0) --- updated-dependencies: - dependency-name: org.flywaydb:flyway-core dependency-version: 11.12.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- database/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/build.gradle b/database/build.gradle index 46b20ac384..419c25d603 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -7,7 +7,7 @@ var sqliteVersion = "3.50.1.0" dependencies { implementation 'com.google.code.findbugs:jsr305:3.0.2' implementation "org.xerial:sqlite-jdbc:${sqliteVersion}" - implementation 'org.flywaydb:flyway-core:11.11.0' + implementation 'org.flywaydb:flyway-core:11.12.0' implementation "org.jooq:jooq:$jooqVersion" implementation project(':utils') From 198f8351585391270710dc24cf184db4a7737b6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:05:43 +0200 Subject: [PATCH 06/13] Bump org.kohsuke:github-api from 1.329 to 1.330 (#1321) Bumps [org.kohsuke:github-api](https://github.com/hub4j/github-api) from 1.329 to 1.330. - [Release notes](https://github.com/hub4j/github-api/releases) - [Changelog](https://github.com/hub4j/github-api/blob/main/CHANGELOG.md) - [Commits](https://github.com/hub4j/github-api/compare/github-api-1.329...github-api-1.330) --- updated-dependencies: - dependency-name: org.kohsuke:github-api dependency-version: '1.330' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- application/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/build.gradle b/application/build.gradle index e03e8adb22..03ef419114 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -75,7 +75,7 @@ dependencies { implementation 'com.github.ben-manes.caffeine:caffeine:3.2.0' - implementation 'org.kohsuke:github-api:1.329' + implementation 'org.kohsuke:github-api:1.330' implementation 'org.apache.commons:commons-text:1.14.0' implementation 'com.apptasticsoftware:rssreader:3.10.0' From f65fb03c6a9ac1da8b549cedce7608b672999c1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:16:55 +0200 Subject: [PATCH 07/13] Bump jacksonVersion from 2.19.1 to 2.20.0 (#1318) Bumps `jacksonVersion` from 2.19.1 to 2.20.0. Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-csv` from 2.19.1 to 2.20.0 - [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.19.1...jackson-dataformats-text-2.20.0) Updates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.19.1 to 2.20.0 Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-xml` from 2.19.1 to 2.20.0 - [Commits](https://github.com/FasterXML/jackson-dataformat-xml/compare/jackson-dataformat-xml-2.19.1...jackson-dataformat-xml-2.20.0) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.19.1 to 2.20.0 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-csv dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310 dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-xml dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 272e5fffec..54cf4bed46 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ version '1.0-SNAPSHOT' ext { jooqVersion = '3.20.5' - jacksonVersion = '2.19.1' + jacksonVersion = '2.20.0' chatGPTVersion = '0.18.2' junitVersion = '5.13.2' } From 1d6fb19cbcc79e033b6a8bec3d6f76c41675037d Mon Sep 17 00:00:00 2001 From: Zabuzard Date: Fri, 5 Sep 2025 09:21:36 +0200 Subject: [PATCH 08/13] Revert "Bump org.kohsuke:github-api from 1.329 to 1.330 (#1321)" This reverts commit 198f8351585391270710dc24cf184db4a7737b6d. --- application/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/build.gradle b/application/build.gradle index 03ef419114..e03e8adb22 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -75,7 +75,7 @@ dependencies { implementation 'com.github.ben-manes.caffeine:caffeine:3.2.0' - implementation 'org.kohsuke:github-api:1.330' + implementation 'org.kohsuke:github-api:1.329' implementation 'org.apache.commons:commons-text:1.14.0' implementation 'com.apptasticsoftware:rssreader:3.10.0' From 637c6166292b7adeda478982b31e991b52dd38ae Mon Sep 17 00:00:00 2001 From: Zabuzard Date: Fri, 5 Sep 2025 09:21:42 +0200 Subject: [PATCH 09/13] Revert "Bump jacksonVersion from 2.19.1 to 2.20.0 (#1318)" This reverts commit f65fb03c6a9ac1da8b549cedce7608b672999c1d. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 54cf4bed46..272e5fffec 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ version '1.0-SNAPSHOT' ext { jooqVersion = '3.20.5' - jacksonVersion = '2.20.0' + jacksonVersion = '2.19.1' chatGPTVersion = '0.18.2' junitVersion = '5.13.2' } From b905efb13b7380a50eebfbe2e1c425d703fabedc Mon Sep 17 00:00:00 2001 From: Mehak Walia <58343523+waliamehak@users.noreply.github.com> Date: Fri, 5 Sep 2025 03:18:40 -0700 Subject: [PATCH 10/13] =?UTF-8?q?Made=20GitHub=20cache=20update=20async=20?= =?UTF-8?q?and=20fixed=20cache=20refresh=20check.=20Fixes=20#=E2=80=A6=20(?= =?UTF-8?q?#1316)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Made GitHub cache update async and fixed cache refresh check. Fixes #1315 * Apply Spotless formatting --- .../tjbot/features/github/GitHubCommand.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/github/GitHubCommand.java b/application/src/main/java/org/togetherjava/tjbot/features/github/GitHubCommand.java index 33f9844656..b52e79550d 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/github/GitHubCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/github/GitHubCommand.java @@ -4,6 +4,8 @@ import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionType; import org.kohsuke.github.GHIssue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.togetherjava.tjbot.features.CommandVisibility; import org.togetherjava.tjbot.features.SlashCommandAdapter; @@ -17,6 +19,7 @@ import java.util.List; import java.util.PriorityQueue; import java.util.Queue; +import java.util.concurrent.CompletableFuture; import java.util.function.ToIntFunction; import java.util.regex.Matcher; import java.util.stream.Stream; @@ -40,11 +43,12 @@ public final class GitHubCommand extends SlashCommandAdapter { }; private static final String TITLE_OPTION = "title"; + private static final Logger logger = LoggerFactory.getLogger(GitHubCommand.class); private final GitHubReference reference; - private Instant lastCacheUpdate; - private List autocompleteGHIssueCache; + private Instant lastCacheUpdate = Instant.EPOCH; + private List autocompleteGHIssueCache = List.of(); /** * Constructs an instance of GitHubCommand. @@ -65,7 +69,14 @@ public GitHubCommand(GitHubReference reference) { getData().addOption(OptionType.STRING, TITLE_OPTION, "Title of the issue you're looking for", true, true); - updateCache(); + CompletableFuture.runAsync(() -> { + try { + updateCache(); + } catch (Exception e) { + logger.error("Unknown error updating the GitHub cache", e); + } + }); + } @Override @@ -110,7 +121,7 @@ public void onAutoComplete(CommandAutoCompleteInteractionEvent event) { event.replyChoiceStrings(choices).queue(); } - if (lastCacheUpdate.isAfter(Instant.now().minus(CACHE_EXPIRES_AFTER))) { + if (isCacheExpired()) { updateCache(); } } @@ -120,12 +131,20 @@ private ToIntFunction suggestionScorer(String title) { return s -> StringDistances.editDistance(title, s.replaceFirst("\\[#\\d+] ", "")); } + private boolean isCacheExpired() { + Instant cacheExpiresAt = lastCacheUpdate.plus(CACHE_EXPIRES_AFTER); + return Instant.now().isAfter(cacheExpiresAt); + } + private void updateCache() { + logger.debug("GitHub Autocomplete cache update started"); + autocompleteGHIssueCache = reference.getRepositories().stream().map(repo -> { try { return repo.queryIssues().pageSize(1000).list().toList(); } catch (IOException ex) { - throw new UncheckedIOException(ex); + throw new UncheckedIOException("Error fetching issues from repo " + repo.getName(), + ex); } }) .flatMap(List::stream) @@ -134,5 +153,8 @@ private void updateCache() { .toList(); lastCacheUpdate = Instant.now(); + + logger.debug("GitHub autocomplete cache update completed successfully. Cached {} issues.", + autocompleteGHIssueCache.size()); } } From d219d0e4b532b350e1428c549da2a01c140a75d3 Mon Sep 17 00:00:00 2001 From: Daniel Tischner Date: Wed, 10 Sep 2025 14:55:59 +0200 Subject: [PATCH 11/13] Support Video Preview in RSS Feeds #1324 --- application/config.json.template | 1 + .../tjbot/config/RSSFeedsConfig.java | 4 ++++ .../tjbot/features/rss/RSSHandlerRoutine.java | 23 ++++++++++++------- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/application/config.json.template b/application/config.json.template index 5884522c60..7225704286 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -187,6 +187,7 @@ } ], "fallbackChannelPattern": "java-news-and-changes", + "videoLinkPattern": "http(s)?://www\\.youtube.com.*", "pollIntervalInMinutes": 10 }, "memberCountCategoryPattern": "Info", diff --git a/application/src/main/java/org/togetherjava/tjbot/config/RSSFeedsConfig.java b/application/src/main/java/org/togetherjava/tjbot/config/RSSFeedsConfig.java index 1c3371f71a..b18ec6fb1f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/RSSFeedsConfig.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/RSSFeedsConfig.java @@ -16,6 +16,7 @@ public record RSSFeedsConfig(@JsonProperty(value = "feeds", required = true) List feeds, @JsonProperty(value = "fallbackChannelPattern", required = true) String fallbackChannelPattern, + @JsonProperty(value = "videoLinkPattern", required = true) String videoLinkPattern, @JsonProperty(value = "pollIntervalInMinutes", required = true) int pollIntervalInMinutes) { /** @@ -23,6 +24,8 @@ public record RSSFeedsConfig(@JsonProperty(value = "feeds", required = true) Lis * * @param feeds The list of RSS feeds to subscribe to. * @param fallbackChannelPattern The pattern used to identify the fallback text channel to use. + * @param videoLinkPattern pattern determining if a link is a video. It is then posted in a way + * to support Discord video embeds. * @param pollIntervalInMinutes The interval (in minutes) for polling the RSS feeds for updates. * @throws NullPointerException if any of the parameters (feeds or fallbackChannelPattern) are * null @@ -30,5 +33,6 @@ public record RSSFeedsConfig(@JsonProperty(value = "feeds", required = true) Lis public RSSFeedsConfig { Objects.requireNonNull(feeds); Objects.requireNonNull(fallbackChannelPattern); + Objects.requireNonNull(videoLinkPattern); } } diff --git a/application/src/main/java/org/togetherjava/tjbot/features/rss/RSSHandlerRoutine.java b/application/src/main/java/org/togetherjava/tjbot/features/rss/RSSHandlerRoutine.java index c86f305cda..56aea37b74 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/rss/RSSHandlerRoutine.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/rss/RSSHandlerRoutine.java @@ -4,9 +4,9 @@ import com.apptasticsoftware.rssreader.RssReader; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; -import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.utils.cache.SnowflakeCacheView; +import net.dv8tion.jda.api.utils.messages.MessageCreateData; import org.apache.commons.text.StringEscapeUtils; import org.jetbrains.annotations.Nullable; import org.jooq.tools.StringUtils; @@ -79,6 +79,7 @@ public final class RSSHandlerRoutine implements Routine { private final RssReader rssReader; private final RSSFeedsConfig config; private final Predicate fallbackChannelPattern; + private final Predicate isVideoLink; private final Map> targetChannelPatterns; private final int interval; private final Database database; @@ -95,6 +96,7 @@ public RSSHandlerRoutine(Config config, Database database) { this.database = database; this.fallbackChannelPattern = Pattern.compile(this.config.fallbackChannelPattern()).asMatchPredicate(); + isVideoLink = Pattern.compile(this.config.videoLinkPattern()).asMatchPredicate(); this.targetChannelPatterns = new HashMap<>(); this.config.feeds().forEach(feed -> { if (feed.targetChannelPattern() != null) { @@ -155,7 +157,7 @@ private void sendRSS(JDA jda, RSSFeed feedConfig) { } rssItems.reversed() .stream() - .filter(shouldItemBePosted.get()) + .filter(shouldItemBePosted.orElseThrow()) .forEachOrdered(item -> postItem(textChannels, item, feedConfig)); } @@ -241,8 +243,8 @@ private Optional getLatestPostDateFromItems(List items, * @param feedConfig the RSS feed configuration */ private void postItem(List textChannels, Item rssItem, RSSFeed feedConfig) { - MessageEmbed embed = constructEmbedMessage(rssItem, feedConfig).build(); - textChannels.forEach(channel -> channel.sendMessageEmbeds(List.of(embed)).queue()); + MessageCreateData message = constructMessage(rssItem, feedConfig); + textChannels.forEach(channel -> channel.sendMessage(message).queue()); } /** @@ -346,13 +348,18 @@ private List getTextChannelsFromFeed(JDA jda, RSSFeed feed) { } /** - * Provides the {@link EmbedBuilder} from an RSS item used for sending RSS posts. + * Provides the message from an RSS item used for sending RSS posts. * * @param item the RSS item to construct the embed message from * @param feedConfig the configuration of the RSS feed - * @return the constructed {@link EmbedBuilder} containing information from the RSS item + * @return the constructed message containing information from the RSS item */ - private static EmbedBuilder constructEmbedMessage(Item item, RSSFeed feedConfig) { + private MessageCreateData constructMessage(Item item, RSSFeed feedConfig) { + if (item.getLink().filter(isVideoLink).isPresent()) { + // Automatic video previews are created on normal messages, not on embeds + return MessageCreateData.fromContent(item.getLink().orElseThrow()); + } + final EmbedBuilder embedBuilder = new EmbedBuilder(); String title = item.getTitle().orElse("No title"); String titleLink = item.getLink().orElse(""); @@ -381,7 +388,7 @@ private static EmbedBuilder constructEmbedMessage(Item item, RSSFeed feedConfig) embedBuilder.setDescription("No description"); } - return embedBuilder; + return MessageCreateData.fromEmbeds(embedBuilder.build()); } /** From 511c485c12499f57440bba368b76a229a4815dbb Mon Sep 17 00:00:00 2001 From: Janki Gadhiya Date: Mon, 15 Sep 2025 16:14:11 +0530 Subject: [PATCH 12/13] Fix: audit message being empty for attachment-only scam posts (#1300) (#1325) * Fix: audit message being empty for attachment-only scam posts (#1300) * spotless formatting * ux improvements for the text * small fix with extra space --------- Co-authored-by: Janki.Bhimijani Co-authored-by: Zabuzard --- .../features/moderation/scam/ScamBlocker.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/ScamBlocker.java b/application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/ScamBlocker.java index 1c37fe8f3f..094d05b5ce 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/ScamBlocker.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/ScamBlocker.java @@ -48,6 +48,7 @@ import java.util.function.Predicate; import java.util.function.UnaryOperator; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * Listener that receives all sent messages from channels, checks them for scam and takes @@ -247,15 +248,24 @@ private void reportScamMessage(MessageReceivedEvent event, String reportTitle, User author = event.getAuthor(); String avatarOrDefaultUrl = author.getEffectiveAvatarUrl(); - - MessageEmbed embed = - new EmbedBuilder().setDescription(event.getMessage().getContentStripped()) - .setTitle(reportTitle) - .setAuthor(author.getName(), null, avatarOrDefaultUrl) - .setTimestamp(event.getMessage().getTimeCreated()) - .setColor(AMBIENT_COLOR) - .setFooter(author.getId()) - .build(); + String content = event.getMessage().getContentStripped(); + List attachments = event.getMessage().getAttachments(); + + if (!attachments.isEmpty()) { + String attachmentInfo = attachments.stream() + .map(Message.Attachment::getFileName) + .collect(Collectors.joining(", ")); + content += "%s(The message has %d attachment%s: %s)".formatted( + content.isBlank() ? "" : "\n", attachments.size(), + attachments.size() > 1 ? "s " : "", attachmentInfo); + } + MessageEmbed embed = new EmbedBuilder().setDescription(content) + .setTitle(reportTitle) + .setAuthor(author.getName(), null, avatarOrDefaultUrl) + .setTimestamp(event.getMessage().getTimeCreated()) + .setColor(AMBIENT_COLOR) + .setFooter(author.getId()) + .build(); MessageCreateBuilder messageBuilder = new MessageCreateBuilder().setEmbeds(embed); if (!confirmDialog.isEmpty()) { From b766c4a63699a93b237dbd9448463f11e8157cd6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 08:27:48 +0200 Subject: [PATCH 13/13] Bump org.flywaydb:flyway-core from 11.12.0 to 11.13.0 (#1326) Bumps [org.flywaydb:flyway-core](https://github.com/flyway/flyway) from 11.12.0 to 11.13.0. - [Release notes](https://github.com/flyway/flyway/releases) - [Commits](https://github.com/flyway/flyway/compare/flyway-11.12.0...flyway-11.13.0) --- updated-dependencies: - dependency-name: org.flywaydb:flyway-core dependency-version: 11.13.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- database/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/build.gradle b/database/build.gradle index 419c25d603..79a0587e5f 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -7,7 +7,7 @@ var sqliteVersion = "3.50.1.0" dependencies { implementation 'com.google.code.findbugs:jsr305:3.0.2' implementation "org.xerial:sqlite-jdbc:${sqliteVersion}" - implementation 'org.flywaydb:flyway-core:11.12.0' + implementation 'org.flywaydb:flyway-core:11.13.0' implementation "org.jooq:jooq:$jooqVersion" implementation project(':utils')