From 6617691f8331abf6c68df9e04cefda1fa0d45d4a Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 6 Mar 2025 12:04:38 +0100 Subject: [PATCH 1/8] test null replacements --- .../notifiers/ExternalPluginNotifierTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java b/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java index 3cf15573..19192d6f 100644 --- a/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java +++ b/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java @@ -68,6 +68,33 @@ void testNotify() { ); } + @Test + void testNoReplacements() { + // fire event + var payload = samplePayload("https://example.com/"); + payload.remove("replacements"); + payload.put("text", "text with no replacements"); + plugin.onPluginMessage(new PluginMessage("dink", "notify", payload)); + + // verify notification + verifyCreateMessage( + "https://example.com/", + false, + NotificationBody.builder() + .type(NotificationType.EXTERNAL_PLUGIN) + .playerName(PLAYER_NAME) + .customTitle("My Title") + .customFooter("Sent by MyExternalPlugin via Dink") + .text( + Template.builder() + .template("text with no replacements") + .build() + ) + .extra(new ExternalNotificationData("MyExternalPlugin", List.of(new Field("sample key", "sample value")), Collections.singletonMap("hello", "world"))) + .build() + ); + } + @Test void testFallbackUrl() { // update config mocks From 226d0f2b6a4162f1e598669f60941eeb6c74bd21 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 6 Mar 2025 12:04:26 +0100 Subject: [PATCH 2/8] fix: allow null replacements --- src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java b/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java index 49dc82c8..a6642c31 100644 --- a/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java +++ b/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java @@ -18,6 +18,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import java.util.Map; +import java.util.Objects; @Slf4j @Singleton @@ -87,7 +88,7 @@ private void handleNotify(ExternalNotificationRequest input) { var player = Utils.getPlayerName(client); var template = Template.builder() .template(input.getText()) - .replacements(input.getReplacements()) + .replacements(Objects.requireNonNullElse(input.getReplacements(), Map.of())) .replacement("%USERNAME%", Replacements.ofText(player)) .build(); From cbe5ff9f61cd0e3e961a75fd0de0dce022f1207a Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 6 Mar 2025 12:05:25 +0100 Subject: [PATCH 3/8] chore: add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9c27d23..6df5bfc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## Unreleased +- Bugfix: Actually allow null replacements to be sent to the external plugin notifier. (#676) + ## 1.11.2 - Dev: Harden input validation for urls provided to the external plugin notifier. (#672) From d6551e09bcf14b9a8937eb1be4aae50b02883f52 Mon Sep 17 00:00:00 2001 From: pajlada Date: Thu, 6 Mar 2025 16:35:12 +0100 Subject: [PATCH 4/8] Update src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java Co-authored-by: iProdigy <8106344+iProdigy@users.noreply.github.com> --- src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java b/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java index a6642c31..0d7bdd89 100644 --- a/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java +++ b/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java @@ -88,7 +88,7 @@ private void handleNotify(ExternalNotificationRequest input) { var player = Utils.getPlayerName(client); var template = Template.builder() .template(input.getText()) - .replacements(Objects.requireNonNullElse(input.getReplacements(), Map.of())) + .replacements(Objects.requireNonNullElse(input.getReplacements(), new HashMap<>(2))) .replacement("%USERNAME%", Replacements.ofText(player)) .build(); From 25431a7adf13c0f9862a11a46d87d30c5b8d71c0 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 6 Mar 2025 16:36:02 +0100 Subject: [PATCH 5/8] import hashmap --- src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java b/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java index 0d7bdd89..7da6ec38 100644 --- a/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java +++ b/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java @@ -17,6 +17,7 @@ import javax.inject.Inject; import javax.inject.Singleton; +import java.util.HashMap; import java.util.Map; import java.util.Objects; From 7e727e1ea16008e56d1e3bdd2a215c24cb3f52c9 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 6 Mar 2025 16:36:15 +0100 Subject: [PATCH 6/8] test no replacement but "standard" replacement --- .../notifiers/ExternalPluginNotifierTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java b/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java index 19192d6f..e8ecb72c 100644 --- a/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java +++ b/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java @@ -95,6 +95,34 @@ void testNoReplacements() { ); } + @Test + void testMissingReplacement() { + // fire event + var payload = samplePayload("https://example.com/"); + payload.remove("replacements"); + payload.put("text", "text with no custom replacement %USERNAME%"); + plugin.onPluginMessage(new PluginMessage("dink", "notify", payload)); + + // verify notification + verifyCreateMessage( + "https://example.com/", + false, + NotificationBody.builder() + .type(NotificationType.EXTERNAL_PLUGIN) + .playerName(PLAYER_NAME) + .customTitle("My Title") + .customFooter("Sent by MyExternalPlugin via Dink") + .text( + Template.builder() + .template("text with no custom replacement %USERNAME%") + .replacement("%USERNAME%", Replacements.ofText(PLAYER_NAME)) + .build() + ) + .extra(new ExternalNotificationData("MyExternalPlugin", List.of(new Field("sample key", "sample value")), Collections.singletonMap("hello", "world"))) + .build() + ); + } + @Test void testFallbackUrl() { // update config mocks From e7c863ef2852ab376792aad240211adea4882eda Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 6 Mar 2025 17:09:26 +0100 Subject: [PATCH 7/8] ElseGet --- src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java b/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java index 7da6ec38..4f26d7bb 100644 --- a/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java +++ b/src/main/java/dinkplugin/notifiers/ExternalPluginNotifier.java @@ -89,7 +89,7 @@ private void handleNotify(ExternalNotificationRequest input) { var player = Utils.getPlayerName(client); var template = Template.builder() .template(input.getText()) - .replacements(Objects.requireNonNullElse(input.getReplacements(), new HashMap<>(2))) + .replacements(Objects.requireNonNullElseGet(input.getReplacements(), () -> new HashMap<>(2))) .replacement("%USERNAME%", Replacements.ofText(player)) .build(); From 543e73594c5353b57eee0288cd9ecb2cfca7d083 Mon Sep 17 00:00:00 2001 From: Rasmus Karlsson Date: Thu, 6 Mar 2025 17:10:53 +0100 Subject: [PATCH 8/8] test without matching replacement --- .../notifiers/ExternalPluginNotifierTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java b/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java index e8ecb72c..d4a9bb85 100644 --- a/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java +++ b/src/test/java/dinkplugin/notifiers/ExternalPluginNotifierTest.java @@ -123,6 +123,34 @@ void testMissingReplacement() { ); } + @Test + void testPatternWithoutReplacement() { + // fire event + var payload = samplePayload("https://example.com/"); + payload.remove("replacements"); + payload.put("text", "text with no custom replacement %XD%"); + plugin.onPluginMessage(new PluginMessage("dink", "notify", payload)); + + // verify notification + verifyCreateMessage( + "https://example.com/", + false, + NotificationBody.builder() + .type(NotificationType.EXTERNAL_PLUGIN) + .playerName(PLAYER_NAME) + .customTitle("My Title") + .customFooter("Sent by MyExternalPlugin via Dink") + .text( + Template.builder() + .template("text with no custom replacement %XD%") + .replacement("%USERNAME%", Replacements.ofText(PLAYER_NAME)) + .build() + ) + .extra(new ExternalNotificationData("MyExternalPlugin", List.of(new Field("sample key", "sample value")), Collections.singletonMap("hello", "world"))) + .build() + ); + } + @Test void testFallbackUrl() { // update config mocks