Skip to content

Commit ad98cf3

Browse files
Added {guild_id}/metrics, {guild_id}/qotw/leaderboard & {guild_id}/{user_id} routes
1 parent ef5e6b6 commit ad98cf3

25 files changed

+396
-39
lines changed

build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ dependencies {
3333
// Discord OAuth2
3434
implementation("com.github.Mokulu:discord-oauth2-api:1.0.2")
3535

36+
// Caffeine (Caching Library)
37+
implementation("com.github.ben-manes.caffeine:caffeine:3.1.0")
38+
3639
implementation("com.google.code.gson:gson:2.9.0")
3740
implementation("org.yaml:snakeyaml:1.30")
3841
implementation("com.google.re2j:re2j:1.6")

src/main/java/net/javadiscord/javabot/Bot.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ public static void main(String[] args) throws Exception {
127127
dih4jda = DIH4JDABuilder.setJDA(jda)
128128
.setCommandsPackage("net.javadiscord.javabot")
129129
.setDefaultCommandType(RegistrationType.GLOBAL)
130+
.disableLogging()
130131
.build();
131132
SystemsConfig.ApiConfig apiConfig = config.getSystems().getApiConfig();
132133
oAuth = new DiscordOAuth(jda.getSelfUser().getApplicationId(), apiConfig.getClientSecret(), apiConfig.getRedirectUrl(), apiConfig.getScopes());
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package net.javadiscord.javabot.api.gson;
2+
3+
import com.google.gson.*;
4+
import org.jetbrains.annotations.NotNull;
5+
6+
import java.awt.*;
7+
import java.lang.reflect.Type;
8+
import java.time.LocalDateTime;
9+
import java.time.format.DateTimeFormatter;
10+
11+
public class GsonColorAdapter implements JsonSerializer<Color>, JsonDeserializer<Color> {
12+
13+
@Override
14+
public Color deserialize(@NotNull JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
15+
return Color.decode(jsonElement.getAsString());
16+
}
17+
18+
@Override
19+
public JsonPrimitive serialize(@NotNull Color color, Type type, JsonSerializationContext jsonSerializationContext) {
20+
return new JsonPrimitive("#" + Integer.toHexString(color.getRGB()).substring(2).toUpperCase());
21+
}
22+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package net.javadiscord.javabot.api.gson;
2+
3+
import com.google.gson.*;
4+
5+
import java.lang.reflect.Type;
6+
import java.time.LocalDateTime;
7+
import java.time.format.DateTimeFormatter;
8+
9+
public class GsonLocalDateTimeAdapter implements JsonSerializer<LocalDateTime>, JsonDeserializer<LocalDateTime> {
10+
11+
@Override
12+
public LocalDateTime deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
13+
return LocalDateTime.parse(jsonElement.getAsString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME);
14+
}
15+
16+
@Override
17+
public JsonElement serialize(LocalDateTime localDateTime, Type type, JsonSerializationContext jsonSerializationContext) {
18+
return new JsonPrimitive(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
19+
}
20+
}

src/main/java/net/javadiscord/javabot/api/model/QOTWLeaderboardData.java

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package net.javadiscord.javabot.api.response;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import net.javadiscord.javabot.api.gson.GsonColorAdapter;
6+
import net.javadiscord.javabot.api.gson.GsonLocalDateTimeAdapter;
7+
8+
import java.awt.*;
9+
import java.time.LocalDateTime;
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
13+
public class ApiResponseBuilder {
14+
15+
private final Gson gson;
16+
private final Map<String, Object> params;
17+
18+
public ApiResponseBuilder() {
19+
gson = new GsonBuilder()
20+
.setPrettyPrinting()
21+
.registerTypeAdapter(LocalDateTime.class, new GsonLocalDateTimeAdapter())
22+
.registerTypeAdapter(Color.class, new GsonColorAdapter())
23+
.create();
24+
params = new HashMap<>();
25+
}
26+
27+
public ApiResponseBuilder add(String param, Object value) {
28+
params.put(param, value);
29+
return this;
30+
}
31+
32+
public String build() {
33+
return gson.toJson(params);
34+
}
35+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package net.javadiscord.javabot.api.response;
2+
3+
public class ApiResponses {
4+
public static String INTERNAL_SERVER_ERROR = buildError("internal_server_error", "Internal server error encountered");
5+
public static String NOT_FOUND_ERROR = buildError("not_found", "Resource not found");
6+
public static String BAD_REQUEST = buildError("bad_request", "Bad Request");
7+
public static String REQUEST_METHOD_NOT_SUPPORTED = buildError("unsupported_method", "Request method not supported");
8+
public static String INVALID_GUILD_IN_REQUEST = buildError("invalid_guild", "Invalid 'guild_id' in request");
9+
public static String INVALID_USER_IN_REQUEST = buildError("invalid_user", "Invalid 'user_id' in request");
10+
public static String INVALID_NUMBER_IN_REQUEST = buildError("invalid_number", "Invalid number in request");
11+
12+
private static String buildError(String name, String description) {
13+
return new ApiResponseBuilder().add("error", name).add("error_description", description).build();
14+
}
15+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package net.javadiscord.javabot.api.routes;
2+
3+
import net.dv8tion.jda.api.JDA;
4+
import net.javadiscord.javabot.Bot;
5+
6+
public interface JDAEntity {
7+
default JDA getJDA() {
8+
return Bot.getDih4jda().getJDA();
9+
}
10+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package net.javadiscord.javabot.api.routes.metrics;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import net.dv8tion.jda.api.entities.Guild;
5+
import net.javadiscord.javabot.api.response.ApiResponseBuilder;
6+
import net.javadiscord.javabot.api.response.ApiResponses;
7+
import net.javadiscord.javabot.api.routes.JDAEntity;
8+
import net.javadiscord.javabot.api.routes.metrics.model.MetricsData;
9+
import org.springframework.http.HttpStatus;
10+
import org.springframework.http.MediaType;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.web.bind.annotation.GetMapping;
13+
import org.springframework.web.bind.annotation.PathVariable;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
/**
17+
* Handles all GET-Requests on the {guild_id}/metrics route.
18+
*/
19+
@Slf4j
20+
@RestController
21+
public class MetricsController implements JDAEntity {
22+
23+
/**
24+
* Serves metrics for the specified guild.
25+
*
26+
* @param guildId The guilds' id.
27+
* @return The {@link ResponseEntity}.
28+
*/
29+
@GetMapping(
30+
value = "{guild_id}/metrics",
31+
produces = MediaType.APPLICATION_JSON_VALUE
32+
)
33+
public ResponseEntity<String> getMetrics(@PathVariable(value = "guild_id") String guildId) {
34+
Guild guild = getJDA().getGuildById(guildId);
35+
if (guild == null) {
36+
return new ResponseEntity<>(ApiResponses.INVALID_GUILD_IN_REQUEST, HttpStatus.BAD_REQUEST);
37+
}
38+
MetricsData data = new MetricsData();
39+
data.setMemberCount(guild.getMemberCount());
40+
data.setOnlineCount(guild.retrieveMetaData().complete().getApproximatePresences());
41+
return new ResponseEntity<>(new ApiResponseBuilder().add("metrics", data).build(), HttpStatus.OK);
42+
}
43+
}

src/main/java/net/javadiscord/javabot/api/model/MetricsData.java renamed to src/main/java/net/javadiscord/javabot/api/routes/metrics/model/MetricsData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.javadiscord.javabot.api.model;
1+
package net.javadiscord.javabot.api.routes.metrics.model;
22

33
import lombok.Data;
44

0 commit comments

Comments
 (0)