diff --git a/back/src/Model/GameRoom.ts b/back/src/Model/GameRoom.ts index 5b1e13bf..2971557d 100644 --- a/back/src/Model/GameRoom.ts +++ b/back/src/Model/GameRoom.ts @@ -146,7 +146,7 @@ export class GameRoom { position, false, this.positionNotifier, - joinRoomMessage.getAway(), + joinRoomMessage.getStatus(), socket, joinRoomMessage.getTagList(), joinRoomMessage.getVisitcardurl(), diff --git a/back/src/Model/User.ts b/back/src/Model/User.ts index 7a6a53f1..ec31d1f0 100644 --- a/back/src/Model/User.ts +++ b/back/src/Model/User.ts @@ -5,6 +5,7 @@ import { Movable } from "../Model/Movable"; import { PositionNotifier } from "../Model/PositionNotifier"; import { ServerDuplexStream } from "grpc"; import { + AvailabilityStatus, BatchMessage, CompanionMessage, FollowAbortMessage, @@ -32,7 +33,7 @@ export class User implements Movable { private position: PointInterface, public silent: boolean, private positionNotifier: PositionNotifier, - private away: boolean, + private status: AvailabilityStatus, public readonly socket: UserSocket, public readonly tags: string[], public readonly visitCardUrl: string | null, @@ -90,8 +91,8 @@ export class User implements Movable { return this.outlineColor; } - public isAway(): boolean { - return this.away; + public getStatus(): AvailabilityStatus { + return this.status; } get following(): User | undefined { @@ -134,9 +135,9 @@ export class User implements Movable { } this.voiceIndicatorShown = details.getShowvoiceindicator()?.getValue(); - const away = details.getAway(); - if (away) { - this.away = away.getValue(); + const status = details.getStatus(); + if (status !== undefined) { + this.status = status; } const playerDetails = new SetPlayerDetailsMessage(); @@ -147,8 +148,8 @@ export class User implements Movable { if (this.voiceIndicatorShown !== undefined) { playerDetails.setShowvoiceindicator(new BoolValue().setValue(this.voiceIndicatorShown)); } - if (details.getAway() !== undefined) { - playerDetails.setAway(new BoolValue().setValue(this.away)); + if (details.getStatus() !== undefined) { + playerDetails.setStatus(details.getStatus()); } this.positionNotifier.updatePlayerDetails(this, playerDetails); diff --git a/back/src/Services/SocketManager.ts b/back/src/Services/SocketManager.ts index c186658f..9a70a148 100644 --- a/back/src/Services/SocketManager.ts +++ b/back/src/Services/SocketManager.ts @@ -328,7 +328,7 @@ export class SocketManager { userJoinedZoneMessage.setUserid(thing.id); userJoinedZoneMessage.setUseruuid(thing.uuid); userJoinedZoneMessage.setName(thing.name); - userJoinedZoneMessage.setAway(thing.isAway()); + userJoinedZoneMessage.setStatus(thing.getStatus()); userJoinedZoneMessage.setCharacterlayersList(ProtobufUtils.toCharacterLayerMessages(thing.characterLayers)); userJoinedZoneMessage.setPosition(ProtobufUtils.toPositionMessage(thing.getPosition())); userJoinedZoneMessage.setFromzone(this.toProtoZone(fromZone)); @@ -656,7 +656,7 @@ export class SocketManager { userJoinedMessage.setUserid(thing.id); userJoinedMessage.setUseruuid(thing.uuid); userJoinedMessage.setName(thing.name); - userJoinedMessage.setAway(thing.isAway()); + userJoinedMessage.setStatus(thing.getStatus()); userJoinedMessage.setCharacterlayersList(ProtobufUtils.toCharacterLayerMessages(thing.characterLayers)); userJoinedMessage.setPosition(ProtobufUtils.toPositionMessage(thing.getPosition())); if (thing.visitCardUrl) { diff --git a/front/src/Connexion/ConnexionModels.ts b/front/src/Connexion/ConnexionModels.ts index 1231373f..d3909f55 100644 --- a/front/src/Connexion/ConnexionModels.ts +++ b/front/src/Connexion/ConnexionModels.ts @@ -1,6 +1,7 @@ import type { SignalData } from "simple-peer"; import type { RoomConnection } from "./RoomConnection"; import type { BodyResourceDescriptionInterface } from "../Phaser/Entity/PlayerTextures"; +import { AvailabilityStatus } from "../Messages/ts-proto-generated/protos/messages"; export interface PointInterface { x: number; @@ -14,7 +15,7 @@ export interface MessageUserPositionInterface { name: string; characterLayers: BodyResourceDescriptionInterface[]; position: PointInterface; - away: boolean; + status: AvailabilityStatus; visitCardUrl: string | null; companion: string | null; userUuid: string; @@ -30,7 +31,7 @@ export interface MessageUserJoined { name: string; characterLayers: BodyResourceDescriptionInterface[]; position: PointInterface; - away: boolean; + status: AvailabilityStatus; visitCardUrl: string | null; companion: string | null; userUuid: string; diff --git a/front/src/Connexion/RoomConnection.ts b/front/src/Connexion/RoomConnection.ts index e385fcc7..06a752f9 100644 --- a/front/src/Connexion/RoomConnection.ts +++ b/front/src/Connexion/RoomConnection.ts @@ -41,6 +41,7 @@ import { SetPlayerDetailsMessage as SetPlayerDetailsMessageTsProto, PingMessage as PingMessageTsProto, CharacterLayerMessage, + AvailabilityStatus, } from "../Messages/ts-proto-generated/protos/messages"; import { Subject } from "rxjs"; import { selectCharacterSceneVisibleStore } from "../Stores/SelectCharacterStore"; @@ -520,9 +521,9 @@ export class RoomConnection implements RoomConnection { this.socket.send(bytes); } - public emitPlayerAway(away: boolean): void { + public emitPlayerStatusChange(status: AvailabilityStatus): void { const message = SetPlayerDetailsMessageTsProto.fromPartial({ - away, + status, }); const bytes = ClientToServerMessageTsProto.encode({ message: { @@ -670,7 +671,7 @@ export class RoomConnection implements RoomConnection { characterLayers, visitCardUrl: message.visitCardUrl, position: ProtobufClientUtils.toPointInterface(position), - away: message.away, + status: message.status, companion: companion ? companion.name : null, userUuid: message.userUuid, outlineColor: message.hasOutline ? message.outlineColor : undefined, diff --git a/front/src/Phaser/Components/PlayerStatusDot.ts b/front/src/Phaser/Components/PlayerStatusDot.ts index 4e09451a..fe739bda 100644 --- a/front/src/Phaser/Components/PlayerStatusDot.ts +++ b/front/src/Phaser/Components/PlayerStatusDot.ts @@ -1,16 +1,11 @@ +import { AvailabilityStatus } from "../../Messages/ts-proto-generated/protos/messages"; import { Easing } from "../../types"; -export enum PlayerStatus { - Online = "Online", - Silenced = "Silenced", - Away = "Away", -} - export class PlayerStatusDot extends Phaser.GameObjects.Container { private statusImage: Phaser.GameObjects.Image; private statusImageOutline: Phaser.GameObjects.Image; - private status: PlayerStatus; + private status: AvailabilityStatus; private readonly COLORS = { online: 0x8cc43f, @@ -19,12 +14,13 @@ export class PlayerStatusDot extends Phaser.GameObjects.Container { awayOutline: 0x875d13, silenced: 0xe74c3c, silencedOutline: 0xc0392b, + never: 0xff00ff, }; constructor(scene: Phaser.Scene, x: number, y: number) { super(scene, x, y); - this.status = PlayerStatus.Online; + this.status = AvailabilityStatus.ONLINE; this.statusImage = this.scene.add.image(0, 0, "iconStatusIndicatorInside"); this.statusImageOutline = this.scene.add.image(0, 0, "iconStatusIndicatorOutline"); @@ -36,7 +32,7 @@ export class PlayerStatusDot extends Phaser.GameObjects.Container { this.scene.add.existing(this); } - public setStatus(status: PlayerStatus, instant: boolean = false): void { + public setStatus(status: AvailabilityStatus, instant: boolean = false): void { if (this.status === status) { return; } @@ -73,12 +69,14 @@ export class PlayerStatusDot extends Phaser.GameObjects.Container { private getColors(): { filling: number; outline: number } { switch (this.status) { - case PlayerStatus.Online: + case AvailabilityStatus.ONLINE: return { filling: this.COLORS.online, outline: this.COLORS.onlineOutline }; - case PlayerStatus.Away: + case AvailabilityStatus.AWAY: return { filling: this.COLORS.away, outline: this.COLORS.awayOutline }; - case PlayerStatus.Silenced: + case AvailabilityStatus.SILENCED: return { filling: this.COLORS.silenced, outline: this.COLORS.silencedOutline }; + default: + return { filling: this.COLORS.never, outline: this.COLORS.never }; } } } diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 5fa11d4b..8c2c5afc 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -100,9 +100,8 @@ import type { CoWebsite } from "../../WebRtc/CoWebsite/CoWesbite"; import CancelablePromise from "cancelable-promise"; import { Deferred } from "ts-deferred"; import { SuperLoaderPlugin } from "../Services/SuperLoaderPlugin"; -import { PlayerDetailsUpdatedMessage } from "../../Messages/ts-proto-generated/protos/messages"; +import { AvailabilityStatus, PlayerDetailsUpdatedMessage } from "../../Messages/ts-proto-generated/protos/messages"; import { privacyShutdownStore } from "../../Stores/PrivacyShutdownStore"; -import { PlayerStatus } from "../Components/PlayerStatusDot"; export interface GameSceneInitInterface { initPosition: PointInterface | null; reconnecting: boolean; @@ -710,7 +709,8 @@ export class GameScene extends DirtyScene { }); this.privacyShutdownStoreUnsubscribe = privacyShutdownStore.subscribe((away) => { - this.connection?.emitPlayerAway(away); + // TODO: Might be a problem with SILENCED here + this.connection?.emitPlayerStatusChange(away ? AvailabilityStatus.AWAY : AvailabilityStatus.ONLINE); }); Promise.all([ @@ -771,7 +771,7 @@ export class GameScene extends DirtyScene { characterLayers: message.characterLayers, name: message.name, position: message.position, - away: message.away, + status: message.status, visitCardUrl: message.visitCardUrl, companion: message.companion, userUuid: message.userUuid, @@ -1956,8 +1956,8 @@ ${escapedMessage} if (addPlayerData.outlineColor !== undefined) { player.setApiOutlineColor(addPlayerData.outlineColor); } - if (addPlayerData.away !== undefined) { - player.setStatus(addPlayerData.away ? PlayerStatus.Away : PlayerStatus.Online, true); + if (addPlayerData.status !== undefined) { + player.setStatus(addPlayerData.status, true); } this.MapPlayers.add(player); this.MapPlayersByKey.set(player.userId, player); @@ -2108,8 +2108,8 @@ ${escapedMessage} if (message.details?.showVoiceIndicator !== undefined) { character.showTalkIcon(message.details?.showVoiceIndicator); } - if (message.details?.away !== undefined) { - character.setStatus(message.details?.away ? PlayerStatus.Away : PlayerStatus.Online); + if (message.details?.status !== undefined) { + character.setStatus(message.details?.status); } } diff --git a/front/src/Phaser/Game/PlayerInterface.ts b/front/src/Phaser/Game/PlayerInterface.ts index 571bf3cb..c6ac3420 100644 --- a/front/src/Phaser/Game/PlayerInterface.ts +++ b/front/src/Phaser/Game/PlayerInterface.ts @@ -1,3 +1,4 @@ +import { AvailabilityStatus } from "../../Messages/ts-proto-generated/protos/messages"; import type { BodyResourceDescriptionInterface } from "../Entity/PlayerTextures"; export interface PlayerInterface { @@ -7,7 +8,7 @@ export interface PlayerInterface { visitCardUrl: string | null; companion: string | null; userUuid: string; - away: boolean; + status: AvailabilityStatus; color?: string; outlineColor?: number; } diff --git a/front/src/Stores/PlayersStore.ts b/front/src/Stores/PlayersStore.ts index 70c59b92..be270b5a 100644 --- a/front/src/Stores/PlayersStore.ts +++ b/front/src/Stores/PlayersStore.ts @@ -2,6 +2,7 @@ import { writable } from "svelte/store"; import type { PlayerInterface } from "../Phaser/Game/PlayerInterface"; import type { RoomConnection } from "../Connexion/RoomConnection"; import { getRandomColor } from "../WebRtc/ColorGenerator"; +import { AvailabilityStatus } from "../Messages/ts-proto-generated/protos/messages"; let idCount = 0; @@ -28,7 +29,7 @@ function createPlayersStore() { visitCardUrl: message.visitCardUrl, companion: message.companion, userUuid: message.userUuid, - away: message.away, + status: message.status, color: getRandomColor(), }); return users; @@ -58,7 +59,7 @@ function createPlayersStore() { characterLayers: [], visitCardUrl: null, companion: null, - away: false, + status: AvailabilityStatus.ONLINE, userUuid: "dummy", color: getRandomColor(), }); diff --git a/maps/tests/status_indicator.json b/maps/tests/status_indicator.json index 8342a7b8..deb82e8d 100644 --- a/maps/tests/status_indicator.json +++ b/maps/tests/status_indicator.json @@ -121,7 +121,7 @@ "rotation":0, "text": { - "text":"Get into silent zone to show status dot for your WOKA", + "text":"Get into silent zone to show red status dot for your WOKA", "wrap":true }, "type":"", diff --git a/messages/protos/messages.proto b/messages/protos/messages.proto index fae82184..43bb185c 100644 --- a/messages/protos/messages.proto +++ b/messages/protos/messages.proto @@ -4,6 +4,12 @@ import "google/protobuf/wrappers.proto"; /*********** PARTIAL MESSAGES **************/ +enum AvailabilityStatus { + ONLINE = 0; + SILENCED = 1; + AWAY = 2; +} + message PositionMessage { int32 x = 1; int32 y = 2; @@ -53,7 +59,7 @@ message SetPlayerDetailsMessage { google.protobuf.UInt32Value outlineColor = 3; google.protobuf.BoolValue removeOutlineColor = 4; google.protobuf.BoolValue showVoiceIndicator = 5; - google.protobuf.BoolValue away = 6; + AvailabilityStatus status = 6; } message UserMovesMessage { @@ -207,7 +213,7 @@ message UserJoinedMessage { string userUuid = 7; uint32 outlineColor = 8; bool hasOutline = 9; - bool away = 10; + AvailabilityStatus status = 10; } message UserLeftMessage { @@ -346,7 +352,7 @@ message JoinRoomMessage { CompanionMessage companion = 8; string visitCardUrl = 9; string userRoomToken = 10; - bool away = 11; + AvailabilityStatus status = 11; } message UserJoinedZoneMessage { @@ -360,7 +366,7 @@ message UserJoinedZoneMessage { string userUuid = 8; uint32 outlineColor = 9; bool hasOutline = 10; - bool away = 11; + AvailabilityStatus status = 11; } message UserLeftZoneMessage { diff --git a/pusher/src/Model/Zone.ts b/pusher/src/Model/Zone.ts index ab82bf1b..c15aeefd 100644 --- a/pusher/src/Model/Zone.ts +++ b/pusher/src/Model/Zone.ts @@ -18,6 +18,7 @@ import { ErrorMessage, PlayerDetailsUpdatedMessage, SetPlayerDetailsMessage, + AvailabilityStatus, } from "../Messages/generated/messages_pb"; import { ClientReadableStream } from "grpc"; import { PositionDispatcher } from "../Model/PositionDispatcher"; @@ -49,7 +50,7 @@ export class UserDescriptor { private name: string, private characterLayers: CharacterLayerMessage[], private position: PositionMessage, - private away: boolean, + private status: AvailabilityStatus, private visitCardUrl: string | null, private companion?: CompanionMessage, private outlineColor?: number @@ -70,7 +71,7 @@ export class UserDescriptor { message.getName(), message.getCharacterlayersList(), position, - message.getAway(), + message.getStatus(), message.getVisitcardurl(), message.getCompanion(), message.getHasoutline() ? message.getOutlinecolor() : undefined @@ -91,9 +92,9 @@ export class UserDescriptor { } else { this.outlineColor = playerDetails.getOutlinecolor()?.getValue(); } - const away = playerDetails.getAway(); - if (away) { - this.away = away.getValue(); + const status = playerDetails.getStatus(); + if (status !== undefined) { + this.status = status; } } @@ -104,7 +105,7 @@ export class UserDescriptor { userJoinedMessage.setName(this.name); userJoinedMessage.setCharacterlayersList(this.characterLayers); userJoinedMessage.setPosition(this.position); - userJoinedMessage.setAway(this.away); + userJoinedMessage.setStatus(this.status); if (this.visitCardUrl) { userJoinedMessage.setVisitcardurl(this.visitCardUrl); }