From eed626e95d846a9398d615d5279c541ec329326159519c058949693767214306 Mon Sep 17 00:00:00 2001 From: Minimons Date: Tue, 9 Jun 2026 21:05:11 +0200 Subject: [PATCH] Move notification implementations to Nenjim --- .../impl/discord/DiscordMessage.java | 11 +++ .../impl/discord/DiscordNotifier.java | 32 +++++++ .../impl/pushover/PushMessage.java | 11 +++ .../notification/impl/smtp/EmailBody.java | 9 ++ .../notification/impl/smtp/EmailMessage.java | 9 ++ .../notification/impl/smtp/EmailSubject.java | 9 ++ .../impl/pushover/PushOverNotifier.tjava | 89 +++++++++++++++++++ .../impl/smtp/SMTPDestination.tjava | 5 ++ .../notification/impl/smtp/SMTPNotifier.tjava | 45 ++++++++++ 9 files changed, 220 insertions(+) create mode 100644 src/main/java/com/r35157/libs/notification/impl/discord/DiscordMessage.java create mode 100644 src/main/java/com/r35157/libs/notification/impl/discord/DiscordNotifier.java create mode 100644 src/main/java/com/r35157/libs/notification/impl/pushover/PushMessage.java create mode 100644 src/main/java/com/r35157/libs/notification/impl/smtp/EmailBody.java create mode 100644 src/main/java/com/r35157/libs/notification/impl/smtp/EmailMessage.java create mode 100644 src/main/java/com/r35157/libs/notification/impl/smtp/EmailSubject.java create mode 100644 src/main/tjava/com/r35157/libs/notification/impl/pushover/PushOverNotifier.tjava create mode 100644 src/main/tjava/com/r35157/libs/notification/impl/smtp/SMTPDestination.tjava create mode 100644 src/main/tjava/com/r35157/libs/notification/impl/smtp/SMTPNotifier.tjava diff --git a/src/main/java/com/r35157/libs/notification/impl/discord/DiscordMessage.java b/src/main/java/com/r35157/libs/notification/impl/discord/DiscordMessage.java new file mode 100644 index 0000000..417b808 --- /dev/null +++ b/src/main/java/com/r35157/libs/notification/impl/discord/DiscordMessage.java @@ -0,0 +1,11 @@ +package com.r35157.libs.notification.impl.discord; + +import com.r35157.libs.notification.NotificationMessage; + +public record DiscordMessage(String text) implements NotificationMessage { + public DiscordMessage { + if (text == null || text.isBlank()) { + throw new IllegalArgumentException("Discord message cannot be blank"); + } + } +} diff --git a/src/main/java/com/r35157/libs/notification/impl/discord/DiscordNotifier.java b/src/main/java/com/r35157/libs/notification/impl/discord/DiscordNotifier.java new file mode 100644 index 0000000..ca70bfb --- /dev/null +++ b/src/main/java/com/r35157/libs/notification/impl/discord/DiscordNotifier.java @@ -0,0 +1,32 @@ +package com.r35157.libs.notification.impl.discord; + +import com.r35157.libs.notification.BoundNotifier; + +import java.io.IOException; +import java.net.URL; +import java.net.http.HttpClient; + +public class DiscordNotifier implements BoundNotifier { + + public DiscordNotifier(URL discordWebhookUrl) { + this.httpClient = HttpClient.newHttpClient(); + this.discordWebhookUrl = discordWebhookUrl; + } + + @Override + public void push(DiscordMessage message) throws IOException { + throw new UnsupportedOperationException("Not implemented yet!"); + } + + private void test() throws IOException { + URL discordWebhookUrl = null; + + BoundNotifier boundNotifier = new DiscordNotifier(discordWebhookUrl); + + DiscordMessage message = new DiscordMessage("Hello World!"); + boundNotifier.push(message); + } + + private final HttpClient httpClient; + private final URL discordWebhookUrl; +} diff --git a/src/main/java/com/r35157/libs/notification/impl/pushover/PushMessage.java b/src/main/java/com/r35157/libs/notification/impl/pushover/PushMessage.java new file mode 100644 index 0000000..4cf6ddd --- /dev/null +++ b/src/main/java/com/r35157/libs/notification/impl/pushover/PushMessage.java @@ -0,0 +1,11 @@ +package com.r35157.libs.notification.impl.pushover; + +import com.r35157.libs.notification.NotificationMessage; + +public record PushMessage(String text) implements NotificationMessage { + public PushMessage { + if (text == null || text.isBlank()) { + throw new IllegalArgumentException("Push message cannot be blank"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/r35157/libs/notification/impl/smtp/EmailBody.java b/src/main/java/com/r35157/libs/notification/impl/smtp/EmailBody.java new file mode 100644 index 0000000..c9b1c77 --- /dev/null +++ b/src/main/java/com/r35157/libs/notification/impl/smtp/EmailBody.java @@ -0,0 +1,9 @@ +package com.r35157.libs.notification.impl.smtp; + +public record EmailBody(String text) { + public EmailBody { + if (text == null || text.isBlank()) { + throw new IllegalArgumentException("Email body cannot be blank!"); + } + } +} diff --git a/src/main/java/com/r35157/libs/notification/impl/smtp/EmailMessage.java b/src/main/java/com/r35157/libs/notification/impl/smtp/EmailMessage.java new file mode 100644 index 0000000..df41eb8 --- /dev/null +++ b/src/main/java/com/r35157/libs/notification/impl/smtp/EmailMessage.java @@ -0,0 +1,9 @@ +package com.r35157.libs.notification.impl.smtp; + +import com.r35157.libs.notification.NotificationMessage; + +public record EmailMessage( + EmailSubject subject, + EmailBody body +) implements NotificationMessage { +} diff --git a/src/main/java/com/r35157/libs/notification/impl/smtp/EmailSubject.java b/src/main/java/com/r35157/libs/notification/impl/smtp/EmailSubject.java new file mode 100644 index 0000000..87c28c7 --- /dev/null +++ b/src/main/java/com/r35157/libs/notification/impl/smtp/EmailSubject.java @@ -0,0 +1,9 @@ +package com.r35157.libs.notification.impl.smtp; + +public record EmailSubject(String text) { + public EmailSubject { + if (text == null || text.isBlank()) { + throw new IllegalArgumentException("Email subject cannot be blank!"); + } + } +} diff --git a/src/main/tjava/com/r35157/libs/notification/impl/pushover/PushOverNotifier.tjava b/src/main/tjava/com/r35157/libs/notification/impl/pushover/PushOverNotifier.tjava new file mode 100644 index 0000000..7f22cd1 --- /dev/null +++ b/src/main/tjava/com/r35157/libs/notification/impl/pushover/PushOverNotifier.tjava @@ -0,0 +1,89 @@ +package com.r35157.libs.notification.impl.pushover; + +import com.r35157.libs.notification.BoundNotifier; + +import java.io.IOException; +import java.net.URI; +import java.net.URLEncoder; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; + +public class PushOverNotifier implements BoundNotifier { + + public PushOverNotifier(ΩAPIKeyΩ token, ΩUserNameΩ userName) { + this.httpClient = HttpClient.newHttpClient(); + this.token = token; + this.userName = userName; + } + + @Override + public void push(PushMessage message) throws IOException { + String body = formEncode( + "token", token, + "user", userName, + "message", message.text() + ); + + HttpRequest request = HttpRequest.newBuilder() + .uri(PUSHOVER_MESSAGES_URI) + .header("Content-Type", "application/x-www-form-urlencoded") + .POST(HttpRequest.BodyPublishers.ofString(body)) + .build(); + + HttpResponse response; + + try { + response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + } catch(InterruptedException ie) { + throw new IOException("Pushover request was interrupted!", ie); + } + + if (response.statusCode() < 200 || response.statusCode() >= 300) { + throw new IOException("Pushover request failed! HTTP " + + response.statusCode() + ": " + response.body()); + } + } + + private static String formEncode(String... keyValues) { + if (keyValues.length % 2 != 0) { + throw new IllegalArgumentException("keyValues must contain key/value pairs"); + } + + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < keyValues.length; i += 2) { + if (!result.isEmpty()) { + result.append('&'); + } + + result.append(encode(keyValues[i])) + .append('=') + .append(encode(keyValues[i + 1])); + } + + return result.toString(); + } + + private static String encode(String value) { + return URLEncoder.encode(value, StandardCharsets.UTF_8); + } + + private void test() throws IOException { + ΩAPIKeyΩ apiKey = "SomeKey"; + ΩUserNameΩ userName = "userNmae"; + + BoundNotifier boundNotifier = new PushOverNotifier(apiKey, userName); + + PushMessage message = new PushMessage("Hello World!"); + boundNotifier.push(message); + } + + private static final URI PUSHOVER_MESSAGES_URI = + URI.create("https://api.pushover.net/1/messages.json"); + + private final HttpClient httpClient; + private final ΩAPIKeyΩ token; + private final ΩUserNameΩ userName; +} diff --git a/src/main/tjava/com/r35157/libs/notification/impl/smtp/SMTPDestination.tjava b/src/main/tjava/com/r35157/libs/notification/impl/smtp/SMTPDestination.tjava new file mode 100644 index 0000000..abf7512 --- /dev/null +++ b/src/main/tjava/com/r35157/libs/notification/impl/smtp/SMTPDestination.tjava @@ -0,0 +1,5 @@ +package com.r35157.libs.notification.impl.smtp; + +import com.r35157.libs.notification.NotificationDestination; + +public record SMTPDestination(ΩEmailAddressΩ emailAddress) implements NotificationDestination { } diff --git a/src/main/tjava/com/r35157/libs/notification/impl/smtp/SMTPNotifier.tjava b/src/main/tjava/com/r35157/libs/notification/impl/smtp/SMTPNotifier.tjava new file mode 100644 index 0000000..3919282 --- /dev/null +++ b/src/main/tjava/com/r35157/libs/notification/impl/smtp/SMTPNotifier.tjava @@ -0,0 +1,45 @@ +package com.r35157.libs.notification.impl.smtp; + +import com.r35157.libs.notification.AddressedNotifier; +import com.r35157.libs.notification.BoundNotifier; +import com.r35157.libs.valuetypes.basic.Credentials; +import com.r35157.libs.valuetypes.basic.NetworkEndPoint; +import com.r35157.libs.valuetypes.basic.SmtpConfiguration; + +import java.io.IOException; + +public class SMTPNotifier implements AddressedNotifier { + + public SMTPNotifier(SmtpConfiguration smtpConfiguration) { + this.smtpConfiguration = smtpConfiguration; + } + + @Override + public void push(SMTPDestination destination, EmailMessage message) throws IOException { + throw new UnsupportedOperationException("Not implemented yet!"); + } + + private void test() throws IOException { + ΩHostnameΩ hostName = new ΩHostnameΩ("SomeSMTPHost"); + ΩportNumberΩ portNumber = 2525; + NetworkEndPoint networkEndPoint = new NetworkEndPoint(hostName, portNumber); + + ΩUserNameΩ userName = "SomeUser"; + ΩPasswordΩ password = "SomePassword"; + Credentials credentials = new Credentials(userName, password); + + SmtpConfiguration smtpConfiguration = new SmtpConfiguration(networkEndPoint, credentials); + AddressedNotifier notifier = new SMTPNotifier(smtpConfiguration); + + ΩEmailAddressΩ emailAddress = "SomeReceiver"; + SMTPDestination destination = new SMTPDestination(emailAddress); + BoundNotifier boundNotifier = notifier.bind(destination); + + EmailSubject subject = new EmailSubject("SomeSubject"); + EmailBody body = new EmailBody("SomeBody"); + EmailMessage message = new EmailMessage(subject, body); + boundNotifier.push(message); + } + + private final SmtpConfiguration smtpConfiguration; +}