Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
<dependency>
<groupId>io.javalin</groupId>
<artifactId>javalin</artifactId>
<version>6.7.0</version>
<version>7.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
Expand Down
313 changes: 165 additions & 148 deletions src/main/java/pro/cloudnode/smp/smpcore/REST.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,172 @@
import java.util.UUID;

public class REST {
final @NotNull Javalin javalin = Javalin.create(config -> config.jsonMapper(new Mapper()));
final @NotNull Javalin javalin;

private void e404 (final @NotNull io.javalin.http.Context ctx) {
public REST(final int port) {

Check warning on line 21 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L21

Method REST length is 162 lines (max allowed is 150).
javalin = Javalin.create(config -> {
config.jsonMapper(new Mapper());

config.routes.before(ctx -> {
final @Nullable String origin = ctx.header("Origin");
ctx.header("Access-Control-Allow-Origin", origin == null ? "*" : origin);
ctx.header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
ctx.header("Access-Control-Allow-Headers", "*");
ctx.header("Access-Control-Allow-Credentials", "true");
ctx.header("Access-Control-Max-Age", "3600");
});

config.routes.get(
"/", ctx -> {
final @NotNull JsonObject obj = new JsonObject();
obj.addProperty("version", SMPCore.getInstance().getPluginMeta().getVersion());
obj.addProperty("time", SMPCore.gameTime().getTime());
ctx.json(obj);
}
);

config.routes.get(
"/members", ctx -> {
final @Nullable String filter = ctx.queryParam("filter");
final @Nullable String limitString = ctx.queryParam("limit");
final @Nullable String pageString = ctx.queryParam("page");
final @Nullable String include = ctx.queryParam("include");

final @Nullable Integer limit;
if (limitString == null)
limit = null;
else {
@Nullable Integer t = null;
try {
t = Integer.parseInt(limitString);
}
catch (final @NotNull NumberFormatException ignored) {}
limit = t;
}

final int page;
if (pageString == null)
page = 1;
else {
int t;
try {
t = Integer.parseInt(pageString);
}
catch (final @NotNull NumberFormatException ignored) {
t = 1;
}
page = t;
}

final @NotNull Set<@NotNull Member> members = limit == null ? Member.get()
: Member.get(limit, page);
final @NotNull JsonArray arr = new JsonArray();
for (final @NotNull Member member : members) {
if (filter != null)
switch (filter) {
case "online":

Check warning on line 82 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L82

The String "online" appears 2 times in the file.
if (member.staff || !member.player().isOnline())
continue;
case "offline":
if (!member.staff && member.player().isOnline())
continue;
case "banned":

Check warning on line 88 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L88

The String "banned" appears 2 times in the file.
if (!member.player().isBanned())
continue;
}
final @NotNull JsonObject m = getMemberObject(member);
if (include != null) {
switch (include) {
case "nation" -> {

Check warning on line 95 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L95

The String "nation" appears 5 times in the file.
final @NotNull Optional<@NotNull Nation> optionalNation = member.nation();
if (optionalNation.isEmpty())
m.add("nation", null);
else
m.add("nation", getNationObject(optionalNation.get()));
}
}
}
arr.add(m);
}
ctx.json(arr);
}
);

config.routes.get(
"/members/{uuid}", ctx -> {
final @NotNull UUID uuid;
try {
uuid = UUID.fromString(ctx.pathParam("uuid"));

Check warning on line 114 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L114

The String "uuid" appears 3 times in the file.
}
catch (final @NotNull IllegalArgumentException e) {
e404(ctx);
return;
}
final @NotNull OfflinePlayer offlinePlayer = SMPCore.getInstance().getServer()
.getOfflinePlayer(uuid);
final @NotNull Optional<@NotNull Member> member = Member.get(offlinePlayer);
if (member.isEmpty()) {
e404(ctx);
return;
}
final @NotNull Set<@NotNull Member> alts = member.get().getAlts();
final @NotNull JsonObject obj = getMemberObject(member.get());
final @NotNull JsonArray altsArray = new JsonArray();
for (final @NotNull Member alt : alts) {
final @NotNull JsonObject altObj = new JsonObject();
final @NotNull OfflinePlayer player = alt.player();
altObj.addProperty("uuid", alt.uuid.toString());
altObj.addProperty("name", CachedProfile.getName(player));

Check warning on line 134 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L134

The String "name" appears 3 times in the file.
altObj.addProperty("nation", alt.nationID);
altObj.addProperty("added", alt.added.getTime());

Check warning on line 136 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L136

The String "added" appears 2 times in the file.
altObj.addProperty("lastSeen", alt.staff ? 0 : player.getLastSeen());

Check warning on line 137 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L137

The String "lastSeen" appears 2 times in the file.
altsArray.add(altObj);
}
obj.add("alts", altsArray);
ctx.json(obj);
}
);

config.routes.get(
"/nations", ctx -> {
final @NotNull Set<@NotNull Nation> nations = Nation.get();
final @NotNull JsonArray arr = new JsonArray();
for (final @NotNull Nation nation : nations)
arr.add(getNationObject(nation));
ctx.json(arr);
}
);

config.routes.get(
"/nations/{id}", ctx -> {
final @Nullable String include = ctx.queryParam("include");

final @NotNull Optional<@NotNull Nation> nation = Nation.get(ctx.pathParam("id"));

Check warning on line 159 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L159

The String "id" appears 2 times in the file.
if (nation.isEmpty()) {
e404(ctx);
return;
}
final @NotNull JsonObject obj = getNationObject(nation.get());

if (include != null) {
switch (include) {
case "members" -> {

Check warning on line 168 in src/main/java/pro/cloudnode/smp/smpcore/REST.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/pro/cloudnode/smp/smpcore/REST.java#L168

The String "members" appears 3 times in the file.
final @NotNull JsonArray arr = new JsonArray();
final @NotNull Set<@NotNull Member> members = nation.get().citizens();
for (final @NotNull Member member : members)
arr.add(getMemberObject(member));
obj.add("members", arr);
}
}
}

ctx.json(obj);
}
);
}).start(port);
}

private void e404(final @NotNull io.javalin.http.Context ctx) {
ctx.status(404);
final @NotNull JsonObject obj = new JsonObject();
obj.addProperty("error", "not found");
Expand Down Expand Up @@ -59,152 +222,6 @@
return obj;
}

public REST(final int port) {
javalin.before(ctx -> {
final @Nullable String origin = ctx.header("Origin");
ctx.header("Access-Control-Allow-Origin", origin == null ? "*" : origin);
ctx.header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
ctx.header("Access-Control-Allow-Headers", "*");
ctx.header("Access-Control-Allow-Credentials", "true");
ctx.header("Access-Control-Max-Age", "3600");
});

javalin.get("/", ctx -> {
final @NotNull JsonObject obj = new JsonObject();
obj.addProperty("version", SMPCore.getInstance().getPluginMeta().getVersion());
obj.addProperty("time", SMPCore.gameTime().getTime());
ctx.json(obj);
});

javalin.get("/members", ctx -> {
final @Nullable String filter = ctx.queryParam("filter");
final @Nullable String limitString = ctx.queryParam("limit");
final @Nullable String pageString = ctx.queryParam("page");
final @Nullable String include = ctx.queryParam("include");

final @Nullable Integer limit;
if (limitString == null) limit = null;
else {
@Nullable Integer t = null;
try {
t = Integer.parseInt(limitString);
}
catch (final @NotNull NumberFormatException ignored) {}
limit = t;
}

final int page;
if (pageString == null) page = 1;
else {
int t;
try {
t = Integer.parseInt(pageString);
}
catch (final @NotNull NumberFormatException ignored) {
t = 1;
}
page = t;
}

final @NotNull Set<@NotNull Member> members = limit == null ? Member.get() : Member.get(limit, page);
final @NotNull JsonArray arr = new JsonArray();
for (final @NotNull Member member : members) {
if (filter != null)
switch (filter) {
case "online":
if (member.staff || !member.player().isOnline())
continue;
case "offline":
if (!member.staff && member.player().isOnline())
continue;
case "banned":
if (!member.player().isBanned())
continue;
}
final @NotNull JsonObject m = getMemberObject(member);
if (include != null) {
switch (include) {
case "nation" -> {
final @NotNull Optional<@NotNull Nation> optionalNation = member.nation();
if (optionalNation.isEmpty()) m.add("nation", null);
else m.add("nation", getNationObject(optionalNation.get()));
}
}
}
arr.add(m);
}
ctx.json(arr);
});

javalin.get("/members/{uuid}", ctx -> {
final @NotNull UUID uuid;
try {
uuid = UUID.fromString(ctx.pathParam("uuid"));
}
catch (final @NotNull IllegalArgumentException e) {
e404(ctx);
return;
}
final @NotNull OfflinePlayer offlinePlayer = SMPCore.getInstance().getServer()
.getOfflinePlayer(uuid);
final @NotNull Optional<@NotNull Member> member = Member.get(offlinePlayer);
if (member.isEmpty()) {
e404(ctx);
return;
}
final @NotNull Set<@NotNull Member> alts = member.get().getAlts();
final @NotNull JsonObject obj = getMemberObject(member.get());
final @NotNull JsonArray altsArray = new JsonArray();
for (final @NotNull Member alt : alts) {
final @NotNull JsonObject altObj = new JsonObject();
final @NotNull OfflinePlayer player = alt.player();
altObj.addProperty("uuid", alt.uuid.toString());
altObj.addProperty("name", CachedProfile.getName(player));
altObj.addProperty("nation", alt.nationID);
altObj.addProperty("added", alt.added.getTime());
altObj.addProperty("lastSeen", alt.staff ? 0 : player.getLastSeen());
altsArray.add(altObj);
}
obj.add("alts", altsArray);
ctx.json(obj);
});

javalin.get("/nations", ctx -> {
final @NotNull Set<@NotNull Nation> nations = Nation.get();
final @NotNull JsonArray arr = new JsonArray();
for (final @NotNull Nation nation : nations)
arr.add(getNationObject(nation));
ctx.json(arr);
});

javalin.get("/nations/{id}", ctx -> {
final @Nullable String include = ctx.queryParam("include");

final @NotNull Optional<@NotNull Nation> nation = Nation.get(ctx.pathParam("id"));
if (nation.isEmpty()) {
e404(ctx);
return;
}
final @NotNull JsonObject obj = getNationObject(nation.get());

if (include != null) {
switch (include) {
case "members" -> {
final @NotNull JsonArray arr = new JsonArray();
final @NotNull Set<@NotNull Member> members = nation.get().citizens();
for (final @NotNull Member member : members)
arr.add(getMemberObject(member));
obj.add("members", arr);
}
}
}

ctx.json(obj);
});

javalin.start(port);
}

public static final class Mapper implements JsonMapper {
private final @NotNull Gson gson = new GsonBuilder().serializeNulls().create();

Expand Down
Loading