Change to update world by scene and room id
authorgparant <g.parant@thecodingmachine.com>
Sun, 10 May 2020 17:45:17 +0000 (19:45 +0200)
committergparant <g.parant@thecodingmachine.com>
Sun, 10 May 2020 17:45:17 +0000 (19:45 +0200)
back/src/Controller/IoSocketController.ts
back/src/Model/Websocket/ExtRooms.ts [moved from back/src/Model/Websocket/ExtRoom.ts with 88% similarity]

index 75eb8a9078ebd9d28b5f23be4e9d1fe273f2a713..e9c86a3faa8e3b41622ca6b170283db67e400e3f 100644 (file)
@@ -5,7 +5,7 @@ import {MessageUserPosition} from "../Model/Websocket/MessageUserPosition"; //TO
 import {ExSocketInterface} from "../Model/Websocket/ExSocketInterface"; //TODO fix import by "_Model/.."
 import Jwt, {JsonWebTokenError} from "jsonwebtoken";
 import {SECRET_KEY, MINIMUM_DISTANCE, GROUP_RADIUS} from "../Enum/EnvironmentVariable"; //TODO fix import by "_Enum/..."
-import {ExtRooms, RefreshUserPositionFunction} from "../Model/Websocket/ExtRoom";
+import {ExtRooms, RefreshUserPositionFunction} from "../Model/Websocket/ExtRooms";
 import {ExtRoomsInterface} from "../Model/Websocket/ExtRoomsInterface";
 import {World} from "../Model/World";
 import {Group} from "_Model/Group";
@@ -27,7 +27,7 @@ enum SockerIoEvent {
 
 export class IoSocketController {
     Io: socketIO.Server;
-    World: World;
+    Worlds: Map<string, World> = new Map<string, World>();
 
     constructor(server: http.Server) {
         this.Io = socketIO(server);
@@ -48,17 +48,6 @@ export class IoSocketController {
 
         this.ioConnection();
         this.shareUsersPosition();
-
-        //don't send only function because the context will be not this
-        this.World = new World((user1: string, group: Group) => {
-            this.connectedUser(user1, group);
-        }, (user1: string, group: Group) => {
-            this.disConnectedUser(user1, group);
-        }, MINIMUM_DISTANCE, GROUP_RADIUS, (group: Group) => {
-            this.sendUpdateGroupEvent(group);
-        }, (groupUuid: string, lastUser: UserInterface) => {
-            this.sendDeleteGroupEvent(groupUuid, lastUser);
-        });
     }
 
     private sendUpdateGroupEvent(group: Group): void {
@@ -108,16 +97,42 @@ export class IoSocketController {
                     return;
                 }
 
-                //lease previous room
+                //lease previous room and world
                 if((socket as ExSocketInterface).roomId){
-                    socket.leave((socket as ExSocketInterface).roomId);
+                    let Client = (socket as ExSocketInterface);
+                    //user leave previous room
+                    socket.leave(Client.roomId);
+                    //user leave previous world
+                    let world : World|undefined = this.Worlds.get(Client.roomId);
+                    if(world){
+                        world.leave(Client);
+                        this.Worlds.set(Client.roomId, world);
+                    }
                 }
 
                 //join user in room
                 socket.join(messageUserPosition.roomId);
 
-                //join user in world
-                this.World.join(messageUserPosition);
+                //check and create new world for a room
+                if(!this.Worlds.get(messageUserPosition.roomId)){
+                    let world = new World((user1: string, group: Group) => {
+                        this.connectedUser(user1, group);
+                    }, (user1: string, group: Group) => {
+                        this.disConnectedUser(user1, group);
+                    }, MINIMUM_DISTANCE, GROUP_RADIUS, (group: Group) => {
+                        this.sendUpdateGroupEvent(group);
+                    }, (groupUuid: string, lastUser: UserInterface) => {
+                        this.sendDeleteGroupEvent(groupUuid, lastUser);
+                    });
+                    this.Worlds.set(messageUserPosition.roomId, world);
+                }
+
+                //join world
+                let world : World|undefined = this.Worlds.get(messageUserPosition.roomId);
+                if(world) {
+                    world.join(messageUserPosition);
+                    this.Worlds.set(messageUserPosition.roomId, world);
+                }
 
                 // sending to all clients in room except sender
                 this.saveUserInformation((socket as ExSocketInterface), messageUserPosition);
@@ -125,6 +140,9 @@ export class IoSocketController {
                 //add function to refresh position user in real time.
                 this.refreshUserPosition();
 
+                //refresh position in world
+                this.refreshWorldPosition(messageUserPosition);
+
                 socket.to(messageUserPosition.roomId).emit(SockerIoEvent.JOIN_ROOM, messageUserPosition.toString());
             });
 
@@ -139,6 +157,9 @@ export class IoSocketController {
 
                 //refresh position of all user in all rooms in real time
                 this.refreshUserPosition();
+
+                //refresh position in world
+                this.refreshWorldPosition(messageUserPosition);
             });
 
             socket.on(SockerIoEvent.WEBRTC_SIGNAL, (message: string) => {
@@ -171,8 +192,11 @@ export class IoSocketController {
                 //refresh position of all user in all rooms in real time
                 this.refreshUserPosition();
 
-                //leave group of user
-                this.World.leave(Client);
+                let world : World|undefined = this.Worlds.get(Client.roomId);
+                if(world){
+                    world.leave(Client);
+                    this.Worlds.set(Client.roomId, world);
+                }
 
                 //leave room
                 socket.leave(Client.roomId);
@@ -272,7 +296,16 @@ export class IoSocketController {
         if (!rooms.refreshUserPosition) {
             rooms.refreshUserPosition = RefreshUserPositionFunction;
         }
-        rooms.refreshUserPosition(rooms, this.Io, this.World);
+        rooms.refreshUserPosition(rooms, this.Io);
+    }
+
+    refreshWorldPosition(messageUserPosition : MessageUserPosition){
+        // update position in the worl
+        let world = this.Worlds.get(messageUserPosition.roomId);
+        if(world) {
+            world.updatePosition(messageUserPosition);
+            this.Worlds.set(messageUserPosition.roomId, world);
+        }
     }
 
     //Hydrate and manage error
similarity index 88%
rename from back/src/Model/Websocket/ExtRoom.ts
rename to back/src/Model/Websocket/ExtRooms.ts
index fa6c41fe528f5b54a7197b9d83f650e683eaa401..ae3b53dc26353d3bd4e6824e11721b94fc4c6e0d 100644 (file)
@@ -7,11 +7,12 @@ import {World} from "_Model/World";
 export class ExtRooms implements ExtRoomsInterface{
     userPositionMapByRoom: any;
     refreshUserPosition: any;
+    Worlds: any;
 
     [room: string]: SocketIO.Room;
 }
 
-let RefreshUserPositionFunction = function(rooms : ExtRooms, Io: socketIO.Server, World : World) {
+let RefreshUserPositionFunction = function(rooms : ExtRooms, Io: socketIO.Server) {
     let clients = Io.clients();
     let socketsKey = Object.keys(Io.clients().sockets);
 
@@ -37,10 +38,6 @@ let RefreshUserPositionFunction = function(rooms : ExtRooms, Io: socketIO.Server
             dataArray = [data];
         }
         mapPositionUserByRoom.set(data.roomId, dataArray);
-
-        // update position in the worl
-        let messageUserPosition = new MessageUserPosition(data);
-        World.updatePosition(messageUserPosition);
     }
     rooms.userPositionMapByRoom = Array.from(mapPositionUserByRoom);
 }