From 5f016158e73a7828c9dec1810e54bbe2550d8c20 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Tue, 20 Jul 2021 17:41:58 +0200 Subject: feat(): trainer registration to actor sys --- api/build.gradle | 11 ++- .../java/akkamon/api/AkkamonMessageEngine.java | 6 ++ api/src/main/java/akkamon/api/AkkamonSession.java | 10 -- api/src/main/java/akkamon/api/App.java | 6 +- api/src/main/java/akkamon/api/EventSocket.java | 37 +------- api/src/main/java/akkamon/api/MessagingEngine.java | 101 +-------------------- 6 files changed, 28 insertions(+), 143 deletions(-) create mode 100644 api/src/main/java/akkamon/api/AkkamonMessageEngine.java (limited to 'api') diff --git a/api/build.gradle b/api/build.gradle index 28ec919..188c417 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -4,6 +4,11 @@ plugins { id 'application' } +def versions = [ + ScalaBinary: "2.13" +] + + repositories { jcenter() mavenCentral() @@ -11,6 +16,9 @@ repositories { dependencies { + implementation platform("com.typesafe.akka:akka-bom_${versions.ScalaBinary}:2.6.15") + implementation "com.typesafe.akka:akka-actor-typed_${versions.ScalaBinary}" + // Use the Jersey framework to make writing and testing servlets easier. implementation 'org.glassfish.jersey.containers:jersey-container-servlet-core:+' implementation 'org.glassfish.jersey.containers:jersey-container-jetty-http:+' @@ -31,9 +39,6 @@ dependencies { implementation 'com.google.code.gson:gson:2.8.7' - // Reference the domain subproject. - implementation project(':domain') - // Use JUnit Jupiter API for testing. testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' // Also use the Mockito mocking framework to mock simple server functionality. diff --git a/api/src/main/java/akkamon/api/AkkamonMessageEngine.java b/api/src/main/java/akkamon/api/AkkamonMessageEngine.java new file mode 100644 index 0000000..2bbe0c8 --- /dev/null +++ b/api/src/main/java/akkamon/api/AkkamonMessageEngine.java @@ -0,0 +1,6 @@ +package akkamon.api; + +public interface AkkamonMessageEngine { + // broadcasts position info to WebSocket Clients + void broadCastGridPosition(); +} diff --git a/api/src/main/java/akkamon/api/AkkamonSession.java b/api/src/main/java/akkamon/api/AkkamonSession.java index 55ca3c3..048071c 100644 --- a/api/src/main/java/akkamon/api/AkkamonSession.java +++ b/api/src/main/java/akkamon/api/AkkamonSession.java @@ -1,14 +1,4 @@ package akkamon.api; -import akkamon.api.models.User; - public interface AkkamonSession { - - void receiveGameState(String gameState); - - void disconnect(int statusCode, String message); - - void setCurrentUser(User user); - - User getUser(); } diff --git a/api/src/main/java/akkamon/api/App.java b/api/src/main/java/akkamon/api/App.java index 989562b..5d9add9 100644 --- a/api/src/main/java/akkamon/api/App.java +++ b/api/src/main/java/akkamon/api/App.java @@ -6,15 +6,19 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.websocket.server.JettyWebSocketServlet; import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer; -import org.glassfish.jersey.servlet.ServletContainer; public class App { + public static MessagingEngine messagingEngine; + public static void main(String[] args) { Server server = startServer(8080); ServletContextHandler context = createStatefulContext(server); + messagingEngine = new MessagingEngine(); + + // websocket behaviour // Configure specific websocket behavior diff --git a/api/src/main/java/akkamon/api/EventSocket.java b/api/src/main/java/akkamon/api/EventSocket.java index fdefee3..092d763 100644 --- a/api/src/main/java/akkamon/api/EventSocket.java +++ b/api/src/main/java/akkamon/api/EventSocket.java @@ -1,18 +1,14 @@ package akkamon.api; -import java.io.IOException; -import java.util.concurrent.CountDownLatch; - -import akkamon.api.models.User; -import org.eclipse.jetty.websocket.api.WebSocketAdapter; import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.WebSocketAdapter; + +import java.util.concurrent.CountDownLatch; public class EventSocket extends WebSocketAdapter implements AkkamonSession { private final CountDownLatch closureLatch = new CountDownLatch(1); - public User user; - @Override public void onWebSocketConnect(Session sess) { @@ -25,7 +21,7 @@ public class EventSocket extends WebSocketAdapter implements AkkamonSession { { super.onWebSocketText(message); System.out.println("Received TEXT message: " + message); - MessagingEngine.getInstance().incoming(this, message); + App.messagingEngine.incoming(this, message); } @@ -35,7 +31,6 @@ public class EventSocket extends WebSocketAdapter implements AkkamonSession { super.onWebSocketClose(statusCode, reason); System.out.println("Socket Closed: [" + statusCode + "] " + reason); closureLatch.countDown(); - MessagingEngine.getInstance().sessionOffline(this); } @Override @@ -50,28 +45,4 @@ public class EventSocket extends WebSocketAdapter implements AkkamonSession { System.out.println("Awaiting closure from remote"); closureLatch.await(); } - - @Override - public void receiveGameState(String gameState) { - try { - getRemote().sendString(gameState); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void disconnect(int statusCode, String message) { - getSession().close(statusCode, message); - } - - @Override - public void setCurrentUser(User user) { - this.user = user; - } - - @Override - public User getUser() { - return user; - } } diff --git a/api/src/main/java/akkamon/api/MessagingEngine.java b/api/src/main/java/akkamon/api/MessagingEngine.java index 1627ad4..bbab97e 100644 --- a/api/src/main/java/akkamon/api/MessagingEngine.java +++ b/api/src/main/java/akkamon/api/MessagingEngine.java @@ -1,120 +1,29 @@ package akkamon.api; -import akkamon.api.models.*; -import akkamon.domain.AkkamonImpl; -import akkamon.domain.Trainer; +import akkamon.api.models.GameState; import com.google.gson.Gson; import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -public class MessagingEngine { +public class MessagingEngine implements AkkamonMessageEngine { private HashMap akkamonSessions = new HashMap<>(); private static MessagingEngine instance; private Gson gson = new Gson(); - public static MessagingEngine getInstance() { - if (instance == null) { - instance = new MessagingEngine(); - return instance; - } - return instance; - } - public MessagingEngine() { - ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2); - executor.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - emitGameState(); - } - }, 0, 200, TimeUnit.MILLISECONDS); - } - void emitGameState() { - HashMap trainers = AkkamonImpl.getInstance().getDummyTrainersCollection(); - - if (akkamonSessions.size() == 1) { - AkkamonSession session = akkamonSessions.get("Ash"); - - GameState gameState = new GameState(); - // dummy - gameState.setCurrentPlayer("Ash", trainers); - - Event event = new Event("serverSidePosUpdate", gameState); - - session.receiveGameState(gson.toJson(event)); - - } else if (akkamonSessions.size() == 2) { - for (String name: akkamonSessions.keySet()) { - AkkamonSession session = akkamonSessions.get(name); - - GameState gameState = new GameState(); - // dummy - gameState.setCurrentPlayer(name, trainers); - gameState.setRemotePlayers(trainers); - - Event event = new Event("serverSidePosUpdate", gameState); - - session.receiveGameState(gson.toJson(event)); - } - } - - // for (Map.Entry sess: akkamonSessions.entrySet()) { - - // User user = sess.getKey(); - // AkkamonSession session = sess.getValue(); - - // GameState gameState = new GameState(); - // // dummy - // gameState.setCurrentPlayer(user.name, trainers); - - // session.receiveGameState(gson.toJson(gameState)); - // } + @Override + public void broadCastGridPosition() { } void incoming(AkkamonSession session, String message) { - Event event = gson.fromJson(message, Event.class); - switch (event.type) { - case "login": - login(session, event.user); - break; - case "clientSidePosUpdate": - updatePositions(event.gameState); - break; - } + } private void updatePositions(GameState gameState) { - Player current = gameState.currentPlayer; - if (gameState.currentPlayer != null) { - AkkamonImpl.getInstance().updateTrainerPosition(current.name, current.position.x, current.position.y); - } - } - private void login(AkkamonSession session, User user) { - if (user == null) { - session.disconnect(401, "Give username and password"); - } - System.out.println("Currrent connections: " + akkamonSessions.size()); - if (akkamonSessions.size() == 0) { - akkamonSessions.put("Ash", session); - System.out.println("After adding ash!: " + akkamonSessions.size()); - session.setCurrentUser(new User("Ash", "")); - } else if (akkamonSessions.size() == 1) { - akkamonSessions.put("Misty", session); - session.setCurrentUser(new User("Misty", "")); - } - AkkamonImpl.getInstance().newPlayerConnected(user.name, user.password); - System.out.println("Emitting gameState!"); - emitGameState(); } - public void sessionOffline(AkkamonSession session) { - akkamonSessions.remove(session.getUser().name); - } } -- cgit v1.2.3