From 8ac518e4cb52ae9756d7fc6c6ba54331dd227011 Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Fri, 18 Jul 2025 21:29:50 +0200 Subject: [PATCH] send responses based on Accept header, add pages for error cases --- .../endpoints/GetDiscordInviteByGuildId.java | 93 +++++++++++++-- .../template/guild-not-supported.html | 107 ++++++++++++++++++ src/main/resources/template/index.html | 3 + .../resources/template/invites-paused.html | 107 ++++++++++++++++++ 4 files changed, 301 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/template/guild-not-supported.html create mode 100644 src/main/resources/template/invites-paused.html diff --git a/src/main/java/me/youhavetrouble/inviter/http/endpoints/GetDiscordInviteByGuildId.java b/src/main/java/me/youhavetrouble/inviter/http/endpoints/GetDiscordInviteByGuildId.java index 81803c7..4700bb6 100644 --- a/src/main/java/me/youhavetrouble/inviter/http/endpoints/GetDiscordInviteByGuildId.java +++ b/src/main/java/me/youhavetrouble/inviter/http/endpoints/GetDiscordInviteByGuildId.java @@ -8,12 +8,34 @@ import me.youhavetrouble.inviter.discord.GuildSettings; import org.jetbrains.annotations.NotNull; import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.regex.Pattern; public class GetDiscordInviteByGuildId implements EndpointHandler { private final Pattern pathPattern = Pattern.compile("^/invite/\\d{10,18}$"); + private final String invitesDisabledTemplate, botNotInGuildTemplate; + + public GetDiscordInviteByGuildId() { + String invitesDisabledTemplate = null; + try (InputStream resource = this.getClass().getResourceAsStream("/template/invites-paused.html")) { + invitesDisabledTemplate = new String(resource.readAllBytes()); + } catch (IOException | NullPointerException e) { + Main.LOGGER.warn("Failed to load template for invites disabled page", e); + } + this.invitesDisabledTemplate = invitesDisabledTemplate; + + String botNotInGuildTemplate = null; + try (InputStream resource = this.getClass().getResourceAsStream("/template/guild-not-supported.html")) { + botNotInGuildTemplate = new String(resource.readAllBytes()); + } catch (IOException | NullPointerException e) { + Main.LOGGER.warn("Failed to load template for guild not supported page", e); + } + this.botNotInGuildTemplate = botNotInGuildTemplate; + } + @NotNull @Override public Pattern pathPattern() { @@ -39,17 +61,18 @@ public class GetDiscordInviteByGuildId implements EndpointHandler { return; } - DiscordInviteManager inviteManager = Main.getDiscordInviteMenager(); GuildSettings settings = Main.getStorage().getGuildSettings(guildIdLong); - DiscordInvite invite = inviteManager.getInvite(guildIdLong); - if (invite == null) { - exchange.sendResponseHeaders(404, -1); // Not Found + if (!settings.invitesEnabled()) { + sendInvitesPausedTemplate(exchange); return; } - if (!settings.invitesEnabled()) { - exchange.sendResponseHeaders(401, -1); // Not Found + DiscordInviteManager inviteManager = Main.getDiscordInviteMenager(); + DiscordInvite invite = inviteManager.getInvite(guildIdLong); + + if (invite == null) { + sendBotNotInGuildTemplate(exchange); return; } @@ -72,10 +95,62 @@ public class GetDiscordInviteByGuildId implements EndpointHandler { exchange.sendResponseHeaders(307, -1); } } - - - } + private void sendInvitesPausedTemplate(HttpExchange exchange) throws IOException { + String message = "Guild you were invited to currently has invites disabled. Try again later."; + switch (exchange.getRequestHeaders().getFirst("Accept")) { + case "text/plain" -> { + exchange.getResponseHeaders().set("Content-Type", "text/plain; charset=UTF-8"); + + exchange.sendResponseHeaders(401, message.getBytes(StandardCharsets.UTF_8).length); + exchange.getResponseBody().write(message.getBytes(StandardCharsets.UTF_8)); + } + case "application/json" -> { + exchange.getResponseHeaders().set("Content-Type", "application/json; charset=UTF-8"); + String jsonResponse = "{\"error\": \"%s\"}".formatted(message); + exchange.sendResponseHeaders(401, jsonResponse.length()); + exchange.getResponseBody().write(jsonResponse.getBytes(StandardCharsets.UTF_8)); + } + default -> { + if (invitesDisabledTemplate != null) { + exchange.getResponseHeaders().set("Content-Type", "text/html; charset=UTF-8"); + exchange.sendResponseHeaders(401, invitesDisabledTemplate.getBytes(StandardCharsets.UTF_8).length); + exchange.getResponseBody().write(invitesDisabledTemplate.getBytes(StandardCharsets.UTF_8)); + exchange.getResponseBody().close(); + } else { + exchange.sendResponseHeaders(401, -1); + } + } + } + } + + private void sendBotNotInGuildTemplate(HttpExchange exchange) throws IOException { + String message = "Guild you were invited to is not supported by the bot. Try again later."; + switch (exchange.getRequestHeaders().getFirst("Accept")) { + case "text/plain" -> { + exchange.getResponseHeaders().set("Content-Type", "text/plain; charset=UTF-8"); + exchange.sendResponseHeaders(404, message.getBytes(StandardCharsets.UTF_8).length); + exchange.getResponseBody().write(message.getBytes(StandardCharsets.UTF_8)); + } + case "application/json" -> { + exchange.getResponseHeaders().set("Content-Type", "application/json; charset=UTF-8"); + String jsonResponse = "{\"error\": \"%s\"}".formatted(message); + exchange.sendResponseHeaders(404, jsonResponse.length()); + exchange.getResponseBody().write(jsonResponse.getBytes(StandardCharsets.UTF_8)); + } + default -> { + if (botNotInGuildTemplate != null) { + exchange.getResponseHeaders().set("Content-Type", "text/html; charset=UTF-8"); + exchange.sendResponseHeaders(404, botNotInGuildTemplate.getBytes(StandardCharsets.UTF_8).length); + exchange.getResponseBody().write(botNotInGuildTemplate.getBytes(StandardCharsets.UTF_8)); + exchange.getResponseBody().close(); + } else { + exchange.sendResponseHeaders(404, -1); + } + } + } + } + } diff --git a/src/main/resources/template/guild-not-supported.html b/src/main/resources/template/guild-not-supported.html new file mode 100644 index 0000000..d08fe3d --- /dev/null +++ b/src/main/resources/template/guild-not-supported.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + Discord Inviter + + + +
+
+

Inviter

+

Inviter bot is not present in the guild you're trying to join.

+ +
+
+ + diff --git a/src/main/resources/template/index.html b/src/main/resources/template/index.html index ceefbf1..a03818b 100644 --- a/src/main/resources/template/index.html +++ b/src/main/resources/template/index.html @@ -82,6 +82,9 @@ text-decoration: none; border-radius: 0.25rem; transition: background-color 0.2s ease; + border: none; + cursor: pointer; + font-size: 1rem; } [role="button"]:hover { diff --git a/src/main/resources/template/invites-paused.html b/src/main/resources/template/invites-paused.html new file mode 100644 index 0000000..ed552cf --- /dev/null +++ b/src/main/resources/template/invites-paused.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + Discord Inviter + + + +
+
+

Inviter

+

Guild you were invited to currently has invites disabled. Try again later.

+ +
+
+ +