diff --git a/front/src/Phaser/Game/SharedVariablesManager.ts b/front/src/Phaser/Game/SharedVariablesManager.ts index f177438d..2d015246 100644 --- a/front/src/Phaser/Game/SharedVariablesManager.ts +++ b/front/src/Phaser/Game/SharedVariablesManager.ts @@ -1,25 +1,29 @@ -/** - * Handles variables shared between the scripting API and the server. - */ -import type {RoomConnection} from "../../Connexion/RoomConnection"; -import {iframeListener} from "../../Api/IframeListener"; -import type {Subscription} from "rxjs"; -import type {GameMap} from "./GameMap"; -import type {ITile, ITiledMapObject} from "../Map/ITiledMap"; -import type {Var} from "svelte/types/compiler/interfaces"; -import {init} from "svelte/internal"; +import type { RoomConnection } from "../../Connexion/RoomConnection"; +import { iframeListener } from "../../Api/IframeListener"; +import type { Subscription } from "rxjs"; +import type { GameMap } from "./GameMap"; +import type { ITile, ITiledMapObject } from "../Map/ITiledMap"; +import type { Var } from "svelte/types/compiler/interfaces"; +import { init } from "svelte/internal"; interface Variable { - defaultValue: unknown, - readableBy?: string, - writableBy?: string, + defaultValue: unknown; + readableBy?: string; + writableBy?: string; } +/** + * Stores variables and provides a bridge between scripts and the pusher server. + */ export class SharedVariablesManager { private _variables = new Map(); private variableObjects: Map; - constructor(private roomConnection: RoomConnection, private gameMap: GameMap, serverVariables: Map) { + constructor( + private roomConnection: RoomConnection, + private gameMap: GameMap, + serverVariables: Map + ) { // We initialize the list of variable object at room start. The objects cannot be edited later // (otherwise, this would cause a security issue if the scripting API can edit this list of objects) this.variableObjects = SharedVariablesManager.findVariablesInMap(gameMap); @@ -46,24 +50,34 @@ export class SharedVariablesManager { iframeListener.setVariable({ key: name, value: value, - }) + }); }); // When a variable is modified from an iFrame - iframeListener.registerAnswerer('setVariable', (event) => { + iframeListener.registerAnswerer("setVariable", (event) => { const key = event.key; const object = this.variableObjects.get(key); if (object === undefined) { - const errMsg = 'A script is trying to modify variable "'+key+'" but this variable is not defined in the map.' + - 'There should be an object in the map whose name is "'+key+'" and whose type is "variable"'; + const errMsg = + 'A script is trying to modify variable "' + + key + + '" but this variable is not defined in the map.' + + 'There should be an object in the map whose name is "' + + key + + '" and whose type is "variable"'; console.error(errMsg); throw new Error(errMsg); } if (object.writableBy && !this.roomConnection.hasTag(object.writableBy)) { - const errMsg = 'A script is trying to modify variable "'+key+'" but this variable is only writable for users with tag "'+object.writableBy+'".'; + const errMsg = + 'A script is trying to modify variable "' + + key + + '" but this variable is only writable for users with tag "' + + object.writableBy + + '".'; console.error(errMsg); throw new Error(errMsg); } @@ -78,11 +92,13 @@ export class SharedVariablesManager { private static findVariablesInMap(gameMap: GameMap): Map { const objects = new Map(); for (const layer of gameMap.getMap().layers) { - if (layer.type === 'objectgroup') { + if (layer.type === "objectgroup") { for (const object of layer.objects) { - if (object.type === 'variable') { + if (object.type === "variable") { if (object.template) { - console.warn('Warning, a variable object is using a Tiled "template". WorkAdventure does not support objects generated from Tiled templates.') + console.warn( + 'Warning, a variable object is using a Tiled "template". WorkAdventure does not support objects generated from Tiled templates.' + ); } // We store a copy of the object (to make it immutable) @@ -96,27 +112,31 @@ export class SharedVariablesManager { private static iTiledObjectToVariable(object: ITiledMapObject): Variable { const variable: Variable = { - defaultValue: undefined + defaultValue: undefined, }; if (object.properties) { for (const property of object.properties) { const value = property.value; switch (property.name) { - case 'default': + case "default": variable.defaultValue = value; break; - case 'writableBy': - if (typeof value !== 'string') { - throw new Error('The writableBy property of variable "'+object.name+'" must be a string'); + case "writableBy": + if (typeof value !== "string") { + throw new Error( + 'The writableBy property of variable "' + object.name + '" must be a string' + ); } if (value) { variable.writableBy = value; } break; - case 'readableBy': - if (typeof value !== 'string') { - throw new Error('The readableBy property of variable "'+object.name+'" must be a string'); + case "readableBy": + if (typeof value !== "string") { + throw new Error( + 'The readableBy property of variable "' + object.name + '" must be a string' + ); } if (value) { variable.readableBy = value; @@ -130,7 +150,7 @@ export class SharedVariablesManager { } public close(): void { - iframeListener.unregisterAnswerer('setVariable'); + iframeListener.unregisterAnswerer("setVariable"); } get variables(): Map {