Added API driven Rooms
This commit is contained in:
35
src/main/java/eu/mhsl/minenet/minigames/api/Controller.java
Normal file
35
src/main/java/eu/mhsl/minenet/minigames/api/Controller.java
Normal file
@ -0,0 +1,35 @@
|
||||
package eu.mhsl.minenet.minigames.api;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import spark.Request;
|
||||
import spark.Response;
|
||||
import spark.Route;
|
||||
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
|
||||
public abstract class Controller<Q, R> implements Route {
|
||||
private final Class<Q> requestType;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Controller() {
|
||||
this.requestType = ((Class<Q>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object handle(Request request, Response response) throws Exception {
|
||||
response.header("Access-Control-Allow-Origin", "*");
|
||||
response.header("Access-Control-Allow-Methods", "*");
|
||||
|
||||
Q req;
|
||||
|
||||
if(request.body().isEmpty()) {
|
||||
req = null;
|
||||
} else {
|
||||
req = new Gson().fromJson(request.body(), this.requestType);
|
||||
}
|
||||
|
||||
return new Gson().toJson(handle(req, response));
|
||||
}
|
||||
|
||||
public abstract R handle(Q request, Response response) throws Exception;
|
||||
}
|
@ -1,6 +1,35 @@
|
||||
package eu.mhsl.minenet.minigames.api;
|
||||
|
||||
import eu.mhsl.minenet.minigames.Main;
|
||||
import eu.mhsl.minenet.minigames.api.routes.closeRoom.CloseRoom;
|
||||
import eu.mhsl.minenet.minigames.api.routes.createRoom.CreateRoom;
|
||||
import eu.mhsl.minenet.minigames.api.routes.queueRoom.QueueRoom;
|
||||
import org.spongepowered.configurate.ConfigurationNode;
|
||||
|
||||
import static spark.Spark.*;
|
||||
|
||||
public class HttpServer {
|
||||
private static final ConfigurationNode apiConfig = Main.globalConfig.node("api");
|
||||
public HttpServer() {
|
||||
if(!apiConfig.node("enabled").getBoolean()) return;
|
||||
|
||||
port(apiConfig.node("port").getInt());
|
||||
initExceptionHandler(e -> e.printStackTrace(System.err));
|
||||
exception(Exception.class, (exception, request, response) -> {
|
||||
exception.printStackTrace(System.err);
|
||||
response.status(500);
|
||||
});
|
||||
|
||||
before((request, response) -> {
|
||||
String userKey = request.headers("Authorization");
|
||||
String serverKey = apiConfig.node("secret").getString();
|
||||
if(userKey != null && !userKey.equals(serverKey)) {
|
||||
halt(401, "Authorization header missing or wrong");
|
||||
}
|
||||
});
|
||||
|
||||
post("/room", new CreateRoom());
|
||||
delete("/room", new CloseRoom());
|
||||
post("/queueRoom", new QueueRoom());
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,17 @@
|
||||
package eu.mhsl.minenet.minigames.api;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public class QueuedPlayerRooms {
|
||||
private static final Map<UUID, UUID> playersToRoom = new HashMap<>();
|
||||
|
||||
public static void queuePlayer(UUID playerUUID, UUID roomUUID) {
|
||||
playersToRoom.put(playerUUID, roomUUID);
|
||||
}
|
||||
|
||||
public static UUID pullQueue(UUID playerUUID) {
|
||||
return playersToRoom.remove(playerUUID);
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package eu.mhsl.minenet.minigames.api.routes.closeRoom;
|
||||
|
||||
import eu.mhsl.minenet.minigames.api.Controller;
|
||||
import eu.mhsl.minenet.minigames.instance.room.Room;
|
||||
import spark.Response;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
record Req(UUID room) {}
|
||||
record Resp() {}
|
||||
public class CloseRoom extends Controller<Req, Resp> {
|
||||
@Override
|
||||
public Resp handle(Req request, Response response) throws Exception {
|
||||
Room.deleteRoom(Room.getRoom(request.room()).orElseThrow());
|
||||
return new Resp();
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package eu.mhsl.minenet.minigames.api.routes.createRoom;
|
||||
|
||||
import eu.mhsl.minenet.minigames.api.Controller;
|
||||
import eu.mhsl.minenet.minigames.instance.room.Room;
|
||||
import spark.Response;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
record Req() {}
|
||||
record Resp(UUID uuid) {}
|
||||
public class CreateRoom extends Controller<Req, Resp> {
|
||||
@Override
|
||||
public Resp handle(Req request, Response response) throws Exception {
|
||||
Room createdRoom = Room.createOwnerlessRoom();
|
||||
return new Resp(createdRoom.uuid);
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package eu.mhsl.minenet.minigames.api.routes.queueRoom;
|
||||
|
||||
import eu.mhsl.minenet.minigames.api.Controller;
|
||||
import eu.mhsl.minenet.minigames.api.QueuedPlayerRooms;
|
||||
import eu.mhsl.minenet.minigames.instance.room.Room;
|
||||
import spark.Response;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
record Req(UUID player, UUID room) {}
|
||||
record Resp() {}
|
||||
public class QueueRoom extends Controller<Req, Resp> {
|
||||
@Override
|
||||
public Resp handle(Req request, Response response) throws Exception {
|
||||
if(Room.getRoom(request.room()).isEmpty()) throw new Exception("Room not found");
|
||||
QueuedPlayerRooms.queuePlayer(request.player(), request.room());
|
||||
return new Resp();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user