From 4d84c12df52c89abb7d3ba9f565753116b99dbf0 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Tue, 27 Jul 2021 21:40:04 +0200 Subject: feat(): interaction handshaker setup --- api/src/main/java/akkamon/api/MessagingEngine.java | 56 +++++++++++++++++----- api/src/main/java/akkamon/api/models/Event.java | 1 + .../main/java/akkamon/api/models/EventType.java | 3 ++ .../main/java/akkamon/api/models/Interaction.java | 21 ++++++++ .../akkamon/api/models/InteractionRequest.java | 14 ++++++ 5 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 api/src/main/java/akkamon/api/models/Interaction.java create mode 100644 api/src/main/java/akkamon/api/models/InteractionRequest.java (limited to 'api/src/main/java') diff --git a/api/src/main/java/akkamon/api/MessagingEngine.java b/api/src/main/java/akkamon/api/MessagingEngine.java index 191ac1a..3cdd7be 100644 --- a/api/src/main/java/akkamon/api/MessagingEngine.java +++ b/api/src/main/java/akkamon/api/MessagingEngine.java @@ -4,6 +4,7 @@ import akka.actor.typed.ActorRef; import akka.actor.typed.ActorSystem; import akkamon.api.models.Event; import akkamon.api.models.HeartBeatEvent; +import akkamon.api.models.InteractionRequest; import akkamon.api.models.TrainerRegistrationReplyEvent; import akkamon.domain.AkkamonMessageEngine; import akkamon.domain.AkkamonNexus; @@ -17,6 +18,7 @@ import java.util.concurrent.TimeUnit; public class MessagingEngine implements AkkamonMessageEngine { private Map> sceneIdToAkkamonSessions = new HashMap<>(); + private Map trainerIdToAkkamonSessions = new HashMap<>(); private Gson gson = new Gson(); private ActorRef system; @@ -45,8 +47,8 @@ public class MessagingEngine implements AkkamonMessageEngine { public void broadCastHeartBeatToScene(String sceneId, Map trainerPositions) { Set sceneSessions = sceneIdToAkkamonSessions.get(sceneId); - System.out.println(sceneSessions); - System.out.println(sceneIdToAkkamonSessions.keySet()); + // System.out.println(sceneSessions); + // System.out.println(sceneIdToAkkamonSessions.keySet()); if (sceneSessions != null) { for (AkkamonSession session : sceneSessions) { Map withoutSelf = new HashMap<>(trainerPositions); @@ -55,8 +57,8 @@ public class MessagingEngine implements AkkamonMessageEngine { withoutSelf ); String heartBeatMessage = gson.toJson(heartBeat); - System.out.println("Sending to " + session.getTrainerId()); - System.out.println(heartBeatMessage); + // System.out.println("Sending to " + session.getTrainerId()); + // System.out.println(heartBeatMessage); session.send( heartBeatMessage ); @@ -65,20 +67,40 @@ public class MessagingEngine implements AkkamonMessageEngine { } @Override - public void registerTrainerSessionToScene(String sceneId, AkkamonSession session) { + public void broadCastInteractionRequestToSessionWithTrainerIds(List trainerIds, String type, String trainerId, long requestId) { + for (String id : trainerIds) { + AkkamonSession session = trainerIdToAkkamonSessions.get(id); + if (session != null) { + session.send(gson.toJson( + new InteractionRequest( + type, + trainerId, + requestId + ) + )); + } + } + } + + @Override + public void registerTrainerSessionToSceneAndTrainerIdMaps(String sceneId, AkkamonSession session) { System.out.println("Registering session to scene " + sceneId); - Set sessionsInScene = sceneIdToAkkamonSessions.get(sceneId); - if (sessionsInScene != null) { - sessionsInScene.add(session); + Set sceneIdMapping = sceneIdToAkkamonSessions.get(sceneId); + AkkamonSession trainerIdMapping = trainerIdToAkkamonSessions.get(session.getTrainerId()); + if (sceneIdMapping != null) { + sceneIdMapping.add(session); } else { - sessionsInScene = new HashSet<>(); - sessionsInScene.add(session); + sceneIdMapping = new HashSet<>(); + sceneIdMapping.add(session); sceneIdToAkkamonSessions.put(sceneId, - sessionsInScene + sceneIdMapping ); System.out.println(sceneIdToAkkamonSessions.keySet()); } + trainerIdToAkkamonSessions.put(session.getTrainerId(), session); + System.out.println(trainerIdToAkkamonSessions); + System.out.println("Sending trainerId: " + session.getTrainerId()); // TODO what if registration goes wrong ... session.send( @@ -113,6 +135,18 @@ public class MessagingEngine implements AkkamonMessageEngine { String sceneId = "DemoScene"; switch (event.type) { + case INTERACTION_REQUEST: + System.out.println("received interaction request"); + System.out.println(event.interaction); + system.tell(new AkkamonNexus.RequestInteraction( + UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE, + event.type.name(), + event.sceneId, + event.interaction.requestingTrainerId, + event.interaction.receivingTrainerIds, + system + )); + break; case START_MOVING: system.tell(new AkkamonNexus.RequestStartMoving( UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE, diff --git a/api/src/main/java/akkamon/api/models/Event.java b/api/src/main/java/akkamon/api/models/Event.java index 8354b10..646e671 100644 --- a/api/src/main/java/akkamon/api/models/Event.java +++ b/api/src/main/java/akkamon/api/models/Event.java @@ -9,4 +9,5 @@ public class Event { public Direction direction; public String sceneId; public TilePos tilePos; + public Interaction interaction; } diff --git a/api/src/main/java/akkamon/api/models/EventType.java b/api/src/main/java/akkamon/api/models/EventType.java index 67bb28d..610bd62 100644 --- a/api/src/main/java/akkamon/api/models/EventType.java +++ b/api/src/main/java/akkamon/api/models/EventType.java @@ -24,4 +24,7 @@ public enum EventType { @SerializedName("SocketClosed") SOCKET_CLOSED, + @SerializedName("InteractionRequestEvent") + INTERACTION_REQUEST + } diff --git a/api/src/main/java/akkamon/api/models/Interaction.java b/api/src/main/java/akkamon/api/models/Interaction.java new file mode 100644 index 0000000..5bc9d17 --- /dev/null +++ b/api/src/main/java/akkamon/api/models/Interaction.java @@ -0,0 +1,21 @@ +package akkamon.api.models; + +import java.util.List; + +public class Interaction { + public String type; + public String requestingTrainerId; + public List receivingTrainerIds; + + public Interaction(String type, String requestingTrainerId, List receivingTrainerIds) { + this.type = type; + this.requestingTrainerId = requestingTrainerId; + this.receivingTrainerIds = receivingTrainerIds; + } + + public String toString() { + return "interaction={\n\ttype: " + this.type + ",\n" + + "\trequestingTrainerId: " + this.requestingTrainerId + ",\n" + + "\treceivingTrainerIds: " + this.receivingTrainerIds + "\n}"; + } +} diff --git a/api/src/main/java/akkamon/api/models/InteractionRequest.java b/api/src/main/java/akkamon/api/models/InteractionRequest.java new file mode 100644 index 0000000..32f4974 --- /dev/null +++ b/api/src/main/java/akkamon/api/models/InteractionRequest.java @@ -0,0 +1,14 @@ +package akkamon.api.models; + +public class InteractionRequest extends Event { + + public String type; + public String trainerId; + public long requestId; + + public InteractionRequest(String type, String trainerId, long requestId) { + this.type = type; + this.trainerId = trainerId; + this.requestId = requestId; + } +} -- cgit v1.2.3