Added the user-room token created from admin when we access a room

This commit is contained in:
Valdo Romao 2021-12-01 15:38:34 +00:00
parent 9eb4206fe0
commit dd79f7d0f4
13 changed files with 63 additions and 2 deletions

View file

@ -97,6 +97,7 @@ export class SocketManager {
} }
const roomJoinedMessage = new RoomJoinedMessage(); const roomJoinedMessage = new RoomJoinedMessage();
roomJoinedMessage.setTagList(joinRoomMessage.getTagList()); roomJoinedMessage.setTagList(joinRoomMessage.getTagList());
roomJoinedMessage.setUserroomtoken(joinRoomMessage.getUserroomtoken());
for (const [itemId, item] of room.getItemsState().entries()) { for (const [itemId, item] of room.getItemsState().entries()) {
const itemStateMessage = new ItemStateMessage(); const itemStateMessage = new ItemStateMessage();

View file

@ -58,6 +58,29 @@ WA.onInit().then(() => {
}) })
``` ```
### Get the user-room token of the player
```
WA.player.userRoomToken: string;
```
The user-room token is available from the `WA.player.userRoomToken` property.
This token is generated in WorkAdventure and contains information such as the player's room ID and its associated membership ID.
{.alert.alert-warn}
This token is used when you change your logo using a configured variable.
Indeed, to change your logo you need to perform an upload in order to get a file URL. This type of actions must be validated on our side.
If you are using a self-hosted version of WorkAdventure you will not have the possibility to perform actions that depends on the user-room token, unless you create an API that support it.
{.alert.alert-info}
You need to wait for the end of the initialization before accessing `WA.player.userRoomToken`
```typescript
WA.onInit().then(() => {
console.log('Token: ', WA.player.userRoomToken);
})
```
### Listen to player movement ### Listen to player movement
``` ```
WA.player.onPlayerMove(callback: HasPlayerMovedEventCallback): void; WA.player.onPlayerMove(callback: HasPlayerMovedEventCallback): void;

View file

