summaryrefslogtreecommitdiff
path: root/domain
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2021-07-27 21:40:04 +0200
committerMike Vink <mike1994vink@gmail.com>2021-07-27 21:40:04 +0200
commit4d84c12df52c89abb7d3ba9f565753116b99dbf0 (patch)
treee241b91506738628b919c2af190ed14ac72c3f06 /domain
parent019ea5fcefa16c2746fb2c7d6fa4a29d18b8d53b (diff)
feat(): interaction handshaker setup
Diffstat (limited to 'domain')
-rw-r--r--domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java7
-rw-r--r--domain/src/main/java/akkamon/domain/AkkamonNexus.java45
-rw-r--r--domain/src/main/java/akkamon/domain/InteractionHandshaker.java57
3 files changed, 103 insertions, 6 deletions
diff --git a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java
index 05efc32..c3ed445 100644
--- a/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java
+++ b/domain/src/main/java/akkamon/domain/AkkamonMessageEngine.java
@@ -1,14 +1,19 @@
package akkamon.domain;
+import java.util.List;
import java.util.Map;
public interface AkkamonMessageEngine {
// broadcasts position info to WebSocket Clients
void broadCastHeartBeatToScene(String sceneId, Map<String, AkkamonNexus.MovementQueueReading> trainerPositions);
- void registerTrainerSessionToScene(String sceneId, AkkamonSession session);
+ void broadCastInteractionRequestToSessionWithTrainerIds(List<String> trainerIds, String type, String trainerId, long requestId);
+
+ void registerTrainerSessionToSceneAndTrainerIdMaps(String sceneId, AkkamonSession session);
void removeTrainerSessionFromScene(String sceneId, AkkamonSession session);
void trainerDisconnected(AkkamonSession session);
+
+ void broadCastMessageToSessionsWithTrainerIds(List<String> needConfirmation, String type, String trainerId, long requestid);
}
diff --git a/domain/src/main/java/akkamon/domain/AkkamonNexus.java b/domain/src/main/java/akkamon/domain/AkkamonNexus.java
index 4958e21..edc8c05 100644
--- a/domain/src/main/java/akkamon/domain/AkkamonNexus.java
+++ b/domain/src/main/java/akkamon/domain/AkkamonNexus.java
@@ -7,16 +7,34 @@ import akka.actor.typed.javadsl.ActorContext;
import akka.actor.typed.javadsl.Behaviors;
import akka.actor.typed.javadsl.Receive;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Queue;
+import java.time.Duration;
+import java.util.*;
public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> {
public interface Command {}
+ public static class RequestInteraction
+ implements Command {
+
+ public long requestId;
+ public String type;
+ public String sceneId;
+ public String trainerId;
+ public List<String> forwardTo;
+ public ActorRef<Command> replyTo;
+
+ public RequestInteraction(long requestId, String type, String sceneId, String trainerId, List<String> forwardTo, ActorRef<Command> replyTo) {
+ this.requestId = requestId;
+ this.type = type;
+ this.sceneId = sceneId;
+ this.trainerId = trainerId;
+ this.forwardTo = forwardTo;
+ this.replyTo = replyTo;
+ }
+ }
+
public static class RequestTrainerRegistration
implements AkkamonNexus.Command, SceneTrainerGroup.Command {
public String trainerId;
@@ -220,9 +238,26 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> {
.onMessage(RequestStartMoving.class, this::onStartMoving)
.onMessage(RequestStopMoving.class, this::onStopMoving)
.onMessage(RequestNewTilePos.class, this::onNewTilePos)
+ .onMessage(RequestInteraction.class, this::onInteractionRequest)
.build();
}
+ private AkkamonNexus onInteractionRequest(RequestInteraction interactionRequest) {
+ List<String> needConfirmation = interactionRequest.forwardTo;
+ messageEngine.broadCastMessageToSessionsWithTrainerIds(needConfirmation, interactionRequest.type, interactionRequest.trainerId, interactionRequest.requestId);
+
+ ActorRef<InteractionHandshaker.Command> getContext().spawn(
+ InteractionHandshaker.create(
+ interactionRequest.trainerId,
+ interactionRequest.forwardTo,
+ interactionRequest.requestId,
+ interactionRequest.replyTo,
+ Duration.ofSeconds(20)
+ )
+ );
+ return this;
+ }
+
private AkkamonNexus onTrainerOffline(RespondTrainerOffline trainerOfflineMsg) {
getContext().getLog().info("Removing {} from akkamon sessions!", trainerOfflineMsg.session.getTrainerId());
messageEngine.removeTrainerSessionFromScene(trainerOfflineMsg.sceneId, trainerOfflineMsg.session);
@@ -306,7 +341,7 @@ public class AkkamonNexus extends AbstractBehavior<AkkamonNexus.Command> {
// TODO test when registration fails?
getContext().getLog().info("Adding {} to scene {} Live AkkamonSessions in Messaging Engine", reply.trainerId, reply.sceneId);
reply.session.setTrainerId(reply.trainerId);
- messageEngine.registerTrainerSessionToScene(reply.sceneId, reply.session);
+ messageEngine.registerTrainerSessionToSceneAndTrainerIdMaps(reply.sceneId, reply.session);
return this;
}
diff --git a/domain/src/main/java/akkamon/domain/InteractionHandshaker.java b/domain/src/main/java/akkamon/domain/InteractionHandshaker.java
new file mode 100644
index 0000000..78d63de
--- /dev/null
+++ b/domain/src/main/java/akkamon/domain/InteractionHandshaker.java
@@ -0,0 +1,57 @@
+package akkamon.domain;
+
+import akka.actor.Timers;
+import akka.actor.typed.ActorRef;
+import akka.actor.typed.Behavior;
+import akka.actor.typed.javadsl.*;
+
+import java.time.Duration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class InteractionHandshaker extends AbstractBehavior<InteractionHandshaker.Command> {
+
+ public interface Command {
+ }
+
+
+ public static Behavior<Command> create(
+ String trainerId,
+ List<String> needingConfirmation,
+ long requestId,
+ ActorRef<AkkamonNexus.Command> replyTo,
+ Duration timeout) {
+
+ return Behaviors.setup(
+ context -> Behaviors.withTimers(
+ timers -> new InteractionHandshaker(
+ context,
+ trainerId,
+ new HashSet(needingConfirmation),
+ requestId,
+ replyTo,
+ timeout,
+ timers
+ )
+ )
+ );
+
+ }
+
+ public InteractionHandshaker(ActorContext<Command> context,
+ String trainerId,
+ Set<String> needingConfirmation,
+ long requestId,
+ ActorRef<AkkamonNexus.Command> replyTo,
+ Duration timeout,
+ TimerScheduler<Command> timers) {
+ super(context);
+ }
+
+ @Override
+ public Receive<Command> createReceive() {
+ return null;
+ }
+
+}