Merge pull request #1466 from thecodingmachine/develop
Deploy 2021-09-16
This commit is contained in:
commit
950ffaafda
@ -75,6 +75,9 @@
|
|||||||
"UPLOADER_URL": "//uploader-"+url,
|
"UPLOADER_URL": "//uploader-"+url,
|
||||||
"ADMIN_URL": "//"+url,
|
"ADMIN_URL": "//"+url,
|
||||||
"JITSI_URL": env.JITSI_URL,
|
"JITSI_URL": env.JITSI_URL,
|
||||||
|
#POSTHOG
|
||||||
|
"POSTHOG_API_KEY": if namespace == "master" then env.POSTHOG_API_KEY else "",
|
||||||
|
"POSTHOG_URL": if namespace == "master" then env.POSTHOG_URL else "",
|
||||||
"SECRET_JITSI_KEY": env.SECRET_JITSI_KEY,
|
"SECRET_JITSI_KEY": env.SECRET_JITSI_KEY,
|
||||||
"TURN_SERVER": "turn:coturn.workadventu.re:443,turns:coturn.workadventu.re:443",
|
"TURN_SERVER": "turn:coturn.workadventu.re:443,turns:coturn.workadventu.re:443",
|
||||||
"JITSI_PRIVATE_MODE": if env.SECRET_JITSI_KEY != '' then "true" else "false",
|
"JITSI_PRIVATE_MODE": if env.SECRET_JITSI_KEY != '' then "true" else "false",
|
||||||
|
@ -12,7 +12,7 @@ In order to create a zone that opens websites:
|
|||||||
|
|
||||||
* You must create a specific layer.
|
* You must create a specific layer.
|
||||||
* In layer properties, you MUST add a "`openWebsite`" property (of type "`string`"). The value of the property is the URL of the website to open (the URL must start with "https://")
|
* In layer properties, you MUST add a "`openWebsite`" property (of type "`string`"). The value of the property is the URL of the website to open (the URL must start with "https://")
|
||||||
* You may also use "`openWebsiteWidth`" property (of type "`number`" between 0 and 100) to control the width of the iframe.
|
* You may also use "`openWebsiteWidth`" property (of type "`int`" or "`float`" between 0 and 100) to control the width of the iframe.
|
||||||
* You may also use "`openTab`" property (of type "`string`") to open in a new tab instead.
|
* You may also use "`openTab`" property (of type "`string`") to open in a new tab instead.
|
||||||
|
|
||||||
{.alert.alert-warning}
|
{.alert.alert-warning}
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
FROM thecodingmachine/workadventure-back-base:latest as builder
|
FROM node:14.15.4-buster-slim@sha256:cbae886186467bbfd274b82a234a1cdfbbd31201c2a6ee63a6893eefcf3c6e76 as builder
|
||||||
WORKDIR /var/www/messages
|
WORKDIR /usr/src
|
||||||
COPY --chown=docker:docker messages .
|
COPY messages .
|
||||||
RUN yarn install && yarn proto
|
RUN yarn install && yarn proto
|
||||||
|
|
||||||
# we are rebuilding on each deploy to cope with the PUSHER_URL environment URL
|
# we are rebuilding on each deploy to cope with the PUSHER_URL environment URL
|
||||||
FROM thecodingmachine/nodejs:14-apache
|
FROM thecodingmachine/nodejs:14-apache
|
||||||
|
|
||||||
COPY --chown=docker:docker front .
|
COPY --chown=docker:docker front .
|
||||||
COPY --from=builder --chown=docker:docker /var/www/messages/generated /var/www/html/src/Messages/generated
|
COPY --from=builder --chown=docker:docker /usr/src/generated /var/www/html/src/Messages/generated
|
||||||
|
|
||||||
# Removing the iframe.html file from the final image as this adds a XSS attack.
|
# Removing the iframe.html file from the final image as this adds a XSS attack.
|
||||||
# iframe.html is only in dev mode to circumvent a limitation
|
# iframe.html is only in dev mode to circumvent a limitation
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
"phaser": "^3.54.0",
|
"phaser": "^3.54.0",
|
||||||
"phaser-animated-tiles": "workadventure/phaser-animated-tiles#da68bbededd605925621dd4f03bd27e69284b254",
|
"phaser-animated-tiles": "workadventure/phaser-animated-tiles#da68bbededd605925621dd4f03bd27e69284b254",
|
||||||
"phaser3-rex-plugins": "^1.1.42",
|
"phaser3-rex-plugins": "^1.1.42",
|
||||||
|
"posthog-js": "^1.13.12",
|
||||||
"queue-typescript": "^1.0.1",
|
"queue-typescript": "^1.0.1",
|
||||||
"quill": "1.3.6",
|
"quill": "1.3.6",
|
||||||
"quill-delta-to-html": "^0.12.0",
|
"quill-delta-to-html": "^0.12.0",
|
||||||
|
61
front/src/Administration/AnalyticsClient.ts
Normal file
61
front/src/Administration/AnalyticsClient.ts
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import {POSTHOG_API_KEY, POSTHOG_URL} from "../Enum/EnvironmentVariable";
|
||||||
|
|
||||||
|
class AnalyticsClient {
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
private posthogPromise: Promise<any>;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
if (POSTHOG_API_KEY && POSTHOG_URL) {
|
||||||
|
this.posthogPromise = import('posthog-js').then(({default: posthog}) => {
|
||||||
|
posthog.init(POSTHOG_API_KEY, { api_host: POSTHOG_URL, disable_cookie: true });
|
||||||
|
return posthog;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.posthogPromise = Promise.reject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
identifyUser(uuid: string) {
|
||||||
|
this.posthogPromise.then(posthog => {
|
||||||
|
posthog.identify(uuid, { uuid, wa: true });
|
||||||
|
}).catch();
|
||||||
|
}
|
||||||
|
|
||||||
|
loggedWithSso() {
|
||||||
|
this.posthogPromise.then(posthog => {
|
||||||
|
posthog.capture('wa-logged-sso');
|
||||||
|
}).catch();
|
||||||
|
}
|
||||||
|
|
||||||
|
loggedWithToken() {
|
||||||
|
this.posthogPromise.then(posthog => {
|
||||||
|
posthog.capture('wa-logged-token');
|
||||||
|
}).catch();
|
||||||
|
}
|
||||||
|
|
||||||
|
enteredRoom(roomId: string) {
|
||||||
|
this.posthogPromise.then(posthog => {
|
||||||
|
posthog.capture('$pageView', {roomId});
|
||||||
|
}).catch();
|
||||||
|
}
|
||||||
|
|
||||||
|
openedMenu() {
|
||||||
|
this.posthogPromise.then(posthog => {
|
||||||
|
posthog.capture('wa-opened-menu');
|
||||||
|
}).catch();
|
||||||
|
}
|
||||||
|
|
||||||
|
launchEmote(emote: string) {
|
||||||
|
this.posthogPromise.then(posthog => {
|
||||||
|
posthog.capture('wa-emote-launch', {emote});
|
||||||
|
}).catch();
|
||||||
|
}
|
||||||
|
|
||||||
|
enteredJitsi(roomName: string, roomId: string) {
|
||||||
|
this.posthogPromise.then(posthog => {
|
||||||
|
posthog.capture('wa-entered-jitsi', {roomName, roomId});
|
||||||
|
}).catch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const analyticsClient = new AnalyticsClient();
|
@ -46,30 +46,18 @@ type AnswererCallback<T extends keyof IframeQueryMap> = (
|
|||||||
* Also allows to send messages to those iframes.
|
* Also allows to send messages to those iframes.
|
||||||
*/
|
*/
|
||||||
class IframeListener {
|
class IframeListener {
|
||||||
private readonly _readyStream: Subject<HTMLIFrameElement> = new Subject();
|
|
||||||
public readonly readyStream = this._readyStream.asObservable();
|
|
||||||
|
|
||||||
private readonly _chatStream: Subject<ChatEvent> = new Subject();
|
|
||||||
public readonly chatStream = this._chatStream.asObservable();
|
|
||||||
|
|
||||||
private readonly _openPopupStream: Subject<OpenPopupEvent> = new Subject();
|
private readonly _openPopupStream: Subject<OpenPopupEvent> = new Subject();
|
||||||
public readonly openPopupStream = this._openPopupStream.asObservable();
|
public readonly openPopupStream = this._openPopupStream.asObservable();
|
||||||
|
|
||||||
private readonly _openTabStream: Subject<OpenTabEvent> = new Subject();
|
private readonly _openTabStream: Subject<OpenTabEvent> = new Subject();
|
||||||
public readonly openTabStream = this._openTabStream.asObservable();
|
public readonly openTabStream = this._openTabStream.asObservable();
|
||||||
|
|
||||||
private readonly _goToPageStream: Subject<GoToPageEvent> = new Subject();
|
|
||||||
public readonly goToPageStream = this._goToPageStream.asObservable();
|
|
||||||
|
|
||||||
private readonly _loadPageStream: Subject<string> = new Subject();
|
private readonly _loadPageStream: Subject<string> = new Subject();
|
||||||
public readonly loadPageStream = this._loadPageStream.asObservable();
|
public readonly loadPageStream = this._loadPageStream.asObservable();
|
||||||
|
|
||||||
private readonly _openCoWebSiteStream: Subject<OpenCoWebSiteEvent> = new Subject();
|
private readonly _openCoWebSiteStream: Subject<OpenCoWebSiteEvent> = new Subject();
|
||||||
public readonly openCoWebSiteStream = this._openCoWebSiteStream.asObservable();
|
public readonly openCoWebSiteStream = this._openCoWebSiteStream.asObservable();
|
||||||
|
|
||||||
private readonly _closeCoWebSiteStream: Subject<void> = new Subject();
|
|
||||||
public readonly closeCoWebSiteStream = this._closeCoWebSiteStream.asObservable();
|
|
||||||
|
|
||||||
private readonly _disablePlayerControlStream: Subject<void> = new Subject();
|
private readonly _disablePlayerControlStream: Subject<void> = new Subject();
|
||||||
public readonly disablePlayerControlStream = this._disablePlayerControlStream.asObservable();
|
public readonly disablePlayerControlStream = this._disablePlayerControlStream.asObservable();
|
||||||
|
|
||||||
@ -219,7 +207,7 @@ class IframeListener {
|
|||||||
} else if (payload.type === "setProperty" && isSetPropertyEvent(payload.data)) {
|
} else if (payload.type === "setProperty" && isSetPropertyEvent(payload.data)) {
|
||||||
this._setPropertyStream.next(payload.data);
|
this._setPropertyStream.next(payload.data);
|
||||||
} else if (payload.type === "chat" && isChatEvent(payload.data)) {
|
} else if (payload.type === "chat" && isChatEvent(payload.data)) {
|
||||||
this._chatStream.next(payload.data);
|
scriptUtils.sendAnonymousChat(payload.data);
|
||||||
} else if (payload.type === "openPopup" && isOpenPopupEvent(payload.data)) {
|
} else if (payload.type === "openPopup" && isOpenPopupEvent(payload.data)) {
|
||||||
this._openPopupStream.next(payload.data);
|
this._openPopupStream.next(payload.data);
|
||||||
} else if (payload.type === "closePopup" && isClosePopupEvent(payload.data)) {
|
} else if (payload.type === "closePopup" && isClosePopupEvent(payload.data)) {
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
import { coWebsiteManager } from "../WebRtc/CoWebsiteManager";
|
import { coWebsiteManager } from "../WebRtc/CoWebsiteManager";
|
||||||
|
import { playersStore } from "../Stores/PlayersStore";
|
||||||
|
import { chatMessagesStore } from "../Stores/ChatStore";
|
||||||
|
import type { ChatEvent } from "./Events/ChatEvent";
|
||||||
|
|
||||||
class ScriptUtils {
|
class ScriptUtils {
|
||||||
public openTab(url: string) {
|
public openTab(url: string) {
|
||||||
@ -16,6 +19,11 @@ class ScriptUtils {
|
|||||||
public closeCoWebSite() {
|
public closeCoWebSite() {
|
||||||
coWebsiteManager.closeCoWebsite();
|
coWebsiteManager.closeCoWebsite();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public sendAnonymousChat(chatEvent: ChatEvent) {
|
||||||
|
const userId = playersStore.addFacticePlayer(chatEvent.author);
|
||||||
|
chatMessagesStore.addExternalMessage(userId, chatEvent.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const scriptUtils = new ScriptUtils();
|
export const scriptUtils = new ScriptUtils();
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
audioManagerFileStore,
|
audioManagerFileStore,
|
||||||
audioManagerVolumeStore,
|
audioManagerVolumeStore,
|
||||||
} from "../../Stores/AudioManagerStore";
|
} from "../../Stores/AudioManagerStore";
|
||||||
import {get} from "svelte/store";
|
import { get } from "svelte/store";
|
||||||
import type { Unsubscriber } from "svelte/store";
|
import type { Unsubscriber } from "svelte/store";
|
||||||
import {onDestroy, onMount} from "svelte";
|
import { onDestroy, onMount } from "svelte";
|
||||||
|
|
||||||
let HTMLAudioPlayer: HTMLAudioElement;
|
let HTMLAudioPlayer: HTMLAudioElement;
|
||||||
let audioPlayerVolumeIcon: HTMLElement;
|
let audioPlayerVolumeIcon: HTMLElement;
|
||||||
@ -21,9 +21,9 @@
|
|||||||
onMount(() => {
|
onMount(() => {
|
||||||
volume = localUserStore.getAudioPlayerVolume();
|
volume = localUserStore.getAudioPlayerVolume();
|
||||||
audioManagerVolumeStore.setMuted(localUserStore.getAudioPlayerMuted());
|
audioManagerVolumeStore.setMuted(localUserStore.getAudioPlayerMuted());
|
||||||
setVolume();
|
changeVolume();
|
||||||
|
|
||||||
unsubscriberFileStore = audioManagerFileStore.subscribe(() =>{
|
unsubscriberFileStore = audioManagerFileStore.subscribe(() => {
|
||||||
HTMLAudioPlayer.pause();
|
HTMLAudioPlayer.pause();
|
||||||
HTMLAudioPlayer.loop = get(audioManagerVolumeStore).loop;
|
HTMLAudioPlayer.loop = get(audioManagerVolumeStore).loop;
|
||||||
HTMLAudioPlayer.volume = get(audioManagerVolumeStore).volume;
|
HTMLAudioPlayer.volume = get(audioManagerVolumeStore).volume;
|
||||||
@ -53,13 +53,7 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
function onMute() {
|
function changeVolume() {
|
||||||
audioManagerVolumeStore.setMuted(!get(audioManagerVolumeStore).muted);
|
|
||||||
localUserStore.setAudioPlayerMuted(get(audioManagerVolumeStore).muted);
|
|
||||||
setVolume();
|
|
||||||
}
|
|
||||||
|
|
||||||
function setVolume() {
|
|
||||||
if (get(audioManagerVolumeStore).muted) {
|
if (get(audioManagerVolumeStore).muted) {
|
||||||
audioPlayerVolumeIcon.classList.add('muted');
|
audioPlayerVolumeIcon.classList.add('muted');
|
||||||
audioPlayerVol.value = "0";
|
audioPlayerVol.value = "0";
|
||||||
@ -76,8 +70,22 @@
|
|||||||
audioPlayerVolumeIcon.classList.remove('mid');
|
audioPlayerVolumeIcon.classList.remove('mid');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
audioManagerVolumeStore.setVolume(volume)
|
}
|
||||||
localUserStore.setAudioPlayerVolume(get(audioManagerVolumeStore).volume);
|
|
||||||
|
function onMute() {
|
||||||
|
const muted = !get(audioManagerVolumeStore).muted;
|
||||||
|
audioManagerVolumeStore.setMuted(muted);
|
||||||
|
localUserStore.setAudioPlayerMuted(muted);
|
||||||
|
changeVolume();
|
||||||
|
}
|
||||||
|
|
||||||
|
function setVolume() {
|
||||||
|
volume = parseFloat(audioPlayerVol.value);
|
||||||
|
audioManagerVolumeStore.setVolume(volume);
|
||||||
|
localUserStore.setAudioPlayerVolume(volume);
|
||||||
|
audioManagerVolumeStore.setMuted(false);
|
||||||
|
localUserStore.setAudioPlayerMuted(false);
|
||||||
|
changeVolume();
|
||||||
}
|
}
|
||||||
|
|
||||||
function setDecrease() {
|
function setDecrease() {
|
||||||
@ -108,8 +116,7 @@
|
|||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
</span>
|
</span>
|
||||||
<input type="range" min="0" max="1" step="0.025" bind:value={volume} bind:this={audioPlayerVol}
|
<input type="range" min="0" max="1" step="0.025" bind:this={audioPlayerVol} on:change={setVolume}>
|
||||||
on:change={setVolume}>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="audio-manager-reduce-conversation">
|
<div class="audio-manager-reduce-conversation">
|
||||||
<label>
|
<label>
|
||||||
@ -135,7 +142,7 @@
|
|||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
|
||||||
background-color: rgb(0,0,0,0.5);
|
background-color: rgb(0, 0, 0, 0.5);
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-rows: 50% 50%;
|
grid-template-rows: 50% 50%;
|
||||||
color: whitesmoke;
|
color: whitesmoke;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
import { chatMessagesStore, chatVisibilityStore } from "../../Stores/ChatStore";
|
import { chatMessagesStore, chatVisibilityStore } from "../../Stores/ChatStore";
|
||||||
import ChatMessageForm from './ChatMessageForm.svelte';
|
import ChatMessageForm from './ChatMessageForm.svelte';
|
||||||
import ChatElement from './ChatElement.svelte';
|
import ChatElement from './ChatElement.svelte';
|
||||||
import {afterUpdate, beforeUpdate} from "svelte";
|
import {afterUpdate, beforeUpdate, onMount} from "svelte";
|
||||||
import {HtmlUtils} from "../../WebRtc/HtmlUtils";
|
import {HtmlUtils} from "../../WebRtc/HtmlUtils";
|
||||||
|
|
||||||
let listDom: HTMLElement;
|
let listDom: HTMLElement;
|
||||||
@ -15,6 +15,10 @@
|
|||||||
autoscroll = listDom && (listDom.offsetHeight + listDom.scrollTop) > (listDom.scrollHeight - 20);
|
autoscroll = listDom && (listDom.offsetHeight + listDom.scrollTop) > (listDom.scrollHeight - 20);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
listDom.scrollTo(0, listDom.scrollHeight);
|
||||||
|
})
|
||||||
|
|
||||||
afterUpdate(() => {
|
afterUpdate(() => {
|
||||||
if (autoscroll) listDom.scrollTo(0, listDom.scrollHeight);
|
if (autoscroll) listDom.scrollTo(0, listDom.scrollHeight);
|
||||||
});
|
});
|
||||||
|
@ -3,6 +3,7 @@ import {localUserStore} from "../../Connexion/LocalUserStore";
|
|||||||
import {videoConstraintStore} from "../../Stores/MediaStore";
|
import {videoConstraintStore} from "../../Stores/MediaStore";
|
||||||
import {HtmlUtils} from "../../WebRtc/HtmlUtils";
|
import {HtmlUtils} from "../../WebRtc/HtmlUtils";
|
||||||
import {isMobile} from "../../Enum/EnvironmentVariable";
|
import {isMobile} from "../../Enum/EnvironmentVariable";
|
||||||
|
import {menuVisiblilityStore} from "../../Stores/MenuStore";
|
||||||
|
|
||||||
let fullscreen : boolean = localUserStore.getFullscreen();
|
let fullscreen : boolean = localUserStore.getFullscreen();
|
||||||
let notification : boolean = localUserStore.getNotification() === 'granted';
|
let notification : boolean = localUserStore.getNotification() === 'granted';
|
||||||
@ -22,6 +23,8 @@ function saveSetting(){
|
|||||||
previewValueVideo = valueVideo;
|
previewValueVideo = valueVideo;
|
||||||
videoConstraintStore.setFrameRate(valueVideo);
|
videoConstraintStore.setFrameRate(valueVideo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
closeMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
function changeFullscreen() {
|
function changeFullscreen() {
|
||||||
@ -50,6 +53,10 @@ function changeNotification() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function closeMenu() {
|
||||||
|
menuVisiblilityStore.set(false);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="settings-main" on:submit|preventDefault={saveSetting}>
|
<div class="settings-main" on:submit|preventDefault={saveSetting}>
|
||||||
|
@ -9,6 +9,7 @@ import { Room } from "./Room";
|
|||||||
import { _ServiceWorker } from "../Network/ServiceWorker";
|
import { _ServiceWorker } from "../Network/ServiceWorker";
|
||||||
import { loginSceneVisibleIframeStore } from "../Stores/LoginSceneStore";
|
import { loginSceneVisibleIframeStore } from "../Stores/LoginSceneStore";
|
||||||
import { userIsConnected } from "../Stores/MenuStore";
|
import { userIsConnected } from "../Stores/MenuStore";
|
||||||
|
import {analyticsClient} from "../Administration/AnalyticsClient";
|
||||||
|
|
||||||
class ConnectionManager {
|
class ConnectionManager {
|
||||||
private localUser!: LocalUser;
|
private localUser!: LocalUser;
|
||||||
@ -93,6 +94,7 @@ class ConnectionManager {
|
|||||||
this._currentRoom = await Room.createRoom(new URL(localUserStore.getLastRoomUrl()));
|
this._currentRoom = await Room.createRoom(new URL(localUserStore.getLastRoomUrl()));
|
||||||
try {
|
try {
|
||||||
await this.checkAuthUserConnexion();
|
await this.checkAuthUserConnexion();
|
||||||
|
analyticsClient.loggedWithSso();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
this.loadOpenIDScreen();
|
this.loadOpenIDScreen();
|
||||||
@ -109,6 +111,7 @@ class ConnectionManager {
|
|||||||
this.authToken = data.authToken;
|
this.authToken = data.authToken;
|
||||||
localUserStore.saveUser(this.localUser);
|
localUserStore.saveUser(this.localUser);
|
||||||
localUserStore.setAuthToken(this.authToken);
|
localUserStore.setAuthToken(this.authToken);
|
||||||
|
analyticsClient.loggedWithToken();
|
||||||
|
|
||||||
const roomUrl = data.roomUrl;
|
const roomUrl = data.roomUrl;
|
||||||
|
|
||||||
@ -184,6 +187,9 @@ class ConnectionManager {
|
|||||||
if (this._currentRoom == undefined) {
|
if (this._currentRoom == undefined) {
|
||||||
return Promise.reject(new Error("Invalid URL"));
|
return Promise.reject(new Error("Invalid URL"));
|
||||||
}
|
}
|
||||||
|
if (this.localUser) {
|
||||||
|
analyticsClient.identifyUser(this.localUser.uuid)
|
||||||
|
}
|
||||||
|
|
||||||
this.serviceWorker = new _ServiceWorker();
|
this.serviceWorker = new _ServiceWorker();
|
||||||
return Promise.resolve(this._currentRoom);
|
return Promise.resolve(this._currentRoom);
|
||||||
|
@ -20,6 +20,8 @@ export const DISPLAY_TERMS_OF_USE = process.env.DISPLAY_TERMS_OF_USE == "true";
|
|||||||
export const NODE_ENV = process.env.NODE_ENV || "development";
|
export const NODE_ENV = process.env.NODE_ENV || "development";
|
||||||
export const CONTACT_URL = process.env.CONTACT_URL || undefined;
|
export const CONTACT_URL = process.env.CONTACT_URL || undefined;
|
||||||
export const PROFILE_URL = process.env.PROFILE_URL || undefined;
|
export const PROFILE_URL = process.env.PROFILE_URL || undefined;
|
||||||
|
export const POSTHOG_API_KEY: string = process.env.POSTHOG_API_KEY as string || '';
|
||||||
|
export const POSTHOG_URL = process.env.POSTHOG_URL || undefined;
|
||||||
|
|
||||||
export const isMobile = (): boolean => window.innerWidth <= 800 || window.innerHeight <= 600;
|
export const isMobile = (): boolean => window.innerWidth <= 800 || window.innerHeight <= 600;
|
||||||
|
|
||||||
|
@ -286,4 +286,15 @@ export class GameMap {
|
|||||||
|
|
||||||
this.triggerAll();
|
this.triggerAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trigger all the callbacks (used when exiting a map)
|
||||||
|
*/
|
||||||
|
public triggerExitCallbacks(): void {
|
||||||
|
const emptyProps = new Map<string, string | boolean | number>();
|
||||||
|
for (const [oldPropName, oldPropValue] of this.lastProperties.entries()) {
|
||||||
|
// We found a property that disappeared
|
||||||
|
this.trigger(oldPropName, oldPropValue, undefined, emptyProps);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,6 +94,7 @@ import { layoutManagerActionStore } from "../../Stores/LayoutManagerStore";
|
|||||||
import { EmbeddedWebsiteManager } from "./EmbeddedWebsiteManager";
|
import { EmbeddedWebsiteManager } from "./EmbeddedWebsiteManager";
|
||||||
import { GameMapPropertiesListener } from "./GameMapPropertiesListener";
|
import { GameMapPropertiesListener } from "./GameMapPropertiesListener";
|
||||||
import type { RadialMenuItem } from "../Components/RadialMenu";
|
import type { RadialMenuItem } from "../Components/RadialMenu";
|
||||||
|
import {analyticsClient} from "../../Administration/AnalyticsClient";
|
||||||
|
|
||||||
export interface GameSceneInitInterface {
|
export interface GameSceneInitInterface {
|
||||||
initPosition: PointInterface | null;
|
initPosition: PointInterface | null;
|
||||||
@ -426,6 +427,7 @@ export class GameScene extends DirtyScene {
|
|||||||
|
|
||||||
gameManager.gameSceneIsCreated(this);
|
gameManager.gameSceneIsCreated(this);
|
||||||
urlManager.pushRoomIdToUrl(this.room);
|
urlManager.pushRoomIdToUrl(this.room);
|
||||||
|
analyticsClient.enteredRoom(this.room.id);
|
||||||
|
|
||||||
if (touchScreenManager.supportTouchScreen) {
|
if (touchScreenManager.supportTouchScreen) {
|
||||||
this.pinchManager = new PinchManager(this);
|
this.pinchManager = new PinchManager(this);
|
||||||
@ -1236,6 +1238,8 @@ ${escapedMessage}
|
|||||||
if (this.mapTransitioning) return;
|
if (this.mapTransitioning) return;
|
||||||
this.mapTransitioning = true;
|
this.mapTransitioning = true;
|
||||||
|
|
||||||
|
this.gameMap.triggerExitCallbacks();
|
||||||
|
|
||||||
let targetRoom: Room;
|
let targetRoom: Room;
|
||||||
try {
|
try {
|
||||||
targetRoom = await Room.createRoom(roomUrl);
|
targetRoom = await Room.createRoom(roomUrl);
|
||||||
@ -1438,6 +1442,7 @@ ${escapedMessage}
|
|||||||
});
|
});
|
||||||
this.CurrentPlayer.on(requestEmoteEventName, (emoteKey: string) => {
|
this.CurrentPlayer.on(requestEmoteEventName, (emoteKey: string) => {
|
||||||
this.connection?.emitEmoteEvent(emoteKey);
|
this.connection?.emitEmoteEvent(emoteKey);
|
||||||
|
analyticsClient.launchEmote(emoteKey);
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err instanceof TextureError) {
|
if (err instanceof TextureError) {
|
||||||
@ -1805,19 +1810,21 @@ ${escapedMessage}
|
|||||||
jitsiFactory.start(roomName, this.playerName, jwt, jitsiConfig, jitsiInterfaceConfig, jitsiUrl, jitsiWidth);
|
jitsiFactory.start(roomName, this.playerName, jwt, jitsiConfig, jitsiInterfaceConfig, jitsiUrl, jitsiWidth);
|
||||||
this.connection?.setSilent(true);
|
this.connection?.setSilent(true);
|
||||||
mediaManager.hideGameOverlay();
|
mediaManager.hideGameOverlay();
|
||||||
|
analyticsClient.enteredJitsi(roomName, this.room.id);
|
||||||
|
|
||||||
//permit to stop jitsi when user close iframe
|
//permit to stop jitsi when user close iframe
|
||||||
mediaManager.addTriggerCloseJitsiFrameButton("close-jisi", () => {
|
mediaManager.addTriggerCloseJitsiFrameButton("close-jitsi", () => {
|
||||||
this.stopJitsi();
|
this.stopJitsi();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public stopJitsi(): void {
|
public stopJitsi(): void {
|
||||||
this.connection?.setSilent(false);
|
const silent = this.gameMap.getCurrentProperties().get("silent");
|
||||||
|
this.connection?.setSilent(!!silent);
|
||||||
jitsiFactory.stop();
|
jitsiFactory.stop();
|
||||||
mediaManager.showGameOverlay();
|
mediaManager.showGameOverlay();
|
||||||
|
|
||||||
mediaManager.removeTriggerCloseJitsiFrameButton("close-jisi");
|
mediaManager.removeTriggerCloseJitsiFrameButton("close-jitsi");
|
||||||
}
|
}
|
||||||
|
|
||||||
//todo: put this into an 'orchestrator' scene (EntryScene?)
|
//todo: put this into an 'orchestrator' scene (EntryScene?)
|
||||||
|
@ -2,11 +2,14 @@ import { get, writable } from "svelte/store";
|
|||||||
import Timeout = NodeJS.Timeout;
|
import Timeout = NodeJS.Timeout;
|
||||||
import { userIsAdminStore } from "./GameStore";
|
import { userIsAdminStore } from "./GameStore";
|
||||||
import { CONTACT_URL } from "../Enum/EnvironmentVariable";
|
import { CONTACT_URL } from "../Enum/EnvironmentVariable";
|
||||||
|
import {analyticsClient} from "../Administration/AnalyticsClient";
|
||||||
|
|
||||||
export const menuIconVisiblilityStore = writable(false);
|
export const menuIconVisiblilityStore = writable(false);
|
||||||
export const menuVisiblilityStore = writable(false);
|
export const menuVisiblilityStore = writable(false);
|
||||||
|
menuVisiblilityStore.subscribe((value) => {
|
||||||
|
if (value) analyticsClient.openedMenu();
|
||||||
|
})
|
||||||
export const menuInputFocusStore = writable(false);
|
export const menuInputFocusStore = writable(false);
|
||||||
export const loginUrlStore = writable(false);
|
|
||||||
export const userIsConnected = writable(false);
|
export const userIsConnected = writable(false);
|
||||||
|
|
||||||
let warningContainerTimeout: Timeout | null = null;
|
let warningContainerTimeout: Timeout | null = null;
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
import { iframeListener } from "../Api/IframeListener";
|
|
||||||
import { chatMessagesStore } from "../Stores/ChatStore";
|
|
||||||
import { playersStore } from "../Stores/PlayersStore";
|
|
||||||
|
|
||||||
export class DiscussionManager {
|
|
||||||
constructor() {
|
|
||||||
iframeListener.chatStream.subscribe((chatEvent) => {
|
|
||||||
const userId = playersStore.addFacticePlayer(chatEvent.author);
|
|
||||||
chatMessagesStore.addExternalMessage(userId, chatEvent.message);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const discussionManager = new DiscussionManager();
|
|
@ -5,11 +5,7 @@ import { blackListManager } from "./BlackListManager";
|
|||||||
import type { Subscription } from "rxjs";
|
import type { Subscription } from "rxjs";
|
||||||
import type { UserSimplePeerInterface } from "./SimplePeer";
|
import type { UserSimplePeerInterface } from "./SimplePeer";
|
||||||
import { readable, Readable, Unsubscriber } from "svelte/store";
|
import { readable, Readable, Unsubscriber } from "svelte/store";
|
||||||
import {
|
import { localStreamStore, obtainedMediaConstraintStore, ObtainedMediaStreamConstraints } from "../Stores/MediaStore";
|
||||||
localStreamStore,
|
|
||||||
obtainedMediaConstraintStore,
|
|
||||||
ObtainedMediaStreamConstraints,
|
|
||||||
} from "../Stores/MediaStore";
|
|
||||||
import { playersStore } from "../Stores/PlayersStore";
|
import { playersStore } from "../Stores/PlayersStore";
|
||||||
import { chatMessagesStore, newChatMessageStore } from "../Stores/ChatStore";
|
import { chatMessagesStore, newChatMessageStore } from "../Stores/ChatStore";
|
||||||
import { getIceServersConfig } from "../Components/Video/utils";
|
import { getIceServersConfig } from "../Components/Video/utils";
|
||||||
|
@ -23,9 +23,9 @@ import { Game } from "./Phaser/Game/Game";
|
|||||||
import App from "./Components/App.svelte";
|
import App from "./Components/App.svelte";
|
||||||
import { HtmlUtils } from "./WebRtc/HtmlUtils";
|
import { HtmlUtils } from "./WebRtc/HtmlUtils";
|
||||||
import WebGLRenderer = Phaser.Renderer.WebGL.WebGLRenderer;
|
import WebGLRenderer = Phaser.Renderer.WebGL.WebGLRenderer;
|
||||||
|
import {analyticsClient} from "./Administration/AnalyticsClient";
|
||||||
|
|
||||||
const { width, height } = coWebsiteManager.getGameSize();
|
const { width, height } = coWebsiteManager.getGameSize();
|
||||||
|
|
||||||
const valueGameQuality = localUserStore.getGameQualityValue();
|
const valueGameQuality = localUserStore.getGameQualityValue();
|
||||||
const fps: Phaser.Types.Core.FPSConfig = {
|
const fps: Phaser.Types.Core.FPSConfig = {
|
||||||
/**
|
/**
|
||||||
|
@ -7,7 +7,7 @@ import MiniCssExtractPlugin from "mini-css-extract-plugin";
|
|||||||
import sveltePreprocess from "svelte-preprocess";
|
import sveltePreprocess from "svelte-preprocess";
|
||||||
import ForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin";
|
import ForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin";
|
||||||
import NodePolyfillPlugin from "node-polyfill-webpack-plugin";
|
import NodePolyfillPlugin from "node-polyfill-webpack-plugin";
|
||||||
import { PROFILE_URL } from "./src/Enum/EnvironmentVariable";
|
import {POSTHOG_API_KEY, PROFILE_URL} from "./src/Enum/EnvironmentVariable";
|
||||||
|
|
||||||
const mode = process.env.NODE_ENV ?? "development";
|
const mode = process.env.NODE_ENV ?? "development";
|
||||||
const buildNpmTypingsForApi = !!process.env.BUILD_TYPINGS;
|
const buildNpmTypingsForApi = !!process.env.BUILD_TYPINGS;
|
||||||
@ -204,6 +204,8 @@ module.exports = {
|
|||||||
MAX_USERNAME_LENGTH: 8,
|
MAX_USERNAME_LENGTH: 8,
|
||||||
MAX_PER_GROUP: 4,
|
MAX_PER_GROUP: 4,
|
||||||
DISPLAY_TERMS_OF_USE: false,
|
DISPLAY_TERMS_OF_USE: false,
|
||||||
|
POSTHOG_API_KEY: null,
|
||||||
|
POSTHOG_URL: null,
|
||||||
NODE_ENV: mode,
|
NODE_ENV: mode,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -83,6 +83,11 @@
|
|||||||
"@nodelib/fs.scandir" "2.1.4"
|
"@nodelib/fs.scandir" "2.1.4"
|
||||||
fastq "^1.6.0"
|
fastq "^1.6.0"
|
||||||
|
|
||||||
|
"@sentry/types@^6.11.0":
|
||||||
|
version "6.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.12.0.tgz#b7395688a79403c6df8d8bb8d81deb8222519853"
|
||||||
|
integrity sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA==
|
||||||
|
|
||||||
"@tsconfig/svelte@^1.0.10":
|
"@tsconfig/svelte@^1.0.10":
|
||||||
version "1.0.10"
|
version "1.0.10"
|
||||||
resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-1.0.10.tgz#30ec7feeee0bdf38b12a50f0686f8a2e7b6b9dc0"
|
resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-1.0.10.tgz#30ec7feeee0bdf38b12a50f0686f8a2e7b6b9dc0"
|
||||||
@ -2296,6 +2301,11 @@ faye-websocket@^0.11.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
websocket-driver ">=0.5.1"
|
websocket-driver ">=0.5.1"
|
||||||
|
|
||||||
|
fflate@^0.4.1:
|
||||||
|
version "0.4.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae"
|
||||||
|
integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==
|
||||||
|
|
||||||
file-entry-cache@^6.0.1:
|
file-entry-cache@^6.0.1:
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
|
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
|
||||||
@ -4394,6 +4404,15 @@ postcss@^8.2.10:
|
|||||||
nanoid "^3.1.23"
|
nanoid "^3.1.23"
|
||||||
source-map "^0.6.1"
|
source-map "^0.6.1"
|
||||||
|
|
||||||
|
posthog-js@^1.13.12:
|
||||||
|
version "1.13.12"
|
||||||
|
resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.13.12.tgz#b54efcb92de43724c889048135ccaae3dc4b874c"
|
||||||
|
integrity sha512-MU1I0zSVhdCcnWI8jAZLtbNJmjfg9AnhUDq5dUzNkb0qPXtNz17BekalnNwDMKs0Zlek3UCOVsIpyc85M+VRNA==
|
||||||
|
dependencies:
|
||||||
|
"@sentry/types" "^6.11.0"
|
||||||
|
fflate "^0.4.1"
|
||||||
|
rrweb-snapshot "^1.1.7"
|
||||||
|
|
||||||
prelude-ls@^1.2.1:
|
prelude-ls@^1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
|
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
|
||||||
@ -4785,6 +4804,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
|
|||||||
hash-base "^3.0.0"
|
hash-base "^3.0.0"
|
||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
|
|
||||||
|
rrweb-snapshot@^1.1.7:
|
||||||
|
version "1.1.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/rrweb-snapshot/-/rrweb-snapshot-1.1.8.tgz#57c3a8003a6ebbe4a2e2f5be29e30a47a8b1eb03"
|
||||||
|
integrity sha512-wi8T9IVobEwlns7U2m8cbPfoihsNAMpTI+UBe4KUjclU2N+vtowD2U1Rq8PleiFTDvcseHvkQDmEIZoZLXFzwg==
|
||||||
|
|
||||||
run-parallel@^1.1.9:
|
run-parallel@^1.1.9:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
|
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
|
||||||
|
@ -49,13 +49,31 @@
|
|||||||
"x":0,
|
"x":0,
|
||||||
"y":0
|
"y":0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
"height":10,
|
||||||
|
"id":6,
|
||||||
|
"name":"exit",
|
||||||
|
"opacity":1,
|
||||||
|
"properties":[
|
||||||
|
{
|
||||||
|
"name":"exitUrl",
|
||||||
|
"type":"string",
|
||||||
|
"value":"Properties\/jitsi_next_to_silent.json"
|
||||||
|
}],
|
||||||
|
"type":"tilelayer",
|
||||||
|
"visible":true,
|
||||||
|
"width":10,
|
||||||
|
"x":0,
|
||||||
|
"y":0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"draworder":"topdown",
|
"draworder":"topdown",
|
||||||
"id":3,
|
"id":3,
|
||||||
"name":"floorLayer",
|
"name":"floorLayer",
|
||||||
"objects":[
|
"objects":[
|
||||||
{
|
{
|
||||||
"height":119.194025905366,
|
"height":308.584234177831,
|
||||||
"id":1,
|
"id":1,
|
||||||
"name":"",
|
"name":"",
|
||||||
"rotation":0,
|
"rotation":0,
|
||||||
@ -63,14 +81,14 @@
|
|||||||
{
|
{
|
||||||
"fontfamily":"Sans Serif",
|
"fontfamily":"Sans Serif",
|
||||||
"pixelsize":13,
|
"pixelsize":13,
|
||||||
"text":"Test:\nWalk on the carpet\nResult:\nA sound is played in loop.\nControls at the top of the screen allow you to control the sound.",
|
"text":"Test:\nWalk on the carpet\n\nResult:\nA sound is played in loop.\nControls at the top of the screen allow you to control the sound.\n\nTest:\nWalk on the white spot in the carpet\n\nResult:\nThe user is redirected to another map AND sound is shut down",
|
||||||
"wrap":true
|
"wrap":true
|
||||||
},
|
},
|
||||||
"type":"",
|
"type":"",
|
||||||
"visible":true,
|
"visible":true,
|
||||||
"width":315.4375,
|
"width":315.4375,
|
||||||
"x":2.28125,
|
"x":1.74700399641053,
|
||||||
"y":198.837938422583
|
"y":1.43404009627554
|
||||||
}],
|
}],
|
||||||
"opacity":1,
|
"opacity":1,
|
||||||
"type":"objectgroup",
|
"type":"objectgroup",
|
||||||
@ -78,7 +96,7 @@
|
|||||||
"x":0,
|
"x":0,
|
||||||
"y":0
|
"y":0
|
||||||
}],
|
}],
|
||||||
"nextlayerid":6,
|
"nextlayerid":7,
|
||||||
"nextobjectid":2,
|
"nextobjectid":2,
|
||||||
"orientation":"orthogonal",
|
"orientation":"orthogonal",
|
||||||
"renderorder":"right-down",
|
"renderorder":"right-down",
|
||||||
|
@ -71,6 +71,14 @@
|
|||||||
<a href="#" class="testLink" data-testmap="audio.json" target="_blank">Testing audio layer</a>
|
<a href="#" class="testLink" data-testmap="audio.json" target="_blank">Testing audio layer</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<input type="radio" name="test-jitsi-silent"> Success <input type="radio" name="test-jitsi-silent"> Failure <input type="radio" name="test-jitsi-silent" checked> Pending
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="#" class="testLink" data-testmap="jitsi_custom_url.json" target="_blank">Testing Jitsi + silent layer</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<h2>Iframe API</h2>
|
<h2>Iframe API</h2>
|
||||||
<table class="table">
|
<table class="table">
|
||||||
@ -224,14 +232,6 @@
|
|||||||
</table>
|
</table>
|
||||||
<h2>WebRTC</h2>
|
<h2>WebRTC</h2>
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<input type="radio" name="test-energy"> Success <input type="radio" name="test-energy"> Failure <input type="radio" name="test-energy" checked> Pending
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="#" class="testLink" data-testmap="energy.json" target="_blank">Test energy consumption</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<input type="radio" name="test-help-camera-setting"> Success <input type="radio" name="test-help-camera-setting"> Failure <input type="radio" name="test-help-camera-setting" checked> Pending
|
<input type="radio" name="test-help-camera-setting"> Success <input type="radio" name="test-help-camera-setting"> Failure <input type="radio" name="test-help-camera-setting" checked> Pending
|
||||||
|
@ -8,6 +8,12 @@
|
|||||||
"id":1,
|
"id":1,
|
||||||
"name":"floor",
|
"name":"floor",
|
||||||
"opacity":1,
|
"opacity":1,
|
||||||
|
"properties":[
|
||||||
|
{
|
||||||
|
"name":"silent",
|
||||||
|
"type":"bool",
|
||||||
|
"value":true
|
||||||
|
}],
|
||||||
"type":"tilelayer",
|
"type":"tilelayer",
|
||||||
"visible":true,
|
"visible":true,
|
||||||
"width":10,
|
"width":10,
|
||||||
@ -37,11 +43,6 @@
|
|||||||
"name":"jitsiRoom",
|
"name":"jitsiRoom",
|
||||||
"type":"string",
|
"type":"string",
|
||||||
"value":"myRoom"
|
"value":"myRoom"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"jitsiUrl",
|
|
||||||
"type":"string",
|
|
||||||
"value":"meet.jit.si"
|
|
||||||
}],
|
}],
|
||||||
"type":"tilelayer",
|
"type":"tilelayer",
|
||||||
"visible":true,
|
"visible":true,
|
||||||
@ -55,7 +56,7 @@
|
|||||||
"name":"floorLayer",
|
"name":"floorLayer",
|
||||||
"objects":[
|
"objects":[
|
||||||
{
|
{
|
||||||
"height":94.6489098314831,
|
"height":163.652982988579,
|
||||||
"id":1,
|
"id":1,
|
||||||
"name":"",
|
"name":"",
|
||||||
"properties":[
|
"properties":[
|
||||||
@ -69,14 +70,14 @@
|
|||||||
{
|
{
|
||||||
"fontfamily":"Sans Serif",
|
"fontfamily":"Sans Serif",
|
||||||
"pixelsize":8,
|
"pixelsize":8,
|
||||||
"text":"Test:\nWalk on the carpet and press space\nResult:\nJitsi opens on meet.jit.si (check this in the network tab). Note: this test only makes sense if the default configured Jitsi instance is NOT meet.jit.si (check your .env file)",
|
"text":"Test:\nThe whole map is silent.\nConnect with 2 users\nResult:\nThe map is silent\n\nTest:\nmove on the carpet with both users\n\nResult:\nA Jitsi opens\n\nTest:\nmove out of the carpet and try to connect both users\nResult:\nThey are still silent\n",
|
||||||
"wrap":true
|
"wrap":true
|
||||||
},
|
},
|
||||||
"type":"",
|
"type":"",
|
||||||
"visible":true,
|
"visible":true,
|
||||||
"width":317.361946929159,
|
"width":317.361946929159,
|
||||||
"x":2.32853056864467,
|
"x":2.32853056864467,
|
||||||
"y":224.602707451482
|
"y":2.25624950083909
|
||||||
}],
|
}],
|
||||||
"opacity":1,
|
"opacity":1,
|
||||||
"type":"objectgroup",
|
"type":"objectgroup",
|
||||||
|
Loading…
Reference in New Issue
Block a user