Adding a "silent" notion (triggered in Jitsi meets)
This commit is contained in:
parent
0a8ba37049
commit
df7b5cc2e3
@ -33,7 +33,8 @@ enum SockerIoEvent {
|
|||||||
MESSAGE_ERROR = "message-error",
|
MESSAGE_ERROR = "message-error",
|
||||||
GROUP_CREATE_UPDATE = "group-create-update",
|
GROUP_CREATE_UPDATE = "group-create-update",
|
||||||
GROUP_DELETE = "group-delete",
|
GROUP_DELETE = "group-delete",
|
||||||
SET_PLAYER_DETAILS = "set-player-details"
|
SET_PLAYER_DETAILS = "set-player-details",
|
||||||
|
SET_SILENT = "set_silent", // Set or unset the silent mode for this user.
|
||||||
}
|
}
|
||||||
|
|
||||||
export class IoSocketController {
|
export class IoSocketController {
|
||||||
@ -274,6 +275,29 @@ export class IoSocketController {
|
|||||||
Client.characterLayers = playerDetails.characterLayers;
|
Client.characterLayers = playerDetails.characterLayers;
|
||||||
answerFn(Client.userId);
|
answerFn(Client.userId);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
socket.on(SockerIoEvent.SET_SILENT, (silent: unknown) => {
|
||||||
|
if (typeof silent !== "boolean") {
|
||||||
|
socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid SET_SILENT message.'});
|
||||||
|
console.warn('Invalid SET_SILENT message received: ', silent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const Client = (socket as ExSocketInterface);
|
||||||
|
|
||||||
|
// update position in the world
|
||||||
|
const world = this.Worlds.get(Client.roomId);
|
||||||
|
if (!world) {
|
||||||
|
console.error("Could not find world with id '", Client.roomId, "'");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
world.setSilent(Client, silent);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('An error occurred on "SET_SILENT"');
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,5 +4,6 @@ import { PointInterface } from "./Websocket/PointInterface";
|
|||||||
export interface UserInterface {
|
export interface UserInterface {
|
||||||
id: string,
|
id: string,
|
||||||
group?: Group,
|
group?: Group,
|
||||||
position: PointInterface
|
position: PointInterface,
|
||||||
}
|
silent: boolean
|
||||||
|
}
|
||||||
|
@ -55,7 +55,8 @@ export class World {
|
|||||||
public join(socket : Identificable, userPosition: PointInterface): void {
|
public join(socket : Identificable, userPosition: PointInterface): void {
|
||||||
this.users.set(socket.userId, {
|
this.users.set(socket.userId, {
|
||||||
id: socket.userId,
|
id: socket.userId,
|
||||||
position: userPosition
|
position: userPosition,
|
||||||
|
silent: false // FIXME: silent should be set at the correct value when joining a room.
|
||||||
});
|
});
|
||||||
// Let's call update position to trigger the join / leave room
|
// Let's call update position to trigger the join / leave room
|
||||||
this.updatePosition(socket, userPosition);
|
this.updatePosition(socket, userPosition);
|
||||||
@ -84,6 +85,10 @@ export class World {
|
|||||||
|
|
||||||
user.position = userPosition;
|
user.position = userPosition;
|
||||||
|
|
||||||
|
if (user.silent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof user.group === 'undefined') {
|
if (typeof user.group === 'undefined') {
|
||||||
// If the user is not part of a group:
|
// If the user is not part of a group:
|
||||||
// should he join a group?
|
// should he join a group?
|
||||||
@ -118,6 +123,26 @@ export class World {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setSilent(socket: Identificable, silent: boolean) {
|
||||||
|
const user = this.users.get(socket.userId);
|
||||||
|
if(typeof user === 'undefined') {
|
||||||
|
console.warn('In setSilent, could not find user with ID "'+socket.userId+'" in world.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (user.silent === silent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
user.silent = silent;
|
||||||
|
if (silent && user.group !== undefined) {
|
||||||
|
this.leaveGroup(user);
|
||||||
|
}
|
||||||
|
if (!silent) {
|
||||||
|
// If we are back to life, let's trigger a position update to see if we can join some group.
|
||||||
|
this.updatePosition(socket, user.position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a user leave a group and closes and destroy the group if the group contains only one remaining person.
|
* Makes a user leave a group and closes and destroy the group if the group contains only one remaining person.
|
||||||
*
|
*
|
||||||
@ -145,6 +170,7 @@ export class World {
|
|||||||
* Looks for the closest user that is:
|
* Looks for the closest user that is:
|
||||||
* - close enough (distance <= minDistance)
|
* - close enough (distance <= minDistance)
|
||||||
* - not in a group
|
* - not in a group
|
||||||
|
* - not silent
|
||||||
* OR
|
* OR
|
||||||
* - close enough to a group (distance <= groupRadius)
|
* - close enough to a group (distance <= groupRadius)
|
||||||
*/
|
*/
|
||||||
@ -160,6 +186,9 @@ export class World {
|
|||||||
if(currentUser === user) {
|
if(currentUser === user) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (currentUser.silent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const distance = World.computeDistance(user, currentUser); // compute distance between peers.
|
const distance = World.computeDistance(user, currentUser); // compute distance between peers.
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ enum EventMessage{
|
|||||||
SET_PLAYER_DETAILS = "set-player-details", // Send the name and character to the server (on connect), receive back the id.
|
SET_PLAYER_DETAILS = "set-player-details", // Send the name and character to the server (on connect), receive back the id.
|
||||||
|
|
||||||
CONNECT_ERROR = "connect_error",
|
CONNECT_ERROR = "connect_error",
|
||||||
|
SET_SILENT = "set_silent", // Set or unset the silent mode for this user.
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PointInterface {
|
export interface PointInterface {
|
||||||
@ -167,6 +168,10 @@ export class Connection implements Connection {
|
|||||||
this.socket.emit(EventMessage.USER_POSITION, point);
|
this.socket.emit(EventMessage.USER_POSITION, point);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public setSilent(silent: boolean): void {
|
||||||
|
this.socket.emit(EventMessage.SET_SILENT, silent);
|
||||||
|
}
|
||||||
|
|
||||||
public onUserJoins(callback: (message: MessageUserJoined) => void): void {
|
public onUserJoins(callback: (message: MessageUserJoined) => void): void {
|
||||||
this.socket.on(EventMessage.JOIN_ROOM, callback);
|
this.socket.on(EventMessage.JOIN_ROOM, callback);
|
||||||
}
|
}
|
||||||
|
@ -423,9 +423,10 @@ export class GameScene extends Phaser.Scene implements CenterListener {
|
|||||||
CoWebsiteManager.loadCoWebsite(newValue as string);
|
CoWebsiteManager.loadCoWebsite(newValue as string);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
let jitsiApi: any;
|
let jitsiApi: any; // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||||
this.gameMap.onPropertyChange('jitsiRoom', (newValue, oldValue) => {
|
this.gameMap.onPropertyChange('jitsiRoom', (newValue, oldValue) => {
|
||||||
if (newValue === undefined) {
|
if (newValue === undefined) {
|
||||||
|
this.connection.setSilent(false);
|
||||||
jitsiApi?.dispose();
|
jitsiApi?.dispose();
|
||||||
CoWebsiteManager.closeCoWebsite();
|
CoWebsiteManager.closeCoWebsite();
|
||||||
} else {
|
} else {
|
||||||
@ -444,9 +445,10 @@ export class GameScene extends Phaser.Scene implements CenterListener {
|
|||||||
MOBILE_APP_PROMO: false
|
MOBILE_APP_PROMO: false
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
jitsiApi = new (window as any).JitsiMeetExternalAPI(domain, options);
|
jitsiApi = new (window as any).JitsiMeetExternalAPI(domain, options); // eslint-disable-line @typescript-eslint/no-explicit-any
|
||||||
jitsiApi.executeCommand('displayName', gameManager.getPlayerName());
|
jitsiApi.executeCommand('displayName', gameManager.getPlayerName());
|
||||||
}))
|
}));
|
||||||
|
this.connection.setSilent(true);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user