@ -9,6 +9,7 @@ export const isGameStateEvent = new tg.IsInterface()
startLayerName: tg.isUnion(tg.isString, tg.isNull), startLayerName: tg.isUnion(tg.isString, tg.isNull),
tags: tg.isArray(tg.isString), tags: tg.isArray(tg.isString),
variables: tg.isObject, variables: tg.isObject,
userRoomToken: tg.isUnion(tg.isString, tg.isUndefined),
}) })
.get(); .get();
/** /**

View file

@ -20,6 +20,12 @@ export const setTags = (_tags: string[]) => {
let uuid: string | undefined; let uuid: string | undefined;
let userRoomToken: string | undefined;
export const setUserRoomToken = (token: string | undefined) => {
userRoomToken = token;
};
export const setUuid = (_uuid: string | undefined) => { export const setUuid = (_uuid: string | undefined) => {
uuid = _uuid; uuid = _uuid;
}; };
@ -67,6 +73,13 @@ export class WorkadventurePlayerCommands extends IframeApiContribution<Workadven
} }
return uuid; return uuid;
} }
get userRoomToken(): string | undefined {
if (userRoomToken === undefined) {
throw new Error("User-room token not initialized yet. You should call WA.player.userRoomToken within a WA.onInit callback.");
}
return userRoomToken;
}
} }
export default new WorkadventurePlayerCommands(); export default new WorkadventurePlayerCommands();

View file

@ -68,6 +68,7 @@ export class RoomConnection implements RoomConnection {
private static websocketFactory: null | ((url: string) => any) = null; // eslint-disable-line @typescript-eslint/no-explicit-any private static websocketFactory: null | ((url: string) => any) = null; // eslint-disable-line @typescript-eslint/no-explicit-any
private closed: boolean = false; private closed: boolean = false;
private tags: string[] = []; private tags: string[] = [];
private _userRoomToken: string | undefined;
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
public static setWebsocketFactory(websocketFactory: (url: string) => any): void { public static setWebsocketFactory(websocketFactory: (url: string) => any): void {
@ -211,6 +212,7 @@ export class RoomConnection implements RoomConnection {
this.userId = roomJoinedMessage.getCurrentuserid(); this.userId = roomJoinedMessage.getCurrentuserid();
this.tags = roomJoinedMessage.getTagList(); this.tags = roomJoinedMessage.getTagList();
this._userRoomToken = roomJoinedMessage.getUserroomtoken();
this.dispatch(EventMessage.CONNECT, { this.dispatch(EventMessage.CONNECT, {
connection: this, connection: this,
@ -710,4 +712,8 @@ export class RoomConnection implements RoomConnection {
public getAllTags(): string[] { public getAllTags(): string[] {
return this.tags; return this.tags;
} }
public get userRoomToken(): string | undefined {
return this._userRoomToken;
}
} }

View file

@ -1165,6 +1165,7 @@ ${escapedMessage}
roomId: this.roomUrl, roomId: this.roomUrl,
tags: this.connection ? this.connection.getAllTags() : [], tags: this.connection ? this.connection.getAllTags() : [],
variables: this.sharedVariablesManager.variables, variables: this.sharedVariablesManager.variables,
userRoomToken: this.connection ? this.connection.userRoomToken : ''
}; };
}); });
this.iframeSubscriptionList.push( this.iframeSubscriptionList.push(

View file

@ -15,11 +15,11 @@ import ui from "./Api/iframe/ui";
import sound from "./Api/iframe/sound"; import sound from "./Api/iframe/sound";
import room, { setMapURL, setRoomId } from "./Api/iframe/room"; import room, { setMapURL, setRoomId } from "./Api/iframe/room";
import state, { initVariables } from "./Api/iframe/state"; import state, { initVariables } from "./Api/iframe/state";
import player, { setPlayerName, setTags, setUuid } from "./Api/iframe/player"; import player, { setPlayerName, setTags, setUserRoomToken, setUuid } from "./Api/iframe/player";
import type { ButtonDescriptor } from "./Api/iframe/Ui/ButtonDescriptor"; import type { ButtonDescriptor } from "./Api/iframe/Ui/ButtonDescriptor";
import type { Popup } from "./Api/iframe/Ui/Popup"; import type { Popup } from "./Api/iframe/Ui/Popup";
import type { Sound } from "./Api/iframe/Sound/Sound"; import type { Sound } from "./Api/iframe/Sound/Sound";
import { answerPromises, queryWorkadventure, sendToWorkadventure } from "./Api/iframe/IframeApiContribution"; import { answerPromises, queryWorkadventure } from "./Api/iframe/IframeApiContribution";
// Notify WorkAdventure that we are ready to receive data // Notify WorkAdventure that we are ready to receive data
const initPromise = queryWorkadventure({ const initPromise = queryWorkadventure({
@ -32,6 +32,7 @@ const initPromise = queryWorkadventure({
setTags(state.tags); setTags(state.tags);
setUuid(state.uuid); setUuid(state.uuid);
initVariables(state.variables as Map<string, unknown>); initVariables(state.variables as Map<string, unknown>);
setUserRoomToken(state.userRoomToken);
}); });
const wa = { const wa = {

View file

@ -4,6 +4,7 @@ WA.onInit().then(() => {
console.log('Player name: ', WA.player.name); console.log('Player name: ', WA.player.name);
console.log('Player id: ', WA.player.id); console.log('Player id: ', WA.player.id);
console.log('Player tags: ', WA.player.tags); console.log('Player tags: ', WA.player.tags);
console.log('Player token: ', WA.player.userRoomToken);
}); });
WA.room.getTiledMap().then((data) => { WA.room.getTiledMap().then((data) => {

View file

@ -198,6 +198,7 @@ message RoomJoinedMessage {
int32 currentUserId = 4; int32 currentUserId = 4;
repeated string tag = 5; repeated string tag = 5;
repeated VariableMessage variable = 6; repeated VariableMessage variable = 6;
string userRoomToken = 7;
} }
message WebRtcStartMessage { message WebRtcStartMessage {
@ -297,6 +298,7 @@ message JoinRoomMessage {
string IPAddress = 7; string IPAddress = 7;
CompanionMessage companion = 8; CompanionMessage companion = 8;
string visitCardUrl = 9; string visitCardUrl = 9;
string userRoomToken = 10;
} }
message UserJoinedZoneMessage { message UserJoinedZoneMessage {

View file

@ -186,6 +186,7 @@ export class IoSocketController {
let memberTags: string[] = []; let memberTags: string[] = [];
let memberVisitCardUrl: string | null = null; let memberVisitCardUrl: string | null = null;
let memberMessages: unknown; let memberMessages: unknown;
let memberUserRoomToken: string | undefined;
let memberTextures: CharacterTexture[] = []; let memberTextures: CharacterTexture[] = [];
const room = await socketManager.getOrCreateRoom(roomId); const room = await socketManager.getOrCreateRoom(roomId);
let userData: FetchMemberDataByUuidResponse = { let userData: FetchMemberDataByUuidResponse = {
@ -196,6 +197,7 @@ export class IoSocketController {
textures: [], textures: [],
messages: [], messages: [],
anonymous: true, anonymous: true,
userRoomToken: undefined,
}; };
if (ADMIN_API_URL) { if (ADMIN_API_URL) {
try { try {
@ -232,6 +234,8 @@ export class IoSocketController {
memberTags = userData.tags; memberTags = userData.tags;
memberVisitCardUrl = userData.visitCardUrl; memberVisitCardUrl = userData.visitCardUrl;
memberTextures = userData.textures; memberTextures = userData.textures;
memberUserRoomToken = userData.userRoomToken;
if ( if (
room.policyType === GameRoomPolicyTypes.USE_TAGS_POLICY && room.policyType === GameRoomPolicyTypes.USE_TAGS_POLICY &&
(userData.anonymous === true || !room.canAccess(memberTags)) (userData.anonymous === true || !room.canAccess(memberTags))
@ -281,6 +285,7 @@ export class IoSocketController {
messages: memberMessages, messages: memberMessages,
tags: memberTags, tags: memberTags,
visitCardUrl: memberVisitCardUrl, visitCardUrl: memberVisitCardUrl,
userRoomToken: memberUserRoomToken,
textures: memberTextures, textures: memberTextures,
position: { position: {
x: x, x: x,

View file

@ -44,4 +44,5 @@ export interface ExSocketInterface extends WebSocket, Identificable {
textures: CharacterTexture[]; textures: CharacterTexture[];
backConnection: BackConnection; backConnection: BackConnection;
listenedZones: Set<Zone>; listenedZones: Set<Zone>;
userRoomToken: string | undefined;
} }

View file

@ -29,6 +29,7 @@ export interface FetchMemberDataByUuidResponse {
textures: CharacterTexture[]; textures: CharacterTexture[];
messages: unknown[]; messages: unknown[];
anonymous?: boolean; anonymous?: boolean;
userRoomToken: string | undefined;
} }
class AdminApi { class AdminApi {

View file

@ -151,6 +151,11 @@ export class SocketManager implements ZoneEventListener {
joinRoomMessage.setName(client.name); joinRoomMessage.setName(client.name);
joinRoomMessage.setPositionmessage(ProtobufUtils.toPositionMessage(client.position)); joinRoomMessage.setPositionmessage(ProtobufUtils.toPositionMessage(client.position));
joinRoomMessage.setTagList(client.tags); joinRoomMessage.setTagList(client.tags);
if (client.userRoomToken) {
joinRoomMessage.setUserroomtoken(client.userRoomToken);
}
if (client.visitCardUrl) { if (client.visitCardUrl) {
joinRoomMessage.setVisitcardurl(client.visitCardUrl); joinRoomMessage.setVisitcardurl(client.visitCardUrl);
} }