From a9b0fef4d5f872637805ed37465b174e506801be Mon Sep 17 00:00:00 2001 From: null8626 Date: Thu, 9 Oct 2025 23:20:24 +0700 Subject: [PATCH] feat: add webhooks --- build.gradle | 23 ++++---- .../discordbots/api/client/Dropwizard.java | 45 ++++++++++++++ .../discordbots/api/client/EclipseJetty.java | 51 ++++++++++++++++ .../discordbots/api/client/SpringBoot.java | 58 +++++++++++++++++++ 4 files changed, 167 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/discordbots/api/client/Dropwizard.java create mode 100644 src/main/java/org/discordbots/api/client/EclipseJetty.java create mode 100644 src/main/java/org/discordbots/api/client/SpringBoot.java diff --git a/build.gradle b/build.gradle index 023b55d..d112be3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,22 @@ -group 'org.discordbots' +plugins { + id "java" +} -apply plugin: 'java' -apply plugin: 'maven' +group = 'org.discordbots' repositories { mavenCentral() } dependencies { - //Logger - compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' + implementation "org.slf4j:slf4j-api:2.0.17" - compile group: 'org.json', name: 'json', version: '20180130' - compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.11.0' - compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5' - compile group: 'com.fatboyindustrial.gson-javatime-serialisers', name: 'gson-javatime-serialisers', version: '1.1.1' -} + implementation "org.json:json:20250517" + implementation "com.squareup.okhttp3:okhttp:5.2.0" + implementation "com.google.code.gson:gson:2.13.2" + implementation "com.fatboyindustrial.gson-javatime-serialisers:gson-javatime-serialisers:1.1.2" + implementation "org.springframework.boot:spring-boot-starter-web:3.5.6" + implementation "jakarta.servlet:jakarta.servlet-api:6.1.0" + implementation "jakarta.ws.rs:jakarta.ws.rs-api:4.0.0" +} \ No newline at end of file diff --git a/src/main/java/org/discordbots/api/client/Dropwizard.java b/src/main/java/org/discordbots/api/client/Dropwizard.java new file mode 100644 index 0000000..58550ba --- /dev/null +++ b/src/main/java/org/discordbots/api/client/Dropwizard.java @@ -0,0 +1,45 @@ +package org.discordbots.api.client.webhooks; + +import java.io.IOException; +import java.io.InputStreamReader; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonIOException; +import com.google.gson.JsonSyntaxException; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; + +public abstract class Dropwizard { + private final Class aClass; + private final String authorization; + private final Gson gson; + + public Dropwizard(final Class aClass, final String authorization) { + this.aClass = aClass; + this.authorization = authorization; + this.gson = new GsonBuilder().create(); + } + + @POST + public Response handle(@Context HttpServletRequest request) { + final String authorizationHeader = request.getHeader("Authorization"); + + if (authorizationHeader == null || !authorizationHeader.equals(this.authorization)) { + return Response.status(Response.Status.UNAUTHORIZED).entity("Unauthorized").build(); + } + + try { + callback(gson.fromJson(new InputStreamReader(request.getInputStream()), aClass)); + + return Response.noContent().build(); + } catch (final JsonSyntaxException | JsonIOException | IOException ignored) {} + + return Response.status(Response.Status.BAD_REQUEST).entity("Bad request").build(); + } + + public abstract void callback(T data); +} \ No newline at end of file diff --git a/src/main/java/org/discordbots/api/client/EclipseJetty.java b/src/main/java/org/discordbots/api/client/EclipseJetty.java new file mode 100644 index 0000000..ee4112e --- /dev/null +++ b/src/main/java/org/discordbots/api/client/EclipseJetty.java @@ -0,0 +1,51 @@ +package org.discordbots.api.client.webhooks; + +import java.io.IOException; +import java.io.InputStreamReader; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonIOException; +import com.google.gson.JsonSyntaxException; + +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public abstract class EclipseJetty extends HttpServlet { + private final Class aClass; + private final String authorization; + private final Gson gson; + + public EclipseJetty(final Class aClass, final String authorization) { + this.aClass = aClass; + this.authorization = authorization; + this.gson = new GsonBuilder().create(); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + final String authorizationHeader = request.getHeader("Authorization"); + + if (authorizationHeader == null || !authorizationHeader.equals(this.authorization)) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.getWriter().write("Unauthorized"); + + return; + } + + try { + callback(gson.fromJson(new InputStreamReader(request.getInputStream()), aClass)); + + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + response.getWriter().write(""); + + return; + } catch (final JsonSyntaxException | JsonIOException | IOException ignored) {} + + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + response.getWriter().write("Bad request"); + } + + public abstract void callback(T data); +} \ No newline at end of file diff --git a/src/main/java/org/discordbots/api/client/SpringBoot.java b/src/main/java/org/discordbots/api/client/SpringBoot.java new file mode 100644 index 0000000..5177b96 --- /dev/null +++ b/src/main/java/org/discordbots/api/client/SpringBoot.java @@ -0,0 +1,58 @@ +package org.discordbots.api.client.webhooks; + +import java.io.IOException; +import java.io.InputStreamReader; + +import org.springframework.web.filter.OncePerRequestFilter; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonIOException; +import com.google.gson.JsonSyntaxException; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public abstract class SpringBoot extends OncePerRequestFilter { + private final Class aClass; + private final String authorization; + private final Gson gson; + + public SpringBoot(final Class aClass, final String authorization) { + this.aClass = aClass; + this.authorization = authorization; + this.gson = new GsonBuilder().create(); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + if (request.getMethod().equalsIgnoreCase("POST")) { + final String authorizationHeader = request.getHeader("Authorization"); + + if (authorizationHeader == null || !authorizationHeader.equals(this.authorization)) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.getWriter().write("Unauthorized"); + + return; + } + + try { + callback(gson.fromJson(new InputStreamReader(request.getInputStream()), aClass)); + + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + response.getWriter().write(""); + + return; + } catch (final JsonSyntaxException | JsonIOException | IOException ignored) {} + + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + response.getWriter().write("Bad request"); + } else { + filterChain.doFilter(request, response); + } + } + + public abstract void callback(T data); +} \ No newline at end of file