Compare commits

...

1455 Commits

Author SHA1 Message Date
e66ff65eaf content-type??? 2021-12-01 21:41:54 +01:00
b0363a4414 bump debian changelog 2021-12-01 21:37:13 +01:00
2bea8813af adjust install rules 2021-12-01 21:27:51 +01:00
4fbbee06f4 add webpack-polyfill-thing 2021-12-01 21:27:51 +01:00
dce2c86fc2 fixes 2021-12-01 21:27:51 +01:00
0582a26af9 another bump 2021-12-01 21:27:51 +01:00
d7df8f6978 bump debian changelog 2021-12-01 21:27:51 +01:00
f75ed771e7 Two minor fixes 2021-12-01 21:27:51 +01:00
28805c62f4 initial import of debian directory 2021-12-01 21:27:51 +01:00
ae81170396 allow external configuration 2021-12-01 21:27:50 +01:00
grégoire parant
4875a8fed9
Merge pull request #1610 from thecodingmachine/fixingQueryParamsRegisterUrl
Fixing "Query string parameters prevent WA from loading"
2021-11-30 17:45:07 +01:00
Gregoire Parant
b098b5f37d Fixing "Query string parameters prevent WA from loading"
Due to a regression, query string parameters added to the URL (like:

http://play.workadventure.localhost/_/global/maps.workadventure.localhost/starter/map.json?utm_source=sendinblue&utm_campaign=WA+-+2021+Christmap+map+launch&utm_medium=email#foo

) were causing a crash in WA.

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-30 17:29:53 +01:00
David Négrier
7b52c13fae
Merge pull request #1609 from thecodingmachine/fix_prod_docker_compose
Adding missing environment variable in docker-compose.prod.yml
2021-11-30 15:09:52 +01:00
David Négrier
0a6d9e88bc
Merge pull request #1608 from thecodingmachine/admin_url_not_compulsory
Making the ADMIN_URL parameter optionnal in front
2021-11-30 15:06:47 +01:00
David Négrier
8205775dc9 Adding missing environment variable in docker-compose.prod.yml
In the new version, a new FRONT_URL environment variable is now compulsory in the Pusher.
This is done to setup CORS security in the pusher.

This commit adds this environment variable in the sample docker-compose.prod.yml file.
2021-11-30 15:02:52 +01:00
David Négrier
d81ecb3199 Making the ADMIN_URL parameter optionnal in front
This parameter is only used in the SAAS version (and ideally, should disappear completely).
The warning message that uses the ADMIN_URL should originate from the admin itself.
2021-11-30 14:58:37 +01:00
David Négrier
986f826830
Merge pull request #1607 from thecodingmachine/fix_query_string
Fixing "Query string parameters prevent WA from loading"
2021-11-30 14:48:15 +01:00
David Négrier
06483fd586 Fixing "Query string parameters prevent WA from loading"
Due to a regression, query string parameters added to the URL (like:

http://play.workadventure.localhost/_/global/maps.workadventure.localhost/starter/map.json?utm_source=sendinblue&utm_campaign=WA+-+2021+Christmap+map+launch&utm_medium=email#foo

) were causing a crash in WA.

This commit fixes the issue (and adds a E2E test)
2021-11-30 14:34:43 +01:00
David Négrier
21e400a4a1
Merge pull request #1604 from thecodingmachine/develop
Deploy 2021-11-29
2021-11-29 18:43:57 +01:00
David Négrier
591467f1e3
Merge pull request #1603 from thecodingmachine/fix-black-screen
Cannot rezise main cowebsite when fullscreen is enable
2021-11-29 18:37:36 +01:00
Alexis Faizeau
812485f863 Cannot rezise main cowebsite when fullscreen is enable 2021-11-29 18:35:32 +01:00
David Négrier
233c3d1abe
Merge pull request #1598 from thecodingmachine/refactor_testcafe_tests
Refactoring test cafe tests
2021-11-28 16:52:24 +01:00
David Négrier
eac4bb2875 Refactoring test cafe tests
- Using "Roles" to log users
- Adding seemingly useless import statement but important for code completion
2021-11-28 16:43:12 +01:00
grégoire parant
5e11cccdf9
Merge pull request #1593 from thecodingmachine/develop
Next release 1.5.7
2021-11-25 11:44:36 +01:00
grégoire parant
923a134270
Merge pull request #1592 from thecodingmachine/fix-blank-cowebsite-bar
Resize cowebsites when main slot is loaded
2021-11-25 11:36:48 +01:00
Alexis Faizeau
a775a01d2a Resize cowebsites when main slot is loaded 2021-11-25 10:48:14 +01:00
David Négrier
3d29fcad7e
Merge pull request #1591 from thecodingmachine/develop
Next release 1.5.7
2021-11-24 22:57:20 +01:00
David Négrier
ecb72d0fd1 Adding FRONT_URL in pusher 2021-11-24 22:47:46 +01:00
grégoire parant
5bdb5d98a9
Merge pull request #1589 from thecodingmachine/fix-grab-cowebsite
Handle touch & mouse events on same time for cowebsite holder
2021-11-24 19:44:07 +01:00
grégoire parant
a59c07d8a3
Merge pull request #1590 from thecodingmachine/FixHashLocalStorage
Fix htag last map URL visited in localstorage
2021-11-24 19:43:48 +01:00
Gregoire Parant
060c844468 Fix htag in localstorage
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-24 19:24:43 +01:00
Alexis Faizeau
07c01d81bf Handle touch & mouse events on same time for cowebsite holder 2021-11-24 18:38:39 +01:00
David Négrier
69a26a0e55
Merge pull request #1588 from thecodingmachine/develop
Deploy 2021-11-24 2
2021-11-24 17:44:48 +01:00
David Négrier
445599416c Commenting waiting as this does not work for some reason 2021-11-24 17:24:11 +01:00
David Négrier
e8a78a0646
Merge pull request #1585 from thecodingmachine/HotFixCleanTokenParamUrl
Clean token auth of url params
2021-11-24 17:10:22 +01:00
David Négrier
94959e2e91 Merge branch 'develop' of github.com:thecodingmachine/workadventure into HotFixCleanTokenParamUrl
# Conflicts:
#	back/src/Services/Logger.ts
2021-11-24 17:03:29 +01:00
David Négrier
257162c451 Fixing prettier 2021-11-24 17:02:11 +01:00
David Négrier
cf6d461247
Merge pull request #1586 from thecodingmachine/revert-1552-improve_logging
Revert "Improving log messages"
2021-11-24 17:00:37 +01:00
David Négrier
d1122d75ec Fixing CI 2021-11-24 16:59:22 +01:00
David Négrier
d8c10ce10a CI fix 2021-11-24 16:32:37 +01:00
David Négrier
065404758b Making sure pusher and admin are started in CI 2021-11-24 16:22:26 +01:00
David Négrier
6e6cdc7bde
Revert "Improving log messages" 2021-11-24 16:20:07 +01:00
David Négrier
6c5f330b71
Merge pull request #1584 from thecodingmachine/fixes
Fixes
2021-11-24 15:55:33 +01:00
Gregoire Parant
b02c09fc7b Clean token auth of url params
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-24 15:49:45 +01:00
David Négrier
be3c1eea6f
Merge pull request #1583 from thecodingmachine/pretty_ci_front_fix
Fixing running of prettier check on the front
2021-11-24 15:46:18 +01:00
David Négrier
0fe2de090e
Merge pull request #1552 from thecodingmachine/improve_logging
Improving log messages
2021-11-24 15:43:24 +01:00
Alexis Faizeau
5c3036e18b Display a default skin on remote player entity 2021-11-24 15:43:01 +01:00
David Négrier
a1107bd20e Merge branch 'develop' of github.com:thecodingmachine/workadventure into improve_logging 2021-11-24 15:36:35 +01:00
David Négrier
07ba532c5e Prettier fixes on front 2021-11-24 15:31:17 +01:00
David Négrier
9b29fde1b3 Merge branch 'develop' of github.com:thecodingmachine/workadventure into pretty_ci_front_fix 2021-11-24 15:30:29 +01:00
David Négrier
dc58f16418
Merge pull request #1582 from thecodingmachine/end-to-end-tests
Making the loader resizable
2021-11-24 15:30:15 +01:00
David Négrier
2cbf5b56af Fixing linting 2021-11-24 15:29:12 +01:00
David Négrier
d3bd99b5ee Fixing running of prettier check on the front 2021-11-24 15:24:24 +01:00
David Négrier
7c6105d93a Making the loader resizable
This way, if the window is resized while loading, the loading bar will stay in the middle
2021-11-24 15:21:07 +01:00
Alexis Faizeau
24640d13bb Fix removing of co-website action trigger 2021-11-24 14:50:19 +01:00
David Négrier
ced08e69c9
Merge pull request #1581 from thecodingmachine/develop
Deploy 2021-12-24
2021-11-24 13:36:11 +01:00
David Négrier
bb435f3580
Merge pull request #1556 from thecodingmachine/iconserver
Add icon server on self host services
2021-11-24 12:24:57 +01:00
David Négrier
64e86411c5
Fixing env var for ICON_URL 2021-11-24 12:19:45 +01:00
David Négrier
2f632ae472
Merge pull request #1580 from thecodingmachine/fix-tab
Fix tab index on embedded iframes
2021-11-24 12:17:25 +01:00
David Négrier
f3e498439c
Merge pull request #1579 from thecodingmachine/end-to-end-tests
Adding End to end tests
2021-11-24 12:09:23 +01:00
David Négrier
dfad0a7b57 Removing useless wait 2021-11-24 12:03:48 +01:00
Alexis Faizeau
6a7385947d Fix authentication mandatory 2021-11-24 11:55:28 +01:00
David Négrier
7c2bf8700b Fixing test 2021-11-24 11:50:23 +01:00
David Négrier
780d92782c Adding a wait step for messages generated file to be available before starting pusher and back 2021-11-24 11:31:11 +01:00
David Négrier
168156b7ff Display error logs in failure 2021-11-24 11:11:38 +01:00
Alexis Faizeau
4ca763c028 Fix tab index on embbed iframes 2021-11-24 11:05:18 +01:00
David Négrier
550ffaf8a8 Merge branch 'develop' of github.com:thecodingmachine/workadventure into end-to-end-tests
# Conflicts:
#	front/src/Administration/AnalyticsClient.ts
2021-11-24 11:01:50 +01:00
David Négrier
8eb346de25 Displaying logs in case of error 2021-11-24 10:58:26 +01:00
David Négrier
7ef6431b64 More CI debug 2021-11-24 10:21:35 +01:00
David Négrier
806b97afab Refactoring Analytics to remove errors 2021-11-24 10:21:19 +01:00
grégoire parant
29c0b57f0c
Merge pull request #1573 from thecodingmachine/PostHogNewAction
Add new action post hog
2021-11-24 10:02:34 +01:00
David Négrier
02ed853399 Switching to actions/upload-artifact 2021-11-24 10:01:35 +01:00
David Négrier
c32a523923 CI fix 2021-11-24 09:29:50 +01:00
David Négrier
963486b663 Adding code to post screenshots of failed tests 2021-11-24 09:26:54 +01:00
David Négrier
a9ecbeec84 More CI fix 2021-11-24 09:12:24 +01:00
David Négrier
24249a1e74 Fixing CI 2021-11-24 08:57:49 +01:00
David Négrier
609af979ff Trying to speed up process 2021-11-23 19:01:56 +01:00
David Négrier
678fb71a7a More Github action fixes 2021-11-23 19:00:10 +01:00
David Négrier
303251b465 Github Actions fix attempt 2021-11-23 18:54:15 +01:00
David Négrier
0932e1de73 Taking exit code from the container 2021-11-23 18:44:00 +01:00
David Négrier
ab337409a1 Trying to fix issue with Github rights 2021-11-23 18:42:25 +01:00
David Négrier
3aec774cf3 Adding end-to-end test run in Github actions 2021-11-23 15:49:44 +01:00
David Négrier
a82f4e1813 Adding end-to-end tests
The first test is testing a tricky cache scenario with the back when testing variables.
The end-to-end package used is testcafe.
2021-11-23 15:43:34 +01:00
David Négrier
d8ecae64f0 Moving lastLoad initialization before we start loading to avoid loading several times 2021-11-23 09:34:39 +01:00
David Négrier
82a1a5fc1e Retry loading map on variable error
If the back is getting an error (because the user has no right to set a variable),
instead of failing directly, let's try to reload the map (maybe we have cached a wrong version of the map).
2021-11-22 18:43:56 +01:00
Gregoire Parant
ecc6321e17 Add new action post hog
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-18 11:39:56 +01:00
David Négrier
3487fa90e0
Merge pull request #1570 from thecodingmachine/fixZoom
Fix zoom
2021-11-17 16:19:26 +01:00
Alexis Faizeau
44c99fb0ef Fix zoom from cowebsite changes 2021-11-17 15:26:58 +01:00
grégoire parant
80c314bb9e
Merge pull request #1568 from thecodingmachine/master
Master release 1.6.0
2021-11-17 02:23:27 +01:00
grégoire parant
26fa566d85
Change 'access-control-allow-origin' to FRONT_URL env variavle (#1567)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-17 02:21:58 +01:00
grégoire parant
75ba9ddae8
HotFix Allow Origin header for CORS (#1566)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-16 18:38:18 +01:00
grégoire parant
f6b8677c2e
Merge pull request #1565 from thecodingmachine/HotFixCreditPage
Update design of credit page
2021-11-16 15:33:35 +01:00
Gregoire Parant
e5979998c5 Update design of credit page
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-16 15:28:54 +01:00
grégoire parant
7d73ca321d
Merge pull request #1564 from thecodingmachine/HotFixAuthenticationManager
Hot fix authentication manager
2021-11-16 15:17:46 +01:00
Gregoire Parant
0614fa7b47 HotFix copy link to share it
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-16 15:03:54 +01:00
Gregoire Parant
e54732be1b HotFix authentication manager to get data from back
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-16 14:46:32 +01:00
grégoire parant
6fafb727ba
Merge pull request #1563 from thecodingmachine/HotFixConnexionManager
HotFix connexion manager
2021-11-16 13:31:43 +01:00
Gregoire Parant
ba89d9b122 HotFix DISABLED_ROOM for env variable
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-16 13:18:40 +01:00
Gregoire Parant
8768374460 HotFix connexion manager
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-16 13:14:40 +01:00
grégoire parant
832c4ab300
Merge pull request #1562 from thecodingmachine/HotFixNewJwtTokenDecrypted
HotFix encrypted and decrypted error
2021-11-16 11:26:35 +01:00
Gregoire Parant
ec1cc92c8b replace console log by error
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-16 11:23:18 +01:00
Gregoire Parant
c1dc438138 HotFix encrypted and decrypted error
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-16 11:14:27 +01:00
David Négrier
78698ff17f
Merge pull request #1551 from thecodingmachine/deprecate-onenterzone
Updates API documentation (other than room) following onEnterZone & onLeaveZone deprecation
2021-11-15 17:37:05 +01:00
grégoire parant
9bdda210f5
Merge pull request #1561 from thecodingmachine/develop
Release v1.6.0
2021-11-15 16:51:48 +01:00
Gregoire Parant
d3964ae25b HotFix conflict merging 2021-11-15 16:36:10 +01:00
Gregoire Parant
20164417fb Change data by resCheckTokenAuth 2021-11-15 16:34:23 +01:00
David Négrier
4e042389c5 Merge branch 'master' of github.com:thecodingmachine/workadventure into develop
# Conflicts:
#	front/src/Connexion/ConnectionManager.ts
#	pusher/src/Controller/AuthenticateController.ts
#	pusher/src/Controller/IoSocketController.ts
#	pusher/src/Services/JWTTokenManager.ts
2021-11-15 16:30:45 +01:00
David Négrier
578fa21591
Merge pull request #1543 from thecodingmachine/fixAdminSocket
FIX: the admin sockets now uses a short live to check room authorization
2021-11-15 16:21:20 +01:00
David Négrier
8b6c16fd30
Merge pull request #1553 from thecodingmachine/openidAdminConnect
OpenId & Admin connect
2021-11-15 16:20:00 +01:00
Gregoire Parant
210a789aa4 Fix feedback @moufmouf 2021-11-15 15:58:08 +01:00
grégoire parant
a4b8a8422f
Merge pull request #1559 from thecodingmachine/openIdDisabledAnonymousSelfHost
Open id disabled anonymous self hosted
2021-11-15 15:29:55 +01:00
Gregoire Parant
bbc2ac2550 Update Connection manager to clean url history of navigator 2021-11-15 15:25:49 +01:00
Gregoire Parant
61b8d584af delete useless userIdentify 2021-11-15 14:34:23 +01:00
Gregoire Parant
16c08d86f2 Update hydraAccessToken to accessToken 2021-11-15 12:30:25 +01:00
Gregoire Parant
7d0b573d37 Define profile variable to show user connected
- OPID_PROFILE_SCREEN_PROVIDER is a variable to show profile of user connected. You can defined your own provider or use classic provider of WorkAdventure.
 - OpenIdProfileController with url "/profile" get user data and create simple html to show user informations. This url will be called with params 'accessToken'
 - If you define your custom profile url, it will be called with param 'accessToken'.

accessToken is token to access at user informations in your OpenId provider.
2021-11-12 20:48:26 +01:00
Gregoire Parant
15cdc54ec3 Add evnvironment Enum for OPID_LOGIN_SCREEN_PROVIDER variable 2021-11-12 19:36:37 +01:00
Gregoire Parant
f905426ebd Add new variable login provider to connect user 2021-11-12 19:36:13 +01:00
Gregoire Parant
24a1f324c7 Add OpenId login url and provider to login user 2021-11-12 19:35:34 +01:00
Gregoire Parant
e073d70098 Merge branch 'develop' into openidAdminConnect
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-12 17:01:26 +01:00
Gregoire Parant
ca74f92051 Pull open id admin from @GRP 2021-11-12 16:59:34 +01:00
Gregoire Parant
c21ea8803a Add OPID redirect url
Is important to defined redirect url to be connected with openid provider
2021-11-12 16:52:44 +01:00
Gregoire Parant
213af0cfa3 Changes ANONYMOUS dynamic variable 2021-11-12 16:47:39 +01:00
Gregoire Parant
fa233e13c6 Changes ANONYMOUS variable
This variable will be use to mandatory login user in self hosted
2021-11-12 16:43:37 +01:00
grégoire parant
c1788424b5
Merge pull request #1533 from Lurkars/oidcRequired
use OIDC without admin api, option to disable anonymous login

Thanks for your work @Lurkars. I will take your changes and apply some update. When I will finish, I will  share you the result and requirement for mounting correct openid connection with puhser and without ADMIN part 💪  🚀
2021-11-12 16:39:15 +01:00
Gregoire Parant
461dee776c Update css 2021-11-12 16:22:37 +01:00
Gregoire Parant
49f68451ae Update profile menu and change UX
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-12 15:31:49 +01:00
Gregoire Parant
d3f120f2bb Update to have token when user is connected
- Update menu design

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-12 12:13:44 +01:00
Gregoire Parant
1db22d82af Set state in local storage when openid provider redirect on jwt with token value
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-10 18:26:50 +01:00
Alexis Faizeau
2513f8b3d6 Add icon server on production docker services 2021-11-10 18:22:03 +01:00
Alexis Faizeau
eac5e8adc8 Add icon server on single domain services 2021-11-10 18:20:30 +01:00
David Négrier
ee4ec7ba97
Merge pull request #1555 from thecodingmachine/iconserver
Add iconserver in services
2021-11-10 18:12:47 +01:00
David Négrier
0f6ecfc311
Merge pull request #1554 from thecodingmachine/twemojiImplementation
Implement Twemoji on emote
2021-11-10 18:11:51 +01:00
Alexis Faizeau
624593e425 Implement twemoji on emote 2021-11-10 16:55:20 +01:00
Alexis Faizeau
1c48feeb61 Add iconserver in services 2021-11-10 16:46:13 +01:00
Gregoire Parant
7406b62093 Add jwt token if is defined un URL
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-09 00:38:32 +01:00
Gregoire Parant
89baafba2f Rollback openid connect to use code and nonce
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-09 00:08:01 +01:00
Gregoire Parant
4c028bfcb3 OpenId from Admin connect
- Create admin environment for redirect uri of openID
 - Add log out redirect when user click on log out button

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-11-08 19:27:01 +01:00
Alexis Faizeau
dd89f12c2e Implement logger on pusher 2021-11-08 19:05:25 +01:00
Alexis Faizeau
6a195be814 Implement logger on back 2021-11-08 17:44:57 +01:00
Alexis Faizeau
c573e9fbaf Implement no floating promises on eslint rules 2021-11-08 14:45:25 +01:00
David Négrier
6c6a7e6fe4 Improving log messages
Signed-off-by: David Négrier <d.negrier@thecodingmachine.com>
2021-11-08 14:30:54 +01:00
Bénédicte Q
b9bf27983f
Update maps/tests/TriggerMessageApi/script.js
Co-authored-by: David Négrier <d.negrier@thecodingmachine.com>
2021-11-08 10:51:18 +01:00
Bénédicte Q
7da975749c
Update maps/tests/TriggerMessageApi/script.js
Co-authored-by: David Négrier <d.negrier@thecodingmachine.com>
2021-11-08 10:51:08 +01:00
Benedicte Quimbert
854d8775d5 Edit documentation exemples 2021-11-03 19:24:24 +01:00
Benedicte Quimbert
f20c39f6a4 wip 2021-11-03 16:51:33 +01:00
David Négrier
603045bcad
Merge pull request #1549 from thecodingmachine/property-index
Create GameMapProperties index
2021-11-03 00:05:27 +01:00
Alexis Faizeau
5a3d510f05 Create GameMapProperties index 2021-11-02 10:52:25 +01:00
Alexis Faizeau
ec3120cf8f
Merge pull request #1546 from thecodingmachine/fix-room-api
Fix change layer api functions
2021-10-29 23:37:54 +02:00
Alexis Faizeau
dbd6ce5bdc Fix player movement tests 2021-10-29 23:30:02 +02:00
Alexis Faizeau
d4470568ec Fix change layer api functions 2021-10-29 23:16:36 +02:00
David Négrier
145117dc58
Merge pull request #1544 from thecodingmachine/property-layer-management
Implement on enters/leaves layer events
2021-10-29 19:46:42 +02:00
Alexis Faizeau
e1d454d834 Add enters/leaves layer with api test map 2021-10-29 19:45:03 +02:00
Alexis Faizeau
db82ae4b88 Replace the enter/leave zone by enter/leave layer on doc 2021-10-29 19:45:03 +02:00
Alexis Faizeau
f4df12e5ff Cowebsite properties manage by layer and not by property index 2021-10-29 19:45:03 +02:00
Alexis Faizeau
934e24f837 Implement on enter/leave layer events 2021-10-29 19:44:58 +02:00
Alexis Faizeau
0b08d9251e Fix link of cowebsite propeerty test map fix 2021-10-29 15:46:05 +02:00
David Négrier
60a82c5eb2
Merge pull request #1516 from thecodingmachine/iframeManager
Display multi co-websites
2021-10-29 15:33:56 +02:00
Alexis Faizeau
e216b6caf4 Handle landscape mobile with cowebsite 2021-10-29 15:23:09 +02:00
Kharhamel
6c78717d97 FIX: the admin sockets now uses a short live to check room authorization 2021-10-28 14:53:07 +02:00
Alexis Faizeau
68c626088d Add co-website icon on mobile landscape 2021-10-28 11:31:28 +02:00
Alexis Faizeau
b03e7ec8f6 Add how to have a jitsi & cowebsite on doc 2021-10-28 10:00:12 +02:00
grégoire parant
4d3bce0266
Merge pull request #1542 from thecodingmachine/HotFixLastRoomDefault
HotFix set last room for first connexion
2021-10-27 17:07:23 +02:00
Gregoire Parant
6c0d8942e5 HotFix set last room for first connexion
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-27 16:48:33 +02:00
grégoire parant
7f677cf5b9
Merge pull request #1541 from thecodingmachine/HotFixOnChatMessageEvent
Hot fix on chat message event
2021-10-27 14:46:15 +02:00
grégoire parant
1f3b712097
Merge pull request #1540 from thecodingmachine/TypoChatMessage
Typo Chat message Store
2021-10-27 14:29:53 +02:00
Gregoire Parant
f8ae189cee HotFix handler message in chat store
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-27 14:29:39 +02:00
Alexis Faizeau
c886feca79 Add max iframe count on doc 2021-10-27 12:12:42 +02:00
Gregoire Parant
385ea1360e Type Chat message Store
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-27 10:02:47 +02:00
Alexis Faizeau
820767db3d Add multi co website to the changelog 2021-10-27 09:47:15 +02:00
Kharhamel
65c472d936
Merge pull request #1539 from thecodingmachine/hotifxnodeApiToken
HOTFIX: now uses a specific secret token for the admin sockets
2021-10-26 15:47:31 +02:00
Kharhamel
d809682c08 HOTFIX: now uses a specific secret token for the admin sockets 2021-10-26 14:58:34 +02:00
Alexis Faizeau
ab1a9b358a Change favicon snatcher http to https 2021-10-26 14:16:00 +02:00
Alexis Faizeau
4538f6d915 Update cowebsite script map 2021-10-25 19:00:26 +02:00
Alexis Faizeau
fb7fe0dc0a Rename cowebsite API functions 2021-10-25 19:00:26 +02:00
Alexis Faizeau
fbff7491df Zoom x 2 thumbnail cowebsite 2021-10-25 19:00:26 +02:00
Alexis Faizeau
f84c4b3276 Refacto insert cowebsite 2021-10-25 19:00:26 +02:00
Gregoire Parant
251d14a470 Add new test for cowebsite and jitsi room
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-25 19:00:26 +02:00
Alexis Faizeau
5eb6c05189 Add a Jitsi room on co-website api test map 2021-10-25 19:00:26 +02:00
Alexis Faizeau
b81b1ff68b Implement new cowbesite system on API 2021-10-25 19:00:26 +02:00
Alexis Faizeau
c29c4bfaa4 Fix onChatMessage subscriber 2021-10-25 19:00:26 +02:00
Alexis Faizeau
da8cc661b7 Implement the new co website system 2021-10-25 19:00:26 +02:00
Alexis Faizeau
1ee0b28f66 Fix co website closing on exit zone 2021-10-25 19:00:26 +02:00
David Négrier
1efcbb4529
Merge pull request #1521 from thecodingmachine/change-player-depth
Change character depth to 0
2021-10-25 15:11:09 +02:00
Lurkars
78e0d1bead fix linter, cleanup 2021-10-21 16:53:24 +02:00
Lurkars
6832fe4990 use OIDC without admin api, option to disable anonymous login 2021-10-21 16:28:57 +02:00
David Négrier
14a31d81ea
Merge pull request #1529 from Floupp/fix/readme-typo
Change pusher host in readme from .testing to .localhost
2021-10-20 09:20:08 +02:00
Mathieu Reynaud
ee432341da Change pusher host from testing to localhost 2021-10-19 20:07:23 +02:00
David Négrier
b6d571500e
Merge pull request #1528 from thecodingmachine/api_chat_multiple_virtual_users
When there are many virtual users (generated by chat), only the name of a first user is displayed.
2021-10-18 15:02:21 +02:00
David Négrier
4a40c08578 Fixing chat message attributed to wrong user
When a new user entered a chat message, the message was still attributed to the last user who wrote.
2021-10-18 14:58:29 +02:00
David Négrier
4abf7208ff
Merge pull request #1524 from thecodingmachine/player-direction
Display the real sprite direction on character loaded
2021-10-18 14:37:01 +02:00
David Négrier
f8b506144d When there are many virtual users (generated by chat), only the name of a first user is displayed.
Adding a test case for this.
2021-10-18 14:34:47 +02:00
David Négrier
bbd6613558
Merge pull request #1527 from thecodingmachine/upgrade_type_guard
Upgrading @workadventure/tiled-map-type-guard to 1.0.3
2021-10-18 14:24:11 +02:00
David Négrier
b201165b81 Upgrading @workadventure/tiled-map-type-guard to 1.0.3
This will fix the issue with maps containing group layers.
2021-10-18 14:11:24 +02:00
Alexis Faizeau
c13839ce8d Display the real sprite direction on character loaded 2021-10-15 16:35:42 +02:00
David Négrier
958fc9eee8
Merge pull request #1523 from thecodingmachine/fix_back_forth_localhost
Fixing exit problem on localhost maps
2021-10-15 16:27:32 +02:00
David Négrier
70d5c7f658 Triggering onload even if file already loaded for files loaded via http:// 2021-10-15 16:14:17 +02:00
grégoire parant
79e83d3782
Merge pull request #1522 from thecodingmachine/HotFixContactPage
Fix share link for website
2021-10-15 15:44:44 +02:00
Gregoire Parant
a8d6024352 Fix share link for website
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-15 15:25:23 +02:00
David Négrier
8b76e5bc36 Adding test case for exits 2021-10-15 15:24:34 +02:00
David Négrier
79a5916057 Removing dead code 2021-10-15 15:08:06 +02:00
grégoire parant
a7699edd6d
Merge pull request #1520 from thecodingmachine/HotFixUserData
HotFix user data connection
2021-10-14 17:37:54 +02:00
Gregoire Parant
497a7c3467 Fix typo emails => email
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-14 17:33:53 +02:00
Alexis Faizeau
cdf4023928 Change character depth to 0 2021-10-14 17:32:27 +02:00
Gregoire Parant
b7692dd355 Fix local user useless
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-14 17:25:36 +02:00
Gregoire Parant
f87422187f HotFix user data connection
Create local store for user connected in SSO

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-14 17:22:43 +02:00
grégoire parant
ee906dc52b
Merge pull request #1517 from thecodingmachine/develop
Release 1.5.5
2021-10-12 20:52:42 +02:00
Kharhamel
524a6c2c4d
Merge pull request #1497 from thecodingmachine/betterAnalytics
FEATURE: analytics client now scrape user email and room instance
2021-10-12 13:52:14 +02:00
Kharhamel
726f52976d FEATURE: analytics client now scrape user email and room group 2021-10-11 16:30:01 +02:00
Kharhamel
d0c0f3e7fc
Merge pull request #1513 from thecodingmachine/editChangelog
FIX: edited changelog
2021-10-11 11:53:25 +02:00
Kharhamel
57bfc1001f FIX: edited changelog 2021-10-11 11:34:10 +02:00
David Négrier
3c9332f9c1
Merge pull request #1512 from thecodingmachine/updatePosthog
FIX: updated posthog client version and fixed a bug with its toolbar
2021-10-08 14:41:08 +02:00
Kharhamel
72583a58d9
Merge pull request #1509 from thecodingmachine/fixGroupCreation
FIX: if a conversion group move to another user, this user will be added to the group
2021-10-08 14:25:21 +02:00
Kharhamel
59fa68e063 FIX: updated posthog client version and fixed a bug with its toolbar 2021-10-08 11:55:27 +02:00
Kharhamel
5255847452 FIX: if a conversion group move to another user, this user will be added to the group 2021-10-08 11:02:58 +02:00
Kharhamel
60eefbce94
Merge pull request #1508 from thecodingmachine/fixSilentZones
FIX: being in a silent zone new forces mediaConstraints to false
2021-10-07 14:50:40 +02:00
Kharhamel
9dd3e8ff85 FIX: being in a silent zone new forces mediaConstraints to false 2021-10-06 17:59:20 +02:00
grégoire parant
900c53f499
Update icon message and profile (#1504)
- Add new icon profil pixel
 - Add new icon message pixel
 - Migrate message icon in svelt menu

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-06 15:36:42 +02:00
Gregoire Parant
2f2aa55fd7 Merge branch 'master' into develop
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-05 23:49:05 +02:00
grégoire parant
358d9a79d3
Add condition Hash for start layer (#1506)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-05 23:34:18 +02:00
grégoire parant
908b78fdda
HotFix mandatory login with ADMIN openid connexion (#1503)
Before anonymous connexion, we must get the details of the map and permit to check mandatory connexion and redirect user to login page.

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-05 18:59:26 +02:00
grégoire parant
b33e271d2e
Merge pull request #1499 from thecodingmachine/develop
Release 1.5.3
2021-10-04 20:54:13 +02:00
Gregoire Parant
2db446889b Create emoji test
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-04 20:39:01 +02:00
Kharhamel
a265290e41
Merge pull request #1501 from thecodingmachine/fixEmoteMenu
FIX: fixes for the emnote menu
2021-10-04 15:12:53 +02:00
Kharhamel
02108ce977 FIX: fixes for the emnote menu 2021-10-04 14:43:19 +02:00
Kharhamel
7bb0175648
FIX: we now make sure to completly disable the old stream before attempting to create a new one (#1493)
* FIX: we now make sure to completly disable the old stream before attempting to create a new one

* FIX: disable audio optimization on chrome

* always reemit the stream on chrome

* Try fix on stop current stream

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Try fix on stop current stream

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Push fix microphone

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

Co-authored-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-10-02 23:58:33 +02:00
Valdo
f6fcb37d91
Updated README (logo, map, wording) (#1485)
Co-authored-by: Valdo Romao <v.romao@thecodingmachine.com>
2021-10-02 15:59:45 +02:00
Alexis Faizeau
8c3b708981
Remove audio manager range volume control by keys (#1489)
Co-authored-by: Alexis Faizeau <a.faizeau@workadventu.re>
2021-10-02 15:55:54 +02:00
David Négrier
a7424b9329
Merge pull request #1496 from thecodingmachine/fixCD
FIX: removed admin url from deeployer and changed starter map
2021-09-30 11:54:51 +02:00
Kharhamel
2e34420605 FIX: removed admin url from deeployer on develop and master and changed starter map 2021-09-30 11:51:41 +02:00
grégoire parant
1e69bb0f49
Manage redirect URL from admin and save in hydra via pusher (#1492)
Add redirect parameter url to connect user directly on private openId application

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-30 11:16:25 +02:00
David Négrier
2b5211d098
Merge pull request #1486 from thecodingmachine/fix-links
Fixing links in the documentation
2021-09-27 15:41:23 +02:00
David Négrier
7d758af900 Fixing .md link 2021-09-27 12:01:40 +02:00
David Négrier
ad5489c102 Adding edit URLs to allow people to directly propose changes 2021-09-27 11:32:57 +02:00
David Négrier
b8996d5abb Fixing links in the documentation 2021-09-27 11:13:35 +02:00
Kharhamel
8d1943d6e9
Merge pull request #1484 from thecodingmachine/fixExitUrl
FIX: initPositionFromLayerName will now prioritize its target layer rather than the start layer
2021-09-24 12:00:23 +02:00
Kharhamel
ce26294250 FIX: initPositionFromLayerName will now prioritize its target layer rather than the start layer 2021-09-24 11:54:19 +02:00
Kharhamel
4650f4e8cf
Merge pull request #1480 from ValdoTR/maps
Removed old maps and add starter-kit map
2021-09-24 10:58:31 +02:00
Valdo Romao
b44c219441 Added default map path 2021-09-24 09:53:02 +01:00
Kharhamel
bf0c333266
Merge pull request #1463 from thecodingmachine/dependabot/npm_and_yarn/front/axios-0.21.2
Bump axios from 0.21.1 to 0.21.2 in /front
2021-09-23 18:36:51 +02:00
Kharhamel
ff5c2c5e58
Merge pull request #1464 from thecodingmachine/dependabot/npm_and_yarn/back/axios-0.21.2
Bump axios from 0.21.1 to 0.21.2 in /back
2021-09-23 18:36:45 +02:00
Kharhamel
d2bf7b8fde
Merge pull request #1465 from thecodingmachine/dependabot/npm_and_yarn/pusher/axios-0.21.2
Bump axios from 0.21.1 to 0.21.2 in /pusher
2021-09-23 18:36:34 +02:00
Valdo Romao
e8ba9e9785 Removed old maps and add starter-kit map 2021-09-23 12:29:14 +01:00
GRL78
3f1c5246f8
TO MERGE : Contact page from Admin or Environment Variable (#1401)
* Contact page from Admin or Environment Variable

* Get contact page from admin by pusher

* Changes requested

* Modify contactPageStore management

* documentation environment variables

Co-authored-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-21 20:24:53 +02:00
Kharhamel
ccea46fe2b
Merge pull request #1476 from thecodingmachine/fixCustomWoka
FIX: added another catch case for default model
2021-09-21 17:45:31 +02:00
grégoire parant
d033b78c58
Update Youtube link markdown (#1477)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-21 16:07:57 +02:00
Kharhamel
8b099e5725 FIX: added another catch case for default model 2021-09-21 14:29:15 +02:00
Gregoire Parant
3f954d273c Merge branch 'master' into develop
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-21 02:37:56 +02:00
grégoire parant
e77d4dda84
Update favicon and logo to deploy new design (#1475)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-20 22:42:15 +02:00
Kharhamel
2fbf8f0a10
Merge pull request #1474 from Lurkars/twemojiEmoteMenuSvelte
fix wrong font name
2021-09-20 15:54:31 +02:00
Lurkars
781c69387c fix wrong font name 2021-09-20 15:22:54 +02:00
dependabot[bot]
8ecef9eadc
Bump axios from 0.21.1 to 0.21.2 in /front
Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-20 12:34:07 +00:00
dependabot[bot]
16d45c921f
Bump axios from 0.21.1 to 0.21.2 in /back
Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-20 12:34:04 +00:00
dependabot[bot]
62c163f11e
Bump axios from 0.21.1 to 0.21.2 in /pusher
Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-20 12:34:04 +00:00
Kharhamel
9b13a6780c
Merge pull request #1437 from Lurkars/twemojiEmoteMenuSvelte
Twemoji emote menu svelte (upgrade of #1301)
2021-09-20 14:33:16 +02:00
Gregoire Parant
f247ec44f1 Merge branch 'master' into develop
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-18 12:20:02 +02:00
grégoire parant
8c96b514d4
HotFix to test hydra connexion (#1471) 2021-09-18 11:35:29 +02:00
Lurkars
63c4eeb4c7 Merge branch 'twemojiEmoteMenuSvelte' of github.com:thecodingmachine/workadventure into twemojiEmoteMenuSvelte 2021-09-16 18:20:42 +02:00
Lurkars
7922de10ff Merge branch 'develop' of github.com:thecodingmachine/workadventure into twemojiEmoteMenuSvelte 2021-09-16 18:12:51 +02:00
grégoire parant
553902e52a
Add log for Oauth login connexion (#1468)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-16 17:57:14 +02:00
David Négrier
9f39cf154a
Merge pull request #1467 from thecodingmachine/master
Backporting changes to develop
2021-09-16 17:49:05 +02:00
David Négrier
8d0f53ada0 Merge branch 'develop' of github.com:thecodingmachine/workadventure 2021-09-16 17:04:43 +02:00
David Négrier
bc45c93932 Fixing Posthog env var 2021-09-16 17:03:49 +02:00
David Négrier
7ef27a0040 Updating Changelog 2021-09-16 16:46:48 +02:00
David Négrier
4728c3a59a Merge branch 'master' of github.com:thecodingmachine/workadventure 2021-09-16 16:46:27 +02:00
David Négrier
950ffaafda
Merge pull request #1466 from thecodingmachine/develop
Deploy 2021-09-16
2021-09-16 16:22:50 +02:00
Kharhamel
483191c521
Merge pull request #1458 from thecodingmachine/posthog
FEATURE: added posthog as new analytics tool
2021-09-16 15:24:27 +02:00
Kharhamel
2e111aa13a FEATURE: added posthog as new analytics tool 2021-09-16 15:16:10 +02:00
David Négrier
a3eebb05ba Fixing type of openWebsiteWidth in doc 2021-09-16 09:58:42 +02:00
David Négrier
74b5e2797f
Merge pull request #1459 from thecodingmachine/turn_off_audio_on_exit
Turn off audio on exit
2021-09-15 15:35:37 +02:00
David Négrier
801ec3bf4c Turn off audio on exit
If an exit zone is overlapping an audio zone, when exiting, the audio is stopped.
We do this by actually triggering the fact that a user should "leave" all active zones when exiting.
2021-09-15 15:28:55 +02:00
David Négrier
8a6419a3b7
Merge pull request #1457 from thecodingmachine/fix_yarn_not_working
fix yarn install not working
2021-09-15 11:50:50 +02:00
David Négrier
bb8583872b Fixing messages generation in Front container 2021-09-15 11:32:32 +02:00
David Négrier
0c374aba48
Merge pull request #1456 from thecodingmachine/jitsi-silent
Fixing silent zone not respected when exiting Jitsi
2021-09-15 11:27:50 +02:00
David Négrier
d26325d8dc Fixing silent zone not respected when exiting Jitsi
Now, when a silent zone is adjacent to a Jitsi, it is enforced, even after leaving the Jitsi zone
2021-09-15 11:16:23 +02:00
TabascoEye
5a855fb7e4
fix yarn install not working
problem for virtually all people trying self-hosting according to #1433, #738 and likely more
2021-09-15 10:43:01 +02:00
GRL78
680e538fd6
save button in settings close menu (#1451) 2021-09-14 16:43:00 +02:00
David Négrier
9006283c90
Merge pull request #1452 from Lurkars/audioPlayerImprovements
some fixes on the audio player controls
2021-09-14 14:41:40 +02:00
David Négrier
6ed4857b1d
Merge pull request #1450 from thecodingmachine/fixScrollChat
Chat scroll to bottom when it open
2021-09-14 14:39:42 +02:00
Lurkars
8c780f07c6 fix font 2021-09-14 11:41:51 +02:00
Lurkars
f1bd92fa52 use included twemoji mozilla font instead of loading external 2021-09-14 11:39:36 +02:00
GRL
ff3e844b68 chat scroll to bottom when it open 2021-09-14 09:36:49 +02:00
Lurkars
34d81b0e6c fix behaviour 2021-09-14 08:55:15 +02:00
Lurkars
91bc524e06 disable controls 2021-09-14 08:50:43 +02:00
Lurkars
beed50874b fix emotemenu on open jitsi rooms 2021-09-13 19:16:47 +02:00
David Négrier
01bd36ca3f Removing test in double 2021-09-13 18:58:00 +02:00
David Négrier
7cf9f8ff10
Merge pull request #1447 from thecodingmachine/fix_api_chat
Fixing broken chat API
2021-09-13 15:57:37 +02:00
David Négrier
f92b728a8e Fixing broken chat API 2021-09-13 14:50:02 +02:00
David Négrier
fae57e36e3
Merge pull request #1446 from thecodingmachine/develop
Deploy 2021-09-13
2021-09-13 11:27:22 +02:00
David Négrier
8b4764912a Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-09-13 10:47:02 +02:00
David Négrier
e3896bf5e7 Adding features to CHANGELOG 2021-09-13 10:45:32 +02:00
David Négrier
3be328af35
Merge pull request #1445 from thecodingmachine/fix-menu-pointer-too-large
Fixing broken sound controls
2021-09-13 10:38:42 +02:00
David Négrier
fbddd54059 Adding a test case for audio 2021-09-13 10:22:55 +02:00
David Négrier
f0b83663f6 Fixing broken sound controls
Because of the rework of the menu, the clickable zone for the menu was extending at the complete top of the screen, which caused interactive items at the top of the screen (like sound controls) to be broken.

This commit fixes this.
2021-09-13 10:06:08 +02:00
David Négrier
bfd418d8b5
Merge pull request #1436 from thecodingmachine/better_test_page
Adding more tests
2021-09-13 09:25:58 +02:00
David Négrier
62227bb15f
Merge pull request #1439 from thecodingmachine/increse_ilde_timeout
Fix disconnects after 5 minutes in Chrome
2021-09-13 09:25:35 +02:00
David Négrier
aa462258ff
Merge pull request #1441 from tabascoeye/patch-1
add the possibilities of "onaction" and message to  new "openTab" pro…
2021-09-13 09:20:56 +02:00
Lurkars
59c22c8dfc svelte check fix 2021-09-12 11:29:53 +02:00
Lurkars
e5b3088b5e Merge branch 'develop' of github.com:thecodingmachine/workadventure into twemojiEmoteMenuSvelte 2021-09-12 11:22:46 +02:00
Lurkars
3080e1fdc7 improvements on svelte store + handling 2021-09-12 11:11:52 +02:00
TabascoEye
94517c0f4b
add the possibilities of "onaction" and message to new "openTab" property 2021-09-10 23:17:04 +02:00
David Négrier
05646718a9 Fix disconnects after 5 minutes in Chrome
This commit increases idle timeout for websocket connection

Issue: after 5 minutes of inactive tab (hidden tab) in Chrome, WorkAdventure was disconnected.

I believe Google was going in "intensive throttling" mode (see  https://developer.chrome.com/blog/timer-throttling-in-chrome-88/#intensive-throttling)
This means setTimeouts are run only once per minute.

And I believe the "keep alive" must be implemented with a "setTimeout" (one way or another even if I can't find a trace of this in the code). This would mean that the browser would send keep alive requests only once per minute.
But the pusher is configured to shut the connection after 30 seconds of idle activity.

Therefore, the pusher disconnects inactive Chrome tabs. By raising the Pusher idle timer to 2 minutes, we give a chance to Chrome to send a ping to the server in time (since Chrome won't send more than 1 ping per minute).
2021-09-10 18:30:36 +02:00
Lurkars
e553392d9d move twemoji menu to svelte 2021-09-10 16:57:21 +02:00
Kharhamel
352b05b1ea
Merge pull request #1431 from thecodingmachine/fixVideoHeight
FIX: the video element should not have a bigger height than its container
2021-09-10 16:54:47 +02:00
David Négrier
7cabf64b11 Adding more tests 2021-09-10 16:40:09 +02:00
Kharhamel
d071f5fa90 FIX: the video element should not have a bigger height than its container 2021-09-10 16:04:15 +02:00
Lurkars
b50253a529 Merge branch 'develop' of github.com:thecodingmachine/workadventure into twemojiEmoteMenuSvelte 2021-09-10 15:10:11 +02:00
Lurkars
d23820227e Merge branch 'twemojiEmoteMenu' of github.com:Lurkars/workadventure into twemojiEmoteMenuSvelte 2021-09-10 14:58:49 +02:00
Kharhamel
7471da6c26
Merge pull request #1434 from tabascoeye/patch-1
explain new property jitsiWidth
2021-09-10 14:09:28 +02:00
TabascoEye
9f310383ba
explain new property jitsiWidth 2021-09-09 22:58:30 +02:00
David Négrier
5626e45f4a
Merge pull request #1430 from thecodingmachine/better_test_page
Improving design of the test page
2021-09-09 14:07:19 +02:00
David Négrier
e715ca42c4 Improving design of the test page 2021-09-09 11:35:17 +02:00
grégoire parant
1e6433a65e
Merge pull request #1429 from thecodingmachine/develop
Next release v1.5.0
2021-09-09 11:27:05 +02:00
David Négrier
c07d853588
Merge pull request #1428 from thecodingmachine/more_test
Adding a new test case to check video display from mobile
2021-09-09 11:15:36 +02:00
David Négrier
24cd17ac51 Adding a new test case to check video display on mobile 2021-09-09 10:41:17 +02:00
David Négrier
7432f15e27
Merge pull request #1427 from Lurkars/fixFlattenGroupLayers
Fix flatten group layers
2021-09-09 10:20:05 +02:00
Lurkars
0530735547 .gitignore to upstream 2021-09-09 08:52:24 +02:00
Lurkars
8dd404801a .gitignore to upstream 2021-09-09 08:51:20 +02:00
Lurkars
30b22d87a6 .gitignore to upstream 2021-09-09 08:50:57 +02:00
Lurkars
36df585a5e fix wrong layer names after re-enter room 2021-09-09 08:47:38 +02:00
Lurkars
1db11a45e3 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-09-09 08:37:28 +02:00
Gregoire Parant
2a0d3759b1 Merge branch 'develop'
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-08 18:26:48 +02:00
Gregoire Parant
3a3e5d5f3b Merge branch 'master' into develop
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

# Conflicts:
#	front/src/Components/Menu/Menu.svelte
#	front/src/Components/Menu/ProfileSubMenu.svelte
#	front/src/Components/Menu/SettingsSubMenu.svelte
#	front/src/Connexion/ConnectionManager.ts
#	front/src/Stores/MediaStore.ts
#	front/src/Stores/MenuStore.ts
#	front/style/TextGlobalMessageSvelte-Style.scss
#	front/style/style.scss
2021-09-08 18:20:13 +02:00
GRL78
2ea7b0cff1
Menu style will adapt if iframe in map is opened (#1422) 2021-09-08 15:43:46 +02:00
David Négrier
65b9da926b
Adding the menu of the workadventu.re website in this repo (#1420)
Because the workadventu.re website documentation regarding map building directly comes from that repo, it makes sense to export the menu in the repo.
This way, when we add a new documentation page, we can edit the menu in the same pull request.
2021-09-08 14:28:29 +02:00
David Négrier
d7a5435d9e
Adding documentation for the new "openTab" property (#1419) 2021-09-08 14:27:40 +02:00
grégoire parant
6cf86ec8dc
Add play uri for login and register in hydra (#1421)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-08 13:39:46 +02:00
David Négrier
149b417d8d
Merge pull request #1417 from thecodingmachine/doc_special_zones
Migrating documentation to this repository
2021-09-08 10:43:29 +02:00
David Négrier
699097c55b Migrating all the map-building documentation to Github.
+ adding links to Youtube tutorials
2021-09-08 10:28:39 +02:00
David Négrier
9ccd967cb8 Adding special zone documentation and Typescript documentation
This commit splits the special zone documentation in 3 different pages (open website / meeting rooms / special zones).
It also migrates special zones doc and using-typescript doc to Github repository
2021-09-08 08:46:01 +02:00
Kharhamel
0a44e3b4a1
Merge pull request #1415 from thecodingmachine/fixChromeTracks
FIX: reimplemented the old stream behavior on bad navigators like chrome
2021-09-07 17:06:18 +02:00
kharhamel
fa9929757d FIX: reimplemented the old stream behavior on bad navigators like chrome 2021-09-07 16:39:44 +02:00
grégoire parant
f60678478b
Update right css (#1416)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-07 13:59:08 +02:00
Lurkars
09125621d8 update gitignore 2021-09-06 19:16:05 +02:00
Lurkars
b29f649822 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-09-06 18:23:40 +02:00
David Négrier
62682cb18c
Merge pull request #1414 from thecodingmachine/doc_variables
Adding a dedicated doc for variables
2021-09-06 16:12:17 +02:00
David Négrier
76362e81e8 Adding a dedicated doc for variables 2021-09-06 16:06:49 +02:00
Kharhamel
317fe28286
Merge pull request #1413 from thecodingmachine/frontpretty
Frontpretty
2021-09-06 14:35:50 +02:00
kharhamel
4160235b92 ran pretty on the front 2021-09-06 14:31:59 +02:00
kharhamel
7743bda3eb added yarn run pretty to the front ci 2021-09-06 14:27:01 +02:00
grégoire parant
bf1953fe22
Release v1.4.15 (#1411)
* audio player volume improvements

* Add workaround for #932

* Bump striptags from 3.1.1 to 3.2.0 in /messages

Bumps [striptags](https://github.com/ericnorris/striptags) from 3.1.1 to 3.2.0.
- [Release notes](https://github.com/ericnorris/striptags/releases)
- [Commits](https://github.com/ericnorris/striptags/compare/v3.1.1...v3.2.0)

---
updated-dependencies:
- dependency-name: striptags
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Add anthoer note for https://github.com/thecodingmachine/workadventure/issues/932#issuecomment-867562208

* WIP: svelte menu

* temp

* temp

* Bump tar from 4.4.13 to 4.4.15 in /back

Bumps [tar](https://github.com/npm/node-tar) from 4.4.13 to 4.4.15.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v4.4.13...v4.4.15)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* New menu svelte

* Migration of report menu in svelte

* Migration of registerCustomMenu for Menu in Svelte
Refactor subMenuStore
Suppression of old MenuScene and ReportMenu

* Suppression of HTML files that aren't use anymore

* New version of cache management (#1365)

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* migrate to svelte

* remove redundancy

* initial localUserStore volume

* Exit scene acess denied detected (#1369)

* Add auth token user to get right in admin and check if user have right

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update error show

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update token generation (#1372)

- Permit only decode token to get map details,
 - If user have token expired, set the token to null and reload the page. This feature will be updated when authentication stategy will be finished.

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* GameManager has an attribute scenePlugin

* GameManager has an attribute scenePlugin

* Suppression of gameManager in IframeListener

* fix deeployer

* fix deeployer

* Fixing enter/leave event not properly sent on adjacent zones

On adjacent zones, the zone leave event was not properly triggered when leaving a zone for the zone next to it.
Closes #1366

* First pass on css

* First pass on css

* Second pass on css and reportMenu

* Second pass on css and reportMenu

* Second pass on css and reportMenu

* Improving popup

If a popup message is empty, only the buttons will be displayed (not the container)

Unrelated: the Sound.play method in the API now accepts 0 arguments.

* Third pass on css and reportMenu

* Correction following test

* Player return a the same position when after editing his profile

* Player return a the same position when after editing his profile (same as reconnection)

* Contact page only if environment variable exist

* Execute scripts of the map after creating gameScene

* Rollback on createPromise switched to public

* Bump tar from 6.1.0 to 6.1.10 in /pusher

Bumps [tar](https://github.com/npm/node-tar) from 6.1.0 to 6.1.10.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.0...v6.1.10)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Add iframe submenu by scripting API
Delete menu by scripting API

* Removing ts-ignore

* REVIEW : Migration Menu and Report Menu in Svelte (#1363)

* WIP: svelte menu

* temp

* temp

* New menu svelte

* Migration of report menu in svelte

* Migration of registerCustomMenu for Menu in Svelte
Refactor subMenuStore
Suppression of old MenuScene and ReportMenu

* Suppression of HTML files that aren't use anymore

* fix deeployer

* First pass on css

* First pass on css

* Second pass on css and reportMenu

* Second pass on css and reportMenu

* Second pass on css and reportMenu

* Third pass on css and reportMenu

* Correction following test

* Contact page only if environment variable exist

* Update service worker

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Change requested

* Change requested

Co-authored-by: kharhamel <oognic@gmail.com>
Co-authored-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Refactor to only have one function registerMenuCommand
When selected custom menu is removed, go to settings menu
Allow iframe in custom menu to use Scripting API
Return menu object when it is registered, can call remove function on it

* Correct bad change

* Add types file in API

* Add types file in API

* Fixing "has/in" on variables proxy object

When using WA.state, using `"myVariable" in WA.state` would always return false.
This is now fixed by adding a "has" method on the Proxy class.

Also, added a `WA.state.hasVariable` method.

* Add documentation
delete unused test map

* Properties changed via the Iframe API now trigger changes directly

Changes performed in WA.room.setPropertyLayer now have a real-time impact.
If the property is changed on a layer the current player is on, the changes will be triggered.

* documentation and CHANGELOG

* add possibility to set size of coWebsite and Jitsis via map property

* Update GameScene.ts

typo fixed

* Update CoWebsiteManager.ts

typos and style

* Update CoWebsiteManager.ts

yet another typo

* FIX: media tracks were not readded to a 3rd person in some situations

* fix ReportMenu (#1397)

* remove the package systeminformation from back

* Bump url-parse from 1.5.1 to 1.5.3 in /front

Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump tar from 4.4.15 to 4.4.19 in /back

Bumps [tar](https://github.com/npm/node-tar) from 4.4.15 to 4.4.19.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v4.4.15...v4.4.19)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump path-parse from 1.0.6 to 1.0.7 in /messages

Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* openTabPropertyKey (create new props in own file)

* Bump path-parse from 1.0.6 to 1.0.7 in /uploader

Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump path-parse from 1.0.6 to 1.0.7 in /front

Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump path-parse from 1.0.6 to 1.0.7 in /back

Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump path-parse from 1.0.6 to 1.0.7 in /maps

Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* FEATURE: improved the mediaStore code to disable tracks instead of deleting them

* Bump path-parse from 1.0.6 to 1.0.7 in /benchmark

Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* added jitsiTypes

* renamed

* Allowing variables nested in group layers

Up until this commit, variables nested in object layers inside group layers where not found by the front nor the back.
This PR changes analysis so that variables can be detected.

* FIX: fixed a circular dependancy in stores by rewriting createPeerStore() and createScreenSharingPeerStore()

* WIP: Bypass camera scene (#1337)

* Set new local camera setup variable

* Finish by pass video settings

 - TODO add button to update camera settings

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Merge branch 'develop' into jumpVideoCamera

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

# Conflicts:
#	front/src/Connexion/LocalUserStore.ts
#	front/src/Phaser/Components/Loader.ts
#	front/src/Phaser/Game/GameManager.ts
#	front/src/Phaser/Login/EnableCameraScene.ts

* Add menu to open enable camera scene

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Finish jump camera setup

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Active authentication Oauth (#1377)

* Active authentication Oauth

 - Google authentication
 - GitHub authentication
 - Linkedin authentication

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Finish connexion et get user info connexion

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Fix lint error

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Change the expires token for 30 days

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update connexion stratgey

 - Set last room when it will be created and not when connexion is openned
 - Add '/login' end point permit to logout and open iframe to log user
 - Add logout feature permit to logout in front

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Implement logout and revoke token with hydra

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Fix pull develop conflict

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Profile url (#1399)

* Create function that permit to get profile URL

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Continue profil user

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Add menu and logout button

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update last room use

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Profile callback permit to get url profile setting from admin

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Finish profile show

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Delete profileUrl will be not use today

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Correct lint

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update size of iframe

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Delete console log

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update feedback ARP

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Emote silent zone (#1342)

* Add an emote when the user is in silent zone

* Update silent icon strategy

* Update strategy for silent zone

 - Add svelte store
 - Show silent zone indication and replace camera

This update permit to hide silent zone when user is in Jitsi discussion

* Fix css silent zone

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Hotfix media constraint error

 - Create error to manage displayed warning when we try to access on media with no constraint video and audio
 - Fix disabled microphone if we try to active and we don't have right or there is an error.

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

Co-authored-by: Lurkars <git@8lh.de>
Co-authored-by: Guy Sheffer <guysoft@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: kharhamel <oognic@gmail.com>
Co-authored-by: GRL <g.lesniewski@thecodingmachine.com>
Co-authored-by: David Négrier <d.negrier@thecodingmachine.com>
Co-authored-by: GRL78 <80678534+GRL78@users.noreply.github.com>
Co-authored-by: ¯\_(ツ)_/¯ <tabascoeye@gmail.com>
Co-authored-by: Kharhamel <Kharhamel@users.noreply.github.com>
Co-authored-by: jonny <ga86lad@mytum.de>
2021-09-05 19:51:33 +02:00
Gregoire Parant
f2ca021740 Hotfix media constraint error
- Create error to manage displayed warning when we try to access on media with no constraint video and audio
 - Fix disabled microphone if we try to active and we don't have right or there is an error.

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-05 19:36:57 +02:00
grégoire parant
4f0bb95a38
Emote silent zone (#1342)
* Add an emote when the user is in silent zone

* Update silent icon strategy

* Update strategy for silent zone

 - Add svelte store
 - Show silent zone indication and replace camera

This update permit to hide silent zone when user is in Jitsi discussion

* Fix css silent zone

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-05 18:36:22 +02:00
grégoire parant
d2b8d7dc04
Active authentication Oauth (#1377)
* Active authentication Oauth

 - Google authentication
 - GitHub authentication
 - Linkedin authentication

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Finish connexion et get user info connexion

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Fix lint error

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Change the expires token for 30 days

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update connexion stratgey

 - Set last room when it will be created and not when connexion is openned
 - Add '/login' end point permit to logout and open iframe to log user
 - Add logout feature permit to logout in front

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Implement logout and revoke token with hydra

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Fix pull develop conflict

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Profile url (#1399)

* Create function that permit to get profile URL

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Continue profil user

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Add menu and logout button

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update last room use

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Profile callback permit to get url profile setting from admin

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Finish profile show

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Delete profileUrl will be not use today

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Correct lint

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update size of iframe

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Delete console log

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update feedback ARP

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-05 18:17:49 +02:00
grégoire parant
a0d863569b
WIP: Bypass camera scene (#1337)
* Set new local camera setup variable

* Finish by pass video settings

 - TODO add button to update camera settings

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Merge branch 'develop' into jumpVideoCamera

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

# Conflicts:
#	front/src/Connexion/LocalUserStore.ts
#	front/src/Phaser/Components/Loader.ts
#	front/src/Phaser/Game/GameManager.ts
#	front/src/Phaser/Login/EnableCameraScene.ts

* Add menu to open enable camera scene

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Finish jump camera setup

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-09-04 21:31:36 +02:00
Kharhamel
ce16dab65f
Merge pull request #1410 from thecodingmachine/betterMEdiaStore
FIX: fixed a circular dependancy in stores
2021-09-03 17:27:12 +02:00
kharhamel
ba5fa06306 FIX: fixed a circular dependancy in stores by rewriting createPeerStore() and createScreenSharingPeerStore() 2021-09-03 17:16:31 +02:00
Kharhamel
6cb0f14e5a
Merge pull request #919 from Lurkars/audioPlayerImprovements
audio player volume improvements
2021-09-03 11:50:23 +02:00
David Négrier
86858a176e
Merge pull request #1406 from thecodingmachine/fix/recursive_variables
Allowing variables nested in group layers
2021-09-02 18:37:27 +02:00
David Négrier
68a4772627 Allowing variables nested in group layers
Up until this commit, variables nested in object layers inside group layers where not found by the front nor the back.
This PR changes analysis so that variables can be detected.
2021-09-02 18:05:55 +02:00
Kharhamel
8d2da6bdc7
Merge pull request #1405 from jonnytest1/opentab2
openTabPropertyKey (create new props in own file)
2021-09-02 17:19:20 +02:00
Lurkars
49b1a55042 Merge branch 'develop' of github.com:thecodingmachine/workadventure into audioPlayerImprovements 2021-09-01 19:25:37 +02:00
Lurkars
cc048f9b20 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-09-01 19:25:11 +02:00
Lurkars
e584c16aaa socket 2021-09-01 19:25:05 +02:00
jonny
606e9093e1 renamed 2021-09-01 18:16:31 +02:00
jonny
181232c1e6 added jitsiTypes 2021-09-01 17:55:23 +02:00
Kharhamel
1d5ad96646
Merge pull request #1357 from thecodingmachine/dependabot/npm_and_yarn/benchmark/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7 in /benchmark
2021-09-01 17:48:28 +02:00
dependabot[bot]
949da0529f
Bump path-parse from 1.0.6 to 1.0.7 in /benchmark
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-01 15:48:20 +00:00
Kharhamel
295d413fdc
Merge pull request #1358 from thecodingmachine/dependabot/npm_and_yarn/maps/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7 in /maps
2021-09-01 17:48:14 +02:00
Kharhamel
04fe8fdd1e
Merge pull request #1359 from thecodingmachine/dependabot/npm_and_yarn/back/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7 in /back
2021-09-01 17:48:01 +02:00
Kharhamel
8f31380084
Merge pull request #1360 from thecodingmachine/dependabot/npm_and_yarn/uploader/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7 in /uploader
2021-09-01 17:47:48 +02:00
Kharhamel
93238abd76
Merge pull request #1361 from thecodingmachine/dependabot/npm_and_yarn/front/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7 in /front
2021-09-01 17:47:34 +02:00
Kharhamel
3191930fdb
Merge pull request #1208 from thecodingmachine/dependabot/npm_and_yarn/messages/striptags-3.2.0
Bump striptags from 3.1.1 to 3.2.0 in /messages
2021-09-01 17:41:35 +02:00
Kharhamel
095a486621
Merge pull request #1402 from thecodingmachine/betterMEdiaStore
FEATURE: improved the mediaStore code to disable tracks instead of deleting them
2021-09-01 17:30:59 +02:00
kharhamel
52fe79df47 FEATURE: improved the mediaStore code to disable tracks instead of deleting them 2021-09-01 17:14:05 +02:00
David Négrier
4fac9eb928 Adding "collides" video to documentation 2021-09-01 16:11:55 +02:00
dependabot[bot]
e2b8d3b6ef
Bump path-parse from 1.0.6 to 1.0.7 in /maps
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-01 13:10:28 +00:00
dependabot[bot]
1b5042ef6a
Bump path-parse from 1.0.6 to 1.0.7 in /back
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-01 13:10:28 +00:00
dependabot[bot]
3f143ba912
Bump path-parse from 1.0.6 to 1.0.7 in /front
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-01 13:10:14 +00:00
dependabot[bot]
80601ae432
Bump path-parse from 1.0.6 to 1.0.7 in /uploader
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-01 13:10:13 +00:00
Kharhamel
49c2ba3c4b
Merge pull request #1362 from thecodingmachine/dependabot/npm_and_yarn/messages/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7 in /messages
2021-09-01 15:09:19 +02:00
jonny
0272e4f691 merged in develop again 2021-09-01 14:55:29 +02:00
jonny
7971daa27f openTabPropertyKey (create new props in own file) 2021-09-01 14:50:48 +02:00
Kharhamel
ad60993b9a
Merge pull request #1398 from tabascoeye/develop
add possibility to set size of coWebsite and Jitsis via map property
2021-09-01 14:42:41 +02:00
dependabot[bot]
7244fcd128
Bump path-parse from 1.0.6 to 1.0.7 in /messages
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-01 12:35:56 +00:00
Kharhamel
c0547637b5
Merge pull request #1404 from thecodingmachine/dependabot/npm_and_yarn/back/tar-4.4.19
Bump tar from 4.4.15 to 4.4.19 in /back
2021-09-01 14:33:57 +02:00
Kharhamel
5315628a10
Merge pull request #1403 from thecodingmachine/removesysteminformation
remove the package systeminformation from back
2021-09-01 14:29:05 +02:00
dependabot[bot]
df0546a2f3
Bump tar from 4.4.15 to 4.4.19 in /back
Bumps [tar](https://github.com/npm/node-tar) from 4.4.15 to 4.4.19.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v4.4.15...v4.4.19)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-01 12:28:03 +00:00
Kharhamel
4f8273bae7
Merge pull request #1356 from thecodingmachine/dependabot/npm_and_yarn/front/url-parse-1.5.3
Bump url-parse from 1.5.1 to 1.5.3 in /front
2021-09-01 14:27:18 +02:00
Kharhamel
b4501a4d2a
Merge pull request #1200 from guysoft/patch-1
Add workaround for #932
2021-09-01 14:26:22 +02:00
dependabot[bot]
96ff1f3af1
Bump url-parse from 1.5.1 to 1.5.3 in /front
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-01 12:23:36 +00:00
kharhamel
bc9131119f remove the package systeminformation from back 2021-09-01 14:21:26 +02:00
GRL78
19baf7f582
fix ReportMenu (#1397) 2021-09-01 10:11:12 +02:00
Kharhamel
d7b552a513
Merge pull request #1400 from thecodingmachine/bugA3
FIX: media tracks were not readded to a 3rd person in some situations
2021-08-31 16:30:41 +02:00
kharhamel
1e20466f74 FIX: media tracks were not readded to a 3rd person in some situations 2021-08-31 16:29:23 +02:00
TabascoEye
a0d73f27d9
Update CoWebsiteManager.ts
yet another typo
2021-08-30 19:51:14 +02:00
TabascoEye
e6ae343975
Update CoWebsiteManager.ts
typos and style
2021-08-30 19:44:50 +02:00
TabascoEye
da03e60de4
Update GameScene.ts
typo fixed
2021-08-30 19:42:18 +02:00
¯\_(ツ)_/¯
ae3e2a09d9 add possibility to set size of coWebsite and Jitsis via map property 2021-08-30 19:32:02 +02:00
David Négrier
d2816220eb
Merge pull request #1395 from thecodingmachine/triggerOnSetLayer
Properties changed via the Iframe API now trigger changes directly
2021-08-27 17:41:58 +02:00
David Négrier
7576fbbe6d
Merge pull request #1392 from thecodingmachine/iframeMenuScript
Iframe menu script
2021-08-27 17:41:04 +02:00
GRL
12108bc529 documentation and CHANGELOG 2021-08-27 16:28:59 +02:00
David Négrier
10c08dea6d
Merge pull request #1393 from thecodingmachine/variableHasProxy
Fixing "has/in" on variables proxy object
2021-08-27 15:07:50 +02:00
David Négrier
4536a63e69 Properties changed via the Iframe API now trigger changes directly
Changes performed in WA.room.setPropertyLayer now have a real-time impact.
If the property is changed on a layer the current player is on, the changes will be triggered.
2021-08-27 15:05:14 +02:00
GRL
ebcf4a6ae3 Add documentation
delete unused test map
2021-08-27 14:49:57 +02:00
David Négrier
a0d3685227 Fixing "has/in" on variables proxy object
When using WA.state, using `"myVariable" in WA.state` would always return false.
This is now fixed by adding a "has" method on the Proxy class.

Also, added a `WA.state.hasVariable` method.
2021-08-27 11:29:59 +02:00
GRL
cb7b98de0d Merge branch 'iframeMenuScript' of github.com:thecodingmachine/workadventure into iframeMenuScript 2021-08-27 11:18:58 +02:00
GRL
706f531ca2 Add types file in API 2021-08-27 11:17:48 +02:00
GRL
12a150c817 Add types file in API 2021-08-27 11:14:07 +02:00
GRL
a195870cfb Correct bad change 2021-08-27 11:12:23 +02:00
GRL
833c15b2d5 Merge branch 'develop' of github.com:thecodingmachine/workadventure into iframeMenuScript 2021-08-27 10:44:32 +02:00
GRL
cf7bfe79ca Refactor to only have one function registerMenuCommand
When selected custom menu is removed, go to settings menu
Allow iframe in custom menu to use Scripting API
Return menu object when it is registered, can call remove function on it
2021-08-27 10:34:03 +02:00
GRL78
7c956d1481
REVIEW : Migration Menu and Report Menu in Svelte (#1363)
* WIP: svelte menu

* temp

* temp

* New menu svelte

* Migration of report menu in svelte

* Migration of registerCustomMenu for Menu in Svelte
Refactor subMenuStore
Suppression of old MenuScene and ReportMenu

* Suppression of HTML files that aren't use anymore

* fix deeployer

* First pass on css

* First pass on css

* Second pass on css and reportMenu

* Second pass on css and reportMenu

* Second pass on css and reportMenu

* Third pass on css and reportMenu

* Correction following test

* Contact page only if environment variable exist

* Update service worker

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Change requested

* Change requested

Co-authored-by: kharhamel <oognic@gmail.com>
Co-authored-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-26 12:01:07 +02:00
David Négrier
5cd3ab4b4c Removing ts-ignore 2021-08-25 09:30:05 +02:00
GRL
f3c4d344b3 Add iframe submenu by scripting API
Delete menu by scripting API
2021-08-24 17:35:06 +02:00
David Négrier
29c1ea25c7
Merge pull request #1391 from thecodingmachine/dependabot/npm_and_yarn/pusher/tar-6.1.10
Bump tar from 6.1.0 to 6.1.10 in /pusher
2021-08-24 16:17:04 +02:00
dependabot[bot]
32290de8dd
Bump tar from 6.1.0 to 6.1.10 in /pusher
Bumps [tar](https://github.com/npm/node-tar) from 6.1.0 to 6.1.10.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.0...v6.1.10)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-24 09:59:46 +00:00
David Négrier
428fbaae02
Merge pull request #1338 from thecodingmachine/dependabot/npm_and_yarn/back/tar-4.4.15
Bump tar from 4.4.13 to 4.4.15 in /back
2021-08-24 11:58:54 +02:00
Gregoire Parant
54fab3d233 Merge branch 'master' into develop 2021-08-24 10:45:03 +02:00
GRL
49eb28dacf Merge branch 'develop' of github.com:thecodingmachine/workadventure into menuInSvelte 2021-08-24 09:38:24 +02:00
David Négrier
60b6e7baa1
Merge pull request #1375 from thecodingmachine/ListenIFrameWaitCreate
Execute scripts of the map after creating gameScene
2021-08-23 19:12:01 +02:00
David Négrier
8c43c2e6e8 Rollback on createPromise switched to public 2021-08-23 18:54:00 +02:00
GRL
ad95fa5e11 Execute scripts of the map after creating gameScene 2021-08-23 18:53:59 +02:00
David Négrier
41c31d3d2f
Merge pull request #1381 from thecodingmachine/samePlaceAfterEditProfile
Player return a the same position when after editing his profile
2021-08-23 18:36:43 +02:00
David Négrier
bf6ce94b80 Merge branch 'develop' of github.com:thecodingmachine/workadventure into samePlaceAfterEditProfile 2021-08-23 18:04:09 +02:00
GRL
2f76a24dff Contact page only if environment variable exist 2021-08-23 17:30:07 +02:00
David Négrier
7fdbcde71c
Merge pull request #1388 from thecodingmachine/BackToLinePopUp
Update escapeHtml
2021-08-23 11:25:04 +02:00
Gregoire Parant
99a9b5f9a2 Update strategy to use css
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-23 10:20:48 +02:00
Gregoire Parant
c4a9da41ba Merge branch 'master' into BackToLinePopUp 2021-08-23 09:45:32 +02:00
Gregoire Parant
8c4ead8421 Add "\n\r" to match
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-23 09:43:43 +02:00
Gregoire Parant
da00fa7868 Update escapeHtml
Update escapeHtml in HtmlUtils class to create paragraphe when user have \r\n in popup text

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-23 09:16:22 +02:00
David Négrier
1f7e964a7d
Merge pull request #1386 from thecodingmachine/master
Backporting master to develop
2021-08-23 09:01:19 +02:00
David Négrier
7e4292f0fd
Merge pull request #1376 from thecodingmachine/deployerFix
fix deeployer
2021-08-20 17:11:10 +02:00
David Négrier
9a150cbcca
Merge pull request #1385 from thecodingmachine/images_in_doc
Migrating images from the WorkAdventure website to the docs/ directory
2021-08-20 17:10:46 +02:00
David Négrier
821e224aac Migrating images from the WorkAdventure website to the docs/ directory
Images belong to the docs, so they should sit next to the documentation files in the /docs directory.
2021-08-20 16:56:03 +02:00
GRL
edfe440c6e Merge branch 'develop' of github.com:thecodingmachine/workadventure into menuInSvelte 2021-08-20 16:18:45 +02:00
GRL
c2b3d23ec0 Player return a the same position when after editing his profile (same as reconnection) 2021-08-20 09:49:37 +02:00
Gregoire Parant
4d4c9c8c6e Merge branch 'master' into develop 2021-08-19 18:50:34 +02:00
grégoire parant
e32f433688
Update cache version (#1383)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-19 18:48:24 +02:00
Gregoire Parant
86c32cf9ff Merge branch 'master' into develop
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

# Conflicts:
#	front/dist/service-worker-prod.js
2021-08-19 18:31:30 +02:00
grégoire parant
1ffd198b00
Update cache management (#1382)
Change strategy of cache management. Today we don't have version of map building so we cannot use cache correctly. The idea is to have a less cache and keep HTPP cache management with GET method.

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-19 18:23:30 +02:00
GRL
0c796dff90 Player return a the same position when after editing his profile 2021-08-19 17:22:16 +02:00
GRL
2ebf05f7d6 Correction following test 2021-08-19 11:17:46 +02:00
David Négrier
5fa8c1de9a
Merge pull request #1379 from thecodingmachine/popup_improvements
Improving popup
2021-08-19 09:52:35 +02:00
GRL
d6bd883c94 Third pass on css and reportMenu 2021-08-18 15:34:26 +02:00
David Négrier
8a64491952 Improving popup
If a popup message is empty, only the buttons will be displayed (not the container)

Unrelated: the Sound.play method in the API now accepts 0 arguments.
2021-08-18 11:53:41 +02:00
GRL
0d29ef5787 Merge branch 'menuInSvelte' of github.com:thecodingmachine/workadventure into menuInSvelte 2021-08-18 11:30:28 +02:00
GRL
5a8e7d277f Second pass on css and reportMenu 2021-08-18 11:30:11 +02:00
GRL
ac825bf725 Second pass on css and reportMenu 2021-08-18 11:20:57 +02:00
GRL
4c3097155b Second pass on css and reportMenu 2021-08-18 11:15:46 +02:00
Lurkars
f3cfe7ec82 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-08-17 20:24:25 +02:00
GRL
9e5cc3b9a7 First pass on css 2021-08-17 15:17:29 +02:00
GRL
096baa8897 First pass on css 2021-08-17 14:44:43 +02:00
grégoire parant
0bfac1a164
Update cache API index (#1378)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-17 13:26:20 +02:00
David Négrier
06be65c12f
Merge pull request #1368 from thecodingmachine/fix_zone_enter_exit
Fixing enter/leave event not properly sent on adjacent zones
2021-08-17 10:08:51 +02:00
David Négrier
1d45bab46d Fixing enter/leave event not properly sent on adjacent zones
On adjacent zones, the zone leave event was not properly triggered when leaving a zone for the zone next to it.
Closes #1366
2021-08-17 10:04:11 +02:00
GRL
82b95faa53 fix deeployer 2021-08-16 14:45:22 +02:00
GRL
d0a85b0870 fix deeployer 2021-08-16 14:33:53 +02:00
GRL
aa9e5c4543 Merge branch 'develop' of github.com:thecodingmachine/workadventure into menuInSvelte 2021-08-16 14:19:28 +02:00
David Négrier
1845b8f66e
Merge pull request #1374 from thecodingmachine/GameManagerRefactor
GameManager has an attribute scenePlugin
2021-08-16 11:59:30 +02:00
GRL
151e63ff91 Suppression of gameManager in IframeListener 2021-08-16 11:56:00 +02:00
GRL
736ac19ed0 Merge remote-tracking branch 'origin/GameManagerRefactor' into GameManagerRefactor 2021-08-16 11:50:22 +02:00
GRL
d2413896c7 GameManager has an attribute scenePlugin 2021-08-16 11:50:09 +02:00
GRL
482a6da1d8 GameManager has an attribute scenePlugin 2021-08-16 11:43:29 +02:00
grégoire parant
005a3c5a0d
Release 1.4.14 (#1370)
* New version of cache management (#1365)

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Exit scene acess denied detected (#1369)

* Add auth token user to get right in admin and check if user have right

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update error show

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update token generation (#1372)

- Permit only decode token to get map details,
 - If user have token expired, set the token to null and reload the page. This feature will be updated when authentication stategy will be finished.

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-15 23:13:48 +02:00
grégoire parant
8d57886bae
Update token generation (#1372)
- Permit only decode token to get map details,
 - If user have token expired, set the token to null and reload the page. This feature will be updated when authentication stategy will be finished.

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-15 22:51:06 +02:00
grégoire parant
02a21209ec
Exit scene acess denied detected (#1369)
* Add auth token user to get right in admin and check if user have right

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>

* Update error show

Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-15 08:51:35 +02:00
Lurkars
aa38d1a5bd initial localUserStore volume 2021-08-11 20:29:48 +02:00
Lurkars
0d27b4ad43 remove redundancy 2021-08-11 20:07:09 +02:00
Lurkars
3702173cd4 migrate to svelte 2021-08-11 20:01:51 +02:00
Lurkars
e8104f63ac Merge branch 'develop' of github.com:thecodingmachine/workadventure into audioPlayerImprovements 2021-08-11 19:55:36 +02:00
Lurkars
5b979fa151 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-08-11 19:54:36 +02:00
grégoire parant
f7daf16ac5
New version of cache management (#1365)
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-11 17:09:17 +02:00
GRL
f4ce5f9a3b Merge branch 'ReportMenuSvelte' of github.com:thecodingmachine/workadventure into menuInSvelte 2021-08-11 15:04:47 +02:00
GRL
46a2e3f453 Suppression of HTML files that aren't use anymore 2021-08-11 14:23:34 +02:00
GRL
e86892b9a5 Merge branch 'develop' of github.com:thecodingmachine/workadventure into MenuSvelte 2021-08-11 14:13:31 +02:00
GRL
8105e966ff Migration of registerCustomMenu for Menu in Svelte
Refactor subMenuStore
Suppression of old MenuScene and ReportMenu
2021-08-11 14:07:34 +02:00
Gregoire Parant
45a56c2e02 HotFix feedback svelte continuous integration
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-11 10:09:04 +02:00
Gregoire Parant
434b112c65 Improve service worker store managment
Signed-off-by: Gregoire Parant <g.parant@thecodingmachine.com>
2021-08-11 10:01:56 +02:00
grégoire parant
bced495570
Add comment use service worker (#1355) 2021-08-10 23:10:56 +02:00
grégoire parant
c7fdfed00c
Improve mobile camera shown (#1354)
- Add new store to send mobile size
 - Update style to show video for mobile size
2021-08-10 22:35:26 +02:00
grégoire parant
22a46a98ea
Improve service worker (#1353)
* Improve service worker

 - Add new env variable in WebPack "NODE_ENV"
 - Add new service worker for mode dev that permit to by pass response in cache storage
 - Add new WorkAdventure icon

* Remove console.log

* Add service worker file prod and dev
2021-08-10 22:34:46 +02:00
Lurkars
fc1a7afd9a Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-08-10 14:20:39 +02:00
grégoire parant
1db2e2aba9
Update style of microphone (#1352)
- Active microphone close when user haven't microphone in the discussion
2021-08-10 10:12:31 +02:00
grégoire parant
dbe7dc4ce0
Merge pull request #1348 from thecodingmachine/develop
Release v1.4.14
2021-08-09 23:15:31 +02:00
GRL
9c1926f636 Merge branch 'develop' of github.com:thecodingmachine/workadventure into MenuSvelte 2021-08-09 16:59:12 +02:00
GRL
d10e2dbca7 Migration of report menu in svelte 2021-08-09 16:56:28 +02:00
grégoire parant
a5b44be6a1
Update JWT expires days (#1349) 2021-08-09 16:37:24 +02:00
grégoire parant
ddecf48697
Update JWT expires days (#1347) 2021-08-09 16:31:55 +02:00
GRL
56fa2e49f6 New menu svelte 2021-08-09 14:49:17 +02:00
Datalog-Mindhack
bc24a6b1db
Update package.json (#1344)
Thans for your Merge Request 🚀
2021-08-09 14:36:53 +02:00
Lurkars
06290cdd78 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-08-08 19:33:58 +02:00
Gregoire Parant
154f8f03da Merge branch 'master' into develop 2021-08-06 18:29:09 +02:00
grégoire parant
fbcb9d898d
Update report message (#1343) 2021-08-06 18:28:18 +02:00
felixdoerre
d051650457
Delete sol_intérieur.png (#1341)
The file was initially renamed but accidentally re-added later. Removing it finished the move.
2021-08-06 17:23:22 +02:00
Gregoire Parant
af613f5b5b Merge branch 'master' into develop 2021-08-06 15:53:33 +02:00
GRL78
e0fb31fc58
WIP: Migrate AudioManager in Svelte (#1325)
* Migrate AudioManager in Svelte

* use import type when needed
2021-08-06 09:11:17 +02:00
David Négrier
ac282db1ac Removing pointless console.log 2021-08-05 17:21:55 +02:00
David Négrier
56cf535551
Merge pull request #1312 from thecodingmachine/iframe_in_map
Adding the ability to inject websites directly inside maps
2021-08-05 12:44:23 +02:00
David Négrier
6b9b999996 Making embedded iframes scriptable using the WA.room.website namespace. 2021-08-05 12:37:05 +02:00
David Négrier
5bb29e99ba Adding a "allowApi" property to authorize the API in a website. 2021-08-05 12:30:07 +02:00
David Négrier
ce3c53ae3f Adding the ability to inject websites directly inside maps
This PR adds the ability to inject a website INSIDE a map (as an iframe inside a Phaser HTML object)
The iFrame will be rendered transparently, unless you set a background-color on the body, which opens a number of cool possibilities.

Needs to be done: allowing the iframe API in those iframes.
2021-08-05 12:30:05 +02:00
David Négrier
a09f27b448
Merge pull request #1227 from jonnytest1/trigger-message-refv3
trigger message api refactorv3
2021-08-05 12:18:55 +02:00
David Négrier
570110f831 Fixing openWebsiteTriggerMessage not hidden when moving out of zone. 2021-08-05 12:07:12 +02:00
David Négrier
bc1c6a4986 Refactoring displayActionMessage signature. Now accepting an options object. This should allow for more options in the future. 2021-08-05 12:02:00 +02:00
David Négrier
87e4367455 Refactoring layoutManagerActionStore. It now supports an uuid field.
layoutManagerVisibilityStore is now a derived field from layoutManagerActionStore.
2021-08-05 11:19:28 +02:00
GRL
2cd5b7f0a8 Merge branch 'develop' of github.com:thecodingmachine/workadventure into MenuSvelte 2021-08-05 10:01:23 +02:00
David Négrier
92fee33b64 Merge branch 'develop' of github.com:thecodingmachine/workadventure into trigger-message-refv3 2021-08-05 09:24:05 +02:00
David Négrier
d1e5d57459 Changing the method name from "triggerMessage" to "displayActionMessage".
Generally speaking, I like to call the message at the bottom an "action message".
And things can "trigger" it, but in the case of a method that actually proactively displays the message, I find "displayActionMessage" to be a better name.

Also, removing package-lock files and improving code style
2021-08-05 09:17:33 +02:00
dependabot[bot]
2e3489a489
Bump tar from 4.4.13 to 4.4.15 in /back
Bumps [tar](https://github.com/npm/node-tar) from 4.4.13 to 4.4.15.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v4.4.13...v4.4.15)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-05 03:09:10 +00:00
grégoire parant
d644b43e24
Merge pull request #1330 from thecodingmachine/layoutManagerSvelte
Migrate layoutManager in Svelte
2021-08-04 21:01:29 +02:00
grégoire parant
7c11441f50
Merge pull request #1336 from thecodingmachine/HotFixJoystickMobile
Fix joystick postion
2021-08-04 18:42:31 +02:00
Gregoire Parant
190007a21f Fix joystick postion
- Aply new size after open and close iframe and permit to keep the good position of the joystick on the WorkAdventure screen
2021-08-04 18:07:04 +02:00
grégoire parant
238d5c22db
Merge pull request #1334 from thecodingmachine/PWAIcon
Update PWA apple icon
2021-08-04 15:05:57 +02:00
Gregoire Parant
f9992876df Update PWA apple icon 2021-08-04 15:05:11 +02:00
grégoire parant
588af2e3cc
Merge pull request #1333 from thecodingmachine/ImproveWA
Force to add service worker js file
2021-08-04 14:32:17 +02:00
Gregoire Parant
383bbbdafe Force to add service worker js file 2021-08-04 14:31:12 +02:00
grégoire parant
3df5eece38
Merge pull request #1331 from thecodingmachine/UpdatePWA
Update PWA design
2021-08-04 13:53:13 +02:00
Gregoire Parant
707040b506 improve PWA and last room strating 2021-08-04 13:33:58 +02:00
David Négrier
82832b7055 Adding a test case for WA.ui.triggerMessage 2021-08-03 22:37:49 +02:00
David Négrier
4713010929 Merge branch 'develop' of github.com:thecodingmachine/workadventure into trigger-message-refv3 2021-08-03 19:01:16 +02:00
Gregoire Parant
1ad9f5b045 Add new icon manifest 2021-08-03 17:49:25 +02:00
Gregoire Parant
d781b2eb91 Update favicon and service worker html 2021-08-03 17:28:27 +02:00
GRL
fe585297fc Merge branch 'develop' of github.com:thecodingmachine/workadventure into MenuSvelte 2021-08-03 17:19:47 +02:00
GRL
2d8098b06d Merge branch 'develop' of github.com:thecodingmachine/workadventure into layoutManagerSvelte 2021-08-03 11:40:51 +02:00
GRL
1436b15328 Migrate layoutManager in Svelte 2021-08-03 11:13:08 +02:00
David Négrier
4293ea320d Hotfix: if an error occurs while loading the map (because the map is not accessible from the WorkAdventure servers), the application does not prevent users from connecting. 2021-08-03 10:08:53 +02:00
grégoire parant
d568fd596b
Merge pull request #1329 from thecodingmachine/develop
Add feature Release 1.4.11
2021-08-03 00:47:09 +02:00
Gregoire Parant
952e58ecc1 Fix ban message style 2021-08-03 00:34:07 +02:00
grégoire parant
71e3b9dfc1
Merge pull request #1308 from thecodingmachine/GlobalMessageToWorld
Send a message to all the room of a world from Console Admin
2021-08-02 23:50:54 +02:00
Gregoire Parant
14b4229019 Merge branch 'develop' into GlobalMessageToWorld
# Conflicts:
#	CHANGELOG.md
#	front/src/Api/Events/IframeEvent.ts
#	front/src/Components/App.svelte
#	pusher/src/Services/SocketManager.ts
2021-08-02 23:07:39 +02:00
grégoire parant
35f0c945fd
Merge pull request #1328 from thecodingmachine/develop
BugFix Release 1.4.11
2021-08-02 22:46:32 +02:00
Gregoire Parant
2480d13f58 Merge branch 'master' into develop 2021-08-02 22:26:34 +02:00
Gregoire Parant
e07f4bf96f Add comment 2021-08-02 22:24:00 +02:00
grégoire parant
fbe7440e24
Merge pull request #1320 from thecodingmachine/loadTileset
Load a json file that describe a tileset in Tile format.
2021-08-02 22:19:49 +02:00
Gregoire Parant
f2d382681b Merge branch 'develop' into loadTileset
# Conflicts:
#	CHANGELOG.md
#	front/src/Phaser/Game/GameScene.ts
2021-08-02 22:16:05 +02:00
Gregoire Parant
e60c69b394 Squashed commit of the following:
commit 3ab069d650d94aecd42bebea8b27bf8ac93ed81b
Merge: 2b748138 9d4ffe54
Author: Kharhamel <Kharhamel@users.noreply.github.com>
Date:   Fri Jul 30 15:51:07 2021 +0200

    Merge pull request #1323 from thecodingmachine/openIDPoc

    FIX: bomp the node version of pusher

commit 9d4ffe542c9c0a094a78e1d6c8c8b11641052a10
Author: kharhamel <oognic@gmail.com>
Date:   Fri Jul 30 15:50:30 2021 +0200

    FIX: bomp the node version of pusher

commit 2b7481383f6f3f085c4c145394b3d63b75eed239
Merge: 74975ac9 9c803a69
Author: Kharhamel <Kharhamel@users.noreply.github.com>
Date:   Fri Jul 30 15:48:56 2021 +0200

    Merge pull request #1251 from thecodingmachine/openIDPoc

    POC for the openID connect

commit 9c803a69ffb8a1a06a1cdd4d86f15d2a7cdfcd08
Author: kharhamel <oognic@gmail.com>
Date:   Tue Jul 27 16:37:01 2021 +0200

    FEATURE: users can now login via an openID client

commit 74975ac9d81f224d30fe3b3eec180b3ef895cbeb
Merge: 315fe7ca ebdcf880
Author: Kharhamel <Kharhamel@users.noreply.github.com>
Date:   Fri Jul 30 14:54:33 2021 +0200

    Merge pull request #1322 from thecodingmachine/improveCapacityWarning

    FEATURE: improved the room capacity warning visuals

commit ebdcf8804d7ab72a51bac10eeb476467caa16f43
Author: kharhamel <oognic@gmail.com>
Date:   Fri Jul 30 14:08:27 2021 +0200

    added admin link to the warning container

commit 41ac51f2918b743da445a2ba3b89bd8f66e08e06
Author: kharhamel <oognic@gmail.com>
Date:   Thu Jul 29 18:02:36 2021 +0200

    FEATURE: improved the room capacity warning visuals

commit 315fe7ca82b3674d07136d7a96233d827804d177
Author: David Négrier <d.negrier@thecodingmachine.com>
Date:   Thu Jul 29 17:49:51 2021 +0200

    Adding a "font-family" property for text objects. (#1311)

    - Tiled displays your system fonts.
    - Computers have different sets of fonts. Therefore, browsers never rely on system fonts
    - Which means if you select a font in Tiled, it is quite unlikely it will render properly in WorkAdventure

    To circumvent this problem, in your text object in Tiled, you can now add an additional property: `font-family`.

    The `font-family` property can contain any "web-font" that can be loaded by your browser.

    This allows us to use the "Press Start 2P" 8px font in text objects, which renders way better than the default "Sans serif" font of your browser.

commit 7ffe564e8eddcfdc0ef8c20d09f43405934e83f9
Author: GRL78 <80678534+GRL78@users.noreply.github.com>
Date:   Thu Jul 29 17:42:16 2021 +0200

    Graphic upgrade of the global message console (#1287)

    * Graphic upgrade of the global message console
    Fix: error if LoginScene doesn't exist

    * Rework graphic of global message console

    * Rework graphic of global message console

    * Remove console.log

commit 2a1af2a131f72ad5a00b6f4a4990a12fcedb0342
Author: grégoire parant <g.parant@thecodingmachine.com>
Date:   Thu Jul 29 16:42:31 2021 +0200

    PWA service workers (#1319)

    * PWA services worker

    - [x] Register service worker of PWA to install WorkAdventure application on desktop and mobile
    - [x] Create webpage specifique for PWA
    - [ ] Add register service to save and redirect on a card
    - [ ] Add possibilities to install PWA for one World (with register token if existing)

    * Finish PWA strategy to load last map visited

    * Fix feedback @Kharhamel

    * Fix feedback @Kharhamel
2021-08-02 22:14:13 +02:00
Gregoire Parant
7bd444ade9 Revert "Squashed commit of the following:"
This reverts commit c177f0a1b36bd1c06fb5a53e52198ba397ba8771.
2021-08-02 22:13:10 +02:00
Gregoire Parant
c177f0a1b3 Squashed commit of the following:
commit 41748a403686cffd5008be966f7cb04e6ca3e45a
Merge: 3b1d4d63 4991a70b
Author: grégoire parant <g.parant@thecodingmachine.com>
Date:   Mon Aug 2 21:38:37 2021 +0200

    Merge pull request #1327 from thecodingmachine/hotFixErrorCardBack

    Fix error generated

commit 4991a70bba40121b14650bc0baba3552cca1a09e
Author: Gregoire Parant <g.parant@thecodingmachine.com>
Date:   Mon Aug 2 21:34:03 2021 +0200

    Fix error generated

    Don't generate error if file is Invalid

commit 3b1d4d630cc1c7ce21ac50e169463aeb7d5d3811
Merge: f52b4598 02e5860e
Author: grégoire parant <g.parant@thecodingmachine.com>
Date:   Mon Aug 2 21:03:18 2021 +0200

    Merge pull request #1326 from thecodingmachine/HotFixCreateMapFeature

    Hot fix create map feature

commit 02e5860e43eba0283f7c055d12bbf2e916e10b9a
Author: Gregoire Parant <g.parant@thecodingmachine.com>
Date:   Mon Aug 2 20:59:13 2021 +0200

    HotFix redirect on production domain of WorkAdventure

     - Update domain `ADMIN_URL` by `workadventu.re`

commit f52b4598723331ff68d7526cdc32f1eff15a0d8a
Merge: 3d657b4a 3ab069d6
Author: grégoire parant <g.parant@thecodingmachine.com>
Date:   Mon Aug 2 11:23:16 2021 +0200

    Merge pull request #1324 from thecodingmachine/develop

    Release v1.4.11

commit 3ab069d650d94aecd42bebea8b27bf8ac93ed81b
Merge: 2b748138 9d4ffe54
Author: Kharhamel <Kharhamel@users.noreply.github.com>
Date:   Fri Jul 30 15:51:07 2021 +0200

    Merge pull request #1323 from thecodingmachine/openIDPoc

    FIX: bomp the node version of pusher

commit 9d4ffe542c9c0a094a78e1d6c8c8b11641052a10
Author: kharhamel <oognic@gmail.com>
Date:   Fri Jul 30 15:50:30 2021 +0200

    FIX: bomp the node version of pusher

commit 2b7481383f6f3f085c4c145394b3d63b75eed239
Merge: 74975ac9 9c803a69
Author: Kharhamel <Kharhamel@users.noreply.github.com>
Date:   Fri Jul 30 15:48:56 2021 +0200

    Merge pull request #1251 from thecodingmachine/openIDPoc

    POC for the openID connect

commit 9c803a69ffb8a1a06a1cdd4d86f15d2a7cdfcd08
Author: kharhamel <oognic@gmail.com>
Date:   Tue Jul 27 16:37:01 2021 +0200

    FEATURE: users can now login via an openID client

commit 74975ac9d81f224d30fe3b3eec180b3ef895cbeb
Merge: 315fe7ca ebdcf880
Author: Kharhamel <Kharhamel@users.noreply.github.com>
Date:   Fri Jul 30 14:54:33 2021 +0200

    Merge pull request #1322 from thecodingmachine/improveCapacityWarning

    FEATURE: improved the room capacity warning visuals

commit ebdcf8804d7ab72a51bac10eeb476467caa16f43
Author: kharhamel <oognic@gmail.com>
Date:   Fri Jul 30 14:08:27 2021 +0200

    added admin link to the warning container

commit 41ac51f2918b743da445a2ba3b89bd8f66e08e06
Author: kharhamel <oognic@gmail.com>
Date:   Thu Jul 29 18:02:36 2021 +0200

    FEATURE: improved the room capacity warning visuals

commit 315fe7ca82b3674d07136d7a96233d827804d177
Author: David Négrier <d.negrier@thecodingmachine.com>
Date:   Thu Jul 29 17:49:51 2021 +0200

    Adding a "font-family" property for text objects. (#1311)

    - Tiled displays your system fonts.
    - Computers have different sets of fonts. Therefore, browsers never rely on system fonts
    - Which means if you select a font in Tiled, it is quite unlikely it will render properly in WorkAdventure

    To circumvent this problem, in your text object in Tiled, you can now add an additional property: `font-family`.

    The `font-family` property can contain any "web-font" that can be loaded by your browser.

    This allows us to use the "Press Start 2P" 8px font in text objects, which renders way better than the default "Sans serif" font of your browser.

commit 7ffe564e8eddcfdc0ef8c20d09f43405934e83f9
Author: GRL78 <80678534+GRL78@users.noreply.github.com>
Date:   Thu Jul 29 17:42:16 2021 +0200

    Graphic upgrade of the global message console (#1287)

    * Graphic upgrade of the global message console
    Fix: error if LoginScene doesn't exist

    * Rework graphic of global message console

    * Rework graphic of global message console

    * Remove console.log

commit 2a1af2a131f72ad5a00b6f4a4990a12fcedb0342
Author: grégoire parant <g.parant@thecodingmachine.com>
Date:   Thu Jul 29 16:42:31 2021 +0200

    PWA service workers (#1319)

    * PWA services worker

    - [x] Register service worker of PWA to install WorkAdventure application on desktop and mobile
    - [x] Create webpage specifique for PWA
    - [ ] Add register service to save and redirect on a card
    - [ ] Add possibilities to install PWA for one World (with register token if existing)

    * Finish PWA strategy to load last map visited

    * Fix feedback @Kharhamel

    * Fix feedback @Kharhamel
2021-08-02 22:06:24 +02:00
grégoire parant
41748a4036
Merge pull request #1327 from thecodingmachine/hotFixErrorCardBack
Fix error generated
2021-08-02 21:38:37 +02:00
Gregoire Parant
4991a70bba Fix error generated
Don't generate error if file is Invalid
2021-08-02 21:34:03 +02:00
grégoire parant
3b1d4d630c
Merge pull request #1326 from thecodingmachine/HotFixCreateMapFeature
Hot fix create map feature
2021-08-02 21:03:18 +02:00
Gregoire Parant
02e5860e43 HotFix redirect on production domain of WorkAdventure
- Update domain `ADMIN_URL` by `workadventu.re`
2021-08-02 20:59:13 +02:00
grégoire parant
f52b459872
Merge pull request #1324 from thecodingmachine/develop
Release v1.4.11
2021-08-02 11:23:16 +02:00
Kharhamel
3ab069d650
Merge pull request #1323 from thecodingmachine/openIDPoc
FIX: bomp the node version of pusher
2021-07-30 15:51:07 +02:00
kharhamel
9d4ffe542c FIX: bomp the node version of pusher 2021-07-30 15:50:30 +02:00
Kharhamel
2b7481383f
Merge pull request #1251 from thecodingmachine/openIDPoc
POC for the openID connect
2021-07-30 15:48:56 +02:00
kharhamel
9c803a69ff FEATURE: users can now login via an openID client 2021-07-30 15:43:46 +02:00
Kharhamel
74975ac9d8
Merge pull request #1322 from thecodingmachine/improveCapacityWarning
FEATURE: improved the room capacity warning visuals
2021-07-30 14:54:33 +02:00
kharhamel
ebdcf8804d added admin link to the warning container 2021-07-30 14:50:11 +02:00
GRL
bd96a32d5b Merge branch 'develop' of github.com:thecodingmachine/workadventure into GlobalMessageToWorld 2021-07-30 09:38:28 +02:00
kharhamel
41ac51f291 FEATURE: improved the room capacity warning visuals 2021-07-29 18:27:53 +02:00
GRL
6ac25d344b Use const 2021-07-29 17:56:28 +02:00
David Négrier
315fe7ca82
Adding a "font-family" property for text objects. (#1311)
- Tiled displays your system fonts.
- Computers have different sets of fonts. Therefore, browsers never rely on system fonts
- Which means if you select a font in Tiled, it is quite unlikely it will render properly in WorkAdventure

To circumvent this problem, in your text object in Tiled, you can now add an additional property: `font-family`.

The `font-family` property can contain any "web-font" that can be loaded by your browser.

This allows us to use the "Press Start 2P" 8px font in text objects, which renders way better than the default "Sans serif" font of your browser.
2021-07-29 17:49:51 +02:00
GRL78
7ffe564e8e
Graphic upgrade of the global message console (#1287)
* Graphic upgrade of the global message console
Fix: error if LoginScene doesn't exist

* Rework graphic of global message console

* Rework graphic of global message console

* Remove console.log
2021-07-29 17:42:16 +02:00
GRL
6c616f73eb Add CHANGELOG 2021-07-29 17:41:31 +02:00
grégoire parant
2a1af2a131
PWA service workers (#1319)
* PWA services worker

- [x] Register service worker of PWA to install WorkAdventure application on desktop and mobile
- [x] Create webpage specifique for PWA
- [ ] Add register service to save and redirect on a card
- [ ] Add possibilities to install PWA for one World (with register token if existing)

* Finish PWA strategy to load last map visited

* Fix feedback @Kharhamel

* Fix feedback @Kharhamel
2021-07-29 16:42:31 +02:00
GRL
880b2d4b71 Add CHANGELOG 2021-07-29 15:56:28 +02:00
GRL
eb8404ac91 Initialise iframeListener in preload
Add documentation and CHANGELOG
2021-07-29 15:53:27 +02:00
GRL
5f7361156b Merge branch 'develop' of github.com:thecodingmachine/workadventure into loadTileset 2021-07-29 15:35:32 +02:00
GRL
897a01bb79 Loading a tileset create a new GameMap 2021-07-29 14:14:40 +02:00
GRL
73d589ad11 Load a json file that describe a tileset in Tile format.
Then add it to the tilemap of the GameScene
Then add if to the GameMap
2021-07-28 18:03:19 +02:00
Gregoire Parant
4b4356e7ff Merge branch 'master' into develop 2021-07-28 12:37:14 +02:00
grégoire parant
3d657b4a18
HotFix ban user (#1318)
* HotFix ban user

 - Fix to permit to ban user with more sub tab openned
 - Fix to permit to send message ban to the user with more sub tab oppened

* Fix CI

* Run pretty
2021-07-27 14:42:32 +02:00
Stefan Weil
64065b2798
Fix some typos (found by codespell) (#1316)
Signed-off-by: Stefan Weil <sw@weilnetz.de>
2021-07-27 14:29:09 +02:00
GRL78
95af568653
Link will now be white and underline + Click on the game to lose focus of input field (#1315)
* Link will now be white and underline
Click on the game to lose focus of input field

* Use bind:this instead of querySelector
Add isClickedInside and isClickedOutside to HtmlUtils to know if the user click inside/outside an element targeted
2021-07-27 14:28:35 +02:00
grégoire parant
fc9865e273
HotFix position WOKA (#1317)
- Fix the moving position when a user enters in "custom your own" with custom WOKA loaded from admin
2021-07-27 14:28:00 +02:00
David Négrier
cdd61bdb2c Merging with develop 2021-07-23 16:41:38 +02:00
GRL
9e8bed7aab Position of quill tooltip
Use inlineStyle to indent and align text correctly
2021-07-23 16:17:53 +02:00
David Négrier
3d5c222957 Reverting changes regarding single quotes 2021-07-23 14:59:56 +02:00
David Négrier
a146065cc6 Reverting changes regarding single quotes 2021-07-23 14:55:14 +02:00
GRL
ba6e6235d6 Merge branch 'develop' of github.com:thecodingmachine/workadventure into GlobalMessageToWorld 2021-07-23 14:10:43 +02:00
David Négrier
5a56c20221
Merge pull request #1310 from thecodingmachine/fix_persist_property
Taking into account persist property
2021-07-23 12:27:08 +02:00
David Négrier
c1cd464a7b Fixing reference to deprecated method in doc 2021-07-23 12:26:18 +02:00
David Négrier
88f2bfdf39 Taking into account persist property
The "persist" property was not taken into account and all variables were stored in DB. This change makes sure only variables tagged with "persist" are actually persisted.
2021-07-23 12:19:47 +02:00
David Négrier
72a9f901ab
Merge pull request #1309 from thecodingmachine/fix_variable_loops
Fixing loop when setting variables
2021-07-23 11:57:06 +02:00
David Négrier
2aba6b1c27 Fixing loop when setting variables
Setting a variable would makes the application enter in an infinite loop of events (between all the scripts and the back)
This fix makes sure a variable does not emit any event if it is changed to a value it already has.
2021-07-23 11:51:01 +02:00
GRL
807abaa2c0 Text global message use delta instead of text 2021-07-23 11:07:17 +02:00
GRL
a0aeb3b1f8 Merge remote-tracking branch 'origin/GlobalMessageToWorld' into GlobalMessageToWorld 2021-07-22 17:29:16 +02:00
GRL
9fa7c7aac0 Merge branch 'develop' of github.com:thecodingmachine/workadventure into GlobalMessageToWorld 2021-07-22 17:29:00 +02:00
GRL
a01bd73e93 Merge branch 'develop' of github.com:thecodingmachine/workadventure into GlobalMessageToWorld 2021-07-22 17:17:25 +02:00
David Négrier
84df25f863 Improving WA.state typings 2021-07-22 17:14:36 +02:00
David Négrier
756a495ac6 Fixing CI 2021-07-22 17:14:15 +02:00
GRL
68ff1b9e17 Merge branch 'develop' of github.com:thecodingmachine/workadventure into GlobalMessageToWorld 2021-07-22 16:26:01 +02:00
GRL
9e16bfc366 playGlobalMessage are receive as adminRoomMessage
Suppression of GlobalMessageManager and TypeMessage
Migrating message to svelte
2021-07-22 16:14:27 +02:00
David Négrier
9b2914cc63
Merge pull request #1239 from thecodingmachine/scripting_api_room_metadata
Allowing loading/saving "metadata" from a room
2021-07-22 11:28:12 +02:00
David Négrier
31811ab906 Improve docblock 2021-07-22 11:24:30 +02:00
David Négrier
ae5617f3a0 Simplifying promises 2021-07-22 10:41:45 +02:00
David Négrier
6d4c2cfd39 Simplifying error handling 2021-07-22 10:33:07 +02:00
Lurkars
c0b09db05e change port back 2021-07-21 19:29:45 +02:00
Lurkars
fb2bd1c346 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-07-21 19:28:00 +02:00
Lurkars
285f1ebe89 Merge branch 'develop' of github.com:thecodingmachine/workadventure into audioPlayerImprovements 2021-07-21 19:26:29 +02:00
David Négrier
ddabda1c4b Adding error case in test 2021-07-21 18:49:25 +02:00
David Négrier
1435ec89c9 Adding unit test and fixing an issue with DNS solving 2021-07-21 18:42:20 +02:00
David Négrier
1bb6d893e0 Simplifying promises 2021-07-21 18:23:03 +02:00
David Négrier
3cfb74be54 Removing useless console log 2021-07-21 16:55:34 +02:00
David Négrier
8790a9c680
Merge pull request #1303 from ValdoTR/develop
Fix openPopup deprecated annotation
2021-07-21 16:43:03 +02:00
David Négrier
080d495044 Renaming WA.room.getMap to WA.room.getTiledMap 2021-07-21 16:40:53 +02:00
David Négrier
181545e6b7 Removing dead code 2021-07-21 16:33:56 +02:00
David Négrier
aa19e8a7cd Adding a warning when editing a map locally. 2021-07-21 16:29:38 +02:00
Valdo Romao
cd49fd5b83 Fixe openPopup deprecated annotation 2021-07-21 16:10:30 +02:00
David Négrier
f435cecfdc Merge branch 'develop' of github.com:thecodingmachine/workadventure into scripting_api_room_metadata 2021-07-21 15:37:53 +02:00
Lurkars
7285122fed fix port 2021-07-21 12:00:15 +02:00
Lurkars
9d518eded8 Merge branch 'develop' of github.com:thecodingmachine/workadventure into twemojiEmoteMenu 2021-07-21 11:56:36 +02:00
Lurkars
d43202d90d fix userInput 2021-07-21 10:17:46 +02:00
Lurkars
f43deff626 use emote button 2021-07-21 09:41:22 +02:00
GRL78
4f513fb1e0
Fix test Scripting API (#1298)
* fix tests of Scripting API

* Suppression ts-ignore
2021-07-20 19:54:45 +02:00
David Négrier
78524e64bd
Merge pull request #1300 from thecodingmachine/remove_search_args_from_room_url
Removing the 'search' parameters from the room URL sent to pusher
2021-07-20 18:42:18 +02:00
David Négrier
2d55f982d3 Removing the 'search' parameters from the room URL sent to pusher 2021-07-20 18:29:41 +02:00
grégoire parant
b336e3b08a
Delete logo TCM on Error scene (#1297) 2021-07-20 16:45:24 +02:00
Lurkars
83bd19c8dc Merge branch 'develop' of github.com:thecodingmachine/workadventure into twemojiEmoteMenu 2021-07-20 16:27:49 +02:00
GRL
6e65952d75 SendGlobalMessage by sendAminMessage 2021-07-20 15:16:51 +02:00
GRL78
936f5d0301
Icon chat not italic or bold (#1296) 2021-07-20 10:28:40 +02:00
David Négrier
fe59b4512b Fixing CI 2021-07-20 09:33:01 +02:00
David Négrier
bfd9ae324b Adding documentation about onVariableChange 2021-07-20 09:19:44 +02:00
David Négrier
ac3d1240ae Setting a variable to undefined now removes it from server-side storage. 2021-07-19 18:46:33 +02:00
Kharhamel
4dcd8cfb18
Merge pull request #1295 from thecodingmachine/develop
v1.4.8
2021-07-19 17:10:00 +02:00
GRL78
697f316780
In SelectCharacterScene, if custom character not loaded then select the first character (#1284) 2021-07-19 17:06:36 +02:00
GRL78
9432c82386
Change address mail to contact us (#1282) 2021-07-19 17:05:23 +02:00
David Négrier
d955ddfe82 Adding support to persist variables in Redis 2021-07-19 16:23:16 +02:00
David Négrier
18e4d2ba4e Setting a timeout to map loading 2021-07-19 10:32:31 +02:00
David Négrier
dbd5b80636 Adding support for "readableBy" and "writableBy" in back
This means that we are now loading maps from server side.
2021-07-19 10:16:43 +02:00
GRL
0d3c697add Merge branch 'develop' of github.com:thecodingmachine/workadventure into GlobalMessageToWorld 2021-07-19 10:01:13 +02:00
GRL
71bf6b362b Rework graphic of global message console 2021-07-19 09:38:49 +02:00
GRL
214226a271 Rework graphic of global message console 2021-07-19 09:22:47 +02:00
Kharhamel
d8176c2f8d
Merge pull request #1291 from thecodingmachine/chatTweak
FEATURE: chat tweak
2021-07-16 15:49:36 +02:00
kharhamel
f840034d9c FEATURE: chat tweak 2021-07-16 14:25:59 +02:00
David Négrier
3d76f76d3e Fixing merge 2021-07-16 11:37:44 +02:00
David Négrier
5c7ea7b258 Merge branch 'develop' of github.com:thecodingmachine/workadventure into scripting_api_room_metadata 2021-07-16 11:22:36 +02:00
David Négrier
66e340dece
Merge pull request #1292 from thecodingmachine/mapDetailsByRoomId
Admin /api/map endpoint return type is now generated with generic type guards
2021-07-16 10:53:27 +02:00
David Négrier
a4a123c331 Admin /api/map endpoint return type is now generated with generic type guards 2021-07-16 10:46:45 +02:00
David Négrier
510477b99b
Merge pull request #1285 from thecodingmachine/mapDetailsByRoomId
Migrating away from the notion of public/private URL in WorkAdventure Github repository
2021-07-16 09:07:43 +02:00
David Négrier
84948eb9da
Merge pull request #1290 from thecodingmachine/develop
Deploy 2021-07-15
2021-07-15 18:36:14 +02:00
Kharhamel
c30c6b7fbd
Merge pull request #1289 from thecodingmachine/removeIncorrectDoc
FIX: removed incorrect documentation
2021-07-15 18:27:13 +02:00
kharhamel
c5587600ba FIX: removed incorrect documentation 2021-07-15 18:23:40 +02:00
David Négrier
d0d191fc28 Removing useless ternary 2021-07-15 17:12:54 +02:00
David Négrier
f217fc8aad Removing dead code 2021-07-15 17:11:48 +02:00
David Négrier
c9fa9b9a92 Migrating away from the notion of public/private URL in WorkAdventure Github repository
The notion of public/private repositories (with /_/ and /@/ URLs) is specific to the SAAS version of WorkAdventure.
It would be better to avoid leaking the organization/world/room structure of the private SAAS URLs inside the WorkAdventure Github project.

Rather than sending http://admin_host/api/map?organizationSlug=...&worldSlug=...&roomSlug=...., we are now sending /api/map&playUri=...
where playUri is the full URL of the current game.
This allows the backend to act as a complete router.
The front (and the pusher) will be able to completely ignore the specifics of URL building (with /@/ and /_/ URLs, etc...)
Those details will live only in the admin server, which is way cleaner (and way more powerful).
2021-07-15 17:07:47 +02:00
Kharhamel
f2ca7b2b16
Merge pull request #1288 from thecodingmachine/fixVideoBox
FIX: VideoPeer destroy could be called twice
2021-07-15 16:46:21 +02:00
kharhamel
285079cae2 FIX: VideoPeer destroy could be called twice 2021-07-15 16:31:43 +02:00
Kharhamel
d147661944
Merge pull request #1286 from thecodingmachine/fixVideoBox
FIX: media box height, chat font, updated simple-peer
2021-07-15 16:15:20 +02:00
kharhamel
18a65651f3 FIX: media box should always have a height 2021-07-15 16:08:37 +02:00
GRL
e43ea3aa5e Graphic upgrade of the global message console
Fix: error if LoginScene doesn't exist
2021-07-15 15:09:35 +02:00
Kharhamel
5f43aeba85
Merge pull request #1283 from thecodingmachine/fixVisitChatInteraction
FIX: visit card is now an absolute position
2021-07-13 17:20:29 +02:00
Kharhamel
091f3aa7ee
Merge pull request #1202 from thecodingmachine/betterNotifications
improved the notifications
2021-07-13 17:19:12 +02:00
kharhamel
e96cb6930b FIX: visit card is now an absolute position 2021-07-13 17:14:40 +02:00
kharhamel
3983d0c5bc FEATURE: improved the notification system 2021-07-13 16:54:11 +02:00
GRL78
b2ea368097
Migrate getCurrentUser() to WA.player (#1279) 2021-07-13 15:13:14 +02:00
kharhamel
1ce801cced temp 2021-07-13 14:40:35 +02:00
kharhamel
50f3af81e4 temp 2021-07-13 14:40:35 +02:00
kharhamel
fecbc8a018 WIP: svelte menu 2021-07-13 14:40:35 +02:00
Kharhamel
41a1f56bd5
Merge pull request #1111 from thecodingmachine/svelteChat
FEATURE: migrated the chat window to svelte
2021-07-13 11:25:38 +02:00
GRL
01bfbc36b5 Merge branch 'svelteChat' of github.com:thecodingmachine/workadventure into svelteChat 2021-07-13 11:09:32 +02:00
GRL
f7127bfb5a Graphic upgrade 2 2021-07-13 11:05:34 +02:00
GRL
a093298993 Graphic upgrade 2 2021-07-13 11:00:32 +02:00
grégoire parant
a583a9dc2a
Merge pull request #1278 from thecodingmachine/develop
Deploy 2021-07-12
2021-07-12 20:33:01 +02:00
David Négrier
28effd8ad4 Using proxy variables in test 2021-07-12 16:43:40 +02:00
GRL
e2e94c11ff Autoscroll 2021-07-12 15:00:28 +02:00
grégoire parant
022d1fec63
ServiceWorker (#1243)
- Create service worker to have PWA
 - Add install service worker
 - Add fecth service worker with a persistent cache navigator
 - Add favicon 512x512
2021-07-12 13:17:45 +02:00
GRL
b9a2433283 Upgrade graphic of the chat 2021-07-12 11:59:05 +02:00
David Négrier
52fd9067b8 Editing do to add "state" API doc 2021-07-08 11:46:30 +02:00
David Négrier
b1cb12861f Migrating variables functions to the "state" namespace. 2021-07-07 22:14:59 +02:00
kharhamel
3cfbcc6b02 FEATURE: migrated the chat window to svelte 2021-07-07 18:07:58 +02:00
David Négrier
e65e8b2097 First version with variables that actually work 2021-07-07 17:17:28 +02:00
David Négrier
ae9af56661
Merge pull request #1264 from thecodingmachine/UpdateShowHideLayer
Show/Hide Layer now unset collision and can show/hide all the layer in a group layer
2021-07-07 17:15:41 +02:00
David Négrier
cb5bdb5fea
Fixing typo 2021-07-07 17:15:22 +02:00
David Négrier
e6f609d3be
Merge pull request #1265 from thecodingmachine/UpdateSetTiles
SetTiles can now set a tile to null so that there is no more tile.
2021-07-07 17:14:03 +02:00
GRL
64c569c42f Add documentation and CHANGELOG
Modify error message
2021-07-07 17:06:23 +02:00
GRL
41c60579a6 Merge branch 'develop' of github.com:thecodingmachine/workadventure into UpdateSetTiles 2021-07-07 17:00:10 +02:00
GRL
e50292a2ba Add documentation
No second parameter
2021-07-07 16:58:54 +02:00
David Négrier
0a1c01fb26
Merge pull request #1266 from thecodingmachine/UpdateSetPropertyLayer
SetProperty delete a property where tha value is undefined and load the map of exitUrl property
2021-07-07 16:44:32 +02:00
grégoire parant
17525e1e15
Return at the new line into the Pop-up (#1267)
Add regex to replace "\r\n" or "\r" or "\n" by <br/>
2021-07-07 16:42:26 +02:00
GRL
6f6ad949ca Merge branch 'develop' of github.com:thecodingmachine/workadventure into UpdateShowHideLayer 2021-07-07 16:34:36 +02:00
GRL
24811e0a31 SetProperty delete a property where tha value is undefined and load the map of exitUrl property 2021-07-07 14:59:40 +02:00
GRL
bef5e139c0 SetTiles can now set a tile to null so that there is no more tile. 2021-07-07 14:42:17 +02:00
GRL
d51ac45079 Show/Hide Layer now unset collision and can show/hide all the layer in a group layer 2021-07-07 14:26:53 +02:00
David Négrier
5116b82e77 Merge branch 'develop' of github.com:thecodingmachine/workadventure into scripting_api_room_metadata 2021-07-07 11:55:00 +02:00
David Négrier
e5f7c62e25
Merge pull request #1263 from thecodingmachine/blacklistOnUuid
Users blocking now rely on UUID rather than ID
2021-07-07 11:33:12 +02:00
David Négrier
34cb0ebf39 Users blocking now rely on UUID rather than ID
This way, if a user A blocks another user B, if user B refreshes the browser or leaves and re-enters the room, user B will still be blocked.
As a side effect, this allows us to completely remove the "sockets" property in the SocketManager on the Pusher.
2021-07-07 11:24:51 +02:00
David Négrier
19bd1045e1 Merge branch 'develop' of github.com:thecodingmachine/workadventure into scripting_api_room_metadata 2021-07-06 17:24:16 +02:00
David Négrier
28e4f59e50
Merge pull request #1262 from thecodingmachine/players_store
Adding a playersStore
2021-07-06 17:21:42 +02:00
David Négrier
46e6917df6 Adding a playersStore
The playerStore can be useful to get the details of a given player from its ID.
2021-07-06 17:13:08 +02:00
David Négrier
a1f1927b6d Starting adding variables server-side 2021-07-06 15:30:49 +02:00
David Négrier
cb78ff333b Adding client side check of setVariable with writableBy property 2021-07-06 10:58:12 +02:00
David Négrier
86fa869b20 Actually using Type Guards in queries received by WA. 2021-07-06 10:26:44 +02:00
David Négrier
0aa93543bc Adding warning if "template" object is used as a variable 2021-07-05 18:48:26 +02:00
David Négrier
bf17ad4567 Switching setVariable to a query and fixing error hangling in query mechanism 2021-07-05 18:29:34 +02:00
David Négrier
c30de8c6db Adding support for default variables values 2021-07-05 17:25:23 +02:00
jonny
4ea6a12d20 cast callback 2021-07-05 16:26:29 +02:00
David Négrier
194d6a6414
Merge pull request #1254 from jonnytest1/server-crash
fixed invalid unauathorized handler
2021-07-05 14:42:20 +02:00
David Négrier
abd53b6251 Adding WA.onInit method to wait for API startup. 2021-07-05 14:41:10 +02:00
David Négrier
62a4814961 Migrating WA.player.getCurrentUser and WA.room.getCurrentRoom to direct property access and WA.room.getMap 2021-07-05 11:53:33 +02:00
jonny
9bcdc9ba33 linter fixes 2021-07-02 19:05:03 +02:00
jonny
310e131a6e eslint restart 2021-07-02 19:03:34 +02:00
jonny
369d453455 Merge remote-tracking branch 'remotes/upstream/develop' into trigger-message-refv3 2021-07-02 18:49:22 +02:00
David Négrier
ea1460abaf Adding variables (on the front side for now) 2021-07-02 17:36:43 +02:00
David Négrier
1806ef9d7e First version of the room metadata doc 2021-07-02 17:30:42 +02:00
David Négrier
a7ced533c0
Merge pull request #1258 from thecodingmachine/query-answer-mechanism
Add new "query/answer" utility functions for the scripting API
2021-07-02 17:29:41 +02:00
David Négrier
280c59e6b5 Changing callback signature of registerAnswerer so that it can return a value and not necessarily a promise. 2021-07-02 17:26:28 +02:00
David Négrier
5b4a72ea1f Add new "query/answer" utility functions for the scripting API
So far, the scripting API was using events to communicate between WA and the iFrame.
But often, the scripting API might actually want to "ask" WA a question and wait for an answer.

We dealt with this by using 2 unrelated events (in a mostly painful way).

This commit adds a "queryWorkadventure" utility function in the iFrame API that allows us
to send a query, and to wait for an answer. The query and answer events have a unique ID to be
sure the answer matches the correct query.

On the WA side, a new `IframeListener.registerAnswerer` method can be used to register a possible answer.
2021-07-02 16:49:22 +02:00
David Négrier
d29c0cc99f
Merge pull request #1257 from thecodingmachine/jonnytest1-tiles-start-positions
Merging Jonnytest1's PR tiles-start-positions + Correction of metadata function
2021-07-02 15:12:23 +02:00
GRL
8644389d7e remove unnecessary conversion type 2021-07-02 14:45:27 +02:00
GRL
c5b5326480 setProperty function doesn't set an empty array if property doesn't exist 2021-07-02 14:40:18 +02:00
GRL
e1611969ce Merge branch 'develop' of github.com:thecodingmachine/workadventure into jonnytest1-tiles-start-positions 2021-07-02 14:35:28 +02:00
jonny
65cefb3584 fixed invalid unauathorized handler 2021-07-01 15:50:40 +02:00
Lurkars
bba26fdc20 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-07-01 13:39:04 +02:00
David Négrier
63391e657f
Merge pull request #1221 from thecodingmachine/metadataScriptAPIV2
Change Tile with scripting API
2021-07-01 12:04:16 +02:00
GRL
01d02124d1 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2 2021-07-01 11:38:33 +02:00
David Négrier
a7d2c600ff Merge branch 'master' of github.com:thecodingmachine/workadventure into develop 2021-06-30 13:35:29 +02:00
David Négrier
50fcc1caaa Fixing signature of openCoWebSite 2021-06-30 10:40:53 +02:00
David Négrier
164f88ef4c
Merge pull request #1250 from thecodingmachine/fix_push_to_npm
Fixing NPM package generation
2021-06-30 10:21:04 +02:00
David Négrier
bfcdd31ed2 Fixing NPM package generation
The generation was broken due to the refactoring in several classes (some of them where not properly exported).
Also, trying to generate the NPM package on every build now (to detect issues).
2021-06-30 10:15:55 +02:00
David Négrier
cb2485bab0
Merge pull request #1248 from thecodingmachine/master_backport
Backporting master into develop
2021-06-29 18:50:54 +02:00
David Négrier
8f3d9277ac Merging master into develop 2021-06-29 18:39:43 +02:00
David Négrier
33ee190b0f
Merge pull request #1246 from thecodingmachine/OpenWebSiteScriptAllowAPI
Cowebsite opened by script can use Iframe Api
2021-06-29 18:27:54 +02:00
David Négrier
3c77ce945d
Improving docs 2021-06-29 18:26:21 +02:00
David Négrier
c5949a0337 Fixing linting 2021-06-29 17:57:19 +02:00
David Négrier
ef0d422a49 Fixing building of typings 2021-06-29 17:55:19 +02:00
David Négrier
285712bfc7 Fixing building of typings 2021-06-29 17:31:01 +02:00
David Négrier
1cd18db560 Fixing broken NPM typings package build 2021-06-29 16:59:54 +02:00
GRL
95bd639124 More statement 2021-06-29 16:50:33 +02:00
David Négrier
3afc725af6
Merge pull request #1245 from thecodingmachine/cowebsiteAllowApibyScript
Allow a website opened by script to use iframe_api
2021-06-29 16:10:22 +02:00
GRL
6462773e7f Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2 2021-06-29 14:16:19 +02:00
GRL
b457ce493b Suppress console.log 2021-06-29 09:44:57 +02:00
GRL
dad8cdef8b Merge branch 'develop' of github.com:thecodingmachine/workadventure into OpenWebSiteScriptAllowAPI 2021-06-29 09:42:20 +02:00
GRL
65d1e4e768 Add CHANGELOG and a map for test 2021-06-29 09:40:15 +02:00
David Négrier
ec75509725
Merge pull request #839 from ValdoTR/new-favicon
Updated favicons
2021-06-29 09:03:15 +02:00
Lurkars
445449d2db remove port change for sync 2021-06-29 08:40:24 +02:00
Lurkars
81f2c8b746 Merge branch 'develop' of github.com:thecodingmachine/workadventure into twemojiEmoteMenu 2021-06-29 08:37:08 +02:00
Lurkars
c264364752 Twemoji Emote Menu 2021-06-29 08:37:01 +02:00
Valdo Romao
723001e1e7 Added better favicon 2021-06-29 00:12:00 +01:00
GRL
389ca25b6a Cowebsite opened by script can use Iframe Api 2021-06-28 18:00:48 +02:00
Valdo Romao
4cf5a6f7a0 Merge branch 'develop' of https://github.com/thecodingmachine/workadventure into new-favicon 2021-06-28 15:56:28 +01:00
GRL
5c3a207c72 Merge branch 'cowebsiteAllowApibyScript' of github.com:thecodingmachine/workadventure into cowebsiteAllowApibyScript 2021-06-28 16:13:53 +02:00
GRL
06920a2271 Use dynamic Iframe API 2021-06-28 16:13:38 +02:00
GRL78
9ab73c0aa0
Update docs/maps/api-reference.md
Co-authored-by: David Négrier <d.negrier@thecodingmachine.com>
2021-06-28 16:05:29 +02:00
GRL
feab5da2ad Allow a website opened by script to use iframe_api 2021-06-28 15:55:30 +02:00
David Négrier
49d627ca38
Merge pull request #1244 from thecodingmachine/warning_message_on_iframe_api
Adding a warning message if an unauthorized iFrame tries to communicate with WA
2021-06-28 15:24:55 +02:00
David Négrier
3fd4f9d384 Adding a warning message if an unauthorized iFrame tries to communicate with WA
Closes #1241
2021-06-28 15:20:27 +02:00
David Négrier
1e57028e6e Renaming changeTile to setTiles 2021-06-28 14:58:49 +02:00
David Négrier
319db95bc8 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2
# Conflicts:
#	front/src/Api/iframe/room.ts
2021-06-28 14:50:26 +02:00
David Négrier
0c5774a48f
Merge pull request #1229 from jonnytest1/cache-fix
immutableData was never assigned
2021-06-28 14:18:45 +02:00
David Négrier
71a5e29ae4 Making script URL dynamic
Signed-off-by: David Négrier <d.negrier@thecodingmachine.com>
2021-06-28 14:13:49 +02:00
David Négrier
86cb118378 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2 2021-06-28 14:12:10 +02:00
David Négrier
46ae4fda74
Merge pull request #1242 from thecodingmachine/iframe_load_url
Trying to find iframe_api.js URL script dynamically
2021-06-28 14:10:32 +02:00
David Négrier
303d2a7837 Adding a warning regarding the "controlled" XSS in iframe.html 2021-06-28 13:55:17 +02:00
David Négrier
7f79c2dc4a Making the test page URL dynamic depending on the environment 2021-06-28 13:54:49 +02:00
GRL
d38cec0b51 Merge branch 'metadataScriptAPIV2' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2 2021-06-28 13:48:44 +02:00
GRL
651b0a4518 Add test map for changing tiles by script in index 2021-06-28 12:03:06 +02:00
GRL
ed84dacb9c Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2 2021-06-28 12:01:08 +02:00
David Négrier
330a795fee Trying to find iframe_api.js URL script dynamically
This would allow us to have tests that don't rely on the iframe_api.js from prod, and would allow scripts that target the correct iframe API, no matter if they are running on workadventu.re or on self-hosted maps.
2021-06-28 11:51:13 +02:00
jonny
917f3728d5 added callback in example 2021-06-28 11:17:22 +02:00
jonny
9643c7adf9 added callback documentation 2021-06-28 11:16:29 +02:00
David Négrier
f18291e9d2 Referencing test in index.html and adding some text in the test map. 2021-06-28 10:06:56 +02:00
David Négrier
0b161a2368
Fixing typos 2021-06-28 09:56:18 +02:00
GRL
b182a08ca2 correction from review 2021-06-28 09:33:13 +02:00
jonny
b0eb241fc3 oO something kept movin the comment to the next line 2021-06-25 18:45:15 +02:00
jonny
bbdf0a1289 fixed merge conflict 2021-06-25 18:20:16 +02:00
jonny
7f61e9addd Merge remote-tracking branch 'remotes/upstream/develop' into tiles-start-positions 2021-06-25 18:14:40 +02:00
jonny
abfa010bbf added husky to gitignore 2021-06-25 18:07:03 +02:00
jonny
769e0fcc29 refactor to position object 2021-06-25 18:03:43 +02:00
jonny
c7fa5cab8b cleanup 2021-06-25 17:57:09 +02:00
jonny
f536d538ea added backwards compatible check and maps 2021-06-25 17:35:42 +02:00
Lurkars
7d12d8561a Merge branch 'develop' of github.com:thecodingmachine/workadventure into audioPlayerImprovements 2021-06-25 16:13:26 +02:00
Lurkars
4c8ee41cf2 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-06-24 18:28:12 +02:00
David Négrier
63d4c99d15
Merge pull request #1235 from thecodingmachine/fix_map_change
Fixing a lock when the player is moving from one room to the other
2021-06-24 17:08:06 +02:00
David Négrier
ac97cf5772 Fixing a lock when the player is moving from one room to the other
This was due to a store not properly unsubscribed when changing rooms.
2021-06-24 17:02:57 +02:00
Lurkars
d28f0bed50 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-06-24 15:43:06 +02:00
David Négrier
8c8649b584
Merge pull request #1232 from thecodingmachine/fixCollides
Fix collides
2021-06-24 15:19:10 +02:00
Kharhamel
66bceb577a
Merge pull request #1233 from thecodingmachine/fixMenuCrash
FIX: solved a menu crash
2021-06-24 13:51:58 +02:00
Guy Sheffer
120f19af65
Add anthoer note for https://github.com/thecodingmachine/workadventure/issues/932#issuecomment-867562208 2021-06-24 14:35:18 +03:00
Lurkars
116c56be81 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-06-24 13:04:28 +02:00
kharhamel
a094e16c1f FIX: solved a menu crash 2021-06-24 12:14:28 +02:00
GRL
dcc7f2a686 Fix collides 2021-06-24 12:10:44 +02:00
GRL
c79603d7fa Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2 2021-06-24 11:55:07 +02:00
David Négrier
2f282e3469 peerStore loading order caused issues. Fixed in GameScene (+ extracted a few stores in their files) 2021-06-24 11:54:09 +02:00
GRL
4903911d62 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2 2021-06-24 11:33:29 +02:00
GRL
a666bf310b Change Tiles 2021-06-24 11:31:29 +02:00
David Négrier
6ed8ce9af1
Merge pull request #1163 from thecodingmachine/svelte_video_overlay
Migrating the video overlay in Svelte
2021-06-24 10:53:35 +02:00
David Négrier
e4708149e0 Merge branch 'develop' of github.com:thecodingmachine/workadventure into svelte_video_overlay
# Conflicts:
#	front/package.json
#	front/src/Components/App.svelte
#	front/src/Phaser/Game/GameScene.ts
#	front/src/Phaser/Menu/MenuScene.ts
#	front/src/WebRtc/MediaManager.ts
2021-06-24 10:49:55 +02:00
David Négrier
8d59680de5 Removing useless code 2021-06-24 10:36:47 +02:00
David Négrier
5ed61012f0 Created a PeerStatus type instead of "connecting" | "connected" | "error" | "closed" 2021-06-24 10:34:36 +02:00
David Négrier
52a90e52d4
Merge pull request #1226 from thecodingmachine/apply_prettier_on_push_and_back
Applying prettier in CI for pusher and back containers
2021-06-24 10:29:21 +02:00
David Négrier
3e464580ea Fixing eslint ignore broken by Prettier 2021-06-24 10:23:32 +02:00
David Négrier
10c3d6dee2 Applying Prettier on pusher and back 2021-06-24 10:09:10 +02:00
Lurkars
a0418ddb78 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-06-24 09:19:55 +02:00
jonny
d1178b1a01 immutableData was never assigned 2021-06-23 20:19:38 +02:00
jonny
5472d220ba added trigger message code 2021-06-23 17:32:32 +02:00
David Négrier
06b7f5ba2f Applying prettier in CI for pusher and back containers 2021-06-23 17:13:16 +02:00
David Négrier
3cf0a9ee84
Merge pull request #1225 from thecodingmachine/apply_prettier_on_pusher_and_back
Setting up prettier on pusher and back
2021-06-23 17:12:16 +02:00
David Négrier
0828dd8af3 Making max line length to 120 2021-06-23 16:58:57 +02:00
David Négrier
3f0ef2d31a Fixing prettier run command 2021-06-23 16:56:33 +02:00
David Négrier
f6d3783f6c Removing git add from lint-staged since it is not necessary since v10 2021-06-23 16:50:00 +02:00
David Négrier
3eab074e2a Setting up lint-staged on front and back 2021-06-23 16:45:38 +02:00
David Négrier
ecbadda65a
Merge pull request #1224 from thecodingmachine/prettier
Setting up prettier
2021-06-23 16:34:21 +02:00
David Négrier
9f9cf5a3bb Fixing .gitignore files 2021-06-23 16:30:42 +02:00
David Négrier
4cac260f81 Adding prettier on back and pusher (not running them right now) 2021-06-23 16:23:16 +02:00
David Négrier
f4209515a1
Merge pull request #1080 from thecodingmachine/metadataScriptingApi
Customize metadata with scripting api
2021-06-23 15:57:14 +02:00
David Négrier
d2be9fa931 Adding contributing guide explaining how to setup the precommit hook 2021-06-23 15:54:13 +02:00
David Négrier
c0bfec7b11 Adding Prettier configuration 2021-06-23 15:51:31 +02:00
David Négrier
a5f0cadccd
Create codeql-analysis.yml 2021-06-23 15:29:02 +02:00
David Négrier
6237672855
Create SECURITY.md 2021-06-23 15:26:17 +02:00
jonny
54d392be82 fixed not returnin null if parsed from url 2021-06-23 15:06:38 +02:00
GRL
95d8cf9257 Change requested 2021-06-23 14:54:06 +02:00
GRL
12da5e64f8 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-06-23 14:43:23 +02:00
David Négrier
a3eb715414 Improving wa-maps doc layout 2021-06-23 14:41:35 +02:00
jonny
64847cd465 adjusted null if no hash 2021-06-23 12:42:24 +02:00
jonny
b20b4abb9e allow start hashes in tiles
# Conflicts:
#	front/src/Phaser/Game/GameScene.ts
2021-06-23 12:37:50 +02:00
GRL
24cc340cb9 Merge branch 'metadataScriptingApi' of github.com:thecodingmachine/workadventure into metadataScriptAPIV2 2021-06-23 12:02:29 +02:00
GRL
2a2cea2cd5 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-06-23 11:40:08 +02:00
GRL
bdb32a29e1 New methods refactored 2021-06-23 11:32:11 +02:00
David Négrier
633fa9f870
Merge pull request #1210 from jonnytest1/functional-tile-properties
tile propeties can be used for effects
2021-06-23 11:18:02 +02:00
David Négrier
af67d9b513 Migrating WA-Maps page to this repo and documenting the fact that tiles properties can now be used. 2021-06-23 10:44:55 +02:00
David Négrier
b7934d9d03 Merge branch 'develop' of github.com:thecodingmachine/workadventure into functional-tile-properties 2021-06-23 10:40:59 +02:00
David Négrier
bdc4b43c17 Setting up prettier
In order not to wreak havoc on all the open PRs, Prettier will be added slowly,
on every changed file, thanks to Husky (for a precommit hook) and lint-staged, for linting only staged files.
2021-06-23 10:10:53 +02:00
GRL
b50df10a49 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-06-23 09:25:13 +02:00
GRL
85fe92f604 Merge branch 'menu-commands-apiref' of github.com:jonnytest1/workadventure into metadataScriptingApi 2021-06-23 09:18:20 +02:00
David Négrier
ee07f637fa
Merge pull request #1219 from thecodingmachine/rex_outline
Putting an outline on the character name
2021-06-22 18:14:27 +02:00
David Négrier
321fff24e6 Filled the Changelog with past changes 2021-06-22 18:09:55 +02:00
David Négrier
1ef1a1cb22 Removing useless import 2021-06-22 17:47:54 +02:00
David Négrier
d7ff8e4be6
Merge pull request #1215 from thecodingmachine/correctionCustomizeWOKA
Correction of button customize WOKA scene issue
2021-06-22 17:29:52 +02:00
David Négrier
f1d00aac0e
Merge pull request #1211 from thecodingmachine/adminSvelte
Migrating ConsoleGlobalMessageManager in svelte
2021-06-22 17:28:37 +02:00
David Négrier
dc0f3feabf Putting an outline on the character name
In the future, we might want to put an outline on the whole character body but this is harder as the body is actually a container and so we would need to turn this container into a sprite first.
2021-06-22 17:15:18 +02:00
David Négrier
f3086fe49a
Merge pull request #1218 from thecodingmachine/rex_outline
Enabling Outline back on actionable objects
2021-06-22 16:39:34 +02:00
David Négrier
e9dd7ebdd9 Enabling Outline back on actionable objects
Actionable objects (still a prototype) were outlined when you walk next to them.
The OutlinePipeline was broken when moving in Phaser 3.50+.

This PR completely removes the custom OutlinePipeline and replaces it with the rexOutlinePipelinePlugin
that is provided by a third party library and that works great \o/
2021-06-22 16:35:57 +02:00
GRL
cec7087fc2 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-06-22 16:28:45 +02:00
GRL
67d4c6e271 Resolve review 2021-06-22 16:12:53 +02:00
GRL
0728d462a5 Merge branch 'develop' of github.com:thecodingmachine/workadventure into adminSvelte 2021-06-22 16:08:06 +02:00
GRL
be23db5bcf Resolve import and LoadPageEvent issue 2021-06-22 16:07:31 +02:00
David Négrier
2b33db74e6
Merge pull request #1214 from thecodingmachine/dependabot/npm_and_yarn/messages/set-getter-0.1.1
Bump set-getter from 0.1.0 to 0.1.1 in /messages
2021-06-22 15:38:52 +02:00
David Négrier
37893936b9
Merge pull request #1217 from thecodingmachine/animations_doc
Migrating animations documentation
2021-06-22 15:33:11 +02:00
David Négrier
bdbd19c3da
Merge pull request #1216 from thecodingmachine/feature/animated-tiles
Add animated Tiles plugin
2021-06-22 15:32:55 +02:00
David Négrier
d87a14db0d Migrating animations documentation
Migrating the animations documentation page from the website to this repository.
2021-06-22 15:18:41 +02:00
David Négrier
eb526f5b67 Upgrading animatedtiles plugin to trigger an event when an animation occurs and setting the scene to dirty state 2021-06-22 14:21:15 +02:00
GRL
ca3f5c599a Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-06-22 14:00:19 +02:00
GRL
3e29ed4376 Correction of button customize WOKA scene issue 2021-06-22 11:48:08 +02:00
GRL
55d99b24f4 Correction form review and checks 2021-06-22 10:43:20 +02:00
GRL
0cc7ed1647 Merge branch 'develop' of github.com:thecodingmachine/workadventure into adminSvelte 2021-06-22 10:36:16 +02:00
GRL
4fedc30301 Correction form review and checks 2021-06-22 10:27:54 +02:00
GRL
da5ae02a06 Correction form review and checks 2021-06-22 10:22:49 +02:00
David Négrier
1283e86ce8 Adding test map for animated tiles 2021-06-22 10:22:48 +02:00
GRL
8a1c57c434 Correction form review and checks 2021-06-22 10:10:03 +02:00
GRL
267a0bbe4d Correction form review and checks 2021-06-22 09:49:04 +02:00
GRL
5cac4f52bc Correction form review and checks 2021-06-22 09:43:41 +02:00
dependabot[bot]
4334ae8c9d
Bump set-getter from 0.1.0 to 0.1.1 in /messages
Bumps [set-getter](https://github.com/doowb/set-getter) from 0.1.0 to 0.1.1.
- [Release notes](https://github.com/doowb/set-getter/releases)
- [Commits](https://github.com/doowb/set-getter/commits/0.1.1)

---
updated-dependencies:
- dependency-name: set-getter
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-21 21:34:46 +00:00
jonny
8be29062f6 reverted import sorting 2021-06-21 18:41:41 +02:00
jonny
64a00481f0 fixed wrong import 2021-06-21 18:39:02 +02:00
jonny
ba1bcf226a menu command api 2021-06-21 18:22:31 +02:00
Kharhamel
5f944d8e4a
Merge pull request #1212 from thecodingmachine/noWhitespaces
FIX: no more whitespaces in player names
2021-06-21 18:02:07 +02:00
kharhamel
42c0d1002f FIX: no more whitespaces in player names 2021-06-21 17:58:04 +02:00
David Négrier
e4dab5fd0d Merge branch 'develop' of github.com:thecodingmachine/workadventure into feature/animated-tiles
# Conflicts:
#	front/package.json
#	front/tsconfig.json
#	front/yarn.lock
2021-06-21 17:26:00 +02:00
GRL
232fd33ec8 Migrating ConsoleGlobalMessageManager in svelte 2021-06-21 17:19:27 +02:00
David Négrier
979ae73d8d Removing old website directory 2021-06-21 17:00:16 +02:00
David Négrier
b59cbcac4c Merge branch 'develop' of github.com:thecodingmachine/workadventure into svelte_video_overlay
# Conflicts:
#	front/package.json
2021-06-21 14:54:32 +02:00
David Négrier
cddade059f Removing commented code 2021-06-21 14:49:41 +02:00
David Négrier
a08f6a33ac Improving naming 2021-06-21 14:43:10 +02:00
David Négrier
77a4d23301 Renaming biggestAvailableArray to biggestAvailableArea + removing duplicated code. 2021-06-21 14:07:03 +02:00
David Négrier
9484acdc6d
Merge pull request #1206 from thecodingmachine/iframe-api-refactor2
Iframe api refactor v2
2021-06-21 13:57:42 +02:00
David Négrier
6101548d89 Fixing bug where only one chat listener can be added. 2021-06-21 13:47:07 +02:00
David Négrier
620bd1ab2c Splitting classes in separated files 2021-06-21 12:26:12 +02:00
David Négrier
c17f006992 Adding list of deprecated methods in the documentation. 2021-06-21 12:13:40 +02:00
David Négrier
ce0a52c227 Merge branch 'develop' of github.com:thecodingmachine/workadventure into iframe-api-refactor2
# Conflicts:
#	front/package-lock.json
2021-06-21 11:53:07 +02:00
Kharhamel
3d1c2dc05a
Merge pull request #1207 from thecodingmachine/fixLoadError
FIX: loading errors after the preload stage should not crash the game anymore
2021-06-21 11:49:14 +02:00
David Négrier
9129ceede1 Improving refactoring of API following @jonnytest1 feedback 2021-06-21 11:48:39 +02:00
kharhamel
0623ee0bf2 HOTFIX: loading errors after the preload stage should not crash the game anymore 2021-06-21 11:44:18 +02:00
jonny
7716fe4b62 run templater on running start script 2021-06-20 19:26:35 +02:00
jonny
5bf943ce77 converted cache to constant lookup time 2021-06-20 19:14:04 +02:00
jonny
92485a02cf tileIndex setting got merged out 2021-06-19 15:46:32 +02:00
jonny
c1d9b2c9ed coverted property map to object 2021-06-19 15:41:58 +02:00
jonny
27ccdf165c fixed merge imports 2021-06-19 15:24:27 +02:00
jonny
74dda8ab69 allow properties on tiles
# Conflicts:
#	front/src/Phaser/Game/GameMap.ts
#	front/src/Phaser/Map/ITiledMap.ts
2021-06-19 15:23:30 +02:00
dependabot[bot]
abfaf73a25
Bump striptags from 3.1.1 to 3.2.0 in /messages
Bumps [striptags](https://github.com/ericnorris/striptags) from 3.1.1 to 3.2.0.
- [Release notes](https://github.com/ericnorris/striptags/releases)
- [Commits](https://github.com/ericnorris/striptags/compare/v3.1.1...v3.2.0)

---
updated-dependencies:
- dependency-name: striptags
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-18 20:36:36 +00:00
David Négrier
be2aa62efc Adding tests for deprecated and moved functions 2021-06-18 18:29:45 +02:00
David Négrier
34dc5a0bc6 Refactoring WorkAdventureAPI.
Simplifying a lot what was done (even if the new code is a bit less automated, it allows to list exactly the methods we want to see deprecated and to add a notification message)
2021-06-18 17:22:56 +02:00
David Négrier
61809aad21
Merge pull request #1201 from jonnytest1/windows-runner
setup to also run on windows
2021-06-18 16:28:06 +02:00
David Négrier
97e6ad6700 Splitting documentation into several pages. Changing documentation to adapt to new "namespaces" 2021-06-18 11:44:54 +02:00
jonny
0690f088b6 setup to also run on windows 2021-06-18 00:21:54 +02:00
David Négrier
227575043b Removing dead code 2021-06-17 18:56:30 +02:00
David Négrier
4ec92ddf58 Adding new icons for the change layout button 2021-06-17 18:30:08 +02:00
David Négrier
7e506c5cbd Starting splitting the doc in several pages. 2021-06-17 18:05:16 +02:00
Guy Sheffer
3e54e75040
Add workaround for #932 2021-06-17 15:14:54 +03:00
jonny
702f4fe4c0 converted goToRoom to typed call 2021-06-17 11:32:59 +02:00
jonny
318749e5a8 develop merge 2021-06-17 11:30:16 +02:00
jonny
d416deec5e Merge branch 'iframe-api-refactor' of github.com:jonnytest1/workadventure into iframe-api-refactor 2021-06-17 11:30:05 +02:00
Kharhamel
3a569ec0d6
Merge pull request #1095 from thecodingmachine/dependabot/npm_and_yarn/benchmark/ws-7.4.6
Bump ws from 7.3.1 to 7.4.6 in /benchmark
2021-06-17 11:29:33 +02:00
dependabot[bot]
47008c015e
Bump ws from 7.3.1 to 7.4.6 in /benchmark
Bumps [ws](https://github.com/websockets/ws) from 7.3.1 to 7.4.6.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.3.1...7.4.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-17 09:25:14 +00:00
Kharhamel
5159f69a59
Merge pull request #576 from Informatic/fix/dependencies-cleanup
back,pusher,uploader: cleanup dependencies
2021-06-17 11:24:26 +02:00
David Négrier
f6554a1082 Merge branch 'develop' of github.com:thecodingmachine/workadventure into iframe-api-refactor
# Conflicts:
#	front/src/iframe_api.ts
2021-06-17 11:23:56 +02:00
jonny
efa1e52ce1 Merge remote-tracking branch 'remotes/workadventure-main/develop' into iframe-api-refactor 2021-06-17 11:19:21 +02:00
David Négrier
d6ec0d22d3 Code cleanup 2021-06-17 10:35:08 +02:00
David Négrier
d533894a74 Fixing warnings and moving biggest area compute in store 2021-06-17 10:13:23 +02:00
David Négrier
d3544e2d97 Ignoring "no tracks" warning (cause really, we cannot add tracks to live streams) 2021-06-17 10:07:27 +02:00
David Négrier
d888b694cc Adding button to change layout 2021-06-17 10:07:27 +02:00
David Négrier
3b278d0498 Removing dead code 2021-06-17 10:07:27 +02:00
David Négrier
76261de805 Enabling back the open report feature 2021-06-17 10:07:27 +02:00
David Négrier
ca56a78814 Limiting the max height of video elements 2021-06-17 10:07:27 +02:00
David Négrier
5cf5e0ce2b Changing the way we focus a video element.
Now, only one video element can be important.
2021-06-17 10:07:27 +02:00
David Négrier
ac7fa164b6 Adding importance handling 2021-06-17 10:07:27 +02:00
David Négrier
e7b0f859a5 Migrating the video overlay in Svelte (WIP) 2021-06-17 10:07:27 +02:00
David Négrier
e6264948b1
Merge pull request #946 from jonnytest1/load-page-api
Load page iframe-api
2021-06-16 18:10:10 +02:00
jonny
8d2baa8d1a added workadventure specific url 2021-06-16 17:36:52 +02:00
jonny
1147a21dde fixed documentation 2021-06-16 17:34:00 +02:00
jonny
c1e202b7b1 renamed to goToRoom 2021-06-16 17:16:00 +02:00
David Négrier
a910ec1639
Merge pull request #1190 from thecodingmachine/svelte_check
Adding svelte-check to the build process
2021-06-15 18:40:14 +02:00
David Négrier
0afdbf7040 Fixing Svelte-check errors 2021-06-15 18:34:11 +02:00
David Négrier
085a4d41fd Adding svelte-check to the build process
Type checking in Svelte was not enabled (because we were not running svelte-check).
This PR adds:

- run svelte-check in watch mode in development
- run svelte-check in CI
2021-06-15 18:08:16 +02:00
David Négrier
39a7b95e32
Merge pull request #1189 from thecodingmachine/develop
Deploy 2021-06-15
2021-06-15 17:20:19 +02:00
Kharhamel
7e9506874c
Merge pull request #1188 from thecodingmachine/sceneCleanup
scene cleanup
2021-06-15 17:01:57 +02:00
kharhamel
c559b2104b scene cleanup 2021-06-15 15:32:40 +02:00
jonny
7712bd685b fixed merge errors 2021-06-15 15:19:45 +02:00
jonny
238f333b81 Merge remote-tracking branch 'remotes/workadventure-main/develop' into load-page-api
# Conflicts:
#	front/src/Api/Events/IframeEvent.ts
#	front/src/Api/IframeListener.ts
#	front/src/Phaser/Game/GameScene.ts
#	front/src/iframe_api.ts
2021-06-15 15:05:49 +02:00
Kharhamel
407f46f248
Merge pull request #1187 from thecodingmachine/touchIframeResize
FIX: fixed the cowebsite aside dom not being visible on some browser
2021-06-15 14:40:26 +02:00
kharhamel
40e2ba196d FIX: fixed the cowebsite aside dom not being visible on some browser 2021-06-15 14:35:29 +02:00
David Négrier
eb895ceb58
Merge pull request #1178 from thecodingmachine/touchIframeResize
FIX: cowebsite resize now works on touchscreens
2021-06-15 11:42:41 +02:00
David Négrier
cbc80391d8
Merge pull request #1186 from thecodingmachine/customSceneNewArrow
CustomizeScene buttons use moveHorizontally and moveVertically
2021-06-15 11:38:48 +02:00
GRL
09da69c24a CustomizeScene buttons use moveHorizontally and moveVertically 2021-06-15 11:16:44 +02:00
kharhamel
a5779095f8 FIX: cowebsite resize now works on touchscreens 2021-06-15 10:55:18 +02:00
David Négrier
1880022971
Merge pull request #1154 from thecodingmachine/gameSizeFix
Display Game
2021-06-15 09:16:00 +02:00
GRL
b04016f30f Merge branch 'develop' of github.com:thecodingmachine/workadventure into gameSizeFix 2021-06-15 09:06:47 +02:00
David Négrier
9c14bd9c90
Merge pull request #1183 from thecodingmachine/develop
Deploy 2021-06-14
2021-06-14 22:19:02 +02:00
David Négrier
0172d7dc3b
Merge pull request #1182 from thecodingmachine/fix_viewport_on_resize
Fixing size of camera on resize
2021-06-14 18:49:37 +02:00
David Négrier
6bca3469b6 Removing useless import 2021-06-14 18:44:20 +02:00
David Négrier
1fa03e44df Fixing size of camera on resize
The size of the Camera after a change in zoom is only computed on the "render" step.
Therefore, we should wait the "render" step to call GameScene.onResize.

Closes #1180
2021-06-14 18:40:58 +02:00
David Négrier
9f9584633c
Merge pull request #1181 from thecodingmachine/disable_screensharing_button_on_error
Disable screensharing button if user refuses rights
2021-06-14 18:22:20 +02:00
David Négrier
6af9b5d0fc Disable screensharing button if user refuses rights
If the user refuses the popup to screen-share, we should switch back the button to gray.

Closes #1179
2021-06-14 18:18:57 +02:00
David Négrier
f16514db21
Merge pull request #1177 from thecodingmachine/bugfix/1167
Making code more robust regarding scene being null in Character class
2021-06-14 16:54:12 +02:00
David Négrier
a8ef43ca84
Merge pull request #1176 from thecodingmachine/fix_character_scene_slow
Fixing bug slowing down the CustomizeScene a lot
2021-06-14 16:41:55 +02:00
David Négrier
dcd44f283f Making code more robust regarding scene being null in Character class
Not sure how this can happen but it does.
Closes #1167
2021-06-14 16:40:33 +02:00
David Négrier
e3ee66527a Fixing bug slowing down the CustomizeScene a lot
By forcing the containers to be updated only in the "update" method, we seem to be solving some bugs regarding the way sprites are handled.
There is still an issue though. Some times, for some reasons, the update list seems to be growing a lot.
The more we click the left/right arrow to choose a character, the slower it gets (but with this commit, it does not lock anymore)
2021-06-14 16:32:09 +02:00
GRL
b239edb266 Clean code 2021-06-14 16:09:41 +02:00
GRL
c2fba35360 Suppression blue back-ground 2021-06-14 16:04:55 +02:00
GRL
281b8580cd Use window and not viewport in css for main-container 2021-06-14 15:54:22 +02:00
GRL
f103a919f2 Merge branch 'develop' of github.com:thecodingmachine/workadventure into gameSizeFix 2021-06-14 14:25:59 +02:00
David Négrier
94333a7438
Merge pull request #1164 from thecodingmachine/wildcard-cert-in-cd
Installing Wildcard certificate in CD environments
2021-06-11 15:40:00 +02:00
David Négrier
2159e70399 Deleting old certificate if one already exists 2021-06-11 15:31:27 +02:00
David Négrier
fdf4b901b8 Fixing URL in message 2021-06-11 15:02:54 +02:00
David Négrier
2260f772a7 Create the K8S namespace if required 2021-06-11 14:52:59 +02:00
David Négrier
a6effe0a29 Fixing scp 2021-06-11 14:44:23 +02:00
David Négrier
9b985a2a0c Providing Base 64 config file 2021-06-11 14:37:43 +02:00
David Négrier
83089f1197 Fixing key access rights 2021-06-11 14:25:02 +02:00
David Négrier
c07d54f4c3 Fixing key access rights 2021-06-11 14:13:23 +02:00
David Négrier
8b5055c7ef Disabling host check (not a big deal since we are only downloading files from the host) 2021-06-11 14:06:08 +02:00
David Négrier
9330a3ec89 Installing Wildcard certificate in CD environments
Because we are limited to 50 domain names per week with Let's encrypt, the continuous delivery environment is pretty fast failing to get new certificates.
We need to download a Wilcard certificate instead for the CD environments.
2021-06-11 11:57:27 +02:00
Kharhamel
c44d453f20
Merge pull request #1160 from thecodingmachine/betterVisitCardBis
FIX: Improved the visuals of the visit card
2021-06-10 17:37:10 +02:00
kharhamel
4d467e9f86 FIX: Improved the visuals of the visit card 2021-06-10 16:57:33 +02:00
GRL
d26502a724 Use HtmlUtils to get DOM Element game 2021-06-10 09:23:25 +02:00
grégoire parant
5a2b3a303a
Improve texture loaded from admin (#1151) 2021-06-09 22:33:42 +02:00
GRL
6868128267 DOM Element game resize at the same time and the same size at the canvas of phaser
Remove VisitCard scss unused
2021-06-09 18:08:14 +02:00
GRL
61180a6e64 The cam of other people in a bubble is at the top of the screen even when a iframe is open on mobile 2021-06-09 15:29:37 +02:00
David Négrier
856b643c6a
Merge pull request #1147 from thecodingmachine/develop
Deploy 2021-06-08
2021-06-08 18:46:10 +02:00
David Négrier
07e6438902
Merge pull request #1145 from thecodingmachine/dimensionMobile
Mobile sizing problem
2021-06-08 18:21:05 +02:00
David Négrier
16a989c19b
Merge pull request #1146 from thecodingmachine/facebookLink
New facebook link
2021-06-08 18:14:39 +02:00
GRL
f6b3b9cfd4 Update facebook link 2021-06-08 18:05:03 +02:00
David Négrier
bcc86d6041
Merge pull request #1144 from thecodingmachine/betterVisitCard
FIX: improved the visit card, cleanup the code
2021-06-08 16:47:13 +02:00
kharhamel
dd45996f9c FIX: improved the visit card, cleanup the code 2021-06-08 16:39:22 +02:00
GRL
4c1dd914eb DOM element game 1OO% height 2021-06-08 16:32:21 +02:00
David Négrier
922ed155ed
Merge pull request #1143 from thecodingmachine/dependabot/npm_and_yarn/benchmark/glob-parent-5.1.2
Bump glob-parent from 5.1.1 to 5.1.2 in /benchmark
2021-06-08 14:36:07 +02:00
David Négrier
7bee3853a1
Merge pull request #1142 from thecodingmachine/dependabot/npm_and_yarn/messages/glob-parent-5.1.2
Bump glob-parent from 5.1.1 to 5.1.2 in /messages
2021-06-08 14:36:00 +02:00
David Négrier
270aaf09fc
Merge pull request #1141 from thecodingmachine/dependabot/npm_and_yarn/uploader/glob-parent-5.1.2
Bump glob-parent from 5.1.1 to 5.1.2 in /uploader
2021-06-08 14:35:52 +02:00
David Négrier
f8d8dae9d7
Merge pull request #1140 from thecodingmachine/dependabot/npm_and_yarn/maps/glob-parent-5.1.2
Bump glob-parent from 5.1.1 to 5.1.2 in /maps
2021-06-08 14:35:43 +02:00
David Négrier
5c9da4a725
Merge pull request #1139 from thecodingmachine/fix-webcam-name
Fixing the cleaning of webcam name
2021-06-08 14:35:13 +02:00
dependabot[bot]
cf8e6e2a76
Bump glob-parent from 5.1.1 to 5.1.2 in /benchmark
Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2.
- [Release notes](https://github.com/gulpjs/glob-parent/releases)
- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2)

---
updated-dependencies:
- dependency-name: glob-parent
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-08 12:05:46 +00:00
dependabot[bot]
6e241709b1
Bump glob-parent from 5.1.1 to 5.1.2 in /messages
Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2.
- [Release notes](https://github.com/gulpjs/glob-parent/releases)
- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2)

---
updated-dependencies:
- dependency-name: glob-parent
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-08 12:05:44 +00:00
dependabot[bot]
81160b6dc7
Bump glob-parent from 5.1.1 to 5.1.2 in /uploader
Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2.
- [Release notes](https://github.com/gulpjs/glob-parent/releases)
- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2)

---
updated-dependencies:
- dependency-name: glob-parent
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-08 12:05:43 +00:00
dependabot[bot]
7697ed053e
Bump glob-parent from 5.1.1 to 5.1.2 in /maps
Bumps [glob-parent](https://github.com/gulpjs/glob-parent) from 5.1.1 to 5.1.2.
- [Release notes](https://github.com/gulpjs/glob-parent/releases)
- [Changelog](https://github.com/gulpjs/glob-parent/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2)

---
updated-dependencies:
- dependency-name: glob-parent
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-08 12:05:43 +00:00
David Négrier
01c128e413
Merge pull request #1088 from thecodingmachine/dependabot/npm_and_yarn/front/dns-packet-1.3.4
Bump dns-packet from 1.3.1 to 1.3.4 in /front
2021-06-08 14:05:02 +02:00
David Négrier
fab5c17dc2 Fixing the cleaning of webcam name
Closes #1130
2021-06-08 12:19:07 +02:00
David Négrier
1b89adc604
Merge pull request #1137 from thecodingmachine/fix_script_prod
Fixing scripting origin check
2021-06-08 10:29:55 +02:00
David Négrier
e3223164b6
Merge pull request #1117 from thecodingmachine/selectCharacterFix
Fix : SelectCharacterScene and SelectCompanionScene
2021-06-08 10:29:21 +02:00
David Négrier
0c38f3b55c
Merge pull request #1131 from thecodingmachine/safari-fix
Fix broken layout on EnableCameraScene on mobile
2021-06-08 10:28:38 +02:00
GRL
d615a7c6a5 suppression comments 2021-06-08 10:12:59 +02:00
GRL
7a3921947a dark mode on select 2021-06-08 10:10:33 +02:00
GRL
1cceed2fd6 dark mode on select 2021-06-08 09:52:52 +02:00
GRL
a7cf071971 max height on select on all device and screen 2021-06-08 09:10:06 +02:00
Kharhamel
e2295d2419
Merge pull request #1133 from thecodingmachine/disableVisitCard
FIX: the visit card feature can now be disabled client side
2021-06-07 19:12:37 +02:00
Kharhamel
473a32b57f
Merge pull request #1134 from thecodingmachine/fixEmoteScene
FIX: trying to start a emote after a scene is desotryed should not crash the game
2021-06-07 17:51:35 +02:00
GRL
aa9c3b9f4f max height on select 2021-06-07 17:18:39 +02:00
David Négrier
b03ee5bd53 Fixing scripting origin check
When working on making the openCoWebsite URL relative, we introduced a regression.
In production, the iframe generated by "script" properties have no "src" and therefore, were treated as invalid messages.

This should fix everything in prod.
2021-06-07 16:48:52 +02:00
GRL
c9da38c7ec reduce select field 2021-06-07 16:23:00 +02:00
GRL
000be7aa49 console 2021-06-07 16:12:31 +02:00
kharhamel
1264b286b2 FIX: trying to start a emote after a scene is desotryed should not crash the game 2021-06-07 15:11:54 +02:00
kharhamel
26f21fe6e4 FIX: the visit card feature can now be disabled client side 2021-06-07 15:01:21 +02:00
GRL
88a72e0153 change width of select field 2021-06-07 15:00:01 +02:00
GRL
3e1f10491a font-size reduce by 20%
img width = 1vw
2021-06-07 14:40:38 +02:00
GRL
dd0391687f change font-size
Change width and margin of img on mobile
2021-06-07 14:19:50 +02:00
David Négrier
311c74584c Merge branch 'master' of github.com:thecodingmachine/workadventure into develop 2021-06-07 10:42:27 +02:00
David Négrier
ac911cff4b Properly escaping name in discussion manager 2021-06-07 10:42:08 +02:00
GRL
cbf786fd56 Remove img and margin 2021-06-07 10:29:38 +02:00
GRL
e45198e403 Remove marging bottom of SelectWebcamForm 2021-06-07 10:09:51 +02:00
GRL
23c74bd7aa Create a PR to fix broken layout on EnableCameraScene on mobile 2021-06-07 09:27:49 +02:00
GRL
8f0947aa9c Merge branch 'selectCharacterFix' of github.com:thecodingmachine/workadventure into selectCharacterFix 2021-06-07 09:17:51 +02:00
GRL
edfdc3bf47 comment on pointerTimer and pointerClicked 2021-06-07 09:17:24 +02:00
GRL
dfb02af0f3 comment on pointerTimer and pointerClicked 2021-06-07 09:15:34 +02:00
Kharhamel
d464f94e0f
Merge pull request #1127 from thecodingmachine/fixMobileVisitCard
FIX: temporary fix for visit card on mobile
2021-06-04 19:40:28 +02:00
kharhamel
8afa94aae3 FIX: temporary fix for visit card on mobile 2021-06-04 19:36:30 +02:00
David Négrier
6b8ef48e7f
Merge pull request #1125 from thecodingmachine/develop
Deploy 2021-06-04
2021-06-04 18:25:10 +02:00
David Négrier
4204b9ebf7
Merge pull request #1118 from thecodingmachine/iphoneCompatibility
Iphone compatibility
2021-06-04 18:19:15 +02:00
GRL
3e19234edc Change <dialog> for ErrorDialog in <div> because only Chrome knows <dialog> 2021-06-04 16:32:21 +02:00
David Négrier
bacd260547 Prevents error message from being displayed twice in the same dialog 2021-06-04 16:22:15 +02:00
David Négrier
9f09dc9df2 Adding a special error message for non Safari browsers on iOS < 14.3 2021-06-04 16:19:41 +02:00
David Négrier
469cac9656 Making sure the "stopped screensharing" log is not displayed on startup 2021-06-04 16:08:02 +02:00
David Négrier
01ce94585a Displaying only message in the Dialog error (and not the exception name in front of the message) 2021-06-04 16:07:36 +02:00
GRL
a58d6353cd Merge branch 'develop' of github.com:thecodingmachine/workadventure into iphoneCompatibility 2021-06-04 16:02:46 +02:00
David Négrier
fd4f09588e Adding "playsinline" tag in remote <video> tags for iPhone compatibility (test) 2021-06-04 14:16:21 +02:00
David Négrier
6977963d01
Merge pull request #1108 from thecodingmachine/svelte_error_message
Adding a global error message
2021-06-04 10:38:03 +02:00
David Négrier
2905a5570c Removing commented code 2021-06-04 10:33:24 +02:00
David Négrier
f4ed527fe8 Adding a global error message
This error message should be used for non fatal errors (otherwise, use the ErrorScene).
It is implemented using Svelte and the new "$errorStore".

Use `errorStore.addErrorMessage` to display the error popup with the message.

This PR uses this error message to display a popup explaining the browser is too old for WebRTC.
2021-06-04 10:33:22 +02:00
David Négrier
a8b91561dc Merge branch 'master' of github.com:thecodingmachine/workadventure into develop 2021-06-04 10:07:57 +02:00
David Négrier
b7ac3b8fad Generating HTML link using DOM manipulation rather that string manipulation 2021-06-04 10:07:12 +02:00
GRL
247d508d09 create PR to test iphone compatibility 2021-06-04 10:01:08 +02:00
GRL
0d2b190222 Replace setTimeout by timer manage in Update 2021-06-04 09:39:33 +02:00
Lurkars
417feec56b Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-06-04 09:28:20 +02:00
jonny
dab3f1f844 removed zoned popups 2021-06-03 22:01:42 +02:00
Gregoire Parant
e190c3b8d6 Merge branch 'master' into develop
# Conflicts:
#	front/src/WebRtc/MediaManager.ts
2021-06-03 20:15:50 +02:00
grégoire parant
eec15b38bb
Hot Fix open & close iframe (#1115) 2021-06-03 20:05:39 +02:00
Kharhamel
44c2276952
Merge pull request #1099 from thecodingmachine/visitCard
FEATURE: clicking on another player show a contact card when possible
2021-06-03 18:40:45 +02:00
David Négrier
2f98bbaa0e Adding auto deploy to develop branch 2021-06-03 18:35:18 +02:00
kharhamel
c5f3cfe87c FEATURE: clicking on another player show a contact card when possible 2021-06-03 17:58:21 +02:00
GRL
8052877a7b Merge branch 'develop' of github.com:thecodingmachine/workadventure into selectCharacterFix 2021-06-03 17:22:50 +02:00
grégoire parant
fffd36267d
Hot Custom Characters Scene (#1113) 2021-06-03 17:22:31 +02:00
GRL
02ff6fb5bf Add timer so that pointerdown event can't be call two time in one click 2021-06-03 17:08:56 +02:00
GRL
c435b7451e Update don't call createPlayer but call moveUser
Change time of pointerclicked from 100ms to 250ms
Suppression of console.log
2021-06-03 16:54:52 +02:00
David Négrier
1527134eeb
Merge pull request #1112 from thecodingmachine/ios_phaser_sounds
Attempt to switch bubble sound playing into Phaser
2021-06-03 16:13:40 +02:00
David Négrier
46666d17dc Making sure the report audio sound does not break the application on iOS 2021-06-03 15:56:06 +02:00
David Négrier
50e994c674 Attempt to switch bubble sound playing into Phaser
In iOS, we cannot trigger a playing sound if it does not start from a user gesture.
This is a huge bummer for a notification sound!

This is an attempt to switch sound playing to Phaser, which is using under the hood the WebAudio API.
This might solve the issue.
2021-06-03 15:40:44 +02:00
David Négrier
80a698d891 Preventing crash on iOS
On iOS, audio elements must be triggered by a user gesture.
We are catching exceptions thrown in order not to crash.

In the future, we need to find another way to play sounds.
2021-06-03 14:53:58 +02:00
David Négrier
46cd387853
Merge pull request #1107 from thecodingmachine/enableCameraSceneSafari
Fixing camera on safari iphone
2021-06-03 14:42:18 +02:00
David Négrier
ebf217057d Switching to "playsinline" attribute in the video tag (both of them) 2021-06-03 14:31:21 +02:00
David Négrier
9401662f83
Merge pull request #1105 from thecodingmachine/dependabot/npm_and_yarn/front/ws-6.2.2
Bump ws from 6.2.1 to 6.2.2 in /front
2021-06-03 14:15:38 +02:00
grégoire parant
2b13b764b4
Public texture (#1093)
* Public texture

 - Front => Get texture when user connected on public method
 - Front => Anonymous login will be make every connexion to get map details
 - Pusher => `/anonymLogin` permit to get map details and public texture load in customize scene

* Improve texture local user

- Permit to keep previous texture get with 'register' link

* Texture public loading

 - Texture will be load with Room class
 - Fix issue on lazzy loading atttempt

* Remove async await useless
2021-06-03 13:07:52 +02:00
GRL
4fd453ec05 playsinline on video 2021-06-03 12:02:58 +02:00
David Négrier
9e42d9d05b
Merge pull request #1106 from thecodingmachine/safari_fix
Fixing Safari on MacOS compatibility
2021-06-03 10:50:30 +02:00
David Négrier
5f562f49c3 Improving error message 2021-06-03 10:49:12 +02:00
Kharhamel
ba2d7958ce
Merge pull request #1103 from thecodingmachine/fixEmotePinch
FIX: on a touch screen, the menu emote will not open if more than one pointer is used
2021-06-03 10:48:16 +02:00
David Négrier
eb6cfdf53d Fixing missing early return if webcam not available 2021-06-03 10:39:30 +02:00
GRL
8bcfc3cbee Max height on EnableCameraScene 2021-06-03 10:30:53 +02:00
kharhamel
b8ffe5038c FIX: on a touch screen, the menu emote will not open if more than one pointer is used 2021-06-03 10:22:06 +02:00
David Négrier
25f4adc7ad Fixing Safari on MacOS compatibility
The null safe operator is not recognized and was not encoded by Webpack in Svelte expressions (inside {})

+ The Notification API of Safari is old and broken and we need to account for that.
2021-06-03 10:17:38 +02:00
dependabot[bot]
918a37173e
Bump ws from 6.2.1 to 6.2.2 in /front
Bumps [ws](https://github.com/websockets/ws) from 6.2.1 to 6.2.2.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/commits)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-03 08:10:49 +00:00
David Négrier
d9b5642078
Merge pull request #1098 from thecodingmachine/resizeSelect
Menu scene in svelte
2021-06-03 10:10:07 +02:00
GRL
304675bc74 Merge remote-tracking branch 'origin/resizeSelect' into resizeSelect 2021-06-02 18:01:42 +02:00
GRL
59d60f54fe Save zoom level in the gameScene and restore it after the SelectCharacterScene and CustomizeScene 2021-06-02 18:01:36 +02:00
David Négrier
100198b55c Using "standardized-audio-context" to fix compatibility of AudioContext with Safari. 2021-06-02 17:58:58 +02:00
David Négrier
d43633e936 Added an animation when audio message played 2021-06-02 16:52:25 +02:00
David Négrier
f4880cc1d0 Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-02 16:48:53 +02:00
David Négrier
267d0a2cd1 Moving audio message to Svelte 2021-06-02 16:46:28 +02:00
GRL
ba038dc75a Merge remote-tracking branch 'origin/resizeSelect' into resizeSelect 2021-06-02 16:08:38 +02:00
GRL
3d9e2ad49a Save zoom level of the game and restore it when quitting the login scenes
SelectCompanionScene with zoom on mobile
2021-06-02 16:08:31 +02:00
David Négrier
faa4c7c08e Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-02 12:27:54 +02:00
David Négrier
395d66e648 Putting grey background under video
Signed-off-by: David Négrier <d.negrier@thecodingmachine.com>
2021-06-02 12:27:46 +02:00
GRL
6fd119c199 Merge remote-tracking branch 'origin/resizeSelect' into resizeSelect 2021-06-02 12:00:50 +02:00
GRL
5bd5245044 SelectCharacterScene and CustomCharacterScene mobile version 2021-06-02 12:00:35 +02:00
David Négrier
321fc3184a Fixing scrollability of enable camera scene page 2021-06-02 10:44:36 +02:00
David Négrier
950c5ace3f Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-02 10:14:42 +02:00
David Négrier
3f20d5b0d1 Trying to fix cam size in portrait and overflow 2021-06-02 10:14:33 +02:00
GRL
e9ec5f26aa Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-02 09:59:44 +02:00
GRL
ea576477cd Border on videocam in enable camera scene 2021-06-02 09:58:34 +02:00
David Négrier
9e35f96ce5 Fixing absolute/relative layouts of Svelte layers 2021-06-02 09:58:00 +02:00
David Négrier
96cd097af8 Fixing cam and controls position 2021-06-02 09:09:23 +02:00
David Négrier
2230f94410 Removed unused message warning 2021-06-01 17:59:00 +02:00
David Négrier
22dff82bd3 Adding back a transition on HelpCameraSettingsPopup 2021-06-01 17:23:16 +02:00
David Négrier
9c9699d2d1 Fixing absolute positioning of Svelte scenes 2021-06-01 17:07:56 +02:00
David Négrier
b04c438d6f Detect webcams unplugged 2021-06-01 16:43:24 +02:00
GRL
9aeb18df37 correction following review by Kharhamel 2 2021-06-01 16:36:13 +02:00
GRL
5735e9da36 Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-01 16:31:09 +02:00
GRL
cd482ef1d2 correction following review by Kharhamel 2021-06-01 16:29:49 +02:00
David Négrier
cf9467419d Fixing scene overflow 2021-06-01 16:22:39 +02:00
David Négrier
d04df35506 Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-01 16:17:45 +02:00
David Négrier
bf7083effc Migrating EnableCameraScene to Svelte 2021-06-01 16:17:36 +02:00
GRL
2d93be519f Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-01 11:52:55 +02:00
GRL
10e40930e2 Adding map test helpCameraSetting 2021-06-01 11:52:19 +02:00
David Négrier
c7b3e3cd44 Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-01 11:19:56 +02:00
David Négrier
47555d5955 Migrating cam to Svelte on Camera setup screen 2021-06-01 11:19:46 +02:00
GRL
9a5300dd2d helpCameraSettingPopup in svelte with nes-css 2021-06-01 11:07:52 +02:00
David Négrier
5839e0b270 Throwing exceptions into store subscribers is wreaking havok 2021-06-01 09:17:01 +02:00
David Négrier
9063ba2a1f Removing call to removed method 2021-06-01 09:12:31 +02:00
David Négrier
59256f4cb9 Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-06-01 09:09:11 +02:00
David Négrier
9d6b597552 Starting working towards migrating the help camera popup 2021-06-01 09:08:02 +02:00
GRL
ffcfb7495b Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-05-31 18:06:02 +02:00
GRL
1ed881e0bf arrow up black and white colors 2021-05-31 18:05:34 +02:00
David Négrier
ce645a83ab Fixing display of terms and conditions 2021-05-31 18:02:45 +02:00
GRL
f8cbf41c3a Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-05-31 17:54:07 +02:00
GRL
047337ae81 Merge branch 'resizeSelect' of github.com:thecodingmachine/workadventure into resizeSelect 2021-05-31 17:53:44 +02:00
David Négrier
11fb0aa1d8 Fixing typo 2021-05-31 17:53:27 +02:00
GRL
4923ce8b83 selectCharacterScene and customCharacterScene in svelte 2021-05-31 17:50:14 +02:00
David Négrier
cb03580421 Partial migration of EnableCameraScene to Svelte 2021-05-31 17:49:41 +02:00
David Négrier
13d3227323 Migrating LoginScene to Svelte 2021-05-31 17:03:29 +02:00
GRL
120a488121 Adding selectCompanionStore 2021-05-31 12:16:46 +02:00
GRL
b8873d1277 selectCompanionScene work with svelte 2021-05-31 12:06:11 +02:00
GRL
471ff2bb01 Merge branch 'develop' of github.com:thecodingmachine/workadventure into resizeSelect 2021-05-31 10:21:15 +02:00
GRL
aeb6ad50ff Merge remote-tracking branch 'origin/resizeSelect' into resizeSelect 2021-05-31 10:20:57 +02:00
GRL
1ac108a9b8 correction of resize select character and companion by David 2021-05-31 10:20:48 +02:00
GRL
645af32b4c correction of resize select character and companion 2021-05-31 10:20:30 +02:00
David Négrier
0b13e22574
Merge pull request #1092 from thecodingmachine/cleaning_mediamanager
MediaManager cleanup
2021-05-29 22:48:04 +02:00
David Négrier
90176da888 MediaManager cleanup
- Removing the last reference to the local video stream. Everything is now fetched from the store.
- Remvoing commented code
2021-05-29 22:34:38 +02:00
David Négrier
4077db37e3
Merge pull request #1091 from thecodingmachine/fixing_button_style
Fixing buttons design
2021-05-29 22:08:54 +02:00
David Négrier
236b1ed099
Merge pull request #1090 from thecodingmachine/migrating_listeners_to_store
Removing listeners from MediaManager.
2021-05-29 22:07:15 +02:00
David Négrier
588e5566d0 Fixing buttons design
Fixing the color of camera/microphone/screen sharing buttons that was broken following the migration to Svelte
2021-05-29 22:05:47 +02:00
David Négrier
b7f1461405 Removing listeners from MediaManager.
SimplePeer now reacts only to stores.
2021-05-29 22:04:08 +02:00
David Négrier
5295f923b5
Merge pull request #1086 from thecodingmachine/camera_controls_in_svelte
Switching Camera controls in Svelte
2021-05-28 18:16:51 +02:00
Kharhamel
bc67817d64
Merge pull request #1089 from thecodingmachine/fixLoginError
FIX: better error text in LoginScene
2021-05-28 17:51:55 +02:00
kharhamel
679b5b6b79 FIX: better error text in LoginScene 2021-05-28 17:51:18 +02:00
David Négrier
b3aa8975e9 Switching the video feedback in Svelte 2021-05-28 16:20:02 +02:00
dependabot[bot]
ee3097e6b0
Bump dns-packet from 1.3.1 to 1.3.4 in /front
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-28 13:41:07 +00:00
Kharhamel
e342096029
Merge pull request #1083 from thecodingmachine/betterNameText
FEATURE: improved the display of player names
2021-05-28 15:40:19 +02:00
kharhamel
12da6ddd6c FEATURE: improved the display of player names, with the font-family 'Press start 2P' and gray outlines 2021-05-28 15:33:10 +02:00
GRL
8f21ea8385 suppression last line of loadtileset 2021-05-28 14:33:16 +02:00
jonny
ed39043bbe this should make one file only 2021-05-28 13:10:30 +02:00
GRL
276b404dd9 Merge remote-tracking branch 'origin/metadataScriptingApi' into metadataScriptingApi 2021-05-28 12:13:25 +02:00
GRL
858a513569 correction of adding custom menu
correction of setProperty
updating CHANGELOG
updating api-reference
2021-05-28 12:13:10 +02:00
David Négrier
d1c22b122c Improving icons centering 2021-05-28 10:48:24 +02:00
David Négrier
cc1eab653a Fixing screen sharing button display 2021-05-28 10:48:13 +02:00
David Négrier
4b77e8c577 Switching Camera controls in Svelte
Moving Camera controls out of HTML + MediaManager and into Svelte components
2021-05-28 09:31:04 +02:00
jonny
8a1376e966 refactored to key based types 2021-05-28 02:28:11 +02:00
jonny
dbb35d102f extracted giant typing block 2021-05-28 01:59:43 +02:00
jonny
5fd82c1188 minor cleanup 2021-05-28 01:50:58 +02:00
jonny
ab631c5dc4 register callbacks
should be done now
2021-05-28 01:46:08 +02:00
jonny
9e6fb755d9 added javascript for setting commands 2021-05-28 01:44:38 +02:00
jonny
fd5b598b63 Bubble [WIP] (still need to do the javascript part) 2021-05-28 01:18:00 +02:00
jonny
540e5783b6 cowebsite
navigation
sound
player
extraction
2021-05-28 01:14:10 +02:00
jonny
ea04dd5303 Merge branch 'iframe-api-refactor' of github.com:jonnytest1/workadventure into iframe-api-refactor 2021-05-28 00:58:11 +02:00
jonny
6a90655c44 Merge branch 'develop' of https://github.com/thecodingmachine/workadventure into iframe-api-refactor 2021-05-28 00:52:42 +02:00
jonnytest1
b35207a578
Merge branch 'develop' into iframe-api-refactor 2021-05-28 00:38:12 +02:00
jonny
cbe93d7164 [WIP] fixed cherry pick conflicts 2021-05-28 00:34:40 +02:00
jonny
2de2d114a1 added typedef for subobject types
extracted popup functions

# Conflicts:
#	front/package-lock.json
#	front/package.json
#	front/src/iframe_api.ts
2021-05-28 00:30:51 +02:00
jonny
1a1ab30574 extraction idea
# Conflicts:
#	front/src/Api/ScriptUtils.ts
#	front/src/iframe_api.ts
2021-05-28 00:29:21 +02:00
David Négrier
5d8d729bd7 Uncommenting action 2021-05-27 18:25:27 +02:00
GRL
6dcb0d3750 first step to change tile 2021-05-27 17:06:39 +02:00
GRL
9cd3ff1d31 Merge branch 'correct-merge' into metadataScriptAPIV2 2021-05-27 10:16:00 +02:00
GRL
acbe4f89a6 Merge branch 'update-game-tiles' into correct-merge 2021-05-27 09:45:25 +02:00
GRL
5565ddd3f4 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-05-26 17:22:37 +02:00
GRL
e1f0192e61 Adding and updating test map for metadata 2021-05-26 17:18:38 +02:00
David Négrier
474323b95f
Merge pull request #933 from ClementVieilly75/SoundInMapScript
Sound in map script
2021-05-26 16:25:50 +02:00
David Négrier
9aed9713c8 Referencing sound test in index.html 2021-05-26 16:22:58 +02:00
David Négrier
769d9cf314 Added sound loading to changelog 2021-05-26 16:18:58 +02:00
David Négrier
870f16f9c6 Merge branch 'develop' of github.com:thecodingmachine/workadventure into SoundInMapScript 2021-05-26 16:15:33 +02:00
David Négrier
54e300443b Fixing Typing 2021-05-26 16:11:22 +02:00
David Négrier
fac6574cb5 Removing console.log and unused files 2021-05-26 16:08:43 +02:00
David Négrier
1523758106
Merge pull request #1038 from thecodingmachine/dependabot/npm_and_yarn/pusher/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21 in /pusher
2021-05-26 15:50:34 +02:00
David Négrier
701710a2a1
Merge pull request #1037 from thecodingmachine/dependabot/npm_and_yarn/pusher/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9 in /pusher
2021-05-26 15:50:17 +02:00
David Négrier
728c2ee092
Merge pull request #1026 from thecodingmachine/dependabot/npm_and_yarn/messages/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9 in /messages
2021-05-26 15:49:57 +02:00
dependabot[bot]
faff263b80
Bump hosted-git-info from 2.8.8 to 2.8.9 in /pusher
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-26 13:49:56 +00:00
David Négrier
62627ba1b0
Merge pull request #1025 from thecodingmachine/dependabot/npm_and_yarn/benchmark/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9 in /benchmark
2021-05-26 15:49:42 +02:00
David Négrier
a1022f768b
Merge pull request #1024 from thecodingmachine/dependabot/npm_and_yarn/uploader/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9 in /uploader
2021-05-26 15:49:29 +02:00
David Négrier
1bf4475e1b
Merge pull request #1023 from thecodingmachine/dependabot/npm_and_yarn/maps/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9 in /maps
2021-05-26 15:49:17 +02:00
David Négrier
f67ca05147
Merge pull request #1020 from thecodingmachine/dependabot/npm_and_yarn/back/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9 in /back
2021-05-26 15:49:03 +02:00
David Négrier
796aaf82ce
Merge pull request #1060 from thecodingmachine/media_manager_store
Switching MediaManager to using a Svelte store
2021-05-26 15:25:15 +02:00
David Négrier
6d15921674 Fixing screen-sharing button not hidden anymore when hovering button 2021-05-26 12:30:56 +02:00
David Négrier
4f1cab5afe Fixing comments 2021-05-26 12:19:58 +02:00
David Négrier
4c4f310b79 The share screen button is now displayed only when screen sharing makes sense.
Also, fixed the button not aligned bug
2021-05-26 12:12:47 +02:00
David Négrier
dd428bc1e1 Migrating screen sharing to using a store 2021-05-26 12:12:47 +02:00
David Négrier
d32df13f1b Camera now show up when someone is moving and hides 5 seconds after we stop moving.
Also, added an animation to show/hide the webcam.
2021-05-26 12:12:46 +02:00
David Négrier
8af8ccd54b Migrating MediaManager game part to Svelte store 2021-05-26 12:12:18 +02:00
David Négrier
28d78a7988 Switching MediaManager to using a Svelte store
This allows cleaner and more expressive code, especially regarding whether the webcam should be on or off.
2021-05-26 12:11:16 +02:00
David Négrier
4f4d2532b7
Merge pull request #1082 from thecodingmachine/disabling_physics_optim
Moving Physics optim to DirtyScene
2021-05-26 12:08:57 +02:00
David Négrier
bc19cbd525 Moving Physics optim to DirtyScene
The Physics engine is now disabled only if no sprites are moving (if they have no velocity).
Also, if a sprite is moving (if it has a velocity), the dirty state is set.
2021-05-26 12:00:27 +02:00
GRL
17261dfab6 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-05-26 10:58:25 +02:00
GRL
c8e2416e08 documentation of getCurrentUser, getCurrentRoom and on working with group layer 2021-05-26 10:41:33 +02:00
Kharhamel
177f0eb053
Merge pull request #863 from thecodingmachine/emote
FEATURE: added the possibility to play emotes
2021-05-26 10:26:13 +02:00
GRL
b4fa38bf8c Merge remote-tracking branch 'origin/metadataScriptingApi' into metadataScriptingApi 2021-05-25 17:21:12 +02:00
GRL
a5cb93541a correction from code review 2021-05-25 17:21:02 +02:00
kharhamel
595c5ca64d now use custom emotes with tweens instead of transistions 2021-05-25 16:37:24 +02:00
GRL78
7c44d747de
Apply suggestions from code review
Co-authored-by: David Négrier <d.negrier@thecodingmachine.com>
2021-05-25 11:02:25 +02:00
David Négrier
2814a95a74
Merge pull request #1081 from thecodingmachine/disable_tsx_for_maps
Removing parsing of TSX files in "maps" container
2021-05-25 10:51:52 +02:00
David Négrier
4d18e0ceb4 Removing parsing of TSX files in "maps" container
The TSX extension is used by Typescript (for JSX like files) but ALSO by Tiled (for tilesets).
We don't need the Typescript TSX files so this PR is preventing Typescript from parsing those files in the "maps" container.
2021-05-25 10:43:01 +02:00
GRL
d4bc999c54 pause loading tileset on fly 2021-05-25 10:15:56 +02:00
GRL
36f0cd1a23 Revert "pause for loading tileset on the fly"
This reverts commit a3165a0540f8aef8477c62e6b4d4dad6adac1150.
2021-05-25 10:11:27 +02:00
GRL
343ad6ea96 Revert "preparation for merge with metadataScriptApi"
This reverts commit b18b2fe0e31c5c6481f184b754c581ac2e4cd6a7.
2021-05-25 10:11:25 +02:00
GRL
a7b09e91ba Revert "Merge branch 'update-game-tiles' into metadataScriptingApi"
This reverts commit 428625e61b558004ae37385b21270fdf11864b2a, reversing
changes made to a3165a0540f8aef8477c62e6b4d4dad6adac1150.
2021-05-25 10:09:58 +02:00
GRL
428625e61b Merge branch 'update-game-tiles' into metadataScriptingApi 2021-05-25 09:54:00 +02:00
GRL
b18b2fe0e3 preparation for merge with metadataScriptApi 2021-05-25 09:50:59 +02:00
GRL
a3165a0540 pause for loading tileset on the fly 2021-05-25 09:39:04 +02:00
GRL
d0aaa0620d Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-05-25 09:24:26 +02:00
DESKTOP-FMM8UI0\CLV
0c3b9ccfbf Merge branch 'develop' of https://github.com/thecodingmachine/workadventure into SoundInMapScript
# Conflicts:
#	front/src/Api/IframeListener.ts
#	front/src/Phaser/Game/GameScene.ts
#	front/src/iframe_api.ts
#	maps/Tuto/scriptTuto.js
#	maps/Village/Village.json
2021-05-21 17:45:26 +02:00
GRL
1110f4fb7f Revert "Merge branch 'update-game-tiles' into metadataScriptingApi"
This reverts commit 796a9418d3b6c356c5c25bfbc4503207b08572c4, reversing
changes made to 3506063e65a2b8f62c3c4faec897bf1dffa2e62b.
2021-05-21 16:24:48 +02:00
GRL
796a9418d3 Merge branch 'update-game-tiles' into metadataScriptingApi 2021-05-21 15:56:35 +02:00
GRL
3506063e65 first step on loading a tileset from a script 2021-05-20 17:09:10 +02:00
GRL
2f9cc393a7 Implementation of getTag of the current user
documentation of getTag
Adding map for test of getTag
2021-05-20 10:57:36 +02:00
GRL
96545c618a Adding maps for test metadata
Documentation of metadata functions/methods
2021-05-20 08:58:05 +02:00
kharhamel
d93b30f982 improved radial menu 2021-05-19 18:11:51 +02:00
kharhamel
35b37a6a88 Added a radial menu to run emotes 2021-05-19 15:17:50 +02:00
kharhamel
a1d52b4265 FEATURE: added the possibility toplay emotes 2021-05-19 15:17:03 +02:00
GRL
ce0a72c6ce Merge branch 'menu-command-api' of github.com:jonnytest1/workadventure into metadataScriptingApi 2021-05-19 09:36:11 +02:00
GRL
b509471140 documentation
documentation of onPlayerMove
documentation of getMap
documentation of getGameState
2021-05-18 17:05:16 +02:00
Lurkars
451fa7dcd7 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-05-18 15:57:40 +02:00
GRL
aa78bf44ef implementation of DataLayerEvent
update GetGameState to add nickname to the returned data
update GameMap to separate phaserLayer and mapLayer
2021-05-18 15:41:16 +02:00
GRL
201fcf6afa Merge branch 'gamestate-api-read' of github.com:jonnytest1/workadventure into metadataScriptingApi 2021-05-18 15:18:35 +02:00
Kharhamel
b57a9957a3
Merge pull request #1058 from thecodingmachine/fixAxiosErrors
FIX: rejected map axios promises are now catched
2021-05-18 12:12:49 +02:00
GRL
2ee62c9e9e Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-05-18 11:50:03 +02:00
kharhamel
20ec609535 FIX: rejected map axios promises are now catched 2021-05-18 11:45:07 +02:00
GRL
3edfd5b285 GameState is now save in cache
HasPlayerMoved is send when the player is actually moving on the map every 200ms.
2021-05-18 11:33:16 +02:00
David Négrier
2ea731beeb
Merge pull request #1057 from thecodingmachine/physics_flag
Making sure Physics is not enabled several times
2021-05-18 10:26:32 +02:00
David Négrier
c9eb5691b5
Merge pull request #1045 from thecodingmachine/svelte
Installing Svelte in front container
2021-05-18 10:25:54 +02:00
David Négrier
127a4759ac Merge branch 'develop' of github.com:thecodingmachine/workadventure into menu-command-api
# Conflicts:
#	front/src/Api/Events/IframeEvent.ts
#	front/src/Api/IframeListener.ts
#	front/src/iframe_api.ts
2021-05-18 10:16:44 +02:00
David Négrier
9b68faac0e
Fixing JSDoc 2021-05-18 09:53:54 +02:00
David Négrier
4f10dd491c
Merge pull request #1056 from thecodingmachine/dirty_on_resize
Set a global dirty flag on resize
2021-05-18 09:45:51 +02:00
David Négrier
6128f1e431 Making sure Physics is not enabled several times
As part of an energy saving measure, we started disabling physics when the character is not moving and enabling physics again only when the character moves.
However, we enabled Physics on each frame the characeter was moving.
As a result, the Physics system would run several times, slowly slowing the computer down.

This fixes this issue by adding a flag to only enable Physics once.
2021-05-18 09:42:01 +02:00
David Négrier
24dfa2703d Set a global dirty flag on resize
This adds a global "Dirty" flag at the Game level and sets it each time the ScaleManager is modified.
This fixes a bug where the game was not redrawn when a CoWebsite was opening/closing.
2021-05-18 09:20:38 +02:00
David Négrier
54e9e5656b Commenting menu display (for now) 2021-05-17 16:50:35 +02:00
David Négrier
00dd5a8c84 Fixing Yarn 2021-05-17 16:45:52 +02:00
David Négrier
7cc1e5b2c6 Moving styles out of the "dist/" directory 2021-05-17 16:41:40 +02:00
David Négrier
79935593e2 Adding fork-ts-checker-webpack-plugin
This allows offloading type checking to another process and saves ~1-2 seconds for each build.
Also, we can integrate ESLint into the build pipeline and this is dope!
2021-05-17 16:41:38 +02:00
David Négrier
6e7f8507b1 Removing custom stats 2021-05-17 16:41:10 +02:00
David Négrier
849e68ece2 Optimizing build time + inline small files into CSS 2021-05-17 16:41:10 +02:00
David Négrier
db40681be7 Code cleanup 2021-05-17 16:41:10 +02:00
David Négrier
9c4c6f2d53 Fixing Jasmine tests 2021-05-17 16:41:10 +02:00
David Négrier
5cb58d98a0 Adding correct SCSS file integration with Svelte 2021-05-17 16:41:09 +02:00
David Négrier
1885ea42a4 First working example with Svelte (the menu icon shows up on entering the game) 2021-05-17 16:39:56 +02:00
David Négrier
62cc1f73ca Tryig to fix webpack for Svelte 2021-05-17 16:39:56 +02:00
David Négrier
9bc79c3ed3 Adding Svelte to the project 2021-05-17 16:39:55 +02:00
Kharhamel
867f783d5e
Merge pull request #1054 from thecodingmachine/fixWebpackConfig
FIX: webpack config NodePolyfillPlugin
2021-05-17 16:33:04 +02:00
kharhamel
f2dca82642 FIX: webpack config NodePolyfillPlugin 2021-05-17 16:30:19 +02:00
Kharhamel
cfc156d022
Merge pull request #1053 from thecodingmachine/fixWebpackConfig
FEATURE: we now allow a global zoom level of 1.5
2021-05-17 16:17:07 +02:00
kharhamel
a66d42e158 FEATURE: we now allow a global zoom level of 1.5 2021-05-17 16:11:38 +02:00
Lurkars
679c8a5ec5 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-05-17 15:25:26 +02:00
Kharhamel
a6786c7494
Merge pull request #1052 from thecodingmachine/fixWebpackConfig
FEATURE: added new env variables
2021-05-17 15:12:12 +02:00
kharhamel
a23e72454d FEATURE: added the env variable DISABLE_DIRTY_CHECKS 2021-05-17 14:47:34 +02:00
Lurkars
85edd47a49 Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-05-17 14:19:55 +02:00
Kharhamel
99cc1b488f
Merge pull request #1051 from thecodingmachine/fixWebpackConfig
FIX: fixed an error in webpack config
2021-05-17 13:35:57 +02:00
kharhamel
1466d7481c FIX: fixed an error in webpack config 2021-05-17 12:20:07 +02:00
GRL
39539214df documentation of SetProperty 2021-05-17 10:13:48 +02:00
Lurkars
498f23b5fc Merge branch 'develop' of github.com:thecodingmachine/workadventure into develop 2021-05-15 19:02:02 +02:00
David Négrier
fe573893a1
Merge pull request #1039 from thecodingmachine/importsNotUsedAsValues
Setting "importsNotUsedAsValues": "error"
2021-05-13 19:43:34 +02:00
Lurkars
cc44bfac77 port 2021-05-13 16:13:07 +02:00
GRL
43aad4ab14 phaserLayers managed by Gamemap
Implementation of LayersFlattener
Implementation of Setting properties of a layer form script
Update show/hide layer form script
Update unit test of LayersIteratorTest
2021-05-12 14:30:12 +02:00
David Négrier
8aeaf292b3
Merge pull request #1043 from thecodingmachine/webpack_typescript_config
Switching the Webpack configuration file to Typescript
2021-05-12 13:42:37 +02:00
David Négrier
4fcbc146ca Switching the Webpack configuration file to Typescript
This switches the Webpack config file from JS to Typescript.
2021-05-12 13:38:32 +02:00
David Négrier
9bf34a5117
Merge pull request #1040 from thecodingmachine/webpack5
Upgrading all dependencies in front
2021-05-12 11:55:10 +02:00
David Négrier
06058cfc24 Upgrading Typescript target from ES2015 to ES2017. 2021-05-12 11:45:01 +02:00
David Négrier
664a5b6b91 Upgrading ESLint (and ignoring a bunch of interesting rules) 2021-05-12 11:44:41 +02:00
David Négrier
f57c01dee8 Refactoring Webpack files to remove prod file. The prod file is now inferred from the NODE_ENV variable. 2021-05-12 11:28:21 +02:00
David Négrier
8c1e01566a Upgrading all dependencies in front
Upgrading to Webpack 5, Typescript 4, ...
2021-05-12 10:35:14 +02:00
David Négrier
4d4f845b9e Setting "importsNotUsedAsValues": "error"
Turning the "importsNotUsedAsValues" TS config value to "error".
This will require us to use `import type` instead of `import` when we are importing a value that is only used as a type (and therefore that is dropped by the Typescript compiler).

Why this change?
This is a requirement to be able to use Svelte in the future. See https://github.com/sveltejs/svelte-preprocess/issues/206#issuecomment-663193798
2021-05-12 09:13:25 +02:00
dependabot[bot]
aff912da55
Bump lodash from 4.17.20 to 4.17.21 in /pusher
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 23:45:14 +00:00
TabascoEye
2d8997c6d7 turning noise suppresion back on
turning AGC off was a good idea, disabling noise suppresion with it was not.
=> should all end up in the "settings" menu in the end
2021-05-11 18:14:42 +02:00
David Négrier
b56e4b5674
Merge pull request #1036 from tabascoeye/patch-1
turning noise suppresion back on
2021-05-11 18:14:17 +02:00
TabascoEye
627db30410
turning noise suppresion back on
turning AGC off was a good idea, disabling noise suppresion with it was not.
=> should all end up in the "settings" menu in the end
2021-05-11 17:38:28 +02:00
David Négrier
d2b122efe5
Merge pull request #1035 from thecodingmachine/improveDirtyScene
FIX: trackDirtyAnims now listen to more generic events
2021-05-11 17:08:29 +02:00
kharhamel
4ec5ad9e33 FIX: trackDirtyAnims now listen to more generic events 2021-05-11 16:44:31 +02:00
David Négrier
0c279750be Merge branch 'master' of github.com:thecodingmachine/workadventure into develop
# Conflicts:
#	front/src/Phaser/Game/GameScene.ts
2021-05-11 16:43:34 +02:00
David Négrier
5674b99734
Merge pull request #1034 from thecodingmachine/close_game_webcam_in_jitsi
Close game webcam when in Jitsi
2021-05-11 15:56:22 +02:00
David Négrier
ad39b43df3 Closing game webcame in Jitsi
When stepping in Jitsi, the game webcam (from mediaManager) was not shut down.
And when enabling/disabling the webcam in Jitsi, the webcam in mediaManager was also
enabled/disabled. This PR fixes those issues.

It also fixes a race condition when closing a Jitsi where the mic/cam would be enabled at the same time.
2021-05-11 14:52:51 +02:00
David Négrier
03a0402b3e
Merge pull request #1033 from thecodingmachine/use_visibility_change_api
Refactoring code to use the "visibilitychange" event
2021-05-11 14:50:22 +02:00
Kharhamel
78d4985d10
Merge pull request #1028 from thecodingmachine/fixOnMapExit
FIX: triggering a map transition now ignores other map transitions for 500ms
2021-05-11 14:21:06 +02:00
kharhamel
f044b3d249 FIX: triggering a map transition now ignores other map transitions for 500ms 2021-05-11 11:05:05 +02:00
David Négrier
23bf78a026 Refactoring code to use the "visibilitychange" event
Using the "visiblitychange" event instead of relying on a "trick" related to RAF being disabled when a window is not open allows us to have cleaner code.
Bonus: the recursive call to "setTimeout" is gone, so the stacktrace growing indefinitely is gone too.
This should make the application a bit more stable.
2021-05-11 10:56:50 +02:00
David Négrier
0229f09ec6
Merge pull request #1032 from thecodingmachine/CheryPickDicussionCircle
Improve focus/blur discussion circle
2021-05-11 10:17:15 +02:00
Gregoire Parant
e50aad0ea0 Add WA logo 2021-05-11 10:13:50 +02:00
Gregoire Parant
52b1c6733b Notification & Camera
- Notification when user is first and not focus on the tab
- Camera focus when user is in discussion circle and back on tab with previous config camera settings
- Camera stay blur if user is in discussion circle and not back on the tab

# Conflicts:
#	front/src/WebRtc/MediaManager.ts
2021-05-11 10:13:38 +02:00
David Négrier
5f6d9e060c
Merge pull request #1027 from thecodingmachine/fix_resize_helpcamera
Fixing "camera popup" always display on resize
2021-05-11 10:05:52 +02:00
GRL
ab7b06f71e Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-05-11 09:44:53 +02:00
jonny
8cef4f6e90 Merge remote-tracking branch 'remotes/workadventure-main/develop' into gamestate-api-read
# Conflicts:
#	front/src/Api/IframeListener.ts
2021-05-10 21:48:11 +02:00
jonny
2c4c98b0e5 limited event trigger to max 10 per second 2021-05-10 21:44:15 +02:00
jonny
8e136cebe8 added callback on playermove - gets quite delayed after walking for a few seconds 2021-05-10 21:27:17 +02:00
grégoire parant
0fd743bcac
HotFix sound meter (#1029) 2021-05-10 20:49:17 +02:00
grégoire parant
bd4cf5d7f7
Fix error context sound meter (#1009) 2021-05-10 19:55:43 +02:00
David Négrier
0411d5e493 Fixing "camera popup" always display on resize
This fixes a bug where the "camera popup" window was always displayed when the screen was resized.
2021-05-10 19:05:01 +02:00
David Négrier
58482f8ae6 Improving Changelog 2021-05-10 19:01:29 +02:00
dependabot[bot]
003bdf18cb
Bump hosted-git-info from 2.8.8 to 2.8.9 in /messages
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-10 16:58:41 +00:00
dependabot[bot]
e0d496c7b7
Bump hosted-git-info from 2.8.8 to 2.8.9 in /benchmark
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-10 16:57:51 +00:00
dependabot[bot]
50ee2e9810
Bump hosted-git-info from 2.8.8 to 2.8.9 in /uploader
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-10 16:57:50 +00:00
David Négrier
a95d592659
Merge pull request #1004 from thecodingmachine/dependabot/npm_and_yarn/back/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21 in /back
2021-05-10 18:57:46 +02:00
dependabot[bot]
25d1e575ef
Bump hosted-git-info from 2.8.8 to 2.8.9 in /maps
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-10 16:57:45 +00:00
David Négrier
4606173ed1
Merge pull request #1003 from thecodingmachine/dependabot/npm_and_yarn/messages/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21 in /messages
2021-05-10 18:57:30 +02:00
David Négrier
954b87db41
Merge pull request #1002 from thecodingmachine/dependabot/npm_and_yarn/maps/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21 in /maps
2021-05-10 18:57:16 +02:00
David Négrier
cd8501d80e
Merge pull request #1001 from thecodingmachine/dependabot/npm_and_yarn/uploader/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21 in /uploader
2021-05-10 18:57:04 +02:00
GRL
cf811c547b documentation of show/hide layer simplification 2021-05-10 17:29:50 +02:00
GRL
973b3405ef documentation of show/hide layer 2021-05-10 15:10:11 +02:00
GRL
fd931c4884 Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-05-10 14:45:41 +02:00
GRL
8edd29abaa suppression console.log 2021-05-10 14:43:00 +02:00
dependabot[bot]
3b6daa99c0
Bump hosted-git-info from 2.8.8 to 2.8.9 in /back
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-10 11:50:12 +00:00
Kharhamel
6e868408ed
Merge pull request #1018 from thecodingmachine/fixStagingBuild
added back automatic deploy of staging 3
2021-05-10 12:45:25 +02:00
kharhamel
d1f1c8f470 added back automatic deploy of staging 3 2021-05-10 12:44:35 +02:00
David Négrier
d2bab4e7ef
Merge pull request #1017 from thecodingmachine/change_xxxplayercontrol_name
Renaming restorePlayerControls/disablePlayerControls
2021-05-10 12:35:34 +02:00
Kharhamel
dfc57d0529
Merge pull request #1016 from thecodingmachine/fixStagingBuild
added back automatic deploy of staging  2
2021-05-10 12:29:11 +02:00
kharhamel
de1768b7bb added back automatic deploy of staging 2 2021-05-10 12:20:46 +02:00
David Négrier
c025d1798b Renaming restorePlayerControls/disablePlayerControls
Putting "controls" in the plural form:

- restorePlayerControl => restorePlayerControls
- disablePlayerControl => disablePlayerControls
2021-05-10 12:18:06 +02:00
David Négrier
3a82481d70 Merge branch 'master' of github.com:thecodingmachine/workadventure into develop 2021-05-10 12:10:57 +02:00
David Négrier
c1da898c59
Merge pull request #1015 from thecodingmachine/markdown_doc
Splitting scripting API doc in 2
2021-05-10 12:09:20 +02:00
David Négrier
293c57568e Splitting scripting API doc in 2
Splitting scripting API doc in 2 docs:

- scripting.md: contains the explaination on how to enable scripting
- api-reference.md: contains the list of all available functions
2021-05-10 12:08:52 +02:00
Kharhamel
8cb32c34b5
Merge pull request #1014 from thecodingmachine/fixStagingBuild
added back automatic deploy of staging
2021-05-10 12:03:23 +02:00
kharhamel
9a8b10bbf5 added back automatic deploy of staging 2021-05-10 11:56:08 +02:00
GRL
cd2d090a8b Merge branch 'develop' of github.com:thecodingmachine/workadventure into metadataScriptingApi 2021-05-10 11:46:16 +02:00
GRL
841bf29764 auto update show/hide layer 2021-05-10 11:20:07 +02:00
GRL
a6ba8d41b9 implement show/hide layer with scripting 2021-05-10 11:19:18 +02:00
David Négrier
945ff446a9
Merge pull request #1012 from thecodingmachine/markdown_doc
Adding Markdown documentation relative to scripting
2021-05-10 10:56:43 +02:00
David Négrier
e0ac8abd51
Merge pull request #1011 from thecodingmachine/markdown_doc
Adding Markdown documentation relative to scripting
2021-05-10 10:54:16 +02:00
David Négrier
bc88a7d3ed Adding Markdown documentation relative to scripting 2021-05-10 10:47:55 +02:00
jonny
ce0c7ea3eb Merge remote-tracking branch 'remotes/workadventure-main/develop' into gamestate-api-read 2021-05-10 10:01:53 +02:00
jonny
8aa34cecef Merge branch 'load-page-api' of github.com:jonnytest1/workadventure into load-page-api 2021-05-10 09:59:12 +02:00
jonny
a5260c0831 Merge remote-tracking branch 'remotes/workadventure-main/develop' into load-page-api 2021-05-10 09:58:59 +02:00
jonny
4758820aa4 Merge remote-tracking branch 'remotes/workadventure-main/develop' into menu-command-api 2021-05-10 09:54:39 +02:00
David Négrier
44eb25e9f6
Merge pull request #1006 from jonnytest1/typed-api-events
Typed api events
2021-05-10 09:13:49 +02:00
jonny
46996f7049 moved event trigger out of index array 2021-05-10 01:34:33 +02:00
jonny
8db72d2dfd refactored to Array of tile 2021-05-10 01:34:32 +02:00
jonny
bed45a8310 cherry pick conflicts 2021-05-10 00:31:54 +02:00
jonny
ffe03d40f5 option to update tile
# Conflicts:
#	front/src/Api/Events/ApiUpdateTileEvent.ts
#	front/src/Api/IframeListener.ts
#	front/src/Phaser/Game/GameScene.ts
2021-05-10 00:30:32 +02:00
jonny
91148035ec polyfill generic message event 2021-05-09 21:46:40 +02:00
jonny
cf06f29ef8 fixed cherry pick conflicts 2021-05-09 21:38:11 +02:00
jonny
8da5bf9f8e typed iframe api events
# Conflicts:
#	front/src/Api/IframeListener.ts
#	front/src/iframe_api.ts
2021-05-09 21:36:48 +02:00
jonnytest1
cb19721dca
Merge branch 'develop' into load-page-api 2021-05-07 20:02:08 +02:00
jonnytest1
2922ae4603
Merge branch 'develop' into menu-command-api 2021-05-07 19:59:58 +02:00
DESKTOP-FMM8UI0\CLV
e655edd9bd export class Popup and Soud of Iframe Api
let become const in SoundManager
2021-05-07 17:03:07 +02:00
dependabot[bot]
b141da1475
Bump lodash from 4.17.20 to 4.17.21 in /back
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-07 13:45:33 +00:00
dependabot[bot]
543397efe4
Bump lodash from 4.17.20 to 4.17.21 in /messages
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-07 13:45:29 +00:00
dependabot[bot]
9c620de649
Bump lodash from 4.17.20 to 4.17.21 in /maps
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-07 13:45:25 +00:00
dependabot[bot]
3a00ecab8f
Bump lodash from 4.17.20 to 4.17.21 in /uploader
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-07 13:44:51 +00:00
David Négrier
5605e63e5f
Merge pull request #998 from thecodingmachine/skiprender2
Skip "render" if nothing changed on screen (2)
2021-05-07 15:44:08 +02:00
Gregoire Parant
62a6eabc88 Merge branch 'master' into develop 2021-05-07 00:07:43 +02:00
grégoire parant
0e32238505
HotFix custom WOKA (#999) 2021-05-06 19:58:08 +02:00
David Négrier
66490c9083 Adding test map to test energy consumption 2021-05-06 16:31:39 +02:00
David Négrier
6b4d064f19 Merge branch 'develop' of github.com:thecodingmachine/workadventure into skiprender2
# Conflicts:
#	front/src/Phaser/Game/GameScene.ts
#	front/src/index.ts
2021-05-06 16:25:13 +02:00
David Négrier
189dba2e21 Fixing memory leak when switching scenes 2021-05-06 15:38:24 +02:00
David Négrier
3b5f105daf Setting the dirty state automatically when there is an animation frame 2021-05-06 15:38:22 +02:00
David Négrier
6d3cbc573c Instruct systems with 2 GPUs to use the low power GPU (to save battery) 2021-05-06 15:36:49 +02:00
David Négrier
0c5e5ef578 Skip "render" if nothing changed on screen
For each requested animation frame (RAF) in Phaser, Phaser calls the "update" method, then the "render" method of each scenes.
The "render" method takes some time (and energy) to perform the rendering.

The fact is we probably don't need to call "render" if nothing changed on the screen (which happens most of the frames in a typical WorkAdventure game).

This commit is therefore overloading the "Game" class of Phaser to add a "dirty" flag.

Scenes can now add a "isDirty()" method. If all displayed scenes are pristine (not dirty), Phaser will skip rendering the frame altogether.

This saves "a lot" of energy, resulting in laptops that are not overheating when using WorkAdventure \o/
2021-05-06 15:36:45 +02:00
David Négrier
271300aa8d
Merge pull request #982 from jonnytest1/baseUrlFix
fixed url cannot be relative
2021-05-06 15:09:13 +02:00
Gregoire Parant
1440faf825 Merge branch 'master' into develop 2021-05-06 00:57:55 +02:00
grégoire parant
46978d26f9
Add entry map village WorkAdventure (#997) 2021-05-06 00:53:04 +02:00
jonny
a24ca078e6 use iframe url if no script
# Conflicts:
#	front/src/Api/IframeListener.ts
2021-05-05 19:15:32 +02:00
David Négrier
fea1de36a4
Merge pull request #974 from tabascoeye/patch-1
allow numbers in nickname again
2021-05-05 18:44:01 +02:00
David Négrier
f085393730
Merge pull request #992 from tabascoeye/patch-2
getting rid of special char in filename
2021-05-05 18:34:46 +02:00
David Négrier
77d14ee7ce
Merge pull request #994 from thecodingmachine/resolution
Improving centering of HTML elements in setup scenes
2021-05-05 18:33:49 +02:00
David Négrier
989528f729 Updating changelog 2021-05-05 17:14:28 +02:00
David Négrier
3751b0e2bc Removing RESOLUTION and ZOOM_LEVEL settings: they are no more needed or supported 2021-05-05 17:11:03 +02:00
David Négrier
7ae66a63a4 Refactoring centering of DOM elements 2021-05-05 17:10:39 +02:00
David Négrier
9c4a0245a3
Merge pull request #924 from thecodingmachine/resolution
Improving mobile rendering / adding zoom / pinch
2021-05-05 16:21:13 +02:00
David Négrier
c1be97e366 Adding test cases for mobile 2021-05-05 16:18:37 +02:00
David Négrier
04448c3c50 Fixing button position in webcam setting page 2021-05-05 15:46:02 +02:00
David Négrier
cd2873e9d3 Fixing CI 2021-05-05 13:14:00 +02:00
David Négrier
4b89e08ea6 Reverting hard coded environment variable 2021-05-05 12:17:06 +02:00
David Négrier
bede7abdd8 Removing mousewheel to up down plugin 2021-05-05 12:15:13 +02:00
David Négrier
10bd073b7d Fixing center computation of popup 2021-05-05 12:12:56 +02:00
David Négrier
7d2cc66f11 Fixing pointer-events interaction preventing virtual joystick from working 2021-05-05 11:56:24 +02:00
David Négrier
82073098e0 Merge branch 'develop' of github.com:thecodingmachine/workadventure into resolution 2021-05-05 11:01:11 +02:00
David Négrier
a6ad1674e3 Fixing broken resize 2021-05-05 09:51:04 +02:00
David Négrier
f66e69cb75 Improving pinch (virtual joystick stops when pinch begins) 2021-05-05 09:35:24 +02:00
grégoire parant
4d0220e118
Merge pull request #990 from thecodingmachine/develop
Release 04/05

- WorkAdventure Village
- Fix loader
- Create sound meter
2021-05-05 02:05:07 +02:00
grégoire parant
71eb3f3b69
Improvement feature circle discussion (#977)
* Improvment circle discussion
 - Change to lissen start event of WebRTC connection

* Update help allow navigator and waring message
 - Show warning message.
 - Use help camera allow setting to show modal and help user.
 - Change feature to show the modal only when user have need the information on allow navigator access

* Create soud for video discussion
2021-05-05 01:49:04 +02:00
Gregoire Parant
83159a121f Revert logo loading and fix it 2021-05-04 15:47:45 +02:00
Gregoire Parant
c8692a08ce Revert "Fix loader logo WA (#991)"
This reverts commit fa3ffe4d7a0834b3f14bebdeecc746dd87a82638.
2021-05-04 15:15:23 +02:00
grégoire parant
fa3ffe4d7a
Fix loader logo WA (#991) 2021-05-04 14:28:30 +02:00
David Négrier
59b391e983 Prevent WA scale manager from zooming too much 2021-05-04 14:08:40 +02:00
TabascoEye
8d45338044
re-upload without accent in filename 2021-05-04 13:50:07 +02:00
TabascoEye
2b30bea3e0
Delete sol_intérieur.png 2021-05-04 13:49:32 +02:00
TabascoEye
ec02b11b7f
remove accent from filename 2021-05-04 13:48:20 +02:00
grégoire parant
622e0c6130
Add WA logo in village map (#989) 2021-05-04 12:39:00 +02:00
David Négrier
613ff5d463 Adding zoom out limit 2021-05-04 12:09:00 +02:00
David Négrier
85efe208b3 Changing default map for docker-compose single-domain 2021-05-04 11:35:55 +02:00
David Négrier
04d3cf8593 Adding HdpiManager to start and scale from a default resolution that is correct by default for the game.
Fixing VirtualJoystick on resize.
2021-05-04 11:35:33 +02:00
jonnytest1
5069099000
fixed typing in chat still causes character to move (#965) 2021-05-03 20:26:42 +02:00
grégoire parant
95ec5dc3f6
Merge pull request #917 from ClementVieilly75/MapWA_Feature
Map village with new WA Office and features presented
2021-05-03 20:12:33 +02:00
jonnytest1
0a5dffd034
Update ScriptUtils.ts 2021-05-03 16:11:16 +02:00
jonny
cd77af318d added more properties
# Conflicts:
#	front/src/Phaser/Game/GameScene.ts
2021-05-01 19:45:23 +02:00
jonny
d674ac9e0c fixed url cannot be relative 2021-05-01 17:43:31 +02:00
David Négrier
4c55b5657f
Merge pull request #973 from thecodingmachine/better_error_message
Improving error messages
2021-04-30 13:31:04 +02:00
TabascoEye
7592a71bd5
remove test case with numbers being invalid in nickname 2021-04-30 10:58:01 +02:00
TabascoEye
2b2c60cbe3
allow numbers in nickname again
closes #972
2021-04-30 10:51:23 +02:00
David Négrier
3c9d477c06 Improving error messages
Trying to put more expressive and helpful error messages for the end user.
2021-04-30 09:33:18 +02:00
grégoire parant
1c20b33d4e
Merge pull request #971 from thecodingmachine/develop
Add error message (#970)
2021-04-30 00:15:40 +02:00
grégoire parant
925545d74f
Add error message (#970)
- Error link not found
 - Error user was banned
 - Error access dinied on the world
2021-04-29 23:47:30 +02:00
Kharhamel
d1ef4a7342
Merge pull request #969 from thecodingmachine/develop
Deployment bis 29/04/2021
2021-04-29 18:47:51 +02:00
Kharhamel
7cd7d22e8b
Merge pull request #968 from thecodingmachine/releaseBuild
FIX: now used a slugified tag for prod deployment
2021-04-29 18:46:49 +02:00
kharhamel
0af3657acb FIX: now used a slugified tag for prod deployment 2021-04-29 18:44:46 +02:00
Kharhamel
0b749a4cab
Merge pull request #967 from thecodingmachine/develop
Déployment 29/04/2021
2021-04-29 18:32:29 +02:00
Kharhamel
b4f2b005e1
Merge pull request #963 from thecodingmachine/releaseBuild
FIX: fixed the deploy workflow to also build images on new releases
2021-04-29 18:20:59 +02:00
kharhamel
7bd524ba55 FIX: fixed the deploy workflow to also build images on new releases 2021-04-29 18:11:24 +02:00
jonny
99bd9d88d9 renamed api method "exitSceneTo" 2021-04-29 10:56:56 +02:00
jonny
99926a89b2 added goToPage.json with the loadPAge Api call to the index.html 2021-04-29 10:55:01 +02:00
jonny
8f1aea1c43 Merge remote-tracking branch 'remotes/workadventure-main/develop' into load-page-api 2021-04-29 10:49:14 +02:00
jonny
8f6c65384a added example script for map exit 2021-04-29 10:43:51 +02:00
Kharhamel
746f1029a8
Merge pull request #687 from malteriechmann/patch-1
Run containers in the background using detached mode
2021-04-29 10:39:47 +02:00
Kharhamel
a984151912
Merge pull request #904 from thecodingmachine/improvetestcases
Improving test cases
2021-04-29 10:37:08 +02:00
kharhamel
fe27169745 solved conflict with develop 2021-04-29 10:31:16 +02:00
Kharhamel
398326b3aa
Merge pull request #959 from thecodingmachine/dependabot/npm_and_yarn/front/ssri-6.0.2
Bump ssri from 6.0.1 to 6.0.2 in /front
2021-04-29 10:18:33 +02:00
David Négrier
2e4b03efff
Merge pull request #962 from thecodingmachine/bugfix/add_template_to_single_domain
Adding templater call to single domain startup
2021-04-29 09:45:16 +02:00
David Négrier
d29dee3bd4 Adding templater call to single domain startup
The docker-compose.single-domain.yaml was missing a call to the templater script.
As a result, the first run would fail unless docker-compose.yaml was started before.

Closes #947
Closes #957
2021-04-29 09:42:15 +02:00
grégoire parant
19ae575b4f
HotFix style help modal (#960) 2021-04-29 01:49:09 +02:00
dependabot[bot]
1e42de9155
Bump ssri from 6.0.1 to 6.0.2 in /front
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-28 23:28:10 +00:00
grégoire parant
5c0b5ef74b
HotFix release v1.3.1 (#958)
- Update camera style support mobile
 - Fix admin console error
2021-04-29 01:26:09 +02:00
grégoire parant
c2f62e2610
Merge pull request #956 from thecodingmachine/develop
Release 28/04 v1.3.1
2021-04-28 00:01:18 +02:00
Gregoire Parant
16397fe978 Merge branch 'master' into develop 2021-04-27 23:59:25 +02:00
grégoire parant
9b69910cb8
WIP: Update style for mobile (#942)
* Update style for mobile

 - Update style for mobile modale

* Fix overscroll

* Change css properties overflow

* Revert "Change css properties overflow"

This reverts commit 612fcc7e007fb03c7f72e5fa4b8a0604a184ae7d.

* rm image

* Update view mobile

* Fix CI
2021-04-27 23:58:33 +02:00
GRL78
57194fd0a1
Add maps for test (#915) 2021-04-27 23:45:28 +02:00
Kharhamel
94e564f135
Merge pull request #955 from thecodingmachine/fixCleanup
FIX: fixed cleanup for real this time
2021-04-27 18:26:12 +02:00
kharhamel
79701fe227 FIX: fixed cleanup for real this time 2021-04-27 18:18:20 +02:00
Kharhamel
76a21cafa0
Merge pull request #954 from thecodingmachine/restrictCD
FIX: fixed cleanup workflow
2021-04-27 17:28:03 +02:00
kharhamel
3ce5c2ec45 FIX: fixed cleanup workflow 2021-04-27 17:17:54 +02:00
Kharhamel
c6ed2c5c57
Merge pull request #953 from thecodingmachine/restrictCD
FIX: fixed cleanup workflow
2021-04-27 17:03:45 +02:00
kharhamel
7a8765826e FIX: fixed cleanup workflow 2021-04-27 16:51:57 +02:00
jonny
6295c8275e reset menu items on map change 2021-04-27 16:40:56 +02:00
Kharhamel
c19201b636
Merge pull request #952 from thecodingmachine/restrictCD
edited CD domain in deeployer config
2021-04-27 16:37:37 +02:00
kharhamel
ea009d912e edited CD domain in deeployer config 2021-04-27 16:30:35 +02:00
Kharhamel
998e051a45
Merge pull request #940 from thecodingmachine/restrictCD
FIX: the deploy action now only start when the label 'deploy' is applied to the PR
2021-04-27 15:49:15 +02:00
jonny
4069e87872 replace menu items if already present 2021-04-27 12:40:29 +02:00
jonny
fafaabb6e7 script api can add menu commands
# Conflicts:
#	front/src/Api/IframeListener.ts
#	front/src/iframe_api.ts
2021-04-27 12:07:02 +02:00
jonny
79e530f0e6 launch jsons + type fixes 2021-04-27 00:04:08 +02:00
jonny
6e847b5f58 Merge branch 'develop' of https://github.com/thecodingmachine/workadventure into develop 2021-04-27 00:02:05 +02:00
kharhamel
30cf078df5 FIX: the deploy action now only start when the label 'deploy' is applied to the PR 2021-04-26 18:33:03 +02:00
grégoire parant
4e09246c7f
Merge pull request #939 from thecodingmachine/develop
Release 26/04/2021
2021-04-26 13:42:27 +02:00
David Négrier
ca628d9a90
Merge pull request #901 from thecodingmachine/text_display
Adding the ability to display "Text" objects from Tiled
2021-04-26 11:30:34 +02:00
David Négrier
08ca95b143 Fixing WorkWrap 2021-04-26 11:28:15 +02:00
David Négrier
22cb41dc29 Adding the ability to display "Text" objects from Tiled
I honestly don't believe text objects look good on map, and in real maps, I think text should be written on tiles.

However, for a variety of use cases (like in test maps in the /maps/test directory, it can be useful to be
able to display some text easily on a map.

This PR adds the ability to display this text.

Note: the "font" support cannot work correctly, as Tiled is listing fonts from the local
system, and those fonts are not available in a browser.
2021-04-26 11:28:13 +02:00
David Négrier
e37ab7d8ad
Merge pull request #899 from thecodingmachine/Lurkars/map-group-layer-support
Map group layer support (2)
2021-04-26 11:26:21 +02:00
David Négrier
6e5fa2c514 Initiating CHANGELOG file 2021-04-26 11:21:36 +02:00
David Négrier
6815fe7a0a Added a new LayersIterator class
This class iterates recursively over layers, flattening groups.
This enables us to simplify the code when we iterate layers. We can remove all recursive function calls in the GameScene code (it is delegated to the LayersIterator)
2021-04-26 11:21:34 +02:00
Lurkars
66b90be0da remove redundancy 2021-04-26 11:20:28 +02:00
Lurkars
93b7b7bc91 removed redundancy, fix for startLayer 2021-04-26 11:20:28 +02:00
Lurkars
9b6be3466b support for group layer of Tiled (excludes 'start' layer) 2021-04-26 11:20:28 +02:00
grégoire parant
f0d277af32
Nickname not centered in video-container (#935)
* Nickname not centered in video-container

#823
2021-04-24 15:45:58 +02:00
Gregoire Parant
364c1d3e98 Merge branch 'master' into develop 2021-04-24 10:39:49 +02:00
grégoire parant
61c8830e24
Merge pull request #934 from thecodingmachine/HotFixStyleMessgae
HotFix Fix style message displaying
2021-04-24 10:37:33 +02:00
Gregoire Parant
0c72378001 Fix style message displaying
#926
2021-04-24 10:36:53 +02:00
grégoire parant
d9620c373f
Merge pull request #918 from thecodingmachine/newStartMobileScene
Mobile started scene
2021-04-23 19:51:45 +02:00
Gregoire Parant
b934d3404f Fix feedback WorkAdventure team 2021-04-23 19:29:43 +02:00
DESKTOP-FMM8UI0\CLV
b79d76fc2e parameter soundConfig is now optionnal
if user call mySound.play() the sound will be played with the base SoundConfig
2021-04-23 17:03:17 +02:00
DESKTOP-FMM8UI0\CLV
f8bab9ce6b Map Village with all the tilesSets 2021-04-23 15:39:45 +02:00
DESKTOP-FMM8UI0\CLV
f03f8076f3 Sound in Script Done
Fom script user can load, play and stop sound
2021-04-23 15:35:34 +02:00
David Négrier
4f4f499d47 Making alone mode more robust
This fixes a number of issues where the game was attempting to access a non existing connection (in alone mode)
2021-04-23 13:44:04 +02:00
Gregoire Parant
f11e936143 Refactoring & fix feedback WorkAdventure 2021-04-23 03:59:14 +02:00
Gregoire Parant
8e52b8597c Merge branch 'develop' into newStartMobileScene
# Conflicts:
#	front/src/Phaser/Login/EnableCameraScene.ts
#	front/src/Phaser/Login/LoginScene.ts
#	front/src/Phaser/Login/SelectCharacterScene.ts
#	front/src/Phaser/Login/SelectCompanionScene.ts
2021-04-22 23:36:21 +02:00
Gregoire Parant
d7f00b505a Update Companion Scene for mobile 2021-04-22 13:10:23 +02:00
Gregoire Parant
3697ddabfa Fix responsive Camera Settings 2021-04-22 11:47:59 +02:00
Gregoire Parant
3df32de83b Update camera and adapte for mobile 2021-04-22 11:26:35 +02:00
Kharhamel
1251cbdc76
Merge pull request #925 from thecodingmachine/touchZones
FIX: use phaser Zones instead of rectangles objects to create tap zones
2021-04-22 10:28:28 +02:00
Gregoire Parant
0a04f5d631 Finish select character scene and custom character scene 2021-04-22 02:29:13 +02:00
kharhamel
c8ba3d8ab9 FIX: use phaser Zones instead of rectangles objects to create tap zones 2021-04-21 18:27:33 +02:00
kharhamel
6a2326c4b3 WIP: testing new resolution config 2021-04-21 18:04:00 +02:00
DESKTOP-FMM8UI0\CLV
517c0e86cb Can play Sound from a map script
add sound in the TutoMap
2021-04-21 16:47:19 +02:00
jonny
3836d5037c game state can be read out by the client APIs
# Conflicts:
#	front/src/Api/IframeListener.ts
#	front/src/Phaser/Game/GameScene.ts
#	front/src/iframe_api.ts
2021-04-21 15:56:52 +02:00
jonny
006195e8cc rewrote to run in event loop 2021-04-21 11:54:37 +02:00
jonny
6c6789411a added loadPage Api call 2021-04-21 11:20:17 +02:00
David Négrier
f9f6abe7b3 Switching setTimeout to false 2021-04-21 10:37:20 +02:00
David Négrier
84bd5eff50 Bump Phaser version
This reverts commit f2c3d6f1589d89aae975639cbedf3465717d308e.
Also, updates all dependencies to their latest allowed version.

# Conflicts:
#	front/package.json
#	front/yarn.lock
2021-04-21 10:35:38 +02:00
Gregoire Parant
78d888ffaf Update menu mobile
- Add mobile style share modal
- Add mobile style settings modal
- Add menu mobile style
2021-04-21 00:53:45 +02:00
Lurkars
405f7b1137 audio player volume improvements 2021-04-20 21:37:48 +02:00
Gregoire Parant
20e0a2553e Update cowebsite mobile style 2021-04-20 21:11:05 +02:00
Gregoire Parant
30c1825abd Update syle mobile
- update my video side
- update user video side
- update button video cam and microphone side
2021-04-20 19:54:37 +02:00
Gregoire Parant
09d5e0b689 Fix center select name modal 2021-04-20 18:58:19 +02:00
Gregoire Parant
2c862fe7e7 Refactor Login Scene 2021-04-20 18:49:42 +02:00
DESKTOP-FMM8UI0\CLV
676dbcc9d0 Map village with new WA Office and features presented 2021-04-20 16:56:48 +02:00
Kharhamel
5dc2f0ac47
Merge pull request #898 from thecodingmachine/touchZoom
FEATURE: add the ability to zoom in and out using touch screen
2021-04-20 14:51:08 +02:00
kharhamel
341b048d6c improved the visuals of the joystick 2021-04-20 14:26:52 +02:00
kharhamel
415d8f9466 the joystick is now visible only when pointer is down 2021-04-20 10:52:06 +02:00
Gregoire Parant
5e8951fdaa Merge branch 'master' into develop 2021-04-19 21:19:35 +02:00
grégoire parant
d44e449e92
Merge pull request #916 from thecodingmachine/HotFixPerformance
HotFix performance
2021-04-19 21:17:26 +02:00
Gregoire Parant
e7b5bb261d HotFix performance
- Change forceSetTimeOut to false and permit to freeze the scene.
 - Fix style sending audio message
 - Fix banned message from admin console
2021-04-19 20:19:40 +02:00
kharhamel
56287a2958 put the virtual joystick into the userInputManager and restricted it to touchscreens 2021-04-19 18:10:33 +02:00
David Négrier
06f6b3153c
Merge pull request #913 from ClementVieilly75/FTUEPopup
Ftue popup
2021-04-19 16:24:02 +02:00
Gregoire Parant
f7daa6e3f5 Merge branch 'master' into develop 2021-04-19 16:05:31 +02:00
grégoire parant
a43afbc124
Merge pull request #914 from thecodingmachine/hotfix-map-tuto
Hotfix redirect map tuto
2021-04-19 15:55:39 +02:00
Gregoire Parant
dab74460bb Hotfix redirect map tuto 2021-04-19 15:45:46 +02:00
DESKTOP-FMM8UI0\CLV
7e6a8b477d Debug state of share Screen button 2021-04-19 15:16:56 +02:00
DESKTOP-FMM8UI0\CLV
b9d9a78868 Link changed in Tutov3
Change position of cam and buttons share/cam/Mic
2021-04-19 14:42:49 +02:00
DESKTOP-FMM8UI0\CLV
d31021c02d Replace share screen logo 2021-04-19 14:19:16 +02:00
David Négrier
cb1dcb5786
Merge pull request #908 from ClementVieilly75/FTUEPopup
Unsubscribe to iframeEvents in CleanUpClosingScene
2021-04-19 11:24:43 +02:00
DESKTOP-FMM8UI0\CLV
5028a54422 Unsubscribe to iframeEvents in CleanUpClosingScene 2021-04-19 10:19:30 +02:00
David Négrier
94317be1ae Improving test cases
This PR improves test cases by adding a "index.html" webpage listing test maps
and by adding text in the map, explaining what needs to be tested.
2021-04-17 21:31:09 +02:00
David Négrier
110511461a Fixing WorkWrap 2021-04-17 18:55:39 +02:00
David Négrier
16daf7332a Adding the ability to display "Text" objects from Tiled
I honestly don't believe text objects look good on map, and in real maps, I think text should be written on tiles.

However, for a variety of use cases (like in test maps in the /maps/test directory, it can be useful to be
able to display some text easily on a map.

This PR adds the ability to display this text.

Note: the "font" support cannot work correctly, as Tiled is listing fonts from the local
system, and those fonts are not available in a browser.
2021-04-17 12:05:54 +02:00
kharhamel
d7a74baa9d FEATURE: add the ability to zoom in and out using touch screen 2021-04-15 16:37:58 +02:00
Piotr Dobrowolski
603fc0a591
Merge branch 'develop' into fix/dependencies-cleanup 2021-04-13 21:33:56 +02:00
Valdo Romao
f7c4592944 Updated favicons 2021-03-24 23:10:02 +00:00
Malte Riechmann
69ff15ff71
Run containers in the background using detached mode 2021-01-29 21:45:01 +01:00
Piotr Dobrowolski
3c099ea783 back,pusher,uploader: cleanup dependencies
Move typescript/ts-node-dev to dev dependencies, remove unused
dependencies.
2021-01-07 19:09:53 +01:00
Piotr Dobrowolski
af260ad229 front: add AnimatedTiles plugin 2021-01-07 18:37:57 +01:00
801 changed files with 49528 additions and 22534 deletions

View File

@ -5,11 +5,13 @@ JITSI_PRIVATE_MODE=false
JITSI_ISS=
SECRET_JITSI_KEY=
ADMIN_API_TOKEN=123
START_ROOM_URL=/_/global/maps.workadventure.localhost/Floor0/floor0.json
START_ROOM_URL=/_/global/maps.workadventure.localhost/starter/map.json
# If your Turn server is configured to use the Turn REST API, you should put the shared auth secret here.
# If you are using Coturn, this is the value of the "static-auth-secret" parameter in your coturn config file.
# Keep empty if you are sharing hard coded / clear text credentials.
TURN_STATIC_AUTH_SECRET=
DISABLE_NOTIFICATIONS=true
SKIP_RENDER_OPTIMIZATIONS=false
# The email address used by Let's encrypt to send renewal warnings (compulsory)
ACME_EMAIL=
@ -17,3 +19,13 @@ ACME_EMAIL=
MAX_PER_GROUP=4
MAX_USERNAME_LENGTH=8
OPID_CLIENT_ID=
OPID_CLIENT_SECRET=
OPID_CLIENT_ISSUER=
OPID_CLIENT_REDIRECT_URL=
OPID_LOGIN_SCREEN_PROVIDER=http://pusher.workadventure.localhost/login-screen
OPID_PROFILE_SCREEN_PROVIDER=
DISABLE_ANONYMOUS=
# If you want to have a contact page in your menu, you MUST set CONTACT_URL to the URL of the page that you want
CONTACT_URL=

View File

@ -1,7 +1,13 @@
name: Build, push and deploy Docker image
on:
- push
push:
branches: [master, develop]
release:
types: [created]
pull_request:
types: [ labeled, synchronize ]
# Enables BuildKit
env:
@ -10,7 +16,7 @@ env:
jobs:
build-front:
if: ${{ github.event_name == 'push' || github.event_name == 'release' || github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy') }}
runs-on: ubuntu-latest
steps:
@ -30,11 +36,11 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
repository: thecodingmachine/workadventure-front
tags: ${{ env.GITHUB_REF_SLUG }}
tags: ${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }}
add_git_labels: true
build-back:
if: ${{ github.event_name == 'push' || github.event_name == 'release' || github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy') }}
runs-on: ubuntu-latest
steps:
@ -53,11 +59,11 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
repository: thecodingmachine/workadventure-back
tags: ${{ env.GITHUB_REF_SLUG }}
tags: ${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }}
add_git_labels: true
build-pusher:
if: ${{ github.event_name == 'push' || github.event_name == 'release' || github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy') }}
runs-on: ubuntu-latest
steps:
@ -76,11 +82,11 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
repository: thecodingmachine/workadventure-pusher
tags: ${{ env.GITHUB_REF_SLUG }}
tags: ${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }}
add_git_labels: true
build-uploader:
if: ${{ github.event_name == 'push' || github.event_name == 'release' || github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy') }}
runs-on: ubuntu-latest
steps:
@ -99,11 +105,11 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
repository: thecodingmachine/workadventure-uploader
tags: ${{ env.GITHUB_REF_SLUG }}
tags: ${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }}
add_git_labels: true
build-maps:
if: ${{ github.event_name == 'push' || github.event_name == 'release' || github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy') }}
runs-on: ubuntu-latest
steps:
@ -123,7 +129,7 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
repository: thecodingmachine/workadventure-maps
tags: ${{ env.GITHUB_REF_SLUG }}
tags: ${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }}
add_git_labels: true
deeploy:
@ -134,6 +140,7 @@ jobs:
- build-maps
- build-uploader
runs-on: ubuntu-latest
if: ${{ github.event_name == 'push' || github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'deploy') }}
steps:
- name: Checkout
@ -142,6 +149,37 @@ jobs:
# Create a slugified value of the branch
- uses: rlespinasse/github-slug-action@3.1.0
- name: Write certificate
run: echo "${CERTS_PRIVATE_KEY}" > secret.key && chmod 0600 secret.key
env:
CERTS_PRIVATE_KEY: ${{ secrets.CERTS_PRIVATE_KEY }}
- name: Download certificate
run: mkdir secrets && scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i secret.key ubuntu@cert.workadventu.re:./config/live/workadventu.re/* secrets/
- name: Create namespace
uses: steebchen/kubectl@v1.0.0
env:
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_FILE_BASE64 }}
with:
args: create namespace workadventure-${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }}
continue-on-error: true
- name: Delete old certificates in namespace
uses: steebchen/kubectl@v1.0.0
env:
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_FILE_BASE64 }}
with:
args: -n workadventure-${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }} delete secret certificate-tls
continue-on-error: true
- name: Install certificates in namespace
uses: steebchen/kubectl@v1.0.0
env:
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_FILE_BASE64 }}
with:
args: -n workadventure-${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }} create secret tls certificate-tls --key="secrets/privkey.pem" --cert="secrets/fullchain.pem"
- name: Deploy
uses: thecodingmachine/deeployer-action@master
env:
@ -151,14 +189,16 @@ jobs:
JITSI_URL: ${{ secrets.JITSI_URL }}
SECRET_JITSI_KEY: ${{ secrets.SECRET_JITSI_KEY }}
TURN_STATIC_AUTH_SECRET: ${{ secrets.TURN_STATIC_AUTH_SECRET }}
DEPLOY_REF: ${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }}
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
POSTHOG_URL: ${{ secrets.POSTHOG_URL }}
with:
namespace: workadventure-${{ env.GITHUB_REF_SLUG }}
namespace: workadventure-${{ github.event_name == 'pull_request' && env.GITHUB_HEAD_REF_SLUG || env.GITHUB_REF_SLUG }}
- name: Add a comment in PR
uses: unsplash/comment-on-pr@v1.2.0
if: ${{ env.GITHUB_REF_SLUG != 'master' }}
if: ${{ github.event_name == 'pull_request' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
msg: Environment deployed at https://play.${{ env.GITHUB_REF_SLUG }}.workadventure.test.thecodingmachine.com
check_for_duplicate_msg: true
msg: "Environment deployed at https://play-${{ env.GITHUB_HEAD_REF_SLUG }}.test.workadventu.re \nTests available at https://maps-${{ env.GITHUB_HEAD_REF_SLUG }}.test.workadventu.re/tests"

View File

@ -1,7 +1,8 @@
name: Cleanup images and environments
on:
- delete
pull_request:
types: [ closed ]
# Enables BuildKit
env:
@ -14,13 +15,12 @@ jobs:
steps:
# Create a slugified value of the branch
- uses: rlespinasse/github-slug-action@1.1.0
- uses: rlespinasse/github-slug-action@3.1.0
- name: Cleanup
continue-on-error: true
uses: thecodingmachine/deeployer-cleanup-action@master
env:
KUBE_CONFIG_FILE: ${{ secrets.KUBE_CONFIG_FILE }}
with:
# FIXME: we are not using ${{ env.GITHUB_REF_SLUG }} that resolves to master BUT! we are not using a slugified namespace
# so complex namespace names will not be treated correctly
namespace: workadventure-${{ github.event.ref }}
namespace: workadventure-${{ env.GITHUB_HEAD_REF_SLUG }}

71
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@ -0,0 +1,71 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ develop ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ develop ]
schedule:
- cron: '24 17 * * 0'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@ -3,8 +3,11 @@
name: "Continuous Integration"
on:
- "pull_request"
- "push"
push:
branches:
- master
- develop
pull_request:
jobs:
@ -46,13 +49,22 @@ jobs:
- name: "Build"
run: yarn run build
env:
API_URL: "localhost:8080"
PUSHER_URL: "//localhost:8080"
ADMIN_URL: "//localhost:80"
working-directory: "front"
- name: "Svelte check"
run: yarn run svelte-check
working-directory: "front"
- name: "Lint"
run: yarn run lint
working-directory: "front"
- name: "Pretty"
run: yarn run pretty-check
working-directory: "front"
- name: "Jasmine"
run: yarn test
working-directory: "front"
@ -69,7 +81,7 @@ jobs:
- name: "Setup NodeJS"
uses: actions/setup-node@v1
with:
node-version: '12.x'
node-version: '14.x'
- name: Install Protoc
uses: arduino/setup-protoc@v1
@ -100,6 +112,10 @@ jobs:
run: yarn test
working-directory: "pusher"
- name: "Prettier"
run: yarn run pretty-check
working-directory: "pusher"
continuous-integration-back:
name: "Continuous Integration Back"
@ -143,3 +159,7 @@ jobs:
run: yarn test
working-directory: "back"
- name: "Prettier"
run: yarn run pretty-check
working-directory: "back"

60
.github/workflows/end_to_end_tests.yml vendored Normal file
View File

@ -0,0 +1,60 @@
# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
name: "End to end tests"
on:
push:
branches:
- master
- develop
pull_request:
jobs:
end-to-end-tests:
name: "End-to-end testcafe tests"
runs-on: "ubuntu-latest"
steps:
- name: "Checkout"
uses: "actions/checkout@v2.0.0"
- name: "Setup .env file"
run: cp .env.template .env
- name: "Edit ownership of file for test cases"
run: sudo chown 1000:1000 -R .
- name: "Start environment"
run: docker-compose up -d
- name: "Wait for environment to build (and downloading testcafe image)"
run: (docker-compose -f docker-compose.testcafe.yml pull &) && docker-compose logs -f --tail=0 front | grep -q "Compiled successfully"
# - name: "temp debug: display logs"
# run: docker-compose logs
#
# - name: "Wait for back start"
# run: docker-compose logs -f back | grep -q "WorkAdventure HTTP API starting on port"
#
# - name: "Wait for pusher start"
# run: docker-compose logs -f pusher | grep -q "WorkAdventure starting on port"
- name: "Run tests"
run: docker-compose -f docker-compose.testcafe.yml up --exit-code-from testcafe
- name: Upload failed tests
if: ${{ failure() }}
uses: actions/upload-artifact@v2
with:
name: my-artifact
path: './tests/screenshots/'
- name: Display state
if: ${{ failure() }}
run: docker-compose ps
- name: Display logs
if: ${{ failure() }}
run: docker-compose logs

View File

@ -2,6 +2,7 @@ name: Push @workadventure/iframe-api-typings to NPM
on:
release:
types: [created]
push:
jobs:
build:
runs-on: ubuntu-latest
@ -13,10 +14,6 @@ jobs:
node-version: '14.x'
registry-url: 'https://registry.npmjs.org'
- name: Edit tsconfig.json to add declarations
run: "sed -i 's/\"declaration\": false/\"declaration\": true/g' tsconfig.json"
working-directory: "front"
- name: Replace version number
run: 'sed -i "s#VERSION_PLACEHOLDER#${GITHUB_REF/refs\/tags\//}#g" package.json'
working-directory: "front/packages/iframe-api-typings"
@ -47,15 +44,19 @@ jobs:
working-directory: "front"
- name: "Build"
run: yarn run build
run: yarn run build-typings
env:
API_URL: "localhost:8080"
PUSHER_URL: "//localhost:8080"
ADMIN_URL: "//localhost:80"
working-directory: "front"
# We build the front to generate the typings of iframe_api, then we copy those typings in a separate package.
- name: Copy typings to package dir
run: cp front/dist/src/iframe_api.d.ts front/packages/iframe-api-typings/iframe_api.d.ts
- name: Copy typings to package dir (2)
run: cp -R front/dist/src/Api front/packages/iframe-api-typings/Api
- name: Install dependencies in package
run: yarn install
working-directory: "front/packages/iframe-api-typings"
@ -65,3 +66,4 @@ jobs:
working-directory: "front/packages/iframe-api-typings"
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
if: ${{ github.event_name == 'release' }}

2
.gitignore vendored
View File

@ -7,3 +7,5 @@ docker-compose.override.yaml
maps/yarn.lock
maps/dist/computer.js
maps/dist/computer.js.map
node_modules
_

1
.husky/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
_

15
.husky/pre-commit Executable file
View File

@ -0,0 +1,15 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
(
cd front || exit
yarn run precommit
)
(
cd pusher || exit
yarn run precommit
)
(
cd back || exit
yarn run precommit
)

166
CHANGELOG.md Normal file
View File

@ -0,0 +1,166 @@
## Version develop
### Updates
- Added multi Co-Website management
### Bugfix
- Moving a discussion over a user will now add this user to the discussion
- Being in a silent zone new forces mediaConstraints to false (#1508)
- Fixes for the emote menu (#1501)
- Fixing chat message attributed to wrong user (#1507 #1528)
## Version 1.5.0
### Updates
- Added support for login with OpenID Connect
- New scripting library available to extend WorkAdventure: see [Scripting API Extra](https://github.com/workadventure/scripting-api-extra/)
- New menu design!
- New `openTab` property (#1419)
- Possible integration with Posthog (#1458)
### Bugfix
- Fixing layers flattened several times (#1427 @Lurkars)
- Fixing CSS of video elements
- Chat now scrolls to bottom when opened (#1450)
- Fixing silent zone not respected when exiting from Jitsi (#1456)
- Fixing "yarn install" failing because of missing rights on some Docker installs (#1457)
- Fixing audio not shut down when exiting a room (#1459)
### Misc
- Finished migrating "Build your map" documentation into the "/docs" directory of this repository (#1417 #1385)
- Refactoring documentation (dedicated page for variables) (#1414)
- Front container code is now completely linted (#1413)
## Version 1.4.15
### Updates
- New scripting API features :
- Use `WA.ui.registerMenuCommand(commandDescriptor: string, options: MenuOptions): Menu` to add a custom menu or an iframe to the menu.
- New `jitsiWidth` parameter to set the width of Jitsi and Cowebsite (#1398 @tabascoeye)
- Refactored the way videos are displayed to better cope for vertical videos (on mobile)
- Fixing reconnection issues after 5 minutes of an inactive tab on Google Chrome
- Changes performed in `WA.room.setPropertyLayer` now have a real-time impact (#1395)
### Bugfixes
- Fixing streams in bubbles sometimes improperly muted when there are more than 2 people in the bubble (#1400 #1402)
- Properly displaying carriage returns in popups (#1388)
- `WA.state` now answers correctly to "in" keyword (#1393)
- Variables can now be nested in group layers (#1406)
## Version 1.4.14
### Updates
- New scripting API features :
- Use `WA.room.loadTileset(url: string) : Promise<number>` to load a tileset from a JSON file.
- Rewrote the way authentification works: the auth jwt token can now contains an email instead of an uuid
- Added an OpenId login flow than can be plugged to any OIDC provider.
- You can send a message to all rooms of your world from the console global message (user with tag admin only).
## Version 1.4.11
### Updates
- Added the ability to have animated tiles in maps #1216 #1217
- Enabled outlines on actionable item again (they were disabled when migrating to Phaser 3.50) #1218
- Enabled outlines on player names (when the mouse hovers on a player you can interact with) #1219
- Migrated the admin console to Svelte, and redesigned the console #1211
- Layer properties (like `exitUrl`, `silent`, etc...) can now also used in tile properties #1210 (@jonnytest1)
- New scripting API features :
- Use `WA.onInit(): Promise<void>` to wait for scripting API initialization
- Use `WA.room.showLayer(): void` to show a layer
- Use `WA.room.hideLayer(): void` to hide a layer
- Use `WA.room.setProperty() : void` to add, delete or change existing property of a layer
- Use `WA.player.onPlayerMove(): void` to track the movement of the current player
- Use `WA.player.id: string|undefined` to get the ID of the current player
- Use `WA.player.name: string` to get the name of the current player
- Use `WA.player.tags: string[]` to get the tags of the current player
- Use `WA.room.id: string` to get the ID of the room
- Use `WA.room.mapURL: string` to get the URL of the map
- Use `WA.room.mapURL: string` to get the URL of the map
- Use `WA.room.getMap(): Promise<ITiledMap>` to get the JSON map file
- Use `WA.room.setTiles(): void` to add, delete or change an array of tiles
- Use `WA.ui.registerMenuCommand(): void` to add a custom menu
- Use `WA.state.loadVariable(key: string): unknown` to retrieve a variable
- Use `WA.state.saveVariable(key: string, value: unknown): Promise<void>` to set a variable (across the room, for all users)
- Use `WA.state.onVariableChange(key: string): Observable<unknown>` to track a variable
- Use `WA.state.[any variable]: unknown` to access directly any variable (this is a shortcut to using `WA.state.loadVariable` and `WA.state.saveVariable`)
- Users blocking now relies on UUID rather than ID. A blocked user that leaves a room and comes back will stay blocked.
- The text chat was redesigned to be prettier and to use more features :
- The chat is now persistent between discussions and always accessible
- The chat now tracks incoming and outcoming users in your conversation
- The chat allows your to see the visit card of users
- You can close the chat window with the escape key
- Added a 'Enable notifications' button in the menu.
- The exchange format between Pusher and Admin servers has changed. If you have your own implementation of an admin server, these endpoints signatures have changed:
- `/api/map`: now accepts a complete room URL instead of organization/world/room slugs
- `/api/ban`: new endpoint to report users
- as a side effect, the "routing" is now completely stored on the admin side, so by implementing your own admin server, you can develop completely custom routing
## Version 1.4.3 - 1.4.4 - 1.4.5
## Bugfixes
- Fixing the generation of @workadventure/iframe-api-typings
## Version 1.4.2
## Updates
- A script in an iframe opened by another script can use the IFrame API.
## Version 1.4.1
### Bugfixes
- Loading errors after the preload stage should not crash the game anymore
## Version 1.4.0
### BREAKING CHANGES
- Scripting API:
- Changed function names: `restorePlayerControl` => `restorePlayerControls`, `disablePlayerControl` => `disablePlayerControls`.
Please keep in mind that the scripting API is still experimental. Some breaking changes can occur in it until we mark it as stable.
### Updates
- Added the emote feature to WorkAdventure. (@Kharhamel, @Tabascoeye)
- The emote menu can be opened by clicking on your character.
- Clicking on one of its element will close the menu and play an emote above your character.
- This emote can be seen by other players.
- Player names were improved. (@Kharhamel)
- We now create a GameObject.Text instead of GameObject.BitmapText
- now use the 'Press Start 2P' font family and added an outline
- As a result, we can now allow non-standard letters like french accents or chinese characters!
- Added the contact card feature. (@Kharhamel)
- Click on another player to see its contact info.
- Premium-only feature unfortunately. I need to find a way to make it available for all.
- If no contact data is found (either because the user is anonymous or because no admin backend), display an error card.
- Mobile support has been improved
- WorkAdventure automatically sets the zoom level based on the viewport size to ensure a sensible size of the map is visible, whatever the viewport used
- Mouse wheel support to zoom in / out
- Pinch support on mobile to zoom in / out
- Improved virtual joystick size (adapts to the zoom level)
- Redesigned intermediate scenes
- Redesigned Select Companion scene
- Redesigned Enter Your Name scene
- Added a new `DISPLAY_TERMS_OF_USE` environment variable to trigger the display of terms of use
- New scripting API features:
- Use `WA.loadSound(): Sound` to load / play / stop a sound
### Bug Fixes
- Pinch gesture does no longer move the character
## Version 1.3.0
### New Features
* Maps can now contain "group" layers (layers that contain other layers) - #899 #779 (@Lurkars @moufmouf)
### Updates
### Bug Fixes

67
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,67 @@
# Contributing to WorkAdventure
Are you looking to help on WorkAdventure? Awesome, feel welcome and read the following sections in order to know how to
ask questions and how to work on something.
## Contributions we are seeking
We love to receive contributions from our community — you!
There are many ways to contribute, from writing tutorials or blog posts, improving the documentation,
submitting bug reports and feature requests or writing code which can be incorporated into WorkAdventure itself.
## Using the issue tracker
First things first: **Do NOT report security vulnerabilities in public issues!**.
Please read the [security guide](SECURITY.md) to learn who to do a security disclosure to the WorkAdventure core team.
You can use [GitHub issue tracker](https://github.com/thecodingmachine/workadventure/issues) to:
- File bug reports
- Ask for feature requests
If you have more general questions, a good place to ask is [our Discord server](https://discord.gg/YGtngdh9gt).
Finally, you can come and talk to the WorkAdventure core team... on WorkAdventure, of course! [Our offices are here](https://play.staging.workadventu.re/@/tcm/workadventure/wa-village).
## Pull requests
Good pull requests - patches, improvements, new features - are a fantastic help. They should remain focused in scope
and avoid containing unrelated commits.
Please ask first before embarking on any significant pull request (e.g. implementing features, refactoring code),
otherwise you risk spending a lot of time working on something that the project's developers might not want to merge
into the project.
You can ask us on [Discord](https://discord.gg/YGtngdh9gt) or in the [GitHub issues](https://github.com/thecodingmachine/workadventure/issues).
### Linting your code
Before committing, be sure to install the "Prettier" precommit hook that will reformat your code to our coding style.
In order to enable the "Prettier" precommit hook, at the root of the project, run:
```console
$ yarn install
$ yarn run prepare
```
If you don't have the precommit hook installed (or if you committed code before installing the precommit hook), you will need
to run code linting manually:
```console
$ docker-compose exec front yarn run pretty
$ docker-compose exec pusher yarn run pretty
$ docker-compose exec back yarn run pretty
```
### Providing tests
WorkAdventure is based on a video game engine (Phaser), and video games are not the easiest programs to unit test.
Nevertheless, if your code can be unit tested, please provide a unit test (we use Jasmine).
If you are providing a new feature, you should setup a test map in the `maps/tests` directory. The test map should contain
some description text describing how to test the feature. Finally, you should modify the `maps/tests/index.html` file
to add a reference to your newly created test map.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 386 KiB

1
README-LOGO.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

BIN
README-MAP.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@ -1,17 +1,18 @@
![](https://github.com/thecodingmachine/workadventure/workflows/Continuous%20Integration/badge.svg) [![Discord](https://img.shields.io/discord/821338762134290432?label=Discord)](https://discord.gg/YGtngdh9gt)
![WorkAdventure landscape image](README-INTRO.jpg)
![WorkAdventure logo](README-LOGO.svg)
![WorkAdventure office image](README-MAP.png)
Demo here : [https://workadventu.re/](https://workadventu.re/).
Live demo [here](https://play.workadventu.re/@/tcm/workadventure/wa-village).
# Work Adventure
# WorkAdventure
Work Adventure is a web-based collaborative workspace for small to medium teams (2-100 people) presented in the form of a
WorkAdventure is a web-based collaborative workspace presented in the form of a
16-bit video game.
In Work Adventure, you can move around your office and talk to your colleagues (using a video-chat feature that is
triggered when you move next to a colleague).
In WorkAdventure you can move around your office and talk to your colleagues (using a video-chat system, triggered when you approach someone).
See more features for your virtual office: https://workadventu.re/virtual-office
## Setting up a development environment
@ -20,7 +21,8 @@ Install Docker.
Run:
```
docker-compose up
cp .env.template .env
docker-compose up -d
```
The environment will start.
@ -35,6 +37,9 @@ Note: on some OSes, you will need to add this line to your `/etc/hosts` file:
127.0.0.1 workadventure.localhost
```
Note: If on the first run you get a page with "network error". Try to ``docker-compose stop`` , then ``docker-compose start``.
Note 2: If you are still getting "network error". Make sure you are authorizing the self-signed certificate by entering https://pusher.workadventure.localhost and accepting them.
### MacOS developers, your environment with Vagrant
If you are using MacOS, you can increase Docker performance using Vagrant. If you want more explanations, you can read [this medium article](https://medium.com/better-programming/vagrant-to-increase-docker-performance-with-macos-25b354b0c65c).

20
SECURITY.md Normal file
View File

@ -0,0 +1,20 @@
# Security Policy
## Reporting a Vulnerability
First things first: **Do NOT report security vulnerabilities in public issues!**
Please disclose responsibly by sending
a mail at security@workadventu.re (you can also ping us in the GitHub issues, but please, no details in the issues!)
We will assess the issue as soon as possible on a best-effort basis and will give you an estimate for when we have a fix
and release available for an eventual public disclosure.
We do not have a bug bounty program.
## Supported Versions
We only apply security patches on the latest tagged release and on the `master` and `develop` branches
Unless specified otherwise, do not expect us to fix security issues on past releases. We are only maintaining one release:
the latest one, which is online at https://play.workadventu.re.

1
back/.prettierignore Normal file
View File

@ -0,0 +1 @@
src/Messages/generated

4
back/.prettierrc.json Normal file
View File

@ -0,0 +1,4 @@
{
"printWidth": 120,
"tabWidth": 4
}

View File

@ -10,8 +10,11 @@
"runprod": "node --max-old-space-size=4096 ./dist/server.js",
"profile": "tsc && node --prof ./dist/server.js",
"test": "ts-node node_modules/jasmine/bin/jasmine --config=jasmine.json",
"lint": "node_modules/.bin/eslint src/ . --ext .ts",
"fix": "node_modules/.bin/eslint --fix src/ . --ext .ts"
"lint": "DEBUG= node_modules/.bin/eslint src/ . --ext .ts",
"fix": "DEBUG= node_modules/.bin/eslint --fix src/ . --ext .ts",
"precommit": "lint-staged",
"pretty": "yarn prettier --write 'src/**/*.{ts,tsx}'",
"pretty-check": "yarn prettier --check 'src/**/*.{ts,tsx}'"
},
"repository": {
"type": "git",
@ -37,24 +40,20 @@
},
"homepage": "https://github.com/thecodingmachine/workadventure#readme",
"dependencies": {
"axios": "^0.21.1",
"body-parser": "^1.19.0",
"@workadventure/tiled-map-type-guard": "^1.0.3",
"axios": "^0.21.2",
"busboy": "^0.3.1",
"circular-json": "^0.5.9",
"debug": "^4.3.1",
"generic-type-guard": "^3.2.0",
"google-protobuf": "^3.13.0",
"grpc": "^1.24.4",
"http-status-codes": "^1.4.0",
"iterall": "^1.3.0",
"ipaddr.js": "^2.0.1",
"jsonwebtoken": "^8.5.1",
"mkdirp": "^1.0.4",
"multer": "^1.4.2",
"prom-client": "^12.0.0",
"query-string": "^6.13.3",
"systeminformation": "^4.31.1",
"ts-node-dev": "^1.0.0-pre.44",
"typescript": "^3.8.3",
"redis": "^3.1.2",
"uWebSockets.js": "uNetworking/uWebSockets.js#v18.5.0",
"uuidv4": "^6.0.7"
},
@ -67,10 +66,20 @@
"@types/jasmine": "^3.5.10",
"@types/jsonwebtoken": "^8.3.8",
"@types/mkdirp": "^1.0.1",
"@types/redis": "^2.8.31",
"@types/uuidv4": "^5.0.0",
"@typescript-eslint/eslint-plugin": "^2.26.0",
"@typescript-eslint/parser": "^2.26.0",
"eslint": "^6.8.0",
"jasmine": "^3.5.0"
"jasmine": "^3.5.0",
"lint-staged": "^11.0.0",
"prettier": "^2.3.1",
"ts-node-dev": "^1.0.0-pre.44",
"typescript": "^3.8.3"
},
"lint-staged": {
"*.ts": [
"prettier --write"
]
}
}

View File

@ -1,7 +1,7 @@
// lib/app.ts
import {PrometheusController} from "./Controller/PrometheusController";
import {DebugController} from "./Controller/DebugController";
import {App as uwsApp} from "./Server/sifrr.server";
import { PrometheusController } from "./Controller/PrometheusController";
import { DebugController } from "./Controller/DebugController";
import { App as uwsApp } from "./Server/sifrr.server";
class App {
public app: uwsApp;

View File

@ -1,10 +1,9 @@
import {HttpResponse} from "uWebSockets.js";
import { HttpResponse } from "uWebSockets.js";
export class BaseController {
protected addCorsHeaders(res: HttpResponse): void {
res.writeHeader('access-control-allow-headers', 'Origin, X-Requested-With, Content-Type, Accept');
res.writeHeader('access-control-allow-methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.writeHeader('access-control-allow-origin', '*');
res.writeHeader("access-control-allow-headers", "Origin, X-Requested-With, Content-Type, Accept");
res.writeHeader("access-control-allow-methods", "GET, POST, OPTIONS, PUT, PATCH, DELETE");
res.writeHeader("access-control-allow-origin", "*");
}
}

View File

@ -1,53 +1,54 @@
import {ADMIN_API_TOKEN} from "../Enum/EnvironmentVariable";
import {stringify} from "circular-json";
import {HttpRequest, HttpResponse} from "uWebSockets.js";
import { parse } from 'query-string';
import {App} from "../Server/sifrr.server";
import {socketManager} from "../Services/SocketManager";
import { ADMIN_API_TOKEN } from "../Enum/EnvironmentVariable";
import { stringify } from "circular-json";
import { HttpRequest, HttpResponse } from "uWebSockets.js";
import { parse } from "query-string";
import { App } from "../Server/sifrr.server";
import { socketManager } from "../Services/SocketManager";
export class DebugController {
constructor(private App : App) {
constructor(private App: App) {
this.getDump();
}
getDump(){
getDump() {
this.App.get("/dump", (res: HttpResponse, req: HttpRequest) => {
const query = parse(req.getQuery());
if (query.token !== ADMIN_API_TOKEN) {
return res.status(401).send('Invalid token sent!');
return res.writeStatus("401 Unauthorized").end("Invalid token sent!");
}
return res.writeStatus('200 OK').writeHeader('Content-Type', 'application/json').end(stringify(
socketManager.getWorlds(),
(key: unknown, value: unknown) => {
if (key === 'listeners') {
return 'Listeners';
}
if (key === 'socket') {
return 'Socket';
}
if (key === 'batchedMessages') {
return 'BatchedMessages';
}
if(value instanceof Map) {
const obj: any = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
for (const [mapKey, mapValue] of value.entries()) {
obj[mapKey] = mapValue;
return res
.writeStatus("200 OK")
.writeHeader("Content-Type", "application/json")
.end(
stringify(socketManager.getWorlds(), (key: unknown, value: unknown) => {
if (key === "listeners") {
return "Listeners";
}
return obj;
} else if(value instanceof Set) {
if (key === "socket") {
return "Socket";
}
if (key === "batchedMessages") {
return "BatchedMessages";
}
if (value instanceof Map) {
const obj: any = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
for (const [mapKey, mapValue] of value.entries()) {
obj[mapKey] = mapValue;
}
return obj;
} else if (value instanceof Set) {
const obj: Array<unknown> = [];
for (const [setKey, setValue] of value.entries()) {
obj.push(setValue);
}
return obj;
} else {
return value;
}
}
));
} else {
return value;
}
})
);
});
}
}

View File

@ -1,7 +1,7 @@
import {App} from "../Server/sifrr.server";
import {HttpRequest, HttpResponse} from "uWebSockets.js";
const register = require('prom-client').register;
const collectDefaultMetrics = require('prom-client').collectDefaultMetrics;
import { App } from "../Server/sifrr.server";
import { HttpRequest, HttpResponse } from "uWebSockets.js";
const register = require("prom-client").register;
const collectDefaultMetrics = require("prom-client").collectDefaultMetrics;
export class PrometheusController {
constructor(private App: App) {
@ -14,7 +14,7 @@ export class PrometheusController {
}
private metrics(res: HttpResponse, req: HttpRequest): void {
res.writeHeader('Content-Type', register.contentType);
res.writeHeader("Content-Type", register.contentType);
res.end(register.metrics());
}
}

View File

@ -1,17 +1,20 @@
const MINIMUM_DISTANCE = process.env.MINIMUM_DISTANCE ? Number(process.env.MINIMUM_DISTANCE) : 64;
const GROUP_RADIUS = process.env.GROUP_RADIUS ? Number(process.env.GROUP_RADIUS) : 48;
const ALLOW_ARTILLERY = process.env.ALLOW_ARTILLERY ? process.env.ALLOW_ARTILLERY == 'true' : false;
const ADMIN_API_URL = process.env.ADMIN_API_URL || '';
const ADMIN_API_TOKEN = process.env.ADMIN_API_TOKEN || 'myapitoken';
const ALLOW_ARTILLERY = process.env.ALLOW_ARTILLERY ? process.env.ALLOW_ARTILLERY == "true" : false;
const ADMIN_API_URL = process.env.ADMIN_API_URL || "";
const ADMIN_API_TOKEN = process.env.ADMIN_API_TOKEN || "myapitoken";
const CPU_OVERHEAT_THRESHOLD = Number(process.env.CPU_OVERHEAT_THRESHOLD) || 80;
const JITSI_URL : string|undefined = (process.env.JITSI_URL === '') ? undefined : process.env.JITSI_URL;
const JITSI_ISS = process.env.JITSI_ISS || '';
const SECRET_JITSI_KEY = process.env.SECRET_JITSI_KEY || '';
const HTTP_PORT = parseInt(process.env.HTTP_PORT || '8080') || 8080;
const GRPC_PORT = parseInt(process.env.GRPC_PORT || '50051') || 50051;
export const SOCKET_IDLE_TIMER = parseInt(process.env.SOCKET_IDLE_TIMER as string) || 30; // maximum time (in second) without activity before a socket is closed
export const TURN_STATIC_AUTH_SECRET = process.env.TURN_STATIC_AUTH_SECRET || '';
export const MAX_PER_GROUP = parseInt(process.env.MAX_PER_GROUP || '4');
const JITSI_URL: string | undefined = process.env.JITSI_URL === "" ? undefined : process.env.JITSI_URL;
const JITSI_ISS = process.env.JITSI_ISS || "";
const SECRET_JITSI_KEY = process.env.SECRET_JITSI_KEY || "";
const HTTP_PORT = parseInt(process.env.HTTP_PORT || "8080") || 8080;
const GRPC_PORT = parseInt(process.env.GRPC_PORT || "50051") || 50051;
export const TURN_STATIC_AUTH_SECRET = process.env.TURN_STATIC_AUTH_SECRET || "";
export const MAX_PER_GROUP = parseInt(process.env.MAX_PER_GROUP || "4");
export const REDIS_HOST = process.env.REDIS_HOST || undefined;
export const REDIS_PORT = parseInt(process.env.REDIS_PORT || "6379") || 6379;
export const REDIS_PASSWORD = process.env.REDIS_PASSWORD || undefined;
export const STORE_VARIABLES_FOR_LOCAL_MAPS = process.env.STORE_VARIABLES_FOR_LOCAL_MAPS === "true";
export {
MINIMUM_DISTANCE,
@ -24,5 +27,5 @@ export {
CPU_OVERHEAT_THRESHOLD,
JITSI_URL,
JITSI_ISS,
SECRET_JITSI_KEY
}
SECRET_JITSI_KEY,
};

View File

@ -1,18 +1,12 @@
import {
BatchMessage,
PusherToBackMessage,
ServerToAdminClientMessage,
ServerToClientMessage,
SubMessage, UserJoinedRoomMessage, UserLeftRoomMessage
UserJoinedRoomMessage,
UserLeftRoomMessage,
} from "../Messages/generated/messages_pb";
import {AdminSocket} from "../RoomManager";
import { AdminSocket } from "../RoomManager";
export class Admin {
public constructor(
private readonly socket: AdminSocket
) {
}
public constructor(private readonly socket: AdminSocket) {}
public sendUserJoin(uuid: string, name: string, ip: string): void {
const serverToAdminClientMessage = new ServerToAdminClientMessage();
@ -27,7 +21,7 @@ export class Admin {
this.socket.write(serverToAdminClientMessage);
}
public sendUserLeft(uuid: string/*, name: string, ip: string*/): void {
public sendUserLeft(uuid: string /*, name: string, ip: string*/): void {
const serverToAdminClientMessage = new ServerToAdminClientMessage();
const userLeftRoomMessage = new UserLeftRoomMessage();

View File

@ -1,80 +1,94 @@
import {PointInterface} from "./Websocket/PointInterface";
import {Group} from "./Group";
import {User, UserSocket} from "./User";
import {PositionInterface} from "_Model/PositionInterface";
import {EntersCallback, LeavesCallback, MovesCallback} from "_Model/Zone";
import {PositionNotifier} from "./PositionNotifier";
import {Movable} from "_Model/Movable";
import {extractDataFromPrivateRoomId, extractRoomSlugPublicRoomId, isRoomAnonymous} from "./RoomIdentifier";
import {arrayIntersect} from "../Services/ArrayHelper";
import {JoinRoomMessage} from "../Messages/generated/messages_pb";
import {ProtobufUtils} from "../Model/Websocket/ProtobufUtils";
import {ZoneSocket} from "src/RoomManager";
import {Admin} from "../Model/Admin";
import { PointInterface } from "./Websocket/PointInterface";
import { Group } from "./Group";
import { User, UserSocket } from "./User";
import { PositionInterface } from "_Model/PositionInterface";
import { EmoteCallback, EntersCallback, LeavesCallback, MovesCallback } from "_Model/Zone";
import { PositionNotifier } from "./PositionNotifier";
import { Movable } from "_Model/Movable";
import {
BatchToPusherMessage,
BatchToPusherRoomMessage,
EmoteEventMessage,
ErrorMessage,
JoinRoomMessage,
SubToPusherRoomMessage,
VariableMessage,
VariableWithTagMessage,
} from "../Messages/generated/messages_pb";
import { ProtobufUtils } from "../Model/Websocket/ProtobufUtils";
import { RoomSocket, ZoneSocket } from "src/RoomManager";
import { Admin } from "../Model/Admin";
import { adminApi } from "../Services/AdminApi";
import { isMapDetailsData, MapDetailsData } from "../Services/AdminApi/MapDetailsData";
import { ITiledMap } from "@workadventure/tiled-map-type-guard/dist";
import { mapFetcher } from "../Services/MapFetcher";
import { VariablesManager } from "../Services/VariablesManager";
import { ADMIN_API_URL } from "../Enum/EnvironmentVariable";
import { LocalUrlError } from "../Services/LocalUrlError";
import { emitErrorOnRoomSocket } from "../Services/MessageHelpers";
import { VariableError } from "../Services/VariableError";
export type ConnectCallback = (user: User, group: Group) => void;
export type DisconnectCallback = (user: User, group: Group) => void;
export enum GameRoomPolicyTypes {
ANONYMOUS_POLICY = 1,
MEMBERS_ONLY_POLICY,
USE_TAGS_POLICY,
}
export class GameRoom {
private readonly minDistance: number;
private readonly groupRadius: number;
// Users, sorted by ID
private readonly users: Map<number, User>;
private readonly usersByUuid: Map<string, User>;
private readonly groups: Set<Group>;
private readonly admins: Set<Admin>;
private readonly users = new Map<number, User>();
private readonly usersByUuid = new Map<string, User>();
private readonly groups = new Set<Group>();
private readonly admins = new Set<Admin>();
private readonly connectCallback: ConnectCallback;
private readonly disconnectCallback: DisconnectCallback;
private itemsState: Map<number, unknown> = new Map<number, unknown>();
private itemsState = new Map<number, unknown>();
private readonly positionNotifier: PositionNotifier;
public readonly roomId: string;
public readonly roomSlug: string;
public readonly worldSlug: string = '';
public readonly organizationSlug: string = '';
private versionNumber:number = 1;
private versionNumber: number = 1;
private nextUserId: number = 1;
constructor(roomId: string,
connectCallback: ConnectCallback,
disconnectCallback: DisconnectCallback,
minDistance: number,
groupRadius: number,
onEnters: EntersCallback,
onMoves: MovesCallback,
onLeaves: LeavesCallback)
{
this.roomId = roomId;
private roomListeners: Set<RoomSocket> = new Set<RoomSocket>();
if (isRoomAnonymous(roomId)) {
this.roomSlug = extractRoomSlugPublicRoomId(this.roomId);
} else {
const {organizationSlug, worldSlug, roomSlug} = extractDataFromPrivateRoomId(this.roomId);
this.roomSlug = roomSlug;
this.organizationSlug = organizationSlug;
this.worldSlug = worldSlug;
}
this.users = new Map<number, User>();
this.usersByUuid = new Map<string, User>();
this.admins = new Set<Admin>();
this.groups = new Set<Group>();
this.connectCallback = connectCallback;
this.disconnectCallback = disconnectCallback;
this.minDistance = minDistance;
this.groupRadius = groupRadius;
private constructor(
public readonly roomUrl: string,
private mapUrl: string,
private readonly connectCallback: ConnectCallback,
private readonly disconnectCallback: DisconnectCallback,
private readonly minDistance: number,
private readonly groupRadius: number,
onEnters: EntersCallback,
onMoves: MovesCallback,
onLeaves: LeavesCallback,
onEmote: EmoteCallback
) {
// A zone is 10 sprites wide.
this.positionNotifier = new PositionNotifier(320, 320, onEnters, onMoves, onLeaves);
this.positionNotifier = new PositionNotifier(320, 320, onEnters, onMoves, onLeaves, onEmote);
}
public static async create(
roomUrl: string,
connectCallback: ConnectCallback,
disconnectCallback: DisconnectCallback,
minDistance: number,
groupRadius: number,
onEnters: EntersCallback,
onMoves: MovesCallback,
onLeaves: LeavesCallback,
onEmote: EmoteCallback
): Promise<GameRoom> {
const mapDetails = await GameRoom.getMapDetails(roomUrl);
const gameRoom = new GameRoom(
roomUrl,
mapDetails.mapUrl,
connectCallback,
disconnectCallback,
minDistance,
groupRadius,
onEnters,
onMoves,
onLeaves,
onEmote
);
return gameRoom;
}
public getGroups(): Group[] {
@ -85,18 +99,31 @@ export class GameRoom {
return this.users;
}
public getUserByUuid(uuid: string): User|undefined {
public getUserByUuid(uuid: string): User | undefined {
return this.usersByUuid.get(uuid);
}
public getUserById(id: number): User | undefined {
return this.users.get(id);
}
public getUsersByUuid(uuid: string): User[] {
const userList: User[] = [];
for (const user of this.users.values()) {
if (user.uuid === uuid) {
userList.push(user);
}
}
return userList;
}
public join(socket : UserSocket, joinRoomMessage: JoinRoomMessage): User {
public join(socket: UserSocket, joinRoomMessage: JoinRoomMessage): User {
const positionMessage = joinRoomMessage.getPositionmessage();
if (positionMessage === undefined) {
throw new Error('Missing position message');
throw new Error("Missing position message");
}
const position = ProtobufUtils.toPointInterface(positionMessage);
const user = new User(this.nextUserId,
const user = new User(
this.nextUserId,
joinRoomMessage.getUseruuid(),
joinRoomMessage.getIpaddress(),
position,
@ -104,6 +131,7 @@ export class GameRoom {
this.positionNotifier,
socket,
joinRoomMessage.getTagList(),
joinRoomMessage.getVisitcardurl(),
joinRoomMessage.getName(),
ProtobufUtils.toCharacterLayerObjects(joinRoomMessage.getCharacterlayerList()),
joinRoomMessage.getCompanion()
@ -121,12 +149,12 @@ export class GameRoom {
return user;
}
public leave(user : User){
public leave(user: User) {
const userObj = this.users.get(user.id);
if (userObj === undefined) {
console.warn('User ', user.id, 'does not belong to this game room! It should!');
console.warn("User ", user.id, "does not belong to this game room! It should!");
}
if (userObj !== undefined && typeof userObj.group !== 'undefined') {
if (userObj !== undefined && typeof userObj.group !== "undefined") {
this.leaveGroup(userObj);
}
this.users.delete(user.id);
@ -138,7 +166,7 @@ export class GameRoom {
// Notify admins
for (const admin of this.admins) {
admin.sendUserLeft(user.uuid/*, user.name, user.IPAddress*/);
admin.sendUserLeft(user.uuid /*, user.name, user.IPAddress*/);
}
}
@ -146,7 +174,7 @@ export class GameRoom {
return this.users.size === 0 && this.admins.size === 0;
}
public updatePosition(user : User, userPosition: PointInterface): void {
public updatePosition(user: User, userPosition: PointInterface): void {
user.setPosition(userPosition);
this.updateUserGroup(user);
@ -154,6 +182,7 @@ export class GameRoom {
private updateUserGroup(user: User): void {
user.group?.updatePosition();
user.group?.searchForNearbyUsers();
if (user.silent) {
return;
@ -168,22 +197,25 @@ export class GameRoom {
return;
}
const closestItem: User|Group|null = this.searchClosestAvailableUserOrGroup(user);
const closestItem: User | Group | null = this.searchClosestAvailableUserOrGroup(user);
if (closestItem !== null) {
if (closestItem instanceof Group) {
// Let's join the group!
closestItem.join(user);
} else {
const closestUser : User = closestItem;
const group: Group = new Group(this.roomId,[
user,
closestUser
], this.connectCallback, this.disconnectCallback, this.positionNotifier);
const closestUser: User = closestItem;
const group: Group = new Group(
this.roomUrl,
[user, closestUser],
this.groupRadius,
this.connectCallback,
this.disconnectCallback,
this.positionNotifier
);
this.groups.add(group);
}
}
} else {
// If the user is part of a group:
// should he leave the group?
@ -224,7 +256,9 @@ export class GameRoom {
this.positionNotifier.leave(group);
group.destroy();
if (!this.groups.has(group)) {
throw new Error("Could not find group "+group.getId()+" referenced by user "+user.id+" in World.");
throw new Error(
"Could not find group " + group.getId() + " referenced by user " + user.id + " in World."
);
}
this.groups.delete(group);
//todo: is the group garbage collected?
@ -242,16 +276,15 @@ export class GameRoom {
* OR
* - close enough to a group (distance <= groupRadius)
*/
private searchClosestAvailableUserOrGroup(user: User): User|Group|null
{
private searchClosestAvailableUserOrGroup(user: User): User | Group | null {
let minimumDistanceFound: number = Math.max(this.minDistance, this.groupRadius);
let matchingItem: User | Group | null = null;
this.users.forEach((currentUser, userId) => {
// Let's only check users that are not part of a group
if (typeof currentUser.group !== 'undefined') {
if (typeof currentUser.group !== "undefined") {
return;
}
if(currentUser === user) {
if (currentUser === user) {
return;
}
if (currentUser.silent) {
@ -260,7 +293,7 @@ export class GameRoom {
const distance = GameRoom.computeDistance(user, currentUser); // compute distance between peers.
if(distance <= minimumDistanceFound && distance <= this.minDistance) {
if (distance <= minimumDistanceFound && distance <= this.minDistance) {
minimumDistanceFound = distance;
matchingItem = currentUser;
}
@ -271,7 +304,7 @@ export class GameRoom {
return;
}
const distance = GameRoom.computeDistanceBetweenPositions(user.getPosition(), group.getPosition());
if(distance <= minimumDistanceFound && distance <= this.groupRadius) {
if (distance <= minimumDistanceFound && distance <= this.groupRadius) {
minimumDistanceFound = distance;
matchingItem = group;
}
@ -280,15 +313,15 @@ export class GameRoom {
return matchingItem;
}
public static computeDistance(user1: User, user2: User): number
{
public static computeDistance(user1: User, user2: User): number {
const user1Position = user1.getPosition();
const user2Position = user2.getPosition();
return Math.sqrt(Math.pow(user2Position.x - user1Position.x, 2) + Math.pow(user2Position.y - user1Position.y, 2));
return Math.sqrt(
Math.pow(user2Position.x - user1Position.x, 2) + Math.pow(user2Position.y - user1Position.y, 2)
);
}
public static computeDistanceBetweenPositions(position1: PositionInterface, position2: PositionInterface): number
{
public static computeDistanceBetweenPositions(position1: PositionInterface, position2: PositionInterface): number {
return Math.sqrt(Math.pow(position2.x - position1.x, 2) + Math.pow(position2.y - position1.y, 2));
}
@ -300,6 +333,69 @@ export class GameRoom {
return this.itemsState;
}
public async setVariable(name: string, value: string, user: User): Promise<void> {
// First, let's check if "user" is allowed to modify the variable.
const variableManager = await this.getVariableManager();
try {
const readableBy = variableManager.setVariable(name, value, user);
// If the variable was not changed, let's not dispatch anything.
if (readableBy === false) {
return;
}
// TODO: should we batch those every 100ms?
const variableMessage = new VariableWithTagMessage();
variableMessage.setName(name);
variableMessage.setValue(value);
if (readableBy) {
variableMessage.setReadableby(readableBy);
}
const subMessage = new SubToPusherRoomMessage();
subMessage.setVariablemessage(variableMessage);
const batchMessage = new BatchToPusherRoomMessage();
batchMessage.addPayload(subMessage);
// Dispatch the message on the room listeners
for (const socket of this.roomListeners) {
socket.write(batchMessage);
}
} catch (e) {
if (e instanceof VariableError) {
// Ok, we have an error setting a variable. Either the user is trying to hack the map... or the map
// is not up to date. So let's try to reload the map from scratch.
if (this.variableManagerLastLoad === undefined) {
throw e;
}
const lastLoaded = new Date().getTime() - this.variableManagerLastLoad.getTime();
if (lastLoaded < 10000) {
console.log(
'An error occurred while setting the "' +
name +
"\" variable. But we tried to reload the map less than 10 seconds ago, so let's fail."
);
// Do not try to reload if we tried to reload less than 10 seconds ago.
throw e;
}
// Reset the variable manager
this.variableManagerPromise = undefined;
this.mapPromise = undefined;
console.log(
'An error occurred while setting the "' + name + "\" variable. Let's reload the map and try again"
);
// Try to set the variable again!
await this.setVariable(name, value, user);
} else {
throw e;
}
}
}
public addZoneListener(call: ZoneSocket, x: number, y: number): Set<Movable> {
return this.positionNotifier.addZoneListener(call, x, y);
}
@ -322,7 +418,122 @@ export class GameRoom {
}
public incrementVersion(): number {
this.versionNumber++
this.versionNumber++;
return this.versionNumber;
}
public emitEmoteEvent(user: User, emoteEventMessage: EmoteEventMessage) {
this.positionNotifier.emitEmoteEvent(user, emoteEventMessage);
}
public addRoomListener(socket: RoomSocket) {
this.roomListeners.add(socket);
}
public removeRoomListener(socket: RoomSocket) {
this.roomListeners.delete(socket);
}
/**
* Connects to the admin server to fetch map details.
* If there is no admin server, the map details are generated by analysing the map URL (that must be in the form: /_/instance/map_url)
*/
private static async getMapDetails(roomUrl: string): Promise<MapDetailsData> {
if (!ADMIN_API_URL) {
const roomUrlObj = new URL(roomUrl);
const match = /\/_\/[^/]+\/(.+)/.exec(roomUrlObj.pathname);
if (!match) {
console.error("Unexpected room URL", roomUrl);
throw new Error('Unexpected room URL "' + roomUrl + '"');
}
const mapUrl = roomUrlObj.protocol + "//" + match[1];
return {
mapUrl,
policy_type: 1,
textures: [],
tags: [],
};
}
const result = await adminApi.fetchMapDetails(roomUrl);
if (!isMapDetailsData(result)) {
console.error("Unexpected room details received from server", result);
throw new Error("Unexpected room details received from server");
}
return result;
}
private mapPromise: Promise<ITiledMap> | undefined;
/**
* Returns a promise to the map file.
* @throws LocalUrlError if the map we are trying to load is hosted on a local network
* @throws Error
*/
private getMap(): Promise<ITiledMap> {
if (!this.mapPromise) {
this.mapPromise = mapFetcher.fetchMap(this.mapUrl);
}
return this.mapPromise;
}
private variableManagerPromise: Promise<VariablesManager> | undefined;
private variableManagerLastLoad: Date | undefined;
private getVariableManager(): Promise<VariablesManager> {
if (!this.variableManagerPromise) {
this.variableManagerLastLoad = new Date();
this.variableManagerPromise = this.getMap()
.then((map) => {
const variablesManager = new VariablesManager(this.roomUrl, map);
return variablesManager.init();
})
.catch((e) => {
if (e instanceof LocalUrlError) {
// If we are trying to load a local URL, we are probably in test mode.
// In this case, let's bypass the server-side checks completely.
// Note: we run this message inside a setTimeout so that the room listeners can have time to connect.
setTimeout(() => {
for (const roomListener of this.roomListeners) {
emitErrorOnRoomSocket(
roomListener,
"You are loading a local map. If you use the scripting API in this map, please be aware that server-side checks and variable persistence is disabled."
);
}
}, 1000);
const variablesManager = new VariablesManager(this.roomUrl, null);
return variablesManager.init();
} else {
// An error occurred while loading the map
// Right now, let's bypass the error. In the future, we should make sure the user is aware of that
// and that he/she will act on it to fix the problem.
// Note: we run this message inside a setTimeout so that the room listeners can have time to connect.
setTimeout(() => {
for (const roomListener of this.roomListeners) {
emitErrorOnRoomSocket(
roomListener,
"Your map does not seem accessible from the WorkAdventure servers. Is it behind a firewall or a proxy? Your map should be accessible from the WorkAdventure servers. If you use the scripting API in this map, please be aware that server-side checks and variable persistence is disabled."
);
}
}, 1000);
const variablesManager = new VariablesManager(this.roomUrl, null);
return variablesManager.init();
}
});
}
return this.variableManagerPromise;
}
public async getVariablesForTags(tags: string[]): Promise<Map<string, string>> {
const variablesManager = await this.getVariableManager();
return variablesManager.getVariablesForTags(tags);
}
}

View File

@ -1,36 +1,34 @@
import { ConnectCallback, DisconnectCallback } from "./GameRoom";
import { ConnectCallback, DisconnectCallback, GameRoom } from "./GameRoom";
import { User } from "./User";
import {PositionInterface} from "_Model/PositionInterface";
import {Movable} from "_Model/Movable";
import {PositionNotifier} from "_Model/PositionNotifier";
import {gaugeManager} from "../Services/GaugeManager";
import {MAX_PER_GROUP} from "../Enum/EnvironmentVariable";
import { PositionInterface } from "_Model/PositionInterface";
import { Movable } from "_Model/Movable";
import { PositionNotifier } from "_Model/PositionNotifier";
import { MAX_PER_GROUP } from "../Enum/EnvironmentVariable";
import type { Zone } from "../Model/Zone";
export class Group implements Movable {
private static nextId: number = 1;
private id: number;
private users: Set<User>;
private x!: number;
private y!: number;
private hasEditedGauge: boolean = false;
private wasDestroyed: boolean = false;
private roomId: string;
private currentZone: Zone | null = null;
constructor(roomId: string, users: User[], private connectCallback: ConnectCallback, private disconnectCallback: DisconnectCallback, private positionNotifier: PositionNotifier) {
constructor(
roomId: string,
users: User[],
private groupRadius: number,
private connectCallback: ConnectCallback,
private disconnectCallback: DisconnectCallback,
private positionNotifier: PositionNotifier
) {
this.roomId = roomId;
this.users = new Set<User>();
this.id = Group.nextId;
Group.nextId++;
//we only send a event for prometheus metrics if the group lives more than 5 seconds
setTimeout(() => {
if (!this.wasDestroyed) {
this.hasEditedGauge = true;
gaugeManager.incNbGroupsPerRoomGauge(roomId);
}
}, 5000);
users.forEach((user: User) => {
this.join(user);
@ -43,7 +41,7 @@ export class Group implements Movable {
return Array.from(this.users.values());
}
getId() : number {
getId(): number {
return this.id;
}
@ -53,7 +51,7 @@ export class Group implements Movable {
getPosition(): PositionInterface {
return {
x: this.x,
y: this.y
y: this.y,
};
}
@ -81,9 +79,22 @@ export class Group implements Movable {
this.y = y;
if (oldX === undefined) {
this.positionNotifier.enter(this);
this.currentZone = this.positionNotifier.enter(this);
} else {
this.positionNotifier.updatePosition(this, {x, y}, {x: oldX, y: oldY});
this.currentZone = this.positionNotifier.updatePosition(this, { x, y }, { x: oldX, y: oldY });
}
}
searchForNearbyUsers(): void {
if (!this.currentZone) return;
for (const user of this.positionNotifier.getAllUsersInSquareAroundZone(this.currentZone)) {
if (user.group || this.isFull()) return; //we ignore users that are already in a group.
const distance = GameRoom.computeDistanceBetweenPositions(user.getPosition(), this.getPosition());
if (distance < this.groupRadius) {
this.join(user);
this.updatePosition();
}
}
}
@ -95,19 +106,17 @@ export class Group implements Movable {
return this.users.size <= 1;
}
join(user: User): void
{
join(user: User): void {
// Broadcast on the right event
this.connectCallback(user, this);
this.users.add(user);
user.group = this;
}
leave(user: User): void
{
leave(user: User): void {
const success = this.users.delete(user);
if (success === false) {
throw new Error("Could not find user "+user.id+" in the group "+this.id);
throw new Error("Could not find user " + user.id + " in the group " + this.id);
}
user.group = undefined;
@ -123,16 +132,14 @@ export class Group implements Movable {
* Let's kick everybody out.
* Usually used when there is only one user left.
*/
destroy(): void
{
if (this.hasEditedGauge) gaugeManager.decNbGroupsPerRoomGauge(this.roomId);
destroy(): void {
for (const user of this.users) {
this.leave(user);
}
this.wasDestroyed = true;
}
get getSize(){
get getSize() {
return this.users.size;
}
}

View File

@ -1,8 +1,8 @@
import {PositionInterface} from "_Model/PositionInterface";
import { PositionInterface } from "_Model/PositionInterface";
/**
* A physical object that can be placed into a Zone
*/
export interface Movable {
getPosition(): PositionInterface
getPosition(): PositionInterface;
}

View File

@ -1,4 +1,4 @@
export interface PositionInterface {
x: number,
y: number
x: number;
y: number;
}

View File

@ -8,40 +8,59 @@
* The PositionNotifier is important for performance. It allows us to send the position of players only to a restricted
* number of players around the current player.
*/
import {EntersCallback, LeavesCallback, MovesCallback, Zone} from "./Zone";
import {Movable} from "_Model/Movable";
import {PositionInterface} from "_Model/PositionInterface";
import {ZoneSocket} from "../RoomManager";
import { EmoteCallback, EntersCallback, LeavesCallback, MovesCallback, Zone } from "./Zone";
import { Movable } from "_Model/Movable";
import { PositionInterface } from "_Model/PositionInterface";
import { ZoneSocket } from "../RoomManager";
import { User } from "../Model/User";
import { EmoteEventMessage } from "../Messages/generated/messages_pb";
interface ZoneDescriptor {
i: number;
j: number;
}
export class PositionNotifier {
export function* getNearbyDescriptorsMatrix(middleZoneDescriptor: ZoneDescriptor): Generator<ZoneDescriptor> {
for (let n = 0; n < 9; n++) {
const i = middleZoneDescriptor.i + ((n % 3) - 1);
const j = middleZoneDescriptor.j + (Math.floor(n / 3) - 1);
// TODO: we need a way to clean the zones if noone is in the zone and noone listening (to free memory!)
if (i >= 0 && j >= 0) {
yield { i, j };
}
}
}
export class PositionNotifier {
// TODO: we need a way to clean the zones if no one is in the zone and no one listening (to free memory!)
private zones: Zone[][] = [];
constructor(private zoneWidth: number, private zoneHeight: number, private onUserEnters: EntersCallback, private onUserMoves: MovesCallback, private onUserLeaves: LeavesCallback) {
}
constructor(
private zoneWidth: number,
private zoneHeight: number,
private onUserEnters: EntersCallback,
private onUserMoves: MovesCallback,
private onUserLeaves: LeavesCallback,
private onEmote: EmoteCallback
) {}
private getZoneDescriptorFromCoordinates(x: number, y: number): ZoneDescriptor {
return {
i: Math.floor(x / this.zoneWidth),
j: Math.floor(y / this.zoneHeight),
}
};
}
public enter(thing: Movable): void {
public enter(thing: Movable): Zone {
const position = thing.getPosition();
const zoneDesc = this.getZoneDescriptorFromCoordinates(position.x, position.y);
const zone = this.getZone(zoneDesc.i, zoneDesc.j);
zone.enter(thing, null, position);
return zone;
}
public updatePosition(thing: Movable, newPosition: PositionInterface, oldPosition: PositionInterface): void {
public updatePosition(thing: Movable, newPosition: PositionInterface, oldPosition: PositionInterface): Zone {
// Did we change zone?
const oldZoneDesc = this.getZoneDescriptorFromCoordinates(oldPosition.x, oldPosition.y);
const newZoneDesc = this.getZoneDescriptorFromCoordinates(newPosition.x, newPosition.y);
@ -55,9 +74,11 @@ export class PositionNotifier {
// Enter new zone
newZone.enter(thing, oldZone, newPosition);
return newZone;
} else {
const zone = this.getZone(oldZoneDesc.i, oldZoneDesc.j);
zone.move(thing, newPosition);
return zone;
}
}
@ -77,7 +98,7 @@ export class PositionNotifier {
let zone = this.zones[j][i];
if (zone === undefined) {
zone = new Zone(this.onUserEnters, this.onUserMoves, this.onUserLeaves, i, j);
zone = new Zone(this.onUserEnters, this.onUserMoves, this.onUserLeaves, this.onEmote, i, j);
this.zones[j][i] = zone;
}
return zone;
@ -93,4 +114,22 @@ export class PositionNotifier {
const zone = this.getZone(x, y);
zone.removeListener(call);
}
public emitEmoteEvent(user: User, emoteEventMessage: EmoteEventMessage) {
const zoneDesc = this.getZoneDescriptorFromCoordinates(user.getPosition().x, user.getPosition().y);
const zone = this.getZone(zoneDesc.i, zoneDesc.j);
zone.emitEmoteEvent(emoteEventMessage);
}
public *getAllUsersInSquareAroundZone(zone: Zone): Generator<User> {
const zoneDescriptor = this.getZoneDescriptorFromCoordinates(zone.x, zone.y);
for (const d of getNearbyDescriptorsMatrix(zoneDescriptor)) {
const zone = this.getZone(d.i, d.j);
for (const thing of zone.getThings()) {
if (thing instanceof User) {
yield thing;
}
}
}
}
}

View File

@ -1,30 +0,0 @@
//helper functions to parse room IDs
export const isRoomAnonymous = (roomID: string): boolean => {
if (roomID.startsWith('_/')) {
return true;
} else if(roomID.startsWith('@/')) {
return false;
} else {
throw new Error('Incorrect room ID: '+roomID);
}
}
export const extractRoomSlugPublicRoomId = (roomId: string): string => {
const idParts = roomId.split('/');
if (idParts.length < 3) throw new Error('Incorrect roomId: '+roomId);
return idParts.slice(2).join('/');
}
export interface extractDataFromPrivateRoomIdResponse {
organizationSlug: string;
worldSlug: string;
roomSlug: string;
}
export const extractDataFromPrivateRoomId = (roomId: string): extractDataFromPrivateRoomIdResponse => {
const idParts = roomId.split('/');
if (idParts.length < 4) throw new Error('Incorrect roomId: '+roomId);
const organizationSlug = idParts[1];
const worldSlug = idParts[2];
const roomSlug = idParts[3];
return {organizationSlug, worldSlug, roomSlug}
}

View File

@ -1,11 +1,17 @@
import { Group } from "./Group";
import { PointInterface } from "./Websocket/PointInterface";
import {Zone} from "_Model/Zone";
import {Movable} from "_Model/Movable";
import {PositionNotifier} from "_Model/PositionNotifier";
import {ServerDuplexStream} from "grpc";
import {BatchMessage, CompanionMessage, PusherToBackMessage, ServerToClientMessage, SubMessage} from "../Messages/generated/messages_pb";
import {CharacterLayer} from "_Model/Websocket/CharacterLayer";
import { Zone } from "_Model/Zone";
import { Movable } from "_Model/Movable";
import { PositionNotifier } from "_Model/PositionNotifier";
import { ServerDuplexStream } from "grpc";
import {
BatchMessage,
CompanionMessage,
PusherToBackMessage,
ServerToClientMessage,
SubMessage,
} from "../Messages/generated/messages_pb";
import { CharacterLayer } from "_Model/Websocket/CharacterLayer";
export type UserSocket = ServerDuplexStream<PusherToBackMessage, ServerToClientMessage>;
@ -22,6 +28,7 @@ export class User implements Movable {
private positionNotifier: PositionNotifier,
public readonly socket: UserSocket,
public readonly tags: string[],
public readonly visitCardUrl: string | null,
public readonly name: string,
public readonly characterLayers: CharacterLayer[],
public readonly companion?: CompanionMessage
@ -41,9 +48,8 @@ export class User implements Movable {
this.positionNotifier.updatePosition(this, position, oldPosition);
}
private batchedMessages: BatchMessage = new BatchMessage();
private batchTimeout: NodeJS.Timeout|null = null;
private batchTimeout: NodeJS.Timeout | null = null;
public emitInBatch(payload: SubMessage): void {
this.batchedMessages.addPayload(payload);

View File

@ -1,4 +1,4 @@
export interface CharacterLayer {
name: string,
url: string|undefined
name: string;
url: string | undefined;
}

View File

@ -1,10 +1,11 @@
import * as tg from "generic-type-guard";
export const isItemEventMessageInterface =
new tg.IsInterface().withProperties({
export const isItemEventMessageInterface = new tg.IsInterface()
.withProperties({
itemId: tg.isNumber,
event: tg.isString,
state: tg.isUnknown,
parameters: tg.isUnknown,
}).get();
})
.get();
export type ItemEventMessageInterface = tg.GuardedType<typeof isItemEventMessageInterface>;

View File

@ -1,7 +1,10 @@
import {PointInterface} from "./PointInterface";
import { PointInterface } from "./PointInterface";
export class Point implements PointInterface{
constructor(public x : number, public y : number, public direction : string = "none", public moving : boolean = false) {
}
export class Point implements PointInterface {
constructor(
public x: number,
public y: number,
public direction: string = "none",
public moving: boolean = false
) {}
}

View File

@ -7,11 +7,12 @@ import * as tg from "generic-type-guard";
readonly moving: boolean;
}*/
export const isPointInterface =
new tg.IsInterface().withProperties({
export const isPointInterface = new tg.IsInterface()
.withProperties({
x: tg.isNumber,
y: tg.isNumber,
direction: tg.isString,
moving: tg.isBoolean
}).get();
moving: tg.isBoolean,
})
.get();
export type PointInterface = tg.GuardedType<typeof isPointInterface>;

View File

@ -1,34 +1,33 @@
import {PointInterface} from "./PointInterface";
import { PointInterface } from "./PointInterface";
import {
CharacterLayerMessage,
ItemEventMessage,
PointMessage,
PositionMessage
PositionMessage,
} from "../../Messages/generated/messages_pb";
import {CharacterLayer} from "_Model/Websocket/CharacterLayer";
import { CharacterLayer } from "_Model/Websocket/CharacterLayer";
import Direction = PositionMessage.Direction;
import {ItemEventMessageInterface} from "_Model/Websocket/ItemEventMessage";
import {PositionInterface} from "_Model/PositionInterface";
import { ItemEventMessageInterface } from "_Model/Websocket/ItemEventMessage";
import { PositionInterface } from "_Model/PositionInterface";
export class ProtobufUtils {
public static toPositionMessage(point: PointInterface): PositionMessage {
let direction: Direction;
switch (point.direction) {
case 'up':
case "up":
direction = Direction.UP;
break;
case 'down':
case "down":
direction = Direction.DOWN;
break;
case 'left':
case "left":
direction = Direction.LEFT;
break;
case 'right':
case "right":
direction = Direction.RIGHT;
break;
default:
throw new Error('unexpected direction');
throw new Error("unexpected direction");
}
const position = new PositionMessage();
@ -44,16 +43,16 @@ export class ProtobufUtils {
let direction: string;
switch (position.getDirection()) {
case Direction.UP:
direction = 'up';
direction = "up";
break;
case Direction.DOWN:
direction = 'down';
direction = "down";
break;
case Direction.LEFT:
direction = 'left';
direction = "left";
break;
case Direction.RIGHT:
direction = 'right';
direction = "right";
break;
default:
throw new Error("Unexpected direction");
@ -82,7 +81,7 @@ export class ProtobufUtils {
event: itemEventMessage.getEvent(),
parameters: JSON.parse(itemEventMessage.getParametersjson()),
state: JSON.parse(itemEventMessage.getStatejson()),
}
};
}
public static toItemEventProtobuf(itemEvent: ItemEventMessageInterface): ItemEventMessage {
@ -96,7 +95,7 @@ export class ProtobufUtils {
}
public static toCharacterLayerMessages(characterLayers: CharacterLayer[]): CharacterLayerMessage[] {
return characterLayers.map(function(characterLayer): CharacterLayerMessage {
return characterLayers.map(function (characterLayer): CharacterLayerMessage {
const message = new CharacterLayerMessage();
message.setName(characterLayer.name);
if (characterLayer.url) {
@ -107,7 +106,7 @@ export class ProtobufUtils {
}
public static toCharacterLayerObjects(characterLayers: CharacterLayerMessage[]): CharacterLayer[] {
return characterLayers.map(function(characterLayer): CharacterLayer {
return characterLayers.map(function (characterLayer): CharacterLayer {
const url = characterLayer.getUrl();
return {
name: characterLayer.getName(),

View File

@ -1,37 +1,52 @@
import {User} from "./User";
import {PositionInterface} from "_Model/PositionInterface";
import {Movable} from "./Movable";
import {Group} from "./Group";
import {ZoneSocket} from "../RoomManager";
import { User } from "./User";
import { PositionInterface } from "_Model/PositionInterface";
import { Movable } from "./Movable";
import { Group } from "./Group";
import { ZoneSocket } from "../RoomManager";
import { EmoteEventMessage } from "../Messages/generated/messages_pb";
export type EntersCallback = (thing: Movable, fromZone: Zone|null, listener: ZoneSocket) => void;
export type EntersCallback = (thing: Movable, fromZone: Zone | null, listener: ZoneSocket) => void;
export type MovesCallback = (thing: Movable, position: PositionInterface, listener: ZoneSocket) => void;
export type LeavesCallback = (thing: Movable, newZone: Zone|null, listener: ZoneSocket) => void;
export type LeavesCallback = (thing: Movable, newZone: Zone | null, listener: ZoneSocket) => void;
export type EmoteCallback = (emoteEventMessage: EmoteEventMessage, listener: ZoneSocket) => void;
export class Zone {
private things: Set<Movable> = new Set<Movable>();
private listeners: Set<ZoneSocket> = new Set<ZoneSocket>();
/**
* @param x For debugging purpose only
* @param y For debugging purpose only
*/
constructor(private onEnters: EntersCallback, private onMoves: MovesCallback, private onLeaves: LeavesCallback, public readonly x: number, public readonly y: number) {
}
constructor(
private onEnters: EntersCallback,
private onMoves: MovesCallback,
private onLeaves: LeavesCallback,
private onEmote: EmoteCallback,
public readonly x: number,
public readonly y: number
) {}
/**
* A user/thing leaves the zone
*/
public leave(thing: Movable, newZone: Zone|null) {
public leave(thing: Movable, newZone: Zone | null) {
const result = this.things.delete(thing);
if (!result) {
if (thing instanceof User) {
throw new Error('Could not find user in zone '+thing.id);
throw new Error("Could not find user in zone " + thing.id);
}
if (thing instanceof Group) {
throw new Error('Could not find group '+thing.getId()+' in zone ('+this.x+','+this.y+'). Position of group: ('+thing.getPosition().x+','+thing.getPosition().y+')');
throw new Error(
"Could not find group " +
thing.getId() +
" in zone (" +
this.x +
"," +
this.y +
"). Position of group: (" +
thing.getPosition().x +
"," +
thing.getPosition().y +
")"
);
}
}
this.notifyLeft(thing, newZone);
}
@ -39,15 +54,13 @@ export class Zone {
/**
* Notify listeners of this zone that this user/thing left
*/
private notifyLeft(thing: Movable, newZone: Zone|null) {
private notifyLeft(thing: Movable, newZone: Zone | null) {
for (const listener of this.listeners) {
//if (listener !== thing && (newZone === null || !listener.listenedZones.has(newZone))) {
this.onLeaves(thing, newZone, listener);
//}
this.onLeaves(thing, newZone, listener);
}
}
public enter(thing: Movable, oldZone: Zone|null, position: PositionInterface) {
public enter(thing: Movable, oldZone: Zone | null, position: PositionInterface) {
this.things.add(thing);
this.notifyEnter(thing, oldZone, position);
}
@ -55,22 +68,12 @@ export class Zone {
/**
* Notify listeners of this zone that this user entered
*/
private notifyEnter(thing: Movable, oldZone: Zone|null, position: PositionInterface) {
private notifyEnter(thing: Movable, oldZone: Zone | null, position: PositionInterface) {
for (const listener of this.listeners) {
/*if (listener === thing) {
continue;
}
if (oldZone === null || !listener.listenedZones.has(oldZone)) {
this.onEnters(thing, listener);
} else {
this.onMoves(thing, position, listener);
}*/
this.onEnters(thing, oldZone, listener);
}
}
public move(thing: Movable, position: PositionInterface) {
if (!this.things.has(thing)) {
this.things.add(thing);
@ -80,33 +83,11 @@ export class Zone {
for (const listener of this.listeners) {
//if (listener !== thing) {
this.onMoves(thing,position, listener);
this.onMoves(thing, position, listener);
//}
}
}
/*public startListening(listener: User): void {
for (const thing of this.things) {
if (thing !== listener) {
this.onEnters(thing, listener);
}
}
this.listeners.add(listener);
listener.listenedZones.add(this);
}
public stopListening(listener: User): void {
for (const thing of this.things) {
if (thing !== listener) {
this.onLeaves(thing, listener);
}
}
this.listeners.delete(listener);
listener.listenedZones.delete(this);
}*/
public getThings(): Set<Movable> {
return this.things;
}
@ -119,4 +100,10 @@ export class Zone {
public removeListener(socket: ZoneSocket): void {
this.listeners.delete(socket);
}
public emitEmoteEvent(emoteEventMessage: EmoteEventMessage) {
for (const listener of this.listeners) {
this.onEmote(emoteEventMessage, listener);
}
}
}

View File

@ -1,99 +1,145 @@
import {IRoomManagerServer} from "./Messages/generated/messages_grpc_pb";
import { IRoomManagerServer } from "./Messages/generated/messages_grpc_pb";
import {
AdminGlobalMessage,
AdminMessage,
AdminPusherToBackMessage,
AdminRoomMessage,
BanMessage,
BatchToPusherMessage,
BatchToPusherRoomMessage,
EmotePromptMessage,
EmptyMessage,
ItemEventMessage,
JoinRoomMessage,
PlayGlobalMessage,
PusherToBackMessage,
QueryJitsiJwtMessage, RefreshRoomPromptMessage,
QueryJitsiJwtMessage,
RefreshRoomPromptMessage,
RoomMessage,
ServerToAdminClientMessage,
ServerToClientMessage,
SilentMessage,
UserMovesMessage,
WebRtcSignalToServerMessage, WorldFullWarningToRoomMessage,
ZoneMessage
VariableMessage,
WebRtcSignalToServerMessage,
WorldFullWarningToRoomMessage,
ZoneMessage,
} from "./Messages/generated/messages_pb";
import {sendUnaryData, ServerDuplexStream, ServerUnaryCall, ServerWritableStream} from "grpc";
import {socketManager} from "./Services/SocketManager";
import {emitError} from "./Services/MessageHelpers";
import {User, UserSocket} from "./Model/User";
import {GameRoom} from "./Model/GameRoom";
import { sendUnaryData, ServerDuplexStream, ServerUnaryCall, ServerWritableStream } from "grpc";
import { socketManager } from "./Services/SocketManager";
import { emitError, emitErrorOnRoomSocket, emitErrorOnZoneSocket } from "./Services/MessageHelpers";
import { User, UserSocket } from "./Model/User";
import { GameRoom } from "./Model/GameRoom";
import Debug from "debug";
import {Admin} from "./Model/Admin";
import { Admin } from "./Model/Admin";
const debug = Debug('roommanager');
const debug = Debug("roommanager");
export type AdminSocket = ServerDuplexStream<AdminPusherToBackMessage, ServerToAdminClientMessage>;
export type ZoneSocket = ServerWritableStream<ZoneMessage, ServerToClientMessage>;
export type ZoneSocket = ServerWritableStream<ZoneMessage, BatchToPusherMessage>;
export type RoomSocket = ServerWritableStream<RoomMessage, BatchToPusherRoomMessage>;
const roomManager: IRoomManagerServer = {
joinRoom: (call: UserSocket): void => {
console.log('joinRoom called');
console.log("joinRoom called");
let room: GameRoom|null = null;
let user: User|null = null;
let room: GameRoom | null = null;
let user: User | null = null;
call.on('data', (message: PusherToBackMessage) => {
try {
if (room === null || user === null) {
if (message.hasJoinroommessage()) {
socketManager.handleJoinRoom(call, message.getJoinroommessage() as JoinRoomMessage).then(({room: gameRoom, user: myUser}) => {
if (call.writable) {
room = gameRoom;
user = myUser;
} else {
//Connexion may have been closed before the init was finished, so we have to manually disconnect the user.
socketManager.leaveRoom(gameRoom, myUser);
call.on("data", (message: PusherToBackMessage) => {
(async () => {
try {
if (room === null || user === null) {
if (message.hasJoinroommessage()) {
socketManager
.handleJoinRoom(call, message.getJoinroommessage() as JoinRoomMessage)
.then(({ room: gameRoom, user: myUser }) => {
if (call.writable) {
room = gameRoom;
user = myUser;
} else {
//Connection may have been closed before the init was finished, so we have to manually disconnect the user.
socketManager.leaveRoom(gameRoom, myUser);
}
})
.catch((e) => emitError(call, e));
} else {
throw new Error("The first message sent MUST be of type JoinRoomMessage");
}
} else {
if (message.hasJoinroommessage()) {
throw new Error("Cannot call JoinRoomMessage twice!");
} else if (message.hasUsermovesmessage()) {
socketManager.handleUserMovesMessage(
room,
user,
message.getUsermovesmessage() as UserMovesMessage
);
} else if (message.hasSilentmessage()) {
socketManager.handleSilentMessage(room, user, message.getSilentmessage() as SilentMessage);
} else if (message.hasItemeventmessage()) {
socketManager.handleItemEvent(
room,
user,
message.getItemeventmessage() as ItemEventMessage
);
} else if (message.hasVariablemessage()) {
await socketManager.handleVariableEvent(
room,
user,
message.getVariablemessage() as VariableMessage
);
} else if (message.hasWebrtcsignaltoservermessage()) {
socketManager.emitVideo(
room,
user,
message.getWebrtcsignaltoservermessage() as WebRtcSignalToServerMessage
);
} else if (message.hasWebrtcscreensharingsignaltoservermessage()) {
socketManager.emitScreenSharing(
room,
user,
message.getWebrtcscreensharingsignaltoservermessage() as WebRtcSignalToServerMessage
);
} else if (message.hasPlayglobalmessage()) {
socketManager.emitPlayGlobalMessage(
room,
message.getPlayglobalmessage() as PlayGlobalMessage
);
} else if (message.hasQueryjitsijwtmessage()) {
socketManager.handleQueryJitsiJwtMessage(
user,
message.getQueryjitsijwtmessage() as QueryJitsiJwtMessage
);
} else if (message.hasEmotepromptmessage()) {
socketManager.handleEmoteEventMessage(
room,
user,
message.getEmotepromptmessage() as EmotePromptMessage
);
} else if (message.hasSendusermessage()) {
const sendUserMessage = message.getSendusermessage();
if (sendUserMessage !== undefined) {
socketManager.handlerSendUserMessage(user, sendUserMessage);
}
});
} else {
throw new Error('The first message sent MUST be of type JoinRoomMessage');
}
} else {
if (message.hasJoinroommessage()) {
throw new Error('Cannot call JoinRoomMessage twice!');
} else if (message.hasUsermovesmessage()) {
socketManager.handleUserMovesMessage(room, user, message.getUsermovesmessage() as UserMovesMessage);
} else if (message.hasSilentmessage()) {
socketManager.handleSilentMessage(room, user, message.getSilentmessage() as SilentMessage);
} else if (message.hasItemeventmessage()) {
socketManager.handleItemEvent(room, user, message.getItemeventmessage() as ItemEventMessage);
} else if (message.hasWebrtcsignaltoservermessage()) {
socketManager.emitVideo(room, user, message.getWebrtcsignaltoservermessage() as WebRtcSignalToServerMessage);
} else if (message.hasWebrtcscreensharingsignaltoservermessage()) {
socketManager.emitScreenSharing(room, user, message.getWebrtcscreensharingsignaltoservermessage() as WebRtcSignalToServerMessage);
} else if (message.hasPlayglobalmessage()) {
socketManager.emitPlayGlobalMessage(room, message.getPlayglobalmessage() as PlayGlobalMessage);
} else if (message.hasQueryjitsijwtmessage()){
socketManager.handleQueryJitsiJwtMessage(user, message.getQueryjitsijwtmessage() as QueryJitsiJwtMessage);
}else if (message.hasSendusermessage()) {
const sendUserMessage = message.getSendusermessage();
if(sendUserMessage !== undefined) {
socketManager.handlerSendUserMessage(user, sendUserMessage);
} else if (message.hasBanusermessage()) {
const banUserMessage = message.getBanusermessage();
if (banUserMessage !== undefined) {
socketManager.handlerBanUserMessage(room, user, banUserMessage);
}
} else {
throw new Error("Unhandled message type");
}
}else if (message.hasBanusermessage()) {
const banUserMessage = message.getBanusermessage();
if(banUserMessage !== undefined) {
socketManager.handlerBanUserMessage(room, user, banUserMessage);
}
} else {
throw new Error('Unhandled message type');
}
} catch (e) {
console.error(e);
emitError(call, e);
call.end();
}
} catch (e) {
emitError(call, e);
call.end();
}
})().catch((e) => console.error(e));
});
call.on('end', () => {
debug('joinRoom ended');
call.on("end", () => {
debug("joinRoom ended");
if (user !== null && room !== null) {
socketManager.leaveRoom(room, user);
}
@ -102,61 +148,96 @@ const roomManager: IRoomManagerServer = {
user = null;
});
call.on('error', (err: Error) => {
console.error('An error occurred in joinRoom stream:', err);
call.on("error", (err: Error) => {
console.error("An error occurred in joinRoom stream:", err);
});
},
listenZone(call: ZoneSocket): void {
debug('listenZone called');
debug("listenZone called");
const zoneMessage = call.request;
socketManager.addZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY());
socketManager
.addZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY())
.catch((e) => {
emitErrorOnZoneSocket(call, e.toString());
});
call.on('cancelled', () => {
debug('listenZone cancelled');
socketManager.removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY());
call.on("cancelled", () => {
debug("listenZone cancelled");
socketManager
.removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY())
.catch((e) => console.error(e));
call.end();
})
});
call.on('close', () => {
debug('listenZone connection closed');
socketManager.removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY());
}).on('error', (e) => {
console.error('An error occurred in listenZone stream:', e);
socketManager.removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY());
call.on("close", () => {
debug("listenZone connection closed");
socketManager
.removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY())
.catch((e) => console.error(e));
}).on("error", (e) => {
console.error("An error occurred in listenZone stream:", e);
socketManager
.removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY())
.catch((e) => console.error(e));
call.end();
});
},
listenRoom(call: RoomSocket): void {
debug("listenRoom called");
const roomMessage = call.request;
socketManager.addRoomListener(call, roomMessage.getRoomid()).catch((e) => {
emitErrorOnRoomSocket(call, e.toString());
});
call.on("cancelled", () => {
debug("listenRoom cancelled");
socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => console.error(e));
call.end();
});
call.on("close", () => {
debug("listenRoom connection closed");
socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => console.error(e));
}).on("error", (e) => {
console.error("An error occurred in listenRoom stream:", e);
socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => console.error(e));
call.end();
});
},
adminRoom(call: AdminSocket): void {
console.log('adminRoom called');
console.log("adminRoom called");
const admin = new Admin(call);
let room: GameRoom|null = null;
let room: GameRoom | null = null;
call.on('data', (message: AdminPusherToBackMessage) => {
call.on("data", (message: AdminPusherToBackMessage) => {
try {
if (room === null) {
if (message.hasSubscribetoroom()) {
const roomId = message.getSubscribetoroom();
socketManager.handleJoinAdminRoom(admin, roomId).then((gameRoom: GameRoom) => {
room = gameRoom;
});
socketManager
.handleJoinAdminRoom(admin, roomId)
.then((gameRoom: GameRoom) => {
room = gameRoom;
})
.catch((e) => console.error(e));
} else {
throw new Error('The first message sent MUST be of type JoinRoomMessage');
throw new Error("The first message sent MUST be of type JoinRoomMessage");
}
}
} catch (e) {
emitError(call, e);
call.end();
}
});
call.on('end', () => {
debug('joinRoom ended');
call.on("end", () => {
debug("joinRoom ended");
if (room !== null) {
socketManager.leaveAdminRoom(room, admin);
}
@ -164,39 +245,53 @@ const roomManager: IRoomManagerServer = {
room = null;
});
call.on('error', (err: Error) => {
console.error('An error occurred in joinAdminRoom stream:', err);
call.on("error", (err: Error) => {
console.error("An error occurred in joinAdminRoom stream:", err);
});
},
sendAdminMessage(call: ServerUnaryCall<AdminMessage>, callback: sendUnaryData<EmptyMessage>): void {
socketManager.sendAdminMessage(call.request.getRoomid(), call.request.getRecipientuuid(), call.request.getMessage());
socketManager
.sendAdminMessage(call.request.getRoomid(), call.request.getRecipientuuid(), call.request.getMessage())
.catch((e) => console.error(e));
callback(null, new EmptyMessage());
},
sendGlobalAdminMessage(call: ServerUnaryCall<AdminGlobalMessage>, callback: sendUnaryData<EmptyMessage>): void {
throw new Error('Not implemented yet');
throw new Error("Not implemented yet");
// TODO
callback(null, new EmptyMessage());
},
ban(call: ServerUnaryCall<BanMessage>, callback: sendUnaryData<EmptyMessage>): void {
// FIXME Work in progress
socketManager.banUser(call.request.getRoomid(), call.request.getRecipientuuid(), call.request.getMessage());
socketManager
.banUser(call.request.getRoomid(), call.request.getRecipientuuid(), call.request.getMessage())
.catch((e) => console.error(e));
callback(null, new EmptyMessage());
},
sendAdminMessageToRoom(call: ServerUnaryCall<AdminRoomMessage>, callback: sendUnaryData<EmptyMessage>): void {
socketManager.sendAdminRoomMessage(call.request.getRoomid(), call.request.getMessage());
// FIXME: we could improve return message by returning a Success|ErrorMessage message
socketManager
.sendAdminRoomMessage(call.request.getRoomid(), call.request.getMessage(), call.request.getType())
.catch((e) => console.error(e));
callback(null, new EmptyMessage());
},
sendWorldFullWarningToRoom(call: ServerUnaryCall<WorldFullWarningToRoomMessage>, callback: sendUnaryData<EmptyMessage>): void {
socketManager.dispatchWorlFullWarning(call.request.getRoomid());
sendWorldFullWarningToRoom(
call: ServerUnaryCall<WorldFullWarningToRoomMessage>,
callback: sendUnaryData<EmptyMessage>
): void {
// FIXME: we could improve return message by returning a Success|ErrorMessage message
socketManager.dispatchWorldFullWarning(call.request.getRoomid()).catch((e) => console.error(e));
callback(null, new EmptyMessage());
},
sendRefreshRoomPrompt(call: ServerUnaryCall<RefreshRoomPromptMessage>, callback: sendUnaryData<EmptyMessage>): void {
socketManager.dispatchRoomRefresh(call.request.getRoomid());
sendRefreshRoomPrompt(
call: ServerUnaryCall<RefreshRoomPromptMessage>,
callback: sendUnaryData<EmptyMessage>
): void {
// FIXME: we could improve return message by returning a Success|ErrorMessage message
socketManager.dispatchRoomRefresh(call.request.getRoomid()).catch((e) => console.error(e));
callback(null, new EmptyMessage());
},
};
export {roomManager};
export { roomManager };

View File

@ -1,13 +1,13 @@
import { App as _App, AppOptions } from 'uWebSockets.js';
import BaseApp from './baseapp';
import { extend } from './utils';
import { UwsApp } from './types';
import { App as _App, AppOptions } from "uWebSockets.js";
import BaseApp from "./baseapp";
import { extend } from "./utils";
import { UwsApp } from "./types";
class App extends (<UwsApp>_App) {
constructor(options: AppOptions = {}) {
super(options); // eslint-disable-line constructor-super
extend(this, new BaseApp());
}
constructor(options: AppOptions = {}) {
super(options); // eslint-disable-line constructor-super
extend(this, new BaseApp());
}
}
export default App;

View File

@ -1,116 +1,109 @@
import { Readable } from 'stream';
import { us_listen_socket_close, TemplatedApp, HttpResponse, HttpRequest } from 'uWebSockets.js';
import { Readable } from "stream";
import { us_listen_socket_close, TemplatedApp, HttpResponse, HttpRequest } from "uWebSockets.js";
import formData from './formdata';
import { stob } from './utils';
import { Handler } from './types';
import {join} from "path";
import formData from "./formdata";
import { stob } from "./utils";
import { Handler } from "./types";
import { join } from "path";
const contTypes = ['application/x-www-form-urlencoded', 'multipart/form-data'];
const contTypes = ["application/x-www-form-urlencoded", "multipart/form-data"];
const noOp = () => true;
const handleBody = (res: HttpResponse, req: HttpRequest) => {
const contType = req.getHeader('content-type');
const contType = req.getHeader("content-type");
res.bodyStream = function() {
const stream = new Readable();
stream._read = noOp; // eslint-disable-line @typescript-eslint/unbound-method
res.bodyStream = function () {
const stream = new Readable();
stream._read = noOp; // eslint-disable-line @typescript-eslint/unbound-method
this.onData((ab: ArrayBuffer, isLast: boolean) => {
// uint and then slicing is bit faster than slice and then uint
stream.push(new Uint8Array(ab.slice((ab as any).byteOffset, ab.byteLength))); // eslint-disable-line @typescript-eslint/no-explicit-any
if (isLast) {
stream.push(null);
}
});
this.onData((ab: ArrayBuffer, isLast: boolean) => {
// uint and then slicing is bit faster than slice and then uint
stream.push(new Uint8Array(ab.slice((ab as any).byteOffset, ab.byteLength))); // eslint-disable-line @typescript-eslint/no-explicit-any
if (isLast) {
stream.push(null);
}
});
return stream;
};
return stream;
};
res.body = () => stob(res.bodyStream());
res.body = () => stob(res.bodyStream());
if (contType.includes('application/json'))
res.json = async () => JSON.parse(await res.body());
if (contTypes.map(t => contType.includes(t)).includes(true))
res.formData = formData.bind(res, contType);
if (contType.includes("application/json")) res.json = async () => JSON.parse(await res.body());
if (contTypes.map((t) => contType.includes(t)).includes(true)) res.formData = formData.bind(res, contType);
};
class BaseApp {
_sockets = new Map();
ws!: TemplatedApp['ws'];
get!: TemplatedApp['get'];
_post!: TemplatedApp['post'];
_put!: TemplatedApp['put'];
_patch!: TemplatedApp['patch'];
_listen!: TemplatedApp['listen'];
_sockets = new Map();
ws!: TemplatedApp["ws"];
get!: TemplatedApp["get"];
_post!: TemplatedApp["post"];
_put!: TemplatedApp["put"];
_patch!: TemplatedApp["patch"];
_listen!: TemplatedApp["listen"];
post(pattern: string, handler: Handler) {
if (typeof handler !== 'function')
throw Error(`handler should be a function, given ${typeof handler}.`);
this._post(pattern, (res, req) => {
handleBody(res, req);
handler(res, req);
});
return this;
}
post(pattern: string, handler: Handler) {
if (typeof handler !== "function") throw Error(`handler should be a function, given ${typeof handler}.`);
this._post(pattern, (res, req) => {
handleBody(res, req);
handler(res, req);
});
return this;
}
put(pattern: string, handler: Handler) {
if (typeof handler !== 'function')
throw Error(`handler should be a function, given ${typeof handler}.`);
this._put(pattern, (res, req) => {
handleBody(res, req);
put(pattern: string, handler: Handler) {
if (typeof handler !== "function") throw Error(`handler should be a function, given ${typeof handler}.`);
this._put(pattern, (res, req) => {
handleBody(res, req);
handler(res, req);
});
return this;
}
handler(res, req);
});
return this;
}
patch(pattern: string, handler: Handler) {
if (typeof handler !== 'function')
throw Error(`handler should be a function, given ${typeof handler}.`);
this._patch(pattern, (res, req) => {
handleBody(res, req);
patch(pattern: string, handler: Handler) {
if (typeof handler !== "function") throw Error(`handler should be a function, given ${typeof handler}.`);
this._patch(pattern, (res, req) => {
handleBody(res, req);
handler(res, req);
});
return this;
}
handler(res, req);
});
return this;
}
listen(h: string | number, p: Function | number = noOp, cb?: Function) {
if (typeof p === 'number' && typeof h === 'string') {
this._listen(h, p, socket => {
this._sockets.set(p, socket);
if (cb === undefined) {
throw new Error('cb undefined');
listen(h: string | number, p: Function | number = noOp, cb?: Function) {
if (typeof p === "number" && typeof h === "string") {
this._listen(h, p, (socket) => {
this._sockets.set(p, socket);
if (cb === undefined) {
throw new Error("cb undefined");
}
cb(socket);
});
} else if (typeof h === "number" && typeof p === "function") {
this._listen(h, (socket) => {
this._sockets.set(h, socket);
p(socket);
});
} else {
throw Error("Argument types: (host: string, port: number, cb?: Function) | (port: number, cb?: Function)");
}
cb(socket);
});
} else if (typeof h === 'number' && typeof p === 'function') {
this._listen(h, socket => {
this._sockets.set(h, socket);
p(socket);
});
} else {
throw Error(
'Argument types: (host: string, port: number, cb?: Function) | (port: number, cb?: Function)'
);
return this;
}
return this;
}
close(port: null | number = null) {
if (port) {
this._sockets.has(port) && us_listen_socket_close(this._sockets.get(port));
this._sockets.delete(port);
} else {
this._sockets.forEach(app => {
us_listen_socket_close(app);
});
this._sockets.clear();
close(port: null | number = null) {
if (port) {
this._sockets.has(port) && us_listen_socket_close(this._sockets.get(port));
this._sockets.delete(port);
} else {
this._sockets.forEach((app) => {
us_listen_socket_close(app);
});
this._sockets.clear();
}
return this;
}
return this;
}
}
export default BaseApp;

View File

@ -1,100 +1,99 @@
import { createWriteStream } from 'fs';
import { join, dirname } from 'path';
import Busboy from 'busboy';
import mkdirp from 'mkdirp';
import { createWriteStream } from "fs";
import { join, dirname } from "path";
import Busboy from "busboy";
import mkdirp from "mkdirp";
function formData(
contType: string,
options: busboy.BusboyConfig & {
abortOnLimit?: boolean;
tmpDir?: string;
onFile?: (
fieldname: string,
file: NodeJS.ReadableStream,
filename: string,
encoding: string,
mimetype: string
) => string;
onField?: (fieldname: string, value: any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any
filename?: (oldName: string) => string;
} = {}
contType: string,
options: busboy.BusboyConfig & {
abortOnLimit?: boolean;
tmpDir?: string;
onFile?: (
fieldname: string,
file: NodeJS.ReadableStream,
filename: string,
encoding: string,
mimetype: string
) => string;
onField?: (fieldname: string, value: any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any
filename?: (oldName: string) => string;
} = {}
) {
console.log('Enter form data');
options.headers = {
'content-type': contType
};
console.log("Enter form data");
options.headers = {
"content-type": contType,
};
return new Promise((resolve, reject) => {
const busb = new Busboy(options);
const ret = {};
return new Promise((resolve, reject) => {
const busb = new Busboy(options);
const ret = {};
this.bodyStream().pipe(busb);
this.bodyStream().pipe(busb);
busb.on('limit', () => {
if (options.abortOnLimit) {
reject(Error('limit'));
}
busb.on("limit", () => {
if (options.abortOnLimit) {
reject(Error("limit"));
}
});
busb.on("file", function (fieldname, file, filename, encoding, mimetype) {
const value: { filePath: string | undefined; filename: string; encoding: string; mimetype: string } = {
filename,
encoding,
mimetype,
filePath: undefined,
};
if (typeof options.tmpDir === "string") {
if (typeof options.filename === "function") filename = options.filename(filename);
const fileToSave = join(options.tmpDir, filename);
mkdirp(dirname(fileToSave));
file.pipe(createWriteStream(fileToSave));
value.filePath = fileToSave;
}
if (typeof options.onFile === "function") {
value.filePath = options.onFile(fieldname, file, filename, encoding, mimetype) || value.filePath;
}
setRetValue(ret, fieldname, value);
});
busb.on("field", function (fieldname, value) {
if (typeof options.onField === "function") options.onField(fieldname, value);
setRetValue(ret, fieldname, value);
});
busb.on("finish", function () {
resolve(ret);
});
busb.on("error", reject);
});
busb.on('file', function(fieldname, file, filename, encoding, mimetype) {
const value: { filePath: string|undefined, filename: string, encoding:string, mimetype: string } = {
filename,
encoding,
mimetype,
filePath: undefined
};
if (typeof options.tmpDir === 'string') {
if (typeof options.filename === 'function') filename = options.filename(filename);
const fileToSave = join(options.tmpDir, filename);
mkdirp(dirname(fileToSave));
file.pipe(createWriteStream(fileToSave));
value.filePath = fileToSave;
}
if (typeof options.onFile === 'function') {
value.filePath =
options.onFile(fieldname, file, filename, encoding, mimetype) || value.filePath;
}
setRetValue(ret, fieldname, value);
});
busb.on('field', function(fieldname, value) {
if (typeof options.onField === 'function') options.onField(fieldname, value);
setRetValue(ret, fieldname, value);
});
busb.on('finish', function() {
resolve(ret);
});
busb.on('error', reject);
});
}
function setRetValue(
ret: { [x: string]: any }, // eslint-disable-line @typescript-eslint/no-explicit-any
fieldname: string,
value: { filename: string; encoding: string; mimetype: string; filePath?: string } | any // eslint-disable-line @typescript-eslint/no-explicit-any
ret: { [x: string]: any }, // eslint-disable-line @typescript-eslint/no-explicit-any
fieldname: string,
value: { filename: string; encoding: string; mimetype: string; filePath?: string } | any // eslint-disable-line @typescript-eslint/no-explicit-any
) {
if (fieldname.endsWith('[]')) {
fieldname = fieldname.slice(0, fieldname.length - 2);
if (Array.isArray(ret[fieldname])) {
ret[fieldname].push(value);
if (fieldname.endsWith("[]")) {
fieldname = fieldname.slice(0, fieldname.length - 2);
if (Array.isArray(ret[fieldname])) {
ret[fieldname].push(value);
} else {
ret[fieldname] = [value];
}
} else {
ret[fieldname] = [value];
if (Array.isArray(ret[fieldname])) {
ret[fieldname].push(value);
} else if (ret[fieldname]) {
ret[fieldname] = [ret[fieldname], value];
} else {
ret[fieldname] = value;
}
}
} else {
if (Array.isArray(ret[fieldname])) {
ret[fieldname].push(value);
} else if (ret[fieldname]) {
ret[fieldname] = [ret[fieldname], value];
} else {
ret[fieldname] = value;
}
}
}
export default formData;

View File

@ -1,13 +1,13 @@
import { SSLApp as _SSLApp, AppOptions } from 'uWebSockets.js';
import BaseApp from './baseapp';
import { extend } from './utils';
import { UwsApp } from './types';
import { SSLApp as _SSLApp, AppOptions } from "uWebSockets.js";
import BaseApp from "./baseapp";
import { extend } from "./utils";
import { UwsApp } from "./types";
class SSLApp extends (<UwsApp>_SSLApp) {
constructor(options: AppOptions) {
super(options); // eslint-disable-line constructor-super
extend(this, new BaseApp());
}
constructor(options: AppOptions) {
super(options); // eslint-disable-line constructor-super
extend(this, new BaseApp());
}
}
export default SSLApp;

View File

@ -1,9 +1,9 @@
import { AppOptions, TemplatedApp, HttpResponse, HttpRequest } from 'uWebSockets.js';
import { AppOptions, TemplatedApp, HttpResponse, HttpRequest } from "uWebSockets.js";
export type UwsApp = {
(options: AppOptions): TemplatedApp;
new (options: AppOptions): TemplatedApp;
prototype: TemplatedApp;
(options: AppOptions): TemplatedApp;
new (options: AppOptions): TemplatedApp;
prototype: TemplatedApp;
};
export type Handler = (res: HttpResponse, req: HttpRequest) => void;

View File

@ -1,37 +1,36 @@
import { ReadStream } from 'fs';
import { ReadStream } from "fs";
function extend(who: any, from: any, overwrite = true) { // eslint-disable-line @typescript-eslint/no-explicit-any
const ownProps = Object.getOwnPropertyNames(Object.getPrototypeOf(from)).concat(
Object.keys(from)
);
ownProps.forEach(prop => {
if (prop === 'constructor' || from[prop] === undefined) return;
if (who[prop] && overwrite) {
who[`_${prop}`] = who[prop];
}
if (typeof from[prop] === 'function') who[prop] = from[prop].bind(who);
else who[prop] = from[prop];
});
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function extend(who: any, from: any, overwrite = true) {
const ownProps = Object.getOwnPropertyNames(Object.getPrototypeOf(from)).concat(Object.keys(from));
ownProps.forEach((prop) => {
if (prop === "constructor" || from[prop] === undefined) return;
if (who[prop] && overwrite) {
who[`_${prop}`] = who[prop];
}
if (typeof from[prop] === "function") who[prop] = from[prop].bind(who);
else who[prop] = from[prop];
});
}
function stob(stream: ReadStream): Promise<Buffer> {
return new Promise(resolve => {
const buffers: Buffer[] = [];
stream.on('data', buffers.push.bind(buffers));
return new Promise((resolve) => {
const buffers: Buffer[] = [];
stream.on("data", buffers.push.bind(buffers));
stream.on('end', () => {
switch (buffers.length) {
case 0:
resolve(Buffer.allocUnsafe(0));
break;
case 1:
resolve(buffers[0]);
break;
default:
resolve(Buffer.concat(buffers));
}
stream.on("end", () => {
switch (buffers.length) {
case 0:
resolve(Buffer.allocUnsafe(0));
break;
case 1:
resolve(buffers[0]);
break;
default:
resolve(Buffer.concat(buffers));
}
});
});
});
}
export { extend, stob };

View File

@ -1,19 +1,19 @@
import { parse } from 'query-string';
import { HttpRequest } from 'uWebSockets.js';
import App from './server/app';
import SSLApp from './server/sslapp';
import * as types from './server/types';
import { parse } from "query-string";
import { HttpRequest } from "uWebSockets.js";
import App from "./server/app";
import SSLApp from "./server/sslapp";
import * as types from "./server/types";
const getQuery = (req: HttpRequest) => {
return parse(req.getQuery());
return parse(req.getQuery());
};
export { App, SSLApp, getQuery };
export * from './server/types';
export * from "./server/types";
export default {
App,
SSLApp,
getQuery,
...types
App,
SSLApp,
getQuery,
...types,
};

View File

@ -0,0 +1,24 @@
import { ADMIN_API_TOKEN, ADMIN_API_URL } from "../Enum/EnvironmentVariable";
import Axios from "axios";
import { MapDetailsData } from "./AdminApi/MapDetailsData";
import { RoomRedirect } from "./AdminApi/RoomRedirect";
class AdminApi {
async fetchMapDetails(playUri: string): Promise<MapDetailsData | RoomRedirect> {
if (!ADMIN_API_URL) {
return Promise.reject(new Error("No admin backoffice set!"));
}
const params: { playUri: string } = {
playUri,
};
const res = await Axios.get(ADMIN_API_URL + "/api/map", {
headers: { Authorization: `${ADMIN_API_TOKEN}` },
params,
});
return res.data;
}
}
export const adminApi = new AdminApi();

View File

@ -0,0 +1,11 @@
import * as tg from "generic-type-guard";
export const isCharacterTexture = new tg.IsInterface()
.withProperties({
id: tg.isNumber,
level: tg.isNumber,
url: tg.isString,
rights: tg.isString,
})
.get();
export type CharacterTexture = tg.GuardedType<typeof isCharacterTexture>;

View File

@ -0,0 +1,21 @@
import * as tg from "generic-type-guard";
import { isCharacterTexture } from "./CharacterTexture";
import { isAny, isNumber } from "generic-type-guard";
/*const isNumericEnum =
<T extends { [n: number]: string }>(vs: T) =>
(v: any): v is T =>
typeof v === "number" && v in vs;*/
export const isMapDetailsData = new tg.IsInterface()
.withProperties({
mapUrl: tg.isString,
policy_type: isNumber, //isNumericEnum(GameRoomPolicyTypes),
tags: tg.isArray(tg.isString),
textures: tg.isArray(isCharacterTexture),
})
.withOptionalProperties({
roomSlug: tg.isUnion(tg.isString, tg.isNull), // deprecated
})
.get();
export type MapDetailsData = tg.GuardedType<typeof isMapDetailsData>;

View File

@ -0,0 +1,8 @@
import * as tg from "generic-type-guard";
export const isRoomRedirect = new tg.IsInterface()
.withProperties({
redirectUrl: tg.isString,
})
.get();
export type RoomRedirect = tg.GuardedType<typeof isRoomRedirect>;

View File

@ -1,3 +1,3 @@
export const arrayIntersect = (array1: string[], array2: string[]) : boolean => {
return array1.filter(value => array2.includes(value)).length > 0;
}
export const arrayIntersect = (array1: string[], array2: string[]): boolean => {
return array1.filter((value) => array2.includes(value)).length > 0;
};

View File

@ -1,7 +1,7 @@
const EventEmitter = require('events');
const EventEmitter = require("events");
const clientJoinEvent = 'clientJoin';
const clientLeaveEvent = 'clientLeave';
const clientJoinEvent = "clientJoin";
const clientLeaveEvent = "clientLeave";
class ClientEventsEmitter extends EventEmitter {
emitClientJoin(clientUUid: string, roomId: string): void {

View File

@ -1,6 +1,6 @@
import {CPU_OVERHEAT_THRESHOLD} from "../Enum/EnvironmentVariable";
import { CPU_OVERHEAT_THRESHOLD } from "../Enum/EnvironmentVariable";
function secNSec2ms(secNSec: Array<number>|number) {
function secNSec2ms(secNSec: Array<number> | number) {
if (Array.isArray(secNSec)) {
return secNSec[0] * 1000 + secNSec[1] / 1000000;
}
@ -12,17 +12,17 @@ class CpuTracker {
private overHeating: boolean = false;
constructor() {
let time = process.hrtime.bigint()
let usage = process.cpuUsage()
let time = process.hrtime.bigint();
let usage = process.cpuUsage();
setInterval(() => {
const elapTime = process.hrtime.bigint();
const elapUsage = process.cpuUsage(usage)
usage = process.cpuUsage()
const elapUsage = process.cpuUsage(usage);
usage = process.cpuUsage();
const elapTimeMS = elapTime - time;
const elapUserMS = secNSec2ms(elapUsage.user)
const elapSystMS = secNSec2ms(elapUsage.system)
this.cpuPercent = Math.round(100 * (elapUserMS + elapSystMS) / Number(elapTimeMS) * 1000000)
const elapUserMS = secNSec2ms(elapUsage.user);
const elapSystMS = secNSec2ms(elapUsage.system);
this.cpuPercent = Math.round(((100 * (elapUserMS + elapSystMS)) / Number(elapTimeMS)) * 1000000);
time = elapTime;

View File

@ -1,4 +1,4 @@
import {Counter, Gauge} from "prom-client";
import { Counter, Gauge } from "prom-client";
//this class should manage all the custom metrics used by prometheus
class GaugeManager {
@ -10,29 +10,29 @@ class GaugeManager {
constructor() {
this.nbRoomsGauge = new Gauge({
name: 'workadventure_nb_rooms',
help: 'Number of active rooms'
name: "workadventure_nb_rooms",
help: "Number of active rooms",
});
this.nbClientsGauge = new Gauge({
name: 'workadventure_nb_sockets',
help: 'Number of connected sockets',
labelNames: [ ]
name: "workadventure_nb_sockets",
help: "Number of connected sockets",
labelNames: [],
});
this.nbClientsPerRoomGauge = new Gauge({
name: 'workadventure_nb_clients_per_room',
help: 'Number of clients per room',
labelNames: [ 'room' ]
name: "workadventure_nb_clients_per_room",
help: "Number of clients per room",
labelNames: ["room"],
});
this.nbGroupsPerRoomCounter = new Counter({
name: 'workadventure_counter_groups_per_room',
help: 'Counter of groups per room',
labelNames: [ 'room' ]
name: "workadventure_counter_groups_per_room",
help: "Counter of groups per room",
labelNames: ["room"],
});
this.nbGroupsPerRoomGauge = new Gauge({
name: 'workadventure_nb_groups_per_room',
help: 'Number of groups per room',
labelNames: [ 'room' ]
name: "workadventure_nb_groups_per_room",
help: "Number of groups per room",
labelNames: ["room"],
});
}
@ -52,15 +52,6 @@ class GaugeManager {
this.nbClientsGauge.dec();
this.nbClientsPerRoomGauge.dec({ room: roomId });
}
incNbGroupsPerRoomGauge(roomId: string): void {
this.nbGroupsPerRoomCounter.inc({ room: roomId })
this.nbGroupsPerRoomGauge.inc({ room: roomId })
}
decNbGroupsPerRoomGauge(roomId: string): void {
this.nbGroupsPerRoomGauge.dec({ room: roomId })
}
}
export const gaugeManager = new GaugeManager();

View File

@ -0,0 +1 @@
export class LocalUrlError extends Error {}

View File

View File

@ -0,0 +1,70 @@
import Axios from "axios";
import ipaddr from "ipaddr.js";
import { Resolver } from "dns";
import { promisify } from "util";
import { LocalUrlError } from "./LocalUrlError";
import { ITiledMap } from "@workadventure/tiled-map-type-guard";
import { isTiledMap } from "@workadventure/tiled-map-type-guard/dist";
import { STORE_VARIABLES_FOR_LOCAL_MAPS } from "../Enum/EnvironmentVariable";
class MapFetcher {
async fetchMap(mapUrl: string): Promise<ITiledMap> {
// Before trying to make the query, let's verify the map is actually on the open internet (and not a local test map)
if ((await this.isLocalUrl(mapUrl)) && !STORE_VARIABLES_FOR_LOCAL_MAPS) {
throw new LocalUrlError('URL for map "' + mapUrl + '" targets a local map');
}
// Note: mapUrl is provided by the client. A possible attack vector would be to use a rogue DNS server that
// returns local URLs. Alas, Axios cannot pin a URL to a given IP. So "isLocalUrl" and Axios.get could potentially
// target to different servers (and one could trick Axios.get into loading resources on the internal network
// despite isLocalUrl checking that.
// We can deem this problem not that important because:
// - We make sure we are only passing "GET" requests
// - The result of the query is never displayed to the end user
const res = await Axios.get(mapUrl, {
maxContentLength: 50 * 1024 * 1024, // Max content length: 50MB. Maps should not be bigger
timeout: 10000, // Timeout after 10 seconds
});
if (!isTiledMap(res.data)) {
//TODO fixme
//throw new Error("Invalid map format for map " + mapUrl);
console.error("Invalid map format for map " + mapUrl);
}
return res.data;
}
/**
* Returns true if the domain name is localhost of *.localhost
* Returns true if the domain name resolves to an IP address that is "private" (like 10.x.x.x or 192.168.x.x)
*
* @private
*/
async isLocalUrl(url: string): Promise<boolean> {
const urlObj = new URL(url);
if (urlObj.hostname === "localhost" || urlObj.hostname.endsWith(".localhost")) {
return true;
}
let addresses = [];
if (!ipaddr.isValid(urlObj.hostname)) {
const resolver = new Resolver();
addresses = await promisify(resolver.resolve).bind(resolver)(urlObj.hostname);
} else {
addresses = [urlObj.hostname];
}
for (const address of addresses) {
const addr = ipaddr.parse(address);
if (addr.range() !== "unicast") {
return true;
}
}
return false;
}
}
export const mapFetcher = new MapFetcher();

View File

@ -1,5 +1,14 @@
import {ErrorMessage, ServerToClientMessage} from "../Messages/generated/messages_pb";
import {UserSocket} from "_Model/User";
import {
BatchMessage,
BatchToPusherMessage,
BatchToPusherRoomMessage,
ErrorMessage,
ServerToClientMessage,
SubToPusherMessage,
SubToPusherRoomMessage,
} from "../Messages/generated/messages_pb";
import { UserSocket } from "_Model/User";
import { RoomSocket, ZoneSocket } from "../RoomManager";
export function emitError(Client: UserSocket, message: string): void {
const errorMessage = new ErrorMessage();
@ -9,7 +18,43 @@ export function emitError(Client: UserSocket, message: string): void {
serverToClientMessage.setErrormessage(errorMessage);
//if (!Client.disconnecting) {
Client.write(serverToClientMessage);
Client.write(serverToClientMessage);
//}
console.warn(message);
}
export function emitErrorOnRoomSocket(Client: RoomSocket, message: string): void {
console.error(message);
const errorMessage = new ErrorMessage();
errorMessage.setMessage(message);
const subToPusherRoomMessage = new SubToPusherRoomMessage();
subToPusherRoomMessage.setErrormessage(errorMessage);
const batchToPusherMessage = new BatchToPusherRoomMessage();
batchToPusherMessage.addPayload(subToPusherRoomMessage);
//if (!Client.disconnecting) {
Client.write(batchToPusherMessage);
//}
console.warn(message);
}
export function emitErrorOnZoneSocket(Client: ZoneSocket, message: string): void {
console.error(message);
const errorMessage = new ErrorMessage();
errorMessage.setMessage(message);
const subToPusherMessage = new SubToPusherMessage();
subToPusherMessage.setErrormessage(errorMessage);
const batchToPusherMessage = new BatchToPusherMessage();
batchToPusherMessage.addPayload(subToPusherMessage);
//if (!Client.disconnecting) {
Client.write(batchToPusherMessage);
//}
console.warn(message);
}

View File

@ -0,0 +1,23 @@
import { ClientOpts, createClient, RedisClient } from "redis";
import { REDIS_HOST, REDIS_PASSWORD, REDIS_PORT } from "../Enum/EnvironmentVariable";
let redisClient: RedisClient | null = null;
if (REDIS_HOST !== undefined) {
const config: ClientOpts = {
host: REDIS_HOST,
port: REDIS_PORT,
};
if (REDIS_PASSWORD) {
config.password = REDIS_PASSWORD;
}
redisClient = createClient(config);
redisClient.on("error", (err) => {
console.error("Error connecting to Redis:", err);
});
}
export { redisClient };

View File

@ -0,0 +1,43 @@
import { promisify } from "util";
import { RedisClient } from "redis";
import { VariablesRepositoryInterface } from "./VariablesRepositoryInterface";
/**
* Class in charge of saving/loading variables from the data store
*/
export class RedisVariablesRepository implements VariablesRepositoryInterface {
private readonly hgetall: OmitThisParameter<(arg1: string) => Promise<{ [p: string]: string }>>;
private readonly hset: OmitThisParameter<(arg1: [string, ...string[]]) => Promise<number>>;
private readonly hdel: OmitThisParameter<(arg1: string, arg2: string) => Promise<number>>;
constructor(private redisClient: RedisClient) {
/* eslint-disable @typescript-eslint/unbound-method */
this.hgetall = promisify(redisClient.hgetall).bind(redisClient);
this.hset = promisify(redisClient.hset).bind(redisClient);
this.hdel = promisify(redisClient.hdel).bind(redisClient);
/* eslint-enable @typescript-eslint/unbound-method */
}
/**
* Load all variables for a room.
*
* Note: in Redis, variables are stored in a hashmap and the key is the roomUrl
*/
async loadVariables(roomUrl: string): Promise<{ [key: string]: string }> {
return this.hgetall(roomUrl);
}
async saveVariable(roomUrl: string, key: string, value: string): Promise<number> {
// The value is passed to JSON.stringify client side. If value is "undefined", JSON.stringify returns "undefined"
// which is translated to empty string when fetching the value in the pusher.
// Therefore, empty string server side == undefined client side.
if (value === "") {
return this.hdel(roomUrl, key);
}
// TODO: SLOW WRITING EVERY 2 SECONDS WITH A TIMEOUT
// @ts-ignore See https://stackoverflow.com/questions/63539317/how-do-i-use-hmset-with-node-promisify
return this.hset(roomUrl, key, value);
}
}

View File

@ -0,0 +1,14 @@
import { RedisVariablesRepository } from "./RedisVariablesRepository";
import { redisClient } from "../RedisClient";
import { VoidVariablesRepository } from "./VoidVariablesRepository";
import { VariablesRepositoryInterface } from "./VariablesRepositoryInterface";
let variablesRepository: VariablesRepositoryInterface;
if (!redisClient) {
console.warn("WARNING: Redis isnot configured. No variables will be persisted.");
variablesRepository = new VoidVariablesRepository();
} else {
variablesRepository = new RedisVariablesRepository(redisClient);
}
export { variablesRepository };

View File

@ -0,0 +1,10 @@
export interface VariablesRepositoryInterface {
/**
* Load all variables for a room.
*
* Note: in Redis, variables are stored in a hashmap and the key is the roomUrl
*/
loadVariables(roomUrl: string): Promise<{ [key: string]: string }>;
saveVariable(roomUrl: string, key: string, value: string): Promise<number>;
}

View File

@ -0,0 +1,14 @@
import { VariablesRepositoryInterface } from "./VariablesRepositoryInterface";
/**
* Mock class in charge of NOT saving/loading variables from the data store
*/
export class VoidVariablesRepository implements VariablesRepositoryInterface {
loadVariables(roomUrl: string): Promise<{ [key: string]: string }> {
return Promise.resolve({});
}
saveVariable(roomUrl: string, key: string, value: string): Promise<number> {
return Promise.resolve(0);
}
}

View File

@ -1,4 +1,4 @@
import {GameRoom} from "../Model/GameRoom";
import { GameRoom } from "../Model/GameRoom";
import {
ItemEventMessage,
ItemStateMessage,
@ -26,45 +26,51 @@ import {
GroupLeftZoneMessage,
WorldFullWarningMessage,
UserLeftZoneMessage,
BanUserMessage, RefreshRoomMessage,
EmoteEventMessage,
BanUserMessage,
RefreshRoomMessage,
EmotePromptMessage,
VariableMessage,
BatchToPusherRoomMessage,
SubToPusherRoomMessage,
} from "../Messages/generated/messages_pb";
import {User, UserSocket} from "../Model/User";
import {ProtobufUtils} from "../Model/Websocket/ProtobufUtils";
import {Group} from "../Model/Group";
import {cpuTracker} from "./CpuTracker";
import { User, UserSocket } from "../Model/User";
import { ProtobufUtils } from "../Model/Websocket/ProtobufUtils";
import { Group } from "../Model/Group";
import { cpuTracker } from "./CpuTracker";
import {
GROUP_RADIUS,
JITSI_ISS,
MINIMUM_DISTANCE,
SECRET_JITSI_KEY,
TURN_STATIC_AUTH_SECRET
TURN_STATIC_AUTH_SECRET,
} from "../Enum/EnvironmentVariable";
import {Movable} from "../Model/Movable";
import {PositionInterface} from "../Model/PositionInterface";
import { Movable } from "../Model/Movable";
import { PositionInterface } from "../Model/PositionInterface";
import Jwt from "jsonwebtoken";
import {JITSI_URL} from "../Enum/EnvironmentVariable";
import {clientEventsEmitter} from "./ClientEventsEmitter";
import {gaugeManager} from "./GaugeManager";
import {ZoneSocket} from "../RoomManager";
import {Zone} from "_Model/Zone";
import { JITSI_URL } from "../Enum/EnvironmentVariable";
import { clientEventsEmitter } from "./ClientEventsEmitter";
import { gaugeManager } from "./GaugeManager";
import { RoomSocket, ZoneSocket } from "../RoomManager";
import { Zone } from "_Model/Zone";
import Debug from "debug";
import {Admin} from "_Model/Admin";
import { Admin } from "_Model/Admin";
import crypto from "crypto";
const debug = Debug('sockermanager');
const debug = Debug("sockermanager");
function emitZoneMessage(subMessage: SubToPusherMessage, socket: ZoneSocket): void {
// TODO: should we batch those every 100ms?
const batchMessage = new BatchToPusherMessage();
batchMessage.addPayload(subMessage);
socket.write(batchMessage);
}
export class SocketManager {
private rooms: Map<string, GameRoom> = new Map<string, GameRoom>();
//private rooms = new Map<string, GameRoom>();
// List of rooms in process of loading.
private roomsPromises = new Map<string, PromiseLike<GameRoom>>();
constructor() {
clientEventsEmitter.registerToClientJoin((clientUUid: string, roomId: string) => {
@ -75,16 +81,18 @@ export class SocketManager {
});
}
public async handleJoinRoom(socket: UserSocket, joinRoomMessage: JoinRoomMessage): Promise<{ room: GameRoom; user: User }> {
public async handleJoinRoom(
socket: UserSocket,
joinRoomMessage: JoinRoomMessage
): Promise<{ room: GameRoom; user: User }> {
//join new previous room
const {room, user} = await this.joinRoom(socket, joinRoomMessage);
const { room, user } = await this.joinRoom(socket, joinRoomMessage);
if (!socket.writable) {
console.warn('Socket was aborted');
console.warn("Socket was aborted");
return {
room,
user
user,
};
}
const roomJoinedMessage = new RoomJoinedMessage();
@ -98,6 +106,16 @@ export class SocketManager {
roomJoinedMessage.addItem(itemStateMessage);
}
const variables = await room.getVariablesForTags(user.tags);
for (const [name, value] of variables.entries()) {
const variableMessage = new VariableMessage();
variableMessage.setName(name);
variableMessage.setValue(value);
roomJoinedMessage.addVariable(variableMessage);
}
roomJoinedMessage.setCurrentuserid(user.id);
const serverToClientMessage = new ServerToClientMessage();
@ -106,37 +124,30 @@ export class SocketManager {
return {
room,
user
user,
};
}
handleUserMovesMessage(room: GameRoom, user: User, userMovesMessage: UserMovesMessage) {
try {
const userMoves = userMovesMessage.toObject();
const position = userMovesMessage.getPosition();
const userMoves = userMovesMessage.toObject();
const position = userMovesMessage.getPosition();
// If CPU is high, let's drop messages of users moving (we will only dispatch the final position)
if (cpuTracker.isOverHeating() && userMoves.position?.moving === true) {
return;
}
if (position === undefined) {
throw new Error('Position not found in message');
}
const viewport = userMoves.viewport;
if (viewport === undefined) {
throw new Error('Viewport not found in message');
}
// update position in the world
room.updatePosition(user, ProtobufUtils.toPointInterface(position));
//room.setViewport(client, client.viewport);
} catch (e) {
console.error('An error occurred on "user_position" event');
console.error(e);
// If CPU is high, let's drop messages of users moving (we will only dispatch the final position)
if (cpuTracker.isOverHeating() && userMoves.position?.moving === true) {
return;
}
if (position === undefined) {
throw new Error("Position not found in message");
}
const viewport = userMoves.viewport;
if (viewport === undefined) {
throw new Error("Viewport not found in message");
}
// update position in the world
room.updatePosition(user, ProtobufUtils.toPointInterface(position));
//room.setViewport(client, client.viewport);
}
// Useless now, will be useful again if we allow editing details in game
@ -155,39 +166,37 @@ export class SocketManager {
}*/
handleSilentMessage(room: GameRoom, user: User, silentMessage: SilentMessage) {
try {
room.setSilent(user, silentMessage.getSilent());
} catch (e) {
console.error('An error occurred on "handleSilentMessage"');
console.error(e);
}
room.setSilent(user, silentMessage.getSilent());
}
handleItemEvent(room: GameRoom, user: User, itemEventMessage: ItemEventMessage) {
const itemEvent = ProtobufUtils.toItemEvent(itemEventMessage);
try {
const subMessage = new SubMessage();
subMessage.setItemeventmessage(itemEventMessage);
const subMessage = new SubMessage();
subMessage.setItemeventmessage(itemEventMessage);
// Let's send the event without using the SocketIO room.
// TODO: move this in the GameRoom class.
for (const user of room.getUsers().values()) {
user.emitInBatch(subMessage);
}
room.setItemState(itemEvent.itemId, itemEvent.state);
} catch (e) {
console.error('An error occurred on "item_event"');
console.error(e);
// Let's send the event without using the SocketIO room.
// TODO: move this in the GameRoom class.
for (const user of room.getUsers().values()) {
user.emitInBatch(subMessage);
}
room.setItemState(itemEvent.itemId, itemEvent.state);
}
handleVariableEvent(room: GameRoom, user: User, variableMessage: VariableMessage): Promise<void> {
return room.setVariable(variableMessage.getName(), variableMessage.getValue(), user);
}
emitVideo(room: GameRoom, user: User, data: WebRtcSignalToServerMessage): void {
//send only at user
const remoteUser = room.getUsers().get(data.getReceiverid());
if (remoteUser === undefined) {
console.warn("While exchanging a WebRTC signal: client with id ", data.getReceiverid(), " does not exist. This might be a race condition.");
console.warn(
"While exchanging a WebRTC signal: client with id ",
data.getReceiverid(),
" does not exist. This might be a race condition."
);
return;
}
@ -195,8 +204,8 @@ export class SocketManager {
webrtcSignalToClient.setUserid(user.id);
webrtcSignalToClient.setSignal(data.getSignal());
// TODO: only compute credentials if data.signal.type === "offer"
if (TURN_STATIC_AUTH_SECRET !== '') {
const {username, password} = this.getTURNCredentials(''+user.id, TURN_STATIC_AUTH_SECRET);
if (TURN_STATIC_AUTH_SECRET !== "") {
const { username, password } = this.getTURNCredentials("" + user.id, TURN_STATIC_AUTH_SECRET);
webrtcSignalToClient.setWebrtcusername(username);
webrtcSignalToClient.setWebrtcpassword(password);
}
@ -205,7 +214,7 @@ export class SocketManager {
serverToClientMessage.setWebrtcsignaltoclientmessage(webrtcSignalToClient);
//if (!client.disconnecting) {
remoteUser.socket.write(serverToClientMessage);
remoteUser.socket.write(serverToClientMessage);
//}
}
@ -213,7 +222,11 @@ export class SocketManager {
//send only at user
const remoteUser = room.getUsers().get(data.getReceiverid());
if (remoteUser === undefined) {
console.warn("While exchanging a WEBRTC_SCREEN_SHARING signal: client with id ", data.getReceiverid(), " does not exist. This might be a race condition.");
console.warn(
"While exchanging a WEBRTC_SCREEN_SHARING signal: client with id ",
data.getReceiverid(),
" does not exist. This might be a race condition."
);
return;
}
@ -221,8 +234,8 @@ export class SocketManager {
webrtcSignalToClient.setUserid(user.id);
webrtcSignalToClient.setSignal(data.getSignal());
// TODO: only compute credentials if data.signal.type === "offer"
if (TURN_STATIC_AUTH_SECRET !== '') {
const {username, password} = this.getTURNCredentials(''+user.id, TURN_STATIC_AUTH_SECRET);
if (TURN_STATIC_AUTH_SECRET !== "") {
const { username, password } = this.getTURNCredentials("" + user.id, TURN_STATIC_AUTH_SECRET);
webrtcSignalToClient.setWebrtcusername(username);
webrtcSignalToClient.setWebrtcpassword(password);
}
@ -231,48 +244,62 @@ export class SocketManager {
serverToClientMessage.setWebrtcscreensharingsignaltoclientmessage(webrtcSignalToClient);
//if (!client.disconnecting) {
remoteUser.socket.write(serverToClientMessage);
remoteUser.socket.write(serverToClientMessage);
//}
}
leaveRoom(room: GameRoom, user: User){
leaveRoom(room: GameRoom, user: User) {
// leave previous room and world
try {
//user leave previous world
room.leave(user);
if (room.isEmpty()) {
this.rooms.delete(room.roomId);
this.roomsPromises.delete(room.roomUrl);
gaugeManager.decNbRoomGauge();
debug('Room is empty. Deleting room "%s"', room.roomId);
debug('Room is empty. Deleting room "%s"', room.roomUrl);
}
} finally {
clientEventsEmitter.emitClientLeave(user.uuid, room.roomId);
console.log('A user left');
clientEventsEmitter.emitClientLeave(user.uuid, room.roomUrl);
console.log("A user left");
}
}
async getOrCreateRoom(roomId: string): Promise<GameRoom> {
//check and create new world for a room
let world = this.rooms.get(roomId)
if(world === undefined){
world = new GameRoom(
//check and create new room
let roomPromise = this.roomsPromises.get(roomId);
if (roomPromise === undefined) {
roomPromise = GameRoom.create(
roomId,
(user: User, group: Group) => this.joinWebRtcRoom(user, group),
(user: User, group: Group) => this.disConnectedUser(user, group),
MINIMUM_DISTANCE,
GROUP_RADIUS,
(thing: Movable, fromZone: Zone|null, listener: ZoneSocket) => this.onZoneEnter(thing, fromZone, listener),
(thing: Movable, position:PositionInterface, listener: ZoneSocket) => this.onClientMove(thing, position, listener),
(thing: Movable, newZone: Zone|null, listener: ZoneSocket) => this.onClientLeave(thing, newZone, listener)
);
gaugeManager.incNbRoomGauge();
this.rooms.set(roomId, world);
(thing: Movable, fromZone: Zone | null, listener: ZoneSocket) =>
this.onZoneEnter(thing, fromZone, listener),
(thing: Movable, position: PositionInterface, listener: ZoneSocket) =>
this.onClientMove(thing, position, listener),
(thing: Movable, newZone: Zone | null, listener: ZoneSocket) =>
this.onClientLeave(thing, newZone, listener),
(emoteEventMessage: EmoteEventMessage, listener: ZoneSocket) =>
this.onEmote(emoteEventMessage, listener)
)
.then((gameRoom) => {
gaugeManager.incNbRoomGauge();
return gameRoom;
})
.catch((e) => {
this.roomsPromises.delete(roomId);
throw e;
});
this.roomsPromises.set(roomId, roomPromise);
}
return Promise.resolve(world)
return roomPromise;
}
private async joinRoom(socket: UserSocket, joinRoomMessage: JoinRoomMessage): Promise<{ room: GameRoom; user: User }> {
private async joinRoom(
socket: UserSocket,
joinRoomMessage: JoinRoomMessage
): Promise<{ room: GameRoom; user: User }> {
const roomId = joinRoomMessage.getRoomid();
const room = await socketManager.getOrCreateRoom(roomId);
@ -281,21 +308,25 @@ export class SocketManager {
const user = room.join(socket, joinRoomMessage);
clientEventsEmitter.emitClientJoin(user.uuid, roomId);
console.log(new Date().toISOString() + ' A user joined');
return {room, user};
console.log(new Date().toISOString() + " A user joined");
return { room, user };
}
private onZoneEnter(thing: Movable, fromZone: Zone|null, listener: ZoneSocket) {
private onZoneEnter(thing: Movable, fromZone: Zone | null, listener: ZoneSocket) {
if (thing instanceof User) {
const userJoinedZoneMessage = new UserJoinedZoneMessage();
if (!Number.isInteger(thing.id)) {
throw new Error('clientUser.userId is not an integer '+thing.id);
throw new Error("clientUser.userId is not an integer " + thing.id);
}
userJoinedZoneMessage.setUserid(thing.id);
userJoinedZoneMessage.setUseruuid(thing.uuid);
userJoinedZoneMessage.setName(thing.name);
userJoinedZoneMessage.setCharacterlayersList(ProtobufUtils.toCharacterLayerMessages(thing.characterLayers));
userJoinedZoneMessage.setPosition(ProtobufUtils.toPositionMessage(thing.getPosition()));
userJoinedZoneMessage.setFromzone(this.toProtoZone(fromZone));
if (thing.visitCardUrl) {
userJoinedZoneMessage.setVisitcardurl(thing.visitCardUrl);
}
userJoinedZoneMessage.setCompanion(thing.companion);
const subMessage = new SubToPusherMessage();
@ -306,11 +337,11 @@ export class SocketManager {
} else if (thing instanceof Group) {
this.emitCreateUpdateGroupEvent(listener, fromZone, thing);
} else {
console.error('Unexpected type for Movable.');
console.error("Unexpected type for Movable.");
}
}
private onClientMove(thing: Movable, position:PositionInterface, listener: ZoneSocket): void {
private onClientMove(thing: Movable, position: PositionInterface, listener: ZoneSocket): void {
if (thing instanceof User) {
const userMovedMessage = new UserMovedMessage();
userMovedMessage.setUserid(thing.id);
@ -325,21 +356,28 @@ export class SocketManager {
} else if (thing instanceof Group) {
this.emitCreateUpdateGroupEvent(listener, null, thing);
} else {
console.error('Unexpected type for Movable.');
console.error("Unexpected type for Movable.");
}
}
private onClientLeave(thing: Movable, newZone: Zone|null, listener: ZoneSocket) {
private onClientLeave(thing: Movable, newZone: Zone | null, listener: ZoneSocket) {
if (thing instanceof User) {
this.emitUserLeftEvent(listener, thing.id, newZone);
} else if (thing instanceof Group) {
this.emitDeleteGroupEvent(listener, thing.getId(), newZone);
} else {
console.error('Unexpected type for Movable.');
console.error("Unexpected type for Movable.");
}
}
private emitCreateUpdateGroupEvent(client: ZoneSocket, fromZone: Zone|null, group: Group): void {
private onEmote(emoteEventMessage: EmoteEventMessage, client: ZoneSocket) {
const subMessage = new SubToPusherMessage();
subMessage.setEmoteeventmessage(emoteEventMessage);
emitZoneMessage(subMessage, client);
}
private emitCreateUpdateGroupEvent(client: ZoneSocket, fromZone: Zone | null, group: Group): void {
const position = group.getPosition();
const pointMessage = new PointMessage();
pointMessage.setX(Math.floor(position.x));
@ -357,7 +395,7 @@ export class SocketManager {
//client.emitInBatch(subMessage);
}
private emitDeleteGroupEvent(client: ZoneSocket, groupId: number, newZone: Zone|null): void {
private emitDeleteGroupEvent(client: ZoneSocket, groupId: number, newZone: Zone | null): void {
const groupDeleteMessage = new GroupLeftZoneMessage();
groupDeleteMessage.setGroupid(groupId);
groupDeleteMessage.setTozone(this.toProtoZone(newZone));
@ -369,7 +407,7 @@ export class SocketManager {
//user.emitInBatch(subMessage);
}
private emitUserLeftEvent(client: ZoneSocket, userId: number, newZone: Zone|null): void {
private emitUserLeftEvent(client: ZoneSocket, userId: number, newZone: Zone | null): void {
const userLeftMessage = new UserLeftZoneMessage();
userLeftMessage.setUserid(userId);
userLeftMessage.setTozone(this.toProtoZone(newZone));
@ -380,7 +418,7 @@ export class SocketManager {
emitZoneMessage(subMessage, client);
}
private toProtoZone(zone: Zone|null): ProtoZone|undefined {
private toProtoZone(zone: Zone | null): ProtoZone | undefined {
if (zone !== null) {
const zoneMessage = new ProtoZone();
zoneMessage.setX(zone.x);
@ -391,7 +429,6 @@ export class SocketManager {
}
private joinWebRtcRoom(user: User, group: Group) {
for (const otherUser of group.getUsers()) {
if (user === otherUser) {
continue;
@ -400,10 +437,9 @@ export class SocketManager {
// Let's send 2 messages: one to the user joining the group and one to the other user
const webrtcStartMessage1 = new WebRtcStartMessage();
webrtcStartMessage1.setUserid(otherUser.id);
webrtcStartMessage1.setName(otherUser.name);
webrtcStartMessage1.setInitiator(true);
if (TURN_STATIC_AUTH_SECRET !== '') {
const {username, password} = this.getTURNCredentials(''+otherUser.id, TURN_STATIC_AUTH_SECRET);
if (TURN_STATIC_AUTH_SECRET !== "") {
const { username, password } = this.getTURNCredentials("" + otherUser.id, TURN_STATIC_AUTH_SECRET);
webrtcStartMessage1.setWebrtcusername(username);
webrtcStartMessage1.setWebrtcpassword(password);
}
@ -411,17 +447,13 @@ export class SocketManager {
const serverToClientMessage1 = new ServerToClientMessage();
serverToClientMessage1.setWebrtcstartmessage(webrtcStartMessage1);
//if (!user.socket.disconnecting) {
user.socket.write(serverToClientMessage1);
//console.log('Sending webrtcstart initiator to '+user.socket.userId)
//}
user.socket.write(serverToClientMessage1);
const webrtcStartMessage2 = new WebRtcStartMessage();
webrtcStartMessage2.setUserid(user.id);
webrtcStartMessage2.setName(user.name);
webrtcStartMessage2.setInitiator(false);
if (TURN_STATIC_AUTH_SECRET !== '') {
const {username, password} = this.getTURNCredentials(''+user.id, TURN_STATIC_AUTH_SECRET);
if (TURN_STATIC_AUTH_SECRET !== "") {
const { username, password } = this.getTURNCredentials("" + user.id, TURN_STATIC_AUTH_SECRET);
webrtcStartMessage2.setWebrtcusername(username);
webrtcStartMessage2.setWebrtcpassword(password);
}
@ -429,11 +461,7 @@ export class SocketManager {
const serverToClientMessage2 = new ServerToClientMessage();
serverToClientMessage2.setWebrtcstartmessage(webrtcStartMessage2);
//if (!otherUser.socket.disconnecting) {
otherUser.socket.write(serverToClientMessage2);
//console.log('Sending webrtcstart to '+otherUser.socket.userId)
//}
otherUser.socket.write(serverToClientMessage2);
}
}
@ -442,17 +470,17 @@ export class SocketManager {
* and the Coturn server.
* The Coturn server should be initialized with parameters: `--use-auth-secret --static-auth-secret=MySecretKey`
*/
private getTURNCredentials(name: string, secret: string): {username: string, password: string} {
const unixTimeStamp = Math.floor(Date.now()/1000) + 4*3600; // this credential would be valid for the next 4 hours
const username = [unixTimeStamp, name].join(':');
const hmac = crypto.createHmac('sha1', secret);
hmac.setEncoding('base64');
private getTURNCredentials(name: string, secret: string): { username: string; password: string } {
const unixTimeStamp = Math.floor(Date.now() / 1000) + 4 * 3600; // this credential would be valid for the next 4 hours
const username = [unixTimeStamp, name].join(":");
const hmac = crypto.createHmac("sha1", secret);
hmac.setEncoding("base64");
hmac.write(username);
hmac.end();
const password = hmac.read();
return {
username: username,
password: password
password: password,
};
}
@ -475,10 +503,9 @@ export class SocketManager {
serverToClientMessage1.setWebrtcdisconnectmessage(webrtcDisconnectMessage1);
//if (!otherUser.socket.disconnecting) {
otherUser.socket.write(serverToClientMessage1);
otherUser.socket.write(serverToClientMessage1);
//}
const webrtcDisconnectMessage2 = new WebRtcDisconnectMessage();
webrtcDisconnectMessage2.setUserid(otherUser.id);
@ -486,57 +513,53 @@ export class SocketManager {
serverToClientMessage2.setWebrtcdisconnectmessage(webrtcDisconnectMessage2);
//if (!user.socket.disconnecting) {
user.socket.write(serverToClientMessage2);
user.socket.write(serverToClientMessage2);
//}
}
}
emitPlayGlobalMessage(room: GameRoom, playGlobalMessage: PlayGlobalMessage) {
try {
const serverToClientMessage = new ServerToClientMessage();
serverToClientMessage.setPlayglobalmessage(playGlobalMessage);
const serverToClientMessage = new ServerToClientMessage();
serverToClientMessage.setPlayglobalmessage(playGlobalMessage);
for (const [id, user] of room.getUsers().entries()) {
user.socket.write(serverToClientMessage);
}
} catch (e) {
console.error('An error occurred on "emitPlayGlobalMessage" event');
console.error(e);
for (const [id, user] of room.getUsers().entries()) {
user.socket.write(serverToClientMessage);
}
}
public getWorlds(): Map<string, GameRoom> {
return this.rooms;
public getWorlds(): Map<string, PromiseLike<GameRoom>> {
return this.roomsPromises;
}
public handleQueryJitsiJwtMessage(user: User, queryJitsiJwtMessage: QueryJitsiJwtMessage) {
const room = queryJitsiJwtMessage.getJitsiroom();
const tag = queryJitsiJwtMessage.getTag(); // FIXME: this is not secure. We should load the JSON for the current room and check rights associated to room instead.
if (SECRET_JITSI_KEY === '') {
throw new Error('You must set the SECRET_JITSI_KEY key to the secret to generate JWT tokens for Jitsi.');
if (SECRET_JITSI_KEY === "") {
throw new Error("You must set the SECRET_JITSI_KEY key to the secret to generate JWT tokens for Jitsi.");
}
// Let's see if the current client has
const isAdmin = user.tags.includes(tag);
const jwt = Jwt.sign({
"aud": "jitsi",
"iss": JITSI_ISS,
"sub": JITSI_URL,
"room": room,
"moderator": isAdmin
}, SECRET_JITSI_KEY, {
expiresIn: '1d',
algorithm: "HS256",
header:
{
"alg": "HS256",
"typ": "JWT"
}
});
const jwt = Jwt.sign(
{
aud: "jitsi",
iss: JITSI_ISS,
sub: JITSI_URL,
room: room,
moderator: isAdmin,
},
SECRET_JITSI_KEY,
{
expiresIn: "1d",
algorithm: "HS256",
header: {
alg: "HS256",
typ: "JWT",
},
}
);
const sendJitsiJwtMessage = new SendJitsiJwtMessage();
sendJitsiJwtMessage.setJitsiroom(room);
@ -548,7 +571,7 @@ export class SocketManager {
user.socket.write(serverToClientMessage);
}
public handlerSendUserMessage(user: User, sendUserMessageToSend: SendUserMessage){
public handlerSendUserMessage(user: User, sendUserMessageToSend: SendUserMessage) {
const sendUserMessage = new SendUserMessage();
sendUserMessage.setMessage(sendUserMessageToSend.getMessage());
sendUserMessage.setType(sendUserMessageToSend.getType());
@ -558,7 +581,7 @@ export class SocketManager {
user.socket.write(serverToClientMessage);
}
public handlerBanUserMessage(room: GameRoom, user: User, banUserMessageToSend: BanUserMessage){
public handlerBanUserMessage(room: GameRoom, user: User, banUserMessageToSend: BanUserMessage) {
const banUserMessage = new BanUserMessage();
banUserMessage.setMessage(banUserMessageToSend.getMessage());
banUserMessage.setType(banUserMessageToSend.getType());
@ -575,11 +598,10 @@ export class SocketManager {
}, 10000);
}
public addZoneListener(call: ZoneSocket, roomId: string, x: number, y: number): void {
const room = this.rooms.get(roomId);
public async addZoneListener(call: ZoneSocket, roomId: string, x: number, y: number): Promise<void> {
const room = await this.roomsPromises.get(roomId);
if (!room) {
console.error("In addZoneListener, could not find room with id '" + roomId + "'");
return;
throw new Error("In addZoneListener, could not find room with id '" + roomId + "'");
}
const things = room.addZoneListener(call, x, y);
@ -590,9 +612,13 @@ export class SocketManager {
if (thing instanceof User) {
const userJoinedMessage = new UserJoinedZoneMessage();
userJoinedMessage.setUserid(thing.id);
userJoinedMessage.setUseruuid(thing.uuid);
userJoinedMessage.setName(thing.name);
userJoinedMessage.setCharacterlayersList(ProtobufUtils.toCharacterLayerMessages(thing.characterLayers));
userJoinedMessage.setPosition(ProtobufUtils.toPositionMessage(thing.getPosition()));
if (thing.visitCardUrl) {
userJoinedMessage.setVisitcardurl(thing.visitCardUrl);
}
userJoinedMessage.setCompanion(thing.companion);
const subMessage = new SubToPusherMessage();
@ -616,16 +642,37 @@ export class SocketManager {
call.write(batchMessage);
}
removeZoneListener(call: ZoneSocket, roomId: string, x: number, y: number) {
const room = this.rooms.get(roomId);
async removeZoneListener(call: ZoneSocket, roomId: string, x: number, y: number): Promise<void> {
const room = await this.roomsPromises.get(roomId);
if (!room) {
console.error("In removeZoneListener, could not find room with id '" + roomId + "'");
return;
throw new Error("In removeZoneListener, could not find room with id '" + roomId + "'");
}
room.removeZoneListener(call, x, y);
}
async addRoomListener(call: RoomSocket, roomId: string) {
const room = await this.getOrCreateRoom(roomId);
if (!room) {
throw new Error("In addRoomListener, could not find room with id '" + roomId + "'");
}
room.addRoomListener(call);
const batchMessage = new BatchToPusherRoomMessage();
call.write(batchMessage);
}
async removeRoomListener(call: RoomSocket, roomId: string) {
const room = await this.roomsPromises.get(roomId);
if (!room) {
throw new Error("In removeRoomListener, could not find room with id '" + roomId + "'");
}
room.removeRoomListener(call);
}
public async handleJoinAdminRoom(admin: Admin, roomId: string): Promise<GameRoom> {
const room = await socketManager.getOrCreateRoom(roomId);
@ -634,79 +681,102 @@ export class SocketManager {
return room;
}
public leaveAdminRoom(room: GameRoom, admin: Admin){
public leaveAdminRoom(room: GameRoom, admin: Admin) {
room.adminLeave(admin);
if (room.isEmpty()) {
this.rooms.delete(room.roomId);
this.roomsPromises.delete(room.roomUrl);
gaugeManager.decNbRoomGauge();
debug('Room is empty. Deleting room "%s"', room.roomId);
debug('Room is empty. Deleting room "%s"', room.roomUrl);
}
}
public sendAdminMessage(roomId: string, recipientUuid: string, message: string): void {
const room = this.rooms.get(roomId);
public async sendAdminMessage(roomId: string, recipientUuid: string, message: string): Promise<void> {
const room = await this.roomsPromises.get(roomId);
if (!room) {
console.error("In sendAdminMessage, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?");
console.error(
"In sendAdminMessage, could not find room with id '" +
roomId +
"'. Maybe the room was closed a few milliseconds ago and there was a race condition?"
);
return;
}
const recipient = room.getUserByUuid(recipientUuid);
if (recipient === undefined) {
console.error("In sendAdminMessage, could not find user with id '" + recipientUuid + "'. Maybe the user left the room a few milliseconds ago and there was a race condition?");
const recipients = room.getUsersByUuid(recipientUuid);
if (recipients.length === 0) {
console.error(
"In sendAdminMessage, could not find user with id '" +
recipientUuid +
"'. Maybe the user left the room a few milliseconds ago and there was a race condition?"
);
return;
}
const sendUserMessage = new SendUserMessage();
sendUserMessage.setMessage(message);
sendUserMessage.setType('ban'); //todo: is the type correct?
for (const recipient of recipients) {
const sendUserMessage = new SendUserMessage();
sendUserMessage.setMessage(message);
sendUserMessage.setType("ban"); //todo: is the type correct?
const serverToClientMessage = new ServerToClientMessage();
serverToClientMessage.setSendusermessage(sendUserMessage);
const serverToClientMessage = new ServerToClientMessage();
serverToClientMessage.setSendusermessage(sendUserMessage);
recipient.socket.write(serverToClientMessage);
recipient.socket.write(serverToClientMessage);
}
}
public banUser(roomId: string, recipientUuid: string, message: string): void {
const room = this.rooms.get(roomId);
public async banUser(roomId: string, recipientUuid: string, message: string): Promise<void> {
const room = await this.roomsPromises.get(roomId);
if (!room) {
console.error("In banUser, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?");
console.error(
"In banUser, could not find room with id '" +
roomId +
"'. Maybe the room was closed a few milliseconds ago and there was a race condition?"
);
return;
}
const recipient = room.getUserByUuid(recipientUuid);
if (recipient === undefined) {
console.error("In banUser, could not find user with id '" + recipientUuid + "'. Maybe the user left the room a few milliseconds ago and there was a race condition?");
const recipients = room.getUsersByUuid(recipientUuid);
if (recipients.length === 0) {
console.error(
"In banUser, could not find user with id '" +
recipientUuid +
"'. Maybe the user left the room a few milliseconds ago and there was a race condition?"
);
return;
}
// Let's leave the room now.
room.leave(recipient);
for (const recipient of recipients) {
// Let's leave the room now.
room.leave(recipient);
const banUserMessage = new BanUserMessage();
banUserMessage.setMessage(message);
banUserMessage.setType('banned');
const banUserMessage = new BanUserMessage();
banUserMessage.setMessage(message);
banUserMessage.setType("banned");
const serverToClientMessage = new ServerToClientMessage();
serverToClientMessage.setBanusermessage(banUserMessage);
const serverToClientMessage = new ServerToClientMessage();
serverToClientMessage.setBanusermessage(banUserMessage);
// Let's close the connection when the user is banned.
recipient.socket.write(serverToClientMessage);
recipient.socket.end();
// Let's close the connection when the user is banned.
recipient.socket.write(serverToClientMessage);
recipient.socket.end();
}
}
sendAdminRoomMessage(roomId: string, message: string) {
const room = this.rooms.get(roomId);
async sendAdminRoomMessage(roomId: string, message: string, type: string) {
const room = await this.roomsPromises.get(roomId);
if (!room) {
//todo: this should cause the http call to return a 500
console.error("In sendAdminRoomMessage, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?");
console.error(
"In sendAdminRoomMessage, could not find room with id '" +
roomId +
"'. Maybe the room was closed a few milliseconds ago and there was a race condition?"
);
return;
}
room.getUsers().forEach((recipient) => {
const sendUserMessage = new SendUserMessage();
sendUserMessage.setMessage(message);
sendUserMessage.setType('message');
sendUserMessage.setType(type);
const clientMessage = new ServerToClientMessage();
clientMessage.setSendusermessage(sendUserMessage);
@ -715,11 +785,15 @@ export class SocketManager {
});
}
dispatchWorlFullWarning(roomId: string,): void {
const room = this.rooms.get(roomId);
async dispatchWorldFullWarning(roomId: string): Promise<void> {
const room = await this.roomsPromises.get(roomId);
if (!room) {
//todo: this should cause the http call to return a 500
console.error("In sendAdminRoomMessage, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?");
console.error(
"In dispatchWorldFullWarning, could not find room with id '" +
roomId +
"'. Maybe the room was closed a few milliseconds ago and there was a race condition?"
);
return;
}
@ -733,8 +807,8 @@ export class SocketManager {
});
}
dispatchRoomRefresh(roomId: string,): void {
const room = this.rooms.get(roomId);
async dispatchRoomRefresh(roomId: string): Promise<void> {
const room = await this.roomsPromises.get(roomId);
if (!room) {
return;
}
@ -742,8 +816,8 @@ export class SocketManager {
const versionNumber = room.incrementVersion();
room.getUsers().forEach((recipient) => {
const worldFullMessage = new RefreshRoomMessage();
worldFullMessage.setRoomid(roomId)
worldFullMessage.setVersionnumber(versionNumber)
worldFullMessage.setRoomid(roomId);
worldFullMessage.setVersionnumber(versionNumber);
const clientMessage = new ServerToClientMessage();
clientMessage.setRefreshroommessage(worldFullMessage);
@ -751,6 +825,13 @@ export class SocketManager {
recipient.socket.write(clientMessage);
});
}
handleEmoteEventMessage(room: GameRoom, user: User, emotePromptMessage: EmotePromptMessage) {
const emoteEventMessage = new EmoteEventMessage();
emoteEventMessage.setEmote(emotePromptMessage.getEmote());
emoteEventMessage.setActoruserid(user.id);
room.emitEmoteEvent(user, emoteEventMessage);
}
}
export const socketManager = new SocketManager();

View File

@ -0,0 +1,9 @@
/**
* Errors related to variable handling.
*/
export class VariableError extends Error {
constructor(message: string) {
super(message);
Object.setPrototypeOf(this, VariableError.prototype);
}
}

View File

@ -0,0 +1,234 @@
/**
* Handles variables shared between the scripting API and the server.
*/
import {
ITiledMap,
ITiledMapLayer,
ITiledMapObject,
ITiledMapObjectLayer,
} from "@workadventure/tiled-map-type-guard/dist";
import { User } from "_Model/User";
import { variablesRepository } from "./Repository/VariablesRepository";
import { redisClient } from "./RedisClient";
import { VariableError } from "./VariableError";
interface Variable {
defaultValue?: string;
persist?: boolean;
readableBy?: string;
writableBy?: string;
}
export class VariablesManager {
/**
* The actual values of the variables for the current room
*/
private _variables = new Map<string, string>();
/**
* The list of variables that are allowed
*/
private variableObjects: Map<string, Variable> | undefined;
/**
* @param map The map can be "null" if it is hosted on a private network. In this case, we assume this is a test setup and bypass any server-side checks.
*/
constructor(private roomUrl: string, private map: ITiledMap | null) {
// 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)
if (map) {
this.variableObjects = VariablesManager.findVariablesInMap(map);
// Let's initialize default values
for (const [name, variableObject] of this.variableObjects.entries()) {
if (variableObject.defaultValue !== undefined) {
this._variables.set(name, variableObject.defaultValue);
}
}
}
}
/**
* Let's load data from the Redis backend.
*/
public async init(): Promise<VariablesManager> {
if (!this.shouldPersist()) {
return this;
}
const variables = await variablesRepository.loadVariables(this.roomUrl);
for (const key in variables) {
// Let's only set variables if they are in the map (if the map has changed, maybe stored variables do not exist anymore)
if (this.variableObjects) {
const variableObject = this.variableObjects.get(key);
if (variableObject === undefined) {
continue;
}
if (!variableObject.persist) {
continue;
}
}
this._variables.set(key, variables[key]);
}
return this;
}
/**
* Returns true if saving should be enabled, and false otherwise.
*
* Saving is enabled if REDIS_HOST is set
* unless we are editing a local map
* unless we are in dev mode in which case it is ok to save
*
* @private
*/
private shouldPersist(): boolean {
return redisClient !== null && (this.map !== null || process.env.NODE_ENV === "development");
}
private static findVariablesInMap(map: ITiledMap): Map<string, Variable> {
const objects = new Map<string, Variable>();
for (const layer of map.layers) {
this.recursiveFindVariablesInLayer(layer, objects);
}
return objects;
}
private static recursiveFindVariablesInLayer(layer: ITiledMapLayer, objects: Map<string, Variable>): void {
if (layer.type === "objectgroup") {
for (const object of layer.objects) {
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.'
);
continue;
}
// We store a copy of the object (to make it immutable)
objects.set(object.name, this.iTiledObjectToVariable(object));
}
}
} else if (layer.type === "group") {
for (const innerLayer of layer.layers) {
this.recursiveFindVariablesInLayer(innerLayer, objects);
}
}
}
private static iTiledObjectToVariable(object: ITiledMapObject): Variable {
const variable: Variable = {};
if (object.properties) {
for (const property of object.properties) {
const value = property.value;
switch (property.name) {
case "default":
variable.defaultValue = JSON.stringify(value);
break;
case "persist":
if (typeof value !== "boolean") {
throw new Error('The persist property of variable "' + object.name + '" must be a boolean');
}
variable.persist = value;
break;
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'
);
}
if (value) {
variable.readableBy = value;
}
break;
}
}
}
return variable;
}
/**
* Sets the variable.
*
* Returns who is allowed to read the variable (the readableby property) or "undefined" if anyone can read it.
* Also, returns "false" if the variable was not modified (because we set it to the value it already has)
*
* @param name
* @param value
* @param user
*/
setVariable(name: string, value: string, user: User): string | undefined | false {
let readableBy: string | undefined;
let variableObject: Variable | undefined;
if (this.variableObjects) {
variableObject = this.variableObjects.get(name);
if (variableObject === undefined) {
throw new VariableError(
'Trying to set a variable "' + name + '" that is not defined as an object in the map.'
);
}
if (variableObject.writableBy && !user.tags.includes(variableObject.writableBy)) {
throw new VariableError(
'Trying to set a variable "' +
name +
'". User "' +
user.name +
'" does not have sufficient permission. Required tag: "' +
variableObject.writableBy +
'". User tags: ' +
user.tags.join(", ") +
"."
);
}
readableBy = variableObject.readableBy;
}
// If the value is not modified, return false
if (this._variables.get(name) === value) {
return false;
}
this._variables.set(name, value);
if (variableObject !== undefined && variableObject.persist) {
variablesRepository
.saveVariable(this.roomUrl, name, value)
.catch((e) => console.error("Error while saving variable in Redis:", e));
}
return readableBy;
}
public getVariablesForTags(tags: string[]): Map<string, string> {
if (this.variableObjects === undefined) {
return this._variables;
}
const readableVariables = new Map<string, string>();
for (const [key, value] of this._variables.entries()) {
const variableObject = this.variableObjects.get(key);
if (variableObject === undefined) {
throw new Error('Unexpected variable "' + key + '" found has no associated variableObject.');
}
if (!variableObject.readableBy || tags.includes(variableObject.readableBy)) {
readableVariables.set(key, value);
}
}
return readableVariables;
}
}

View File

@ -1,55 +1,62 @@
import "jasmine";
import {ConnectCallback, DisconnectCallback, GameRoom} from "../src/Model/GameRoom";
import {Point} from "../src/Model/Websocket/MessageUserPosition";
import {Group} from "../src/Model/Group";
import {User, UserSocket} from "_Model/User";
import {JoinRoomMessage, PositionMessage} from "../src/Messages/generated/messages_pb";
import { ConnectCallback, DisconnectCallback, GameRoom } from "../src/Model/GameRoom";
import { Point } from "../src/Model/Websocket/MessageUserPosition";
import { Group } from "../src/Model/Group";
import { User, UserSocket } from "_Model/User";
import { JoinRoomMessage, PositionMessage } from "../src/Messages/generated/messages_pb";
import Direction = PositionMessage.Direction;
import { EmoteCallback } from "_Model/Zone";
function createMockUser(userId: number): User {
return {
userId
userId,
} as unknown as User;
}
function createMockUserSocket(): UserSocket {
return {
} as unknown as UserSocket;
return {} as unknown as UserSocket;
}
function createJoinRoomMessage(uuid: string, x: number, y: number): JoinRoomMessage
{
function createJoinRoomMessage(uuid: string, x: number, y: number): JoinRoomMessage {
const positionMessage = new PositionMessage();
positionMessage.setX(x);
positionMessage.setY(y);
positionMessage.setDirection(Direction.DOWN);
positionMessage.setMoving(false);
const joinRoomMessage = new JoinRoomMessage();
joinRoomMessage.setUseruuid('1');
joinRoomMessage.setIpaddress('10.0.0.2');
joinRoomMessage.setName('foo');
joinRoomMessage.setRoomid('_/global/test.json');
joinRoomMessage.setUseruuid("1");
joinRoomMessage.setIpaddress("10.0.0.2");
joinRoomMessage.setName("foo");
joinRoomMessage.setRoomid("_/global/test.json");
joinRoomMessage.setPositionmessage(positionMessage);
return joinRoomMessage;
}
const emote: EmoteCallback = (emoteEventMessage, listener): void => {};
describe("GameRoom", () => {
it("should connect user1 and user2", () => {
it("should connect user1 and user2", async () => {
let connectCalledNumber: number = 0;
const connect: ConnectCallback = (user: User, group: Group): void => {
connectCalledNumber++;
}
const disconnect: DisconnectCallback = (user: User, group: Group): void => {
};
const disconnect: DisconnectCallback = (user: User, group: Group): void => {};
}
const world = await GameRoom.create(
"https://play.workadventu.re/_/global/localhost/test.json",
connect,
disconnect,
160,
160,
() => {},
() => {},
() => {},
emote
);
const world = new GameRoom('_/global/test.json', connect, disconnect, 160, 160, () => {}, () => {}, () => {});
const user1 = world.join(createMockUserSocket(), createJoinRoomMessage("1", 100, 100));
const user1 = world.join(createMockUserSocket(), createJoinRoomMessage('1', 100, 100));
const user2 = world.join(createMockUserSocket(), createJoinRoomMessage('2', 500, 100));
const user2 = world.join(createMockUserSocket(), createJoinRoomMessage("2", 500, 100));
world.updatePosition(user2, new Point(261, 100));
@ -63,26 +70,34 @@ describe("GameRoom", () => {
expect(connectCalledNumber).toBe(2);
});
it("should connect 3 users", () => {
it("should connect 3 users", async () => {
let connectCalled: boolean = false;
const connect: ConnectCallback = (user: User, group: Group): void => {
connectCalled = true;
}
const disconnect: DisconnectCallback = (user: User, group: Group): void => {
};
const disconnect: DisconnectCallback = (user: User, group: Group): void => {};
}
const world = await GameRoom.create(
"https://play.workadventu.re/_/global/localhost/test.json",
connect,
disconnect,
160,
160,
() => {},
() => {},
() => {},
emote
);
const world = new GameRoom('_/global/test.json', connect, disconnect, 160, 160, () => {}, () => {}, () => {});
const user1 = world.join(createMockUserSocket(), createJoinRoomMessage("1", 100, 100));
const user1 = world.join(createMockUserSocket(), createJoinRoomMessage('1', 100, 100));
const user2 = world.join(createMockUserSocket(), createJoinRoomMessage('2', 200, 100));
const user2 = world.join(createMockUserSocket(), createJoinRoomMessage("2", 200, 100));
expect(connectCalled).toBe(true);
connectCalled = false;
// baz joins at the outer limit of the group
const user3 = world.join(createMockUserSocket(), createJoinRoomMessage('2', 311, 100));
const user3 = world.join(createMockUserSocket(), createJoinRoomMessage("2", 311, 100));
expect(connectCalled).toBe(false);
@ -91,31 +106,40 @@ describe("GameRoom", () => {
expect(connectCalled).toBe(true);
});
it("should disconnect user1 and user2", () => {
it("should disconnect user1 and user2", async () => {
let connectCalled: boolean = false;
let disconnectCallNumber: number = 0;
const connect: ConnectCallback = (user: User, group: Group): void => {
connectCalled = true;
}
};
const disconnect: DisconnectCallback = (user: User, group: Group): void => {
disconnectCallNumber++;
}
};
const world = new GameRoom('_/global/test.json', connect, disconnect, 160, 160, () => {}, () => {}, () => {});
const world = await GameRoom.create(
"https://play.workadventu.re/_/global/localhost/test.json",
connect,
disconnect,
160,
160,
() => {},
() => {},
() => {},
emote
);
const user1 = world.join(createMockUserSocket(), createJoinRoomMessage('1', 100, 100));
const user1 = world.join(createMockUserSocket(), createJoinRoomMessage("1", 100, 100));
const user2 = world.join(createMockUserSocket(), createJoinRoomMessage('2', 259, 100));
const user2 = world.join(createMockUserSocket(), createJoinRoomMessage("2", 259, 100));
expect(connectCalled).toBe(true);
expect(disconnectCallNumber).toBe(0);
world.updatePosition(user2, new Point(100+160+160+1, 100));
world.updatePosition(user2, new Point(100 + 160 + 160 + 1, 100));
expect(disconnectCallNumber).toBe(2);
world.updatePosition(user2, new Point(262, 100));
expect(disconnectCallNumber).toBe(2);
});
})
});

View File

@ -0,0 +1,32 @@
import { arrayIntersect } from "../src/Services/ArrayHelper";
import { mapFetcher } from "../src/Services/MapFetcher";
describe("MapFetcher", () => {
it("should return true on localhost ending URLs", async () => {
expect(await mapFetcher.isLocalUrl("https://localhost")).toBeTrue();
expect(await mapFetcher.isLocalUrl("https://foo.localhost")).toBeTrue();
});
it("should return true on DNS resolving to a local domain", async () => {
expect(await mapFetcher.isLocalUrl("https://127.0.0.1.nip.io")).toBeTrue();
});
it("should return true on an IP resolving to a local domain", async () => {
expect(await mapFetcher.isLocalUrl("https://127.0.0.1")).toBeTrue();
expect(await mapFetcher.isLocalUrl("https://192.168.0.1")).toBeTrue();
});
it("should return false on an IP resolving to a global domain", async () => {
expect(await mapFetcher.isLocalUrl("https://51.12.42.42")).toBeFalse();
});
it("should return false on an DNS resolving to a global domain", async () => {
expect(await mapFetcher.isLocalUrl("https://maps.workadventu.re")).toBeFalse();
});
it("should throw error on invalid domain", async () => {
await expectAsync(
mapFetcher.isLocalUrl("https://this.domain.name.doesnotexistfoobgjkgfdjkgldf.com")
).toBeRejected();
});
});

View File

@ -1,10 +1,6 @@
import "jasmine";
import {GameRoom, ConnectCallback, DisconnectCallback } from "_Model/GameRoom";
import {Point} from "../src/Model/Websocket/MessageUserPosition";
import { Group } from "../src/Model/Group";
import {PositionNotifier} from "../src/Model/PositionNotifier";
import {User, UserSocket} from "../src/Model/User";
import {PointInterface} from "../src/Model/Websocket/PointInterface";
import {Zone} from "_Model/Zone";
import {Movable} from "_Model/Movable";
import {PositionInterface} from "_Model/PositionInterface";
@ -23,21 +19,21 @@ describe("PositionNotifier", () => {
moveTriggered = true;
}, (thing: Movable) => {
leaveTriggered = true;
});
}, () => {});
const user1 = new User(1, 'test', '10.0.0.2', {
x: 500,
y: 500,
moving: false,
direction: 'down'
}, false, positionNotifier, {} as UserSocket, [], 'foo', []);
}, false, positionNotifier, {} as UserSocket, [], null, 'foo', []);
const user2 = new User(2, 'test', '10.0.0.2', {
x: -9999,
y: -9999,
moving: false,
direction: 'down'
}, false, positionNotifier, {} as UserSocket, [], 'foo', []);
}, false, positionNotifier, {} as UserSocket, [], null, 'foo', []);
positionNotifier.addZoneListener({} as ZoneSocket, 0, 0);
positionNotifier.addZoneListener({} as ZoneSocket, 0, 1);
@ -98,21 +94,21 @@ describe("PositionNotifier", () => {
moveTriggered = true;
}, (thing: Movable) => {
leaveTriggered = true;
});
}, () => {});
const user1 = new User(1, 'test', '10.0.0.2', {
x: 500,
y: 500,
moving: false,
direction: 'down'
}, false, positionNotifier, {} as UserSocket, [], 'foo', []);
}, false, positionNotifier, {} as UserSocket, [], null, 'foo', []);
const user2 = new User(2, 'test', '10.0.0.2', {
x: 0,
y: 0,
moving: false,
direction: 'down'
}, false, positionNotifier, {} as UserSocket, [], 'foo', []);
}, false, positionNotifier, {} as UserSocket, [], null, 'foo', []);
const listener = {} as ZoneSocket;
positionNotifier.addZoneListener(listener, 0, 0);

View File

@ -1,19 +0,0 @@
import {extractDataFromPrivateRoomId, extractRoomSlugPublicRoomId, isRoomAnonymous} from "../src/Model/RoomIdentifier";
describe("RoomIdentifier", () => {
it("should flag public id as anonymous", () => {
expect(isRoomAnonymous('_/global/test')).toBe(true);
});
it("should flag public id as not anonymous", () => {
expect(isRoomAnonymous('@/afup/afup2020/1floor')).toBe(false);
});
it("should extract roomSlug from public ID", () => {
expect(extractRoomSlugPublicRoomId('_/global/npeguin/test.json')).toBe('npeguin/test.json');
});
it("should extract correct from private ID", () => {
const {organizationSlug, worldSlug, roomSlug} = extractDataFromPrivateRoomId('@/afup/afup2020/1floor');
expect(organizationSlug).toBe('afup');
expect(worldSlug).toBe('afup2020');
expect(roomSlug).toBe('1floor');
});
})

View File

@ -0,0 +1,67 @@
import "jasmine";
import { getNearbyDescriptorsMatrix } from "../src/Model/PositionNotifier";
describe("getNearbyDescriptorsMatrix", () => {
it("should create a matrix of coordinates in a square around the parameter", () => {
const matrix = [];
for (const d of getNearbyDescriptorsMatrix({ i: 1, j: 1 })) {
matrix.push(d);
}
expect(matrix).toEqual([
{ i: 0, j: 0 },
{ i: 1, j: 0 },
{ i: 2, j: 0 },
{ i: 0, j: 1 },
{ i: 1, j: 1 },
{ i: 2, j: 1 },
{ i: 0, j: 2 },
{ i: 1, j: 2 },
{ i: 2, j: 2 },
]);
});
it("should create a matrix of coordinates in a square around the parameter bis", () => {
const matrix = [];
for (const d of getNearbyDescriptorsMatrix({ i: 8, j: 3 })) {
matrix.push(d);
}
expect(matrix).toEqual([
{ i: 7, j: 2 },
{ i: 8, j: 2 },
{ i: 9, j: 2 },
{ i: 7, j: 3 },
{ i: 8, j: 3 },
{ i: 9, j: 3 },
{ i: 7, j: 4 },
{ i: 8, j: 4 },
{ i: 9, j: 4 },
]);
});
it("should not create a matrix with negative coordinates", () => {
const matrix = [];
for (const d of getNearbyDescriptorsMatrix({ i: 0, j: 0 })) {
matrix.push(d);
}
expect(matrix).toEqual([
{ i: 0, j: 0 },
{ i: 1, j: 0 },
{ i: 0, j: 1 },
{ i: 1, j: 1 },
]);
});
/*it("should not create a matrix with coordinates bigger than its dimmensions", () => {
const matrix = getNearbyDescriptorsMatrix({i: 4, j: 4}, 5, 5);
expect(matrix).toEqual([
{i: 3,j: 3},
{i: 4,j: 3},
{i: 3,j: 4},
{i: 4,j: 4},
])
});*/
});

View File

@ -3,7 +3,7 @@
"experimentalDecorators": true,
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"target": "ES2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"downlevelIteration": true,
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */

File diff suppressed because it is too large Load Diff

View File

@ -13,7 +13,6 @@ RoomConnection.setWebsocketFactory((url: string) => {
});
async function startOneUser(): Promise<void> {
await connectionManager.anonymousLogin(true);
const onConnect = await connectionManager.connectToRoomSocket(process.env.ROOM_ID ? process.env.ROOM_ID : '_/global/maps.workadventure.localhost/Floor0/floor0.json', 'TEST', ['male3'],
{
x: 783,
@ -23,7 +22,7 @@ async function startOneUser(): Promise<void> {
bottom: 200,
left: 500,
right: 800
});
}, null);
const connection = onConnect.connection;

View File

@ -209,9 +209,9 @@
}
},
"glob-parent": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"requires": {
"is-glob": "^4.0.1"
}
@ -230,9 +230,9 @@
}
},
"hosted-git-info": {
"version": "2.8.8",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
},
"indent-string": {
"version": "2.1.0",
@ -429,9 +429,9 @@
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"path-type": {
"version": "1.1.0",
@ -688,9 +688,9 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
"integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
},
"xtend": {
"version": "4.0.2",

View File

@ -24,7 +24,7 @@
"@types/ws": "^7.2.6",
"ts-node-dev": "^1.0.0-pre.62",
"typescript": "^4.0.2",
"ws": "^7.3.1"
"ws": "^7.4.6"
},
"devDependencies": {}
}

View File

@ -148,8 +148,8 @@ get-stdin@^4.0.1:
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
dependencies:
is-glob "^4.0.1"
@ -169,8 +169,8 @@ graceful-fs@^4.1.2:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
hosted-git-info@^2.1.4:
version "2.8.8"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
version "2.8.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
indent-string@^2.1.0:
version "2.1.0"
@ -315,8 +315,8 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
path-type@^1.0.0:
version "1.1.0"
@ -515,9 +515,9 @@ wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
ws@^7.3.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
ws@^7.4.6:
version "7.4.6"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
xtend@^4.0.0:
version "4.0.2"

View File

@ -38,6 +38,7 @@ services:
JITSI_URL: $JITSI_URL
JITSI_PRIVATE_MODE: "$JITSI_PRIVATE_MODE"
PUSHER_URL: //pusher.${DOMAIN}
ICON_URL: //icon.${DOMAIN}
TURN_SERVER: "${TURN_SERVER}"
TURN_USER: "${TURN_USER}"
TURN_PASSWORD: "${TURN_PASSWORD}"
@ -65,6 +66,7 @@ services:
API_URL: back:50051
JITSI_URL: $JITSI_URL
JITSI_ISS: $JITSI_ISS
FRONT_URL: https://play.${DOMAIN}
labels:
- "traefik.http.routers.pusher.rule=Host(`pusher.${DOMAIN}`)"
- "traefik.http.routers.pusher.entryPoints=web,traefik"
@ -98,3 +100,15 @@ services:
- "traefik.http.routers.back-ssl.service=back"
- "traefik.http.routers.back-ssl.tls.certresolver=myresolver"
restart: unless-stopped
icon:
image: matthiasluedtke/iconserver:v3.13.0
labels:
- "traefik.http.routers.icon.rule=Host(`icon.${DOMAIN}`)"
- "traefik.http.routers.icon.entryPoints=web,traefik"
- "traefik.http.services.icon.loadbalancer.server.port=8080"
- "traefik.http.routers.icon-ssl.rule=Host(`icon.${DOMAIN}`)"
- "traefik.http.routers.icon-ssl.entryPoints=websecure"
- "traefik.http.routers.icon-ssl.tls=true"
- "traefik.http.routers.icon-ssl.service=icon"
- "traefik.http.routers.icon-ssl.tls.certresolver=myresolver"

2
debian/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*~
\#*\#

10
debian/README.Debian vendored Normal file
View File

@ -0,0 +1,10 @@
workadventure for Debian
-----------------------
To install:
- Install workadventure-back workadventure-front workadventure-pusher
- Go to "/var/lib/workadvenure/{back,pusher}" and run "yarn install --production"
- Serve "/usr/src/workadventure/front" as web page
- Provide configuration for the UI in "/usr/src/workadventure/front/config.js"
-- unknown <felix@localhost> Sat, 17 Apr 2021 14:06:51 +0200

24
debian/changelog vendored Normal file
View File

@ -0,0 +1,24 @@
workadventure (1.6.3-1) unstable; urgency=medium
* Update to 1.6.3
-- unknown <felix@localhost> Mon, 29 Nov 2021 20:10:29 +0200
workadventure (1.4.12-1) unstable; urgency=medium
* Update to 1.4.12
-- unknown <felix@localhost> Fri, 06 Aug 2021 15:00:35 +0200
workadventure (1.2.4-2) unstable; urgency=medium
* Fix chat dialog spacing
* Improve systemd unit for backend
-- unknown <felix@localhost> Wed, 21 Apr 2021 21:55:41 +0200
workadventure (1.2.4-1) unstable; urgency=medium
* Initial release
-- unknown <felix@localhost> Sat, 17 Apr 2021 14:06:51 +0200

32
debian/control vendored Normal file
View File

@ -0,0 +1,32 @@
Source: workadventure
Section: unknown
Priority: optional
Maintainer: unknown <felix@localhost>
Build-Depends: debhelper-compat (= 12), yarnpkg
Standards-Version: 4.5.1
Homepage: <insert the upstream URL, if relevant>
Rules-Requires-Root: no
Package: workadventure-back
Architecture: all
Depends: ${misc:Depends}, yarnpkg
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
Package: workadventure-pusher
Architecture: all
Depends: ${misc:Depends}, yarnpkg
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
Package: workadventure-front
Architecture: all
Depends: ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
Package: workadventure-front-map
Architecture: all
Depends: ${misc:Depends}, workadventure-front
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>

32
debian/copyright vendored Normal file
View File

@ -0,0 +1,32 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: workadventure
Upstream-Contact: <preferred name and address to reach the upstream project>
Source: <url://example.com>
Files: *
Copyright: 2021 TheCodingMachine
License: AGPL-3 with Commons Clause
<Put the license of the package here indented by 1 space>
<This follows the format of Description: lines in control file>
.
<Including paragraphs>
Files: debian/*
Copyright: 2021 unknown <felix@localhost>
License: GPL-2+
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>
.
On Debian systems, the complete text of the GNU General
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".

49
debian/rules vendored Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/make -f
%:
dh $@
override_dh_install:
install -Dt debian/workadventure-front/usr/src/workadventure/front front/dist/index.html
install -d debian/workadventure-front/usr/src/workadventure/front/js
cp -r front/dist/static front/dist/fonts front/dist/resources front/dist/*.js front/dist/*.png front/dist/*.css debian/workadventure-front/usr/src/workadventure/front
cp -r front/dist/js/*.js debian/workadventure-front/usr/src/workadventure/front/js
install -d debian/workadventure-front-map/usr/src/workadventure/front/js
cp -r front/dist/*.js.map front/dist/*.css.map debian/workadventure-front-map/usr/src/workadventure/front
cp -r front/dist/js/*.js.map debian/workadventure-front-map/usr/src/workadventure/front/js
install -d debian/workadventure-back/usr/src/workadventure/back
cp -r back/dist/server.js back/dist/src debian/workadventure-back/usr/src/workadventure/back
cp back/yarn.lock back/package.json debian/workadventure-back/usr/src/workadventure/back
install -d debian/workadventure-back/var/lib/workadventure/back
ln -s /usr/src/workadventure/back/package.json /usr/src/workadventure/back/yarn.lock /usr/src/workadventure/back/src /usr/src/workadventure/back/server.js debian/workadventure-back/var/lib/workadventure/back/
install -d debian/workadventure-pusher/usr/src/workadventure/pusher
cp -r pusher/dist/server.js pusher/dist/src debian/workadventure-pusher/usr/src/workadventure/pusher
cp pusher/yarn.lock pusher/package.json debian/workadventure-pusher/usr/src/workadventure/pusher
install -d debian/workadventure-back/var/lib/workadventure/pusher
ln -s /usr/src/workadventure/pusher/package.json /usr/src/workadventure/pusher/yarn.lock /usr/src/workadventure/pusher/src /usr/src/workadventure/pusher/server.js debian/workadventure-back/var/lib/workadventure/pusher/
front/src/Messages/generated:
ln -s ../../../messages/generated front/src/Messages
back/src/Messages/generated:
ln -s ../../../messages/generated back/src/Messages
pusher/src/Messages/generated:
ln -s ../../../messages/generated pusher/src/Messages
override_dh_auto_build: front/src/Messages/generated back/src/Messages/generated pusher/src/Messages/generated
cd messages && yarnpkg install && yarnpkg run proto
rm -Rf front/dist/js
cd front && ./templater.sh && yarnpkg install && yarnpkg run build
cd back && yarnpkg install && yarnpkg run tsc
cd pusher && yarnpkg install && yarnpkg run tsc
# dh_make generated override targets
# This is example for Cmake (See https://bugs.debian.org/641051 )
#override_dh_auto_configure:
# dh_auto_configure -- \
# -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)

1
debian/source/format vendored Normal file
View File

@ -0,0 +1 @@
3.0 (quilt)

13
debian/workadventure-back.service vendored Normal file
View File

@ -0,0 +1,13 @@
[Unit]
Description="Workadventure Backend"
[Service]
User=webspace-user
WorkingDirectory=/var/lib/workadventure/back
Environment=NODE_PATH=node_modules
ExecStart=node --max-old-space-size=4096 server.js
ProtectSystem=Full
ProtectHome=true
[Install]
WantedBy=multi-user.target

2
debian/workadventure-docs.docs vendored Normal file
View File

@ -0,0 +1,2 @@
README.source
README.Debian

15
debian/workadventure-pusher.service vendored Normal file
View File

@ -0,0 +1,15 @@
[Unit]
Description="Workadventure Pusher"
[Service]
User=webspace-user
WorkingDirectory=/var/lib/workadventure/pusher
Environment=NODE_PATH=node_modules
Environment=PUSHER_HTTP_PORT=8081
Environment=API_URL=localhost:50051
ExecStart=node --max-old-space-size=4096 server.js
ProtectSystem=Full
ProtectHome=true
[Install]
WantedBy=multi-user.target

View File

@ -1,103 +1,95 @@
{
local env = std.extVar("env"),
local namespace = env.GITHUB_REF_SLUG,
local namespace = env.DEPLOY_REF,
local tag = namespace,
local url = if namespace == "master" then "workadventu.re" else namespace+".workadventure.test.thecodingmachine.com",
local url = namespace+".test.workadventu.re",
// develop branch does not use admin because of issue with SSL certificate of admin as of now.
local adminUrl = if namespace == "master" || namespace == "develop" || std.startsWith(namespace, "admin") then "https://"+url else null,
local adminUrl = if std.startsWith(namespace, "admin") then "https://"+url else null,
"$schema": "https://raw.githubusercontent.com/thecodingmachine/deeployer/master/deeployer.schema.json",
"version": "1.0",
"containers": {
"back1": {
"image": "thecodingmachine/workadventure-back:"+tag,
"host": {
"url": "api1."+url,
"https": "enable",
"url": "api1-"+url,
"containerPort": 8080
},
"ports": [8080, 50051],
"env": {
"SECRET_KEY": "tempSecretKeyNeedsToChange",
"ADMIN_API_TOKEN": env.ADMIN_API_TOKEN,
"JITSI_ISS": env.JITSI_ISS,
"JITSI_URL": env.JITSI_URL,
"SECRET_JITSI_KEY": env.SECRET_JITSI_KEY,
"TURN_STATIC_AUTH_SECRET": env.TURN_STATIC_AUTH_SECRET,
"REDIS_HOST": "redis",
} + (if adminUrl != null then {
"ADMIN_API_URL": adminUrl,
} else {}) + if namespace != "master" then {
// Absolutely ugly WorkAround to circumvent broken certificates on the K8S test cluster. Don't do this in production kids!
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
"ADMIN_API_TOKEN": env.ADMIN_API_TOKEN,
} else {})
},
"back2": {
"image": "thecodingmachine/workadventure-back:"+tag,
"host": {
"url": "api2."+url,
"https": "enable",
"url": "api2-"+url,
"containerPort": 8080
},
"ports": [8080, 50051],
"env": {
"SECRET_KEY": "tempSecretKeyNeedsToChange",
"ADMIN_API_TOKEN": env.ADMIN_API_TOKEN,
"JITSI_ISS": env.JITSI_ISS,
"JITSI_URL": env.JITSI_URL,
"SECRET_JITSI_KEY": env.SECRET_JITSI_KEY,
"TURN_STATIC_AUTH_SECRET": env.TURN_STATIC_AUTH_SECRET,
"REDIS_HOST": "redis",
} + (if adminUrl != null then {
"ADMIN_API_URL": adminUrl,
} else {}) + if namespace != "master" then {
// Absolutely ugly WorkAround to circumvent broken certificates on the K8S test cluster. Don't do this in production kids!
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
"ADMIN_API_TOKEN": env.ADMIN_API_TOKEN,
} else {})
},
"pusher": {
"replicas": 2,
"image": "thecodingmachine/workadventure-pusher:"+tag,
"host": {
"url": "pusher."+url,
"https": "enable"
"url": "pusher-"+url,
},
"ports": [8080],
"env": {
"SECRET_KEY": "tempSecretKeyNeedsToChange",
"ADMIN_API_TOKEN": env.ADMIN_API_TOKEN,
"JITSI_ISS": env.JITSI_ISS,
"JITSI_URL": env.JITSI_URL,
"API_URL": "back1:50051,back2:50051",
"SECRET_JITSI_KEY": env.SECRET_JITSI_KEY,
"FRONT_URL": "https://play-"+url
} + (if adminUrl != null then {
"ADMIN_API_URL": adminUrl,
} else {}) + if namespace != "master" then {
// Absolutely ugly WorkAround to circumvent broken certificates on the K8S test cluster. Don't do this in production kids!
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
"ADMIN_API_TOKEN": env.ADMIN_API_TOKEN,
"ADMIN_SOCKETS_TOKEN": env.ADMIN_SOCKETS_TOKEN,
} else {})
},
"front": {
"image": "thecodingmachine/workadventure-front:"+tag,
"host": {
"url": "play."+url,
"https": "enable"
"url": "play-"+url,
},
"ports": [80],
"env": {
"PUSHER_URL": "//pusher."+url,
"UPLOADER_URL": "//uploader."+url,
"PUSHER_URL": "//pusher-"+url,
"UPLOADER_URL": "//uploader-"+url,
"ADMIN_URL": "//"+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,
"TURN_SERVER": "turn:coturn.workadventu.re:443,turns:coturn.workadventu.re:443",
"JITSI_PRIVATE_MODE": if env.SECRET_JITSI_KEY != '' then "true" else "false",
"START_ROOM_URL": "/_/global/maps."+url+"/Floor0/floor0.json"
//"GA_TRACKING_ID": "UA-10196481-11"
"START_ROOM_URL": "/_/global/maps-"+url+"/starter/map.json"
}
},
"uploader": {
"image": "thecodingmachine/workadventure-uploader:"+tag,
"host": {
"url": "uploader."+url,
"https": "enable",
"url": "uploader-"+url,
"containerPort": 8080
},
"ports": [8080],
@ -107,16 +99,16 @@
"maps": {
"image": "thecodingmachine/workadventure-maps:"+tag,
"host": {
"url": "maps."+url,
"https": "enable"
"url": "maps-"+url
},
"ports": [80]
},
"redis": {
"image": "redis:6",
"ports": [6379]
}
},
"config": {
"https": {
"mail": "d.negrier@thecodingmachine.com"
},
k8sextension(k8sConf)::
k8sConf + {
back1+: {
@ -131,6 +123,14 @@
}
}
}
},
ingress+: {
spec+: {
tls+: [{
hosts: ["api1-"+url],
secretName: "certificate-tls"
}]
}
}
},
back2+: {
@ -145,6 +145,14 @@
}
}
}
},
ingress+: {
spec+: {
tls+: [{
hosts: ["api2-"+url],
secretName: "certificate-tls"
}]
}
}
},
pusher+: {
@ -159,8 +167,46 @@
}
}
}
}
}
},
ingress+: {
spec+: {
tls+: [{
hosts: ["pusher-"+url],
secretName: "certificate-tls"
}]
}
}
},
front+: {
ingress+: {
spec+: {
tls+: [{
hosts: ["play-"+url],
secretName: "certificate-tls"
}]
}
}
},
uploader+: {
ingress+: {
spec+: {
tls+: [{
hosts: ["uploader-"+url],
secretName: "certificate-tls"
}]
}
}
},
maps+: {
ingress+: {
spec+: {
tls+: [{
hosts: ["maps-"+url],
secretName: "certificate-tls"
}]
}
}
},
}
}
}

View File

@ -28,15 +28,20 @@ services:
NODE_ENV: development
PUSHER_URL: /pusher
UPLOADER_URL: /uploader
ADMIN_URL: /admin
#ADMIN_URL: /admin
MAPS_URL: /maps
STARTUP_COMMAND_1: yarn install
ICON_URL: /icon
STARTUP_COMMAND_1: ./templater.sh
STARTUP_COMMAND_2: yarn install
TURN_SERVER: "turn:localhost:3478,turns:localhost:5349"
DISABLE_NOTIFICATIONS: "$DISABLE_NOTIFICATIONS"
SKIP_RENDER_OPTIMIZATIONS: "$SKIP_RENDER_OPTIMIZATIONS"
# Use TURN_USER/TURN_PASSWORD if your Coturn server is secured via hard coded credentials.
# Advice: you should instead use Coturn REST API along the TURN_STATIC_AUTH_SECRET in the Back container
TURN_USER: ""
TURN_PASSWORD: ""
START_ROOM_URL: "$START_ROOM_URL"
DISABLE_ANONYMOUS: "$DISABLE_ANONYMOUS"
command: yarn run start
volumes:
- ./front:/usr/src/app
@ -50,19 +55,28 @@ services:
- "traefik.http.routers.front-ssl.service=front"
pusher:
image: thecodingmachine/nodejs:12
image: thecodingmachine/nodejs:14
command: yarn dev
#command: yarn run prod
#command: yarn run profile
environment:
DEBUG: "*"
STARTUP_COMMAND_1: yarn install
# wait for files generated by "messages" container to exists
STARTUP_COMMAND_2: while [ ! -f /usr/src/app/src/Messages/generated/messages_pb.js ]; do sleep 1; done
SECRET_JITSI_KEY: "$SECRET_JITSI_KEY"
SECRET_KEY: yourSecretKey
ADMIN_API_TOKEN: "$ADMIN_API_TOKEN"
API_URL: back:50051
JITSI_URL: $JITSI_URL
JITSI_ISS: $JITSI_ISS
FRONT_URL: http://localhost
OPID_CLIENT_ID: $OPID_CLIENT_ID
OPID_CLIENT_SECRET: $OPID_CLIENT_SECRET
OPID_CLIENT_ISSUER: $OPID_CLIENT_ISSUER
OPID_CLIENT_REDIRECT_URL: $OPID_CLIENT_REDIRECT_URL
OPID_PROFILE_SCREEN_PROVIDER: $OPID_PROFILE_SCREEN_PROVIDER
DISABLE_ANONYMOUS: $DISABLE_ANONYMOUS
volumes:
- ./pusher:/usr/src/app
labels:
@ -110,6 +124,8 @@ services:
environment:
DEBUG: "*"
STARTUP_COMMAND_1: yarn install
# wait for files generated by "messages" container to exists
STARTUP_COMMAND_2: while [ ! -f /usr/src/app/src/Messages/generated/messages_pb.js ]; do sleep 1; done
SECRET_KEY: yourSecretKey
SECRET_JITSI_KEY: "$SECRET_JITSI_KEY"
ALLOW_ARTILLERY: "true"
@ -117,6 +133,8 @@ services:
JITSI_URL: $JITSI_URL
JITSI_ISS: $JITSI_ISS
MAX_PER_GROUP: "$MAX_PER_GROUP"
REDIS_HOST: redis
NODE_ENV: development
volumes:
- ./back:/usr/src/app
labels:
@ -152,23 +170,6 @@ services:
- "traefik.http.routers.uploader-ssl.tls=true"
- "traefik.http.routers.uploader-ssl.service=uploader"
website:
image: thecodingmachine/nodejs:12-apache
environment:
STARTUP_COMMAND_1: npm install
STARTUP_COMMAND_2: npm run watch &
APACHE_DOCUMENT_ROOT: dist/
volumes:
- ./website:/var/www/html
labels:
- "traefik.http.routers.website.rule=Host(`workadventure.localhost`)"
- "traefik.http.routers.website.entryPoints=web"
- "traefik.http.services.website.loadbalancer.server.port=80"
- "traefik.http.routers.website-ssl.rule=Host(`workadventure.localhost`)"
- "traefik.http.routers.website-ssl.entryPoints=websecure"
- "traefik.http.routers.website-ssl.tls=true"
- "traefik.http.routers.website-ssl.service=website"
messages:
#image: thecodingmachine/nodejs:14
image: thecodingmachine/workadventure-back-base:latest
@ -182,6 +183,23 @@ services:
- ./front:/usr/src/front
- ./pusher:/usr/src/pusher
redis:
image: redis:6
icon:
image: matthiasluedtke/iconserver:v3.13.0
labels:
- "traefik.http.middlewares.strip-icon-prefix.stripprefix.prefixes=/icon"
- "traefik.http.routers.icon.rule=PathPrefix(`/icon`)"
- "traefik.http.routers.icon.middlewares=strip-icon-prefix@docker"
- "traefik.http.routers.icon.entryPoints=web"
- "traefik.http.services.icon.loadbalancer.server.port=8080"
- "traefik.http.routers.icon-ssl.rule=PathPrefix(`/icon`)"
- "traefik.http.routers.icon-ssl.middlewares=strip-icon-prefix@docker"
- "traefik.http.routers.icon-ssl.entryPoints=websecure"
- "traefik.http.routers.icon-ssl.tls=true"
- "traefik.http.routers.icon-ssl.service=icon"
# coturn:
# image: coturn/coturn:4.5.2
# command:

View File

@ -0,0 +1,12 @@
version: "3"
services:
testcafe:
image: testcafe/testcafe:1.17.1
working_dir: /tests
environment:
BROWSER: "chromium --use-fake-device-for-media-stream"
volumes:
- ./tests:/tests
- ./maps:/maps
# security_opt:
# - seccomp:unconfined

View File

@ -17,6 +17,12 @@ services:
- front
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
default:
aliases:
- 'play.workadventure.localhost'
- 'pusher.workadventure.localhost'
- 'maps.workadventure.localhost'
front:
image: thecodingmachine/nodejs:14
@ -28,11 +34,14 @@ services:
NODE_ENV: development
PUSHER_URL: //pusher.workadventure.localhost
UPLOADER_URL: //uploader.workadventure.localhost
ADMIN_URL: //workadventure.localhost
#ADMIN_URL: //workadventure.localhost
ICON_URL: //icon.workadventure.localhost
STARTUP_COMMAND_1: ./templater.sh
STARTUP_COMMAND_2: yarn install
STUN_SERVER: "stun:stun.l.google.com:19302"
TURN_SERVER: "turn:coturn.workadventure.localhost:3478,turns:coturn.workadventure.localhost:5349"
DISABLE_NOTIFICATIONS: "$DISABLE_NOTIFICATIONS"
SKIP_RENDER_OPTIMIZATIONS: "$SKIP_RENDER_OPTIMIZATIONS"
# Use TURN_USER/TURN_PASSWORD if your Coturn server is secured via hard coded credentials.
# Advice: you should instead use Coturn REST API along the TURN_STATIC_AUTH_SECRET in the Back container
TURN_USER: ""
@ -40,6 +49,8 @@ services:
START_ROOM_URL: "$START_ROOM_URL"
MAX_PER_GROUP: "$MAX_PER_GROUP"
MAX_USERNAME_LENGTH: "$MAX_USERNAME_LENGTH"
DISABLE_ANONYMOUS: "$DISABLE_ANONYMOUS"
OPID_LOGIN_SCREEN_PROVIDER: "$OPID_LOGIN_SCREEN_PROVIDER"
command: yarn run start
volumes:
- ./front:/usr/src/app
@ -53,17 +64,26 @@ services:
- "traefik.http.routers.front-ssl.service=front"
pusher:
image: thecodingmachine/nodejs:12
image: thecodingmachine/nodejs:14
command: yarn dev
environment:
DEBUG: "socket:*"
STARTUP_COMMAND_1: yarn install
# wait for files generated by "messages" container to exists
STARTUP_COMMAND_2: while [ ! -f /usr/src/app/src/Messages/generated/messages_pb.js ]; do sleep 1; done
SECRET_JITSI_KEY: "$SECRET_JITSI_KEY"
SECRET_KEY: yourSecretKey
ADMIN_API_TOKEN: "$ADMIN_API_TOKEN"
API_URL: back:50051
JITSI_URL: $JITSI_URL
JITSI_ISS: $JITSI_ISS
FRONT_URL: http://play.workadventure.localhost
OPID_CLIENT_ID: $OPID_CLIENT_ID
OPID_CLIENT_SECRET: $OPID_CLIENT_SECRET
OPID_CLIENT_ISSUER: $OPID_CLIENT_ISSUER
OPID_CLIENT_REDIRECT_URL: $OPID_CLIENT_REDIRECT_URL
OPID_PROFILE_SCREEN_PROVIDER: $OPID_PROFILE_SCREEN_PROVIDER
DISABLE_ANONYMOUS: $DISABLE_ANONYMOUS
volumes:
- ./pusher:/usr/src/app
labels:
@ -105,6 +125,8 @@ services:
environment:
DEBUG: "*"
STARTUP_COMMAND_1: yarn install
# wait for files generated by "messages" container to exists
STARTUP_COMMAND_2: while [ ! -f /usr/src/app/src/Messages/generated/messages_pb.js ]; do sleep 1; done
SECRET_KEY: yourSecretKey
SECRET_JITSI_KEY: "$SECRET_JITSI_KEY"
ALLOW_ARTILLERY: "true"
@ -113,6 +135,9 @@ services:
JITSI_ISS: $JITSI_ISS
TURN_STATIC_AUTH_SECRET: SomeStaticAuthSecret
MAX_PER_GROUP: "MAX_PER_GROUP"
REDIS_HOST: redis
NODE_ENV: development
STORE_VARIABLES_FOR_LOCAL_MAPS: "true"
volumes:
- ./back:/usr/src/app
labels:
@ -155,6 +180,31 @@ services:
- ./front:/usr/src/front
- ./pusher:/usr/src/pusher
redis:
image: redis:6
redisinsight:
image: redislabs/redisinsight:latest
labels:
- "traefik.http.routers.redisinsight.rule=Host(`redis.workadventure.localhost`)"
- "traefik.http.routers.redisinsight.entryPoints=web"
- "traefik.http.services.redisinsight.loadbalancer.server.port=8001"
- "traefik.http.routers.redisinsight-ssl.rule=Host(`redis.workadventure.localhost`)"
- "traefik.http.routers.redisinsight-ssl.entryPoints=websecure"
- "traefik.http.routers.redisinsight-ssl.tls=true"
- "traefik.http.routers.redisinsight-ssl.service=redisinsight"
icon:
image: matthiasluedtke/iconserver:v3.13.0
labels:
- "traefik.http.routers.icon.rule=Host(`icon.workadventure.localhost`)"
- "traefik.http.routers.icon.entryPoints=web"
- "traefik.http.services.icon.loadbalancer.server.port=8080"
- "traefik.http.routers.icon-ssl.rule=Host(`icon.workadventure.localhost`)"
- "traefik.http.routers.icon-ssl.entryPoints=websecure"
- "traefik.http.routers.icon-ssl.tls=true"
- "traefik.http.routers.icon-ssl.service=icon"
# coturn:
# image: coturn/coturn:4.5.2
# command:

33
docs/maps/animations.md Normal file
View File

@ -0,0 +1,33 @@
{.section-title.accent.text-primary}
# Animating WorkAdventure maps
A tile can run an animation in loops, for example to render water or blinking lights. Each animation frame is a single
32x32 tile. To create an animation, edit the tileset in Tiled and click on the tile to animate (or pick a free tile to
not overwrite existing ones) and click on the animation editor:
<div class="px-5 card rounded d-inline-block">
<img class="document-img" src="images/anims/camera.png" alt="" />
</div>
You can now add all tiles that should be part of the animation via drag and drop to the "playlist" and adjust the frame duration:
<div>
<figure class="figure">
<img class="figure-img img-fluid rounded" src="images/anims/animation_editor.png" alt="" />
<figcaption class="figure-caption">The tile animation editor</figcaption>
</figure>
</div>
You can preview animations directly in Tiled, using the "Show tile animations" option:
<div>
<figure class="figure">
<img class="figure-img img-fluid rounded" src="images/anims/settings_show_animations.png" alt="" />
<figcaption class="figure-caption">The Show Tile Animations option</figcaption>
</figure>
</div>
{.alert.alert-info}
**Tip:** The engine does tile-updates every 100ms, animations with a shorter frame duration will most likely not look that good or may even do not work.

37
docs/maps/api-chat.md Normal file
View File

@ -0,0 +1,37 @@
{.section-title.accent.text-primary}
# API Chat functions reference
### Sending a message in the chat
```
WA.chat.sendChatMessage(message: string, author: string): void
```
Sends a message in the chat. The message is only visible in the browser of the current user.
* **message**: the message to be displayed in the chat
* **author**: the name displayed for the author of the message. It does not have to be a real user.
Example:
```javascript
WA.chat.sendChatMessage('Hello world', 'Mr Robot');
```
### Listening to messages from the chat
```javascript
WA.chat.onChatMessage(callback: (message: string) => void): void
```
Listens to messages typed by the current user and calls the callback. Messages from other users in the chat cannot be listened to.
* **callback**: the function that will be called when a message is received. It contains the message typed by the user.
Example:
```javascript
WA.chat.onChatMessage((message => {
console.log('The user typed a message', message);
}));
```

29
docs/maps/api-controls.md Normal file
View File

@ -0,0 +1,29 @@
{.section-title.accent.text-primary}
# API Controls functions Reference
### Disabling / restoring controls
```
WA.controls.disablePlayerControls(): void
WA.controls.restorePlayerControls(): void
```
These 2 methods can be used to completely disable player controls and to enable them again.
When controls are disabled, the user cannot move anymore using keyboard input. This can be useful in a "First Time User Experience" part, to display an important message to a user before letting him/her move again.
Example:
```javascript
WA.room.onEnterLayer('myZone').subscribe(() => {
WA.controls.disablePlayerControls();
WA.ui.openPopup("popupRectangle", 'This is an imporant message!', [{
label: "Got it!",
className: "primary",
callback: (popup) => {
WA.controls.restorePlayerControls();
popup.close();
}
}]);
})
```

View File

@ -0,0 +1,23 @@
{.section-title.accent.text-primary}
# API Reference - Deprecated functions
The list of functions below is **deprecated**. You should not use those but. use the replacement functions.
- Method `WA.sendChatMessage` is deprecated. It has been renamed to [`WA.chat.sendChatMessage`](api-chat.md#sending-a-message-in-the-chat).
- Method `WA.disablePlayerControls` is deprecated. It has been renamed to [`WA.controls.disablePlayerControls`](api-controls.md#disabling--restoring-controls).
- Method `WA.restorePlayerControls` is deprecated. It has been renamed to [`WA.controls.restorePlayerControls`](api-controls.md#disabling--restoring-controls).
- Method `WA.displayBubble` is deprecated. It has been renamed to `WA.ui.displayBubble`.
- Method `WA.removeBubble` is deprecated. It has been renamed to `WA.ui.removeBubble`.
- Method `WA.openTab` is deprecated. It has been renamed to [`WA.nav.openTab`](api-nav.md#opening-a-web-page-in-a-new-tab).
- Method `WA.loadSound` is deprecated. It has been renamed to [`WA.sound.loadSound`](api-sound.md#load-a-sound-from-an-url).
- Method `WA.goToPage` is deprecated. It has been renamed to [`WA.nav.goToPage`](api-nav.md#opening-a-web-page-in-the-current-tab).
- Method `WA.goToRoom` is deprecated. It has been renamed to [`WA.nav.goToRoom`](api-nav.md#going-to-a-different-map-from-the-script).
- Method `WA.openCoWebSite` is deprecated. It has been renamed to [`WA.nav.openCoWebSite`](api-nav.md#openingclosing-web-page-in-co-websites).
- Method `WA.closeCoWebSite` is deprecated. It has been remove and [replace by a function close](api-nav.md#openingclosing-web-page-in-co-websites).
- Method `WA.openPopup` is deprecated. It has been renamed to [`WA.ui.openPopup`](api-ui.md#opening-a-popup).
- Method `WA.onChatMessage` is deprecated. It has been renamed to [`WA.chat.onChatMessage`](api-chat.md#listening-to-messages-from-the-chat).
- Method `WA.onEnterZone` is deprecated. It has been renamed to [`WA.room.onEnterZone`](api-room.md#detecting-when-the-user-entersleaves-a-layer).
- Method `WA.onLeaveZone` is deprecated. It has been renamed to [`WA.room.onLeaveZone`](api-room.md#detecting-when-the-user-entersleaves-a-layer).
- Method `WA.ui.registerMenuCommand` parameter `callback` is deprecated. Use [`WA.ui.registerMenuCommand(commandDescriptor: string, options: MenuOptions)`](api-ui.md#add-custom-menu).
- Method `WA.room.onEnterZone` is deprecated. Use instead [`WA.room.onEnterLayer`](api-room.md#detecting-when-the-user-entersleaves-a-layer).
- Method `WA.room.onLeaveZone` is deprecated. Use instead [`WA.room.onLeaveLayer`](api-room.md#detecting-when-the-user-entersleaves-a-layer).

82
docs/maps/api-nav.md Normal file
View File

@ -0,0 +1,82 @@
{.section-title.accent.text-primary}
# API Navigation functions reference
### Opening a web page in a new tab
```
WA.nav.openTab(url: string): void
```
Opens the webpage at "url" in your browser, in a new tab.
Example:
```javascript
WA.nav.openTab('https://www.wikipedia.org/');
```
### Opening a web page in the current tab
```
WA.nav.goToPage(url: string): void
```
Opens the webpage at "url" in your browser in place of WorkAdventure. WorkAdventure will be completely unloaded.
Example:
```javascript
WA.nav.goToPage('https://www.wikipedia.org/');
```
### Going to a different map from the script
```
WA.nav.goToRoom(url: string): void
```
Load the map at url without unloading workadventure
relative urls: "../subFolder/map.json[#start-layer-name]"
global urls: "/_/global/domain/path/map.json[#start-layer-name]"
Example:
```javascript
WA.nav.goToRoom("/@/tcm/workadventure/floor0") // workadventure urls
WA.nav.goToRoom('../otherMap/map.json');
WA.nav.goToRoom("/_/global/<path to global map>.json#start-layer-2")
```
### Opening/closing web page in Co-Websites
```
WA.nav.openCoWebSite(url: string, allowApi: boolean = false, allowPolicy: string = "", position: number = 0): Promise<CoWebsite>
```
Opens the webpage at "url" in an iFrame (on the right side of the screen) or close that iFrame. `allowApi` allows the webpage to use the "IFrame API" and execute script (it is equivalent to putting the `openWebsiteAllowApi` property in the map). `allowPolicy` grants additional access rights to the iFrame. The `allowPolicy` parameter is turned into an [`allow` feature policy in the iFrame](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-allow), position in whitch slot the web page will be open.
You can have only 5 co-wbesites open simultaneously.
Example:
```javascript
const coWebsite = await WA.nav.openCoWebSite('https://www.wikipedia.org/');
const coWebsiteWorkAdventure = await WA.nav.openCoWebSite('https://workadventu.re/', true, "", 1);
// ...
coWebsite.close();
```
### Get all Co-Websites
```
WA.nav.getCoWebSites(): Promise<CoWebsite[]>
```
Get all opened co-websites with their ids and positions.
Example:
```javascript
const coWebsites = await WA.nav.getCowebSites();
```

80
docs/maps/api-player.md Normal file
View File

@ -0,0 +1,80 @@
{.section-title.accent.text-primary}
# API Player functions Reference
### Get the player name
```
WA.player.name: string;
```
The player name is available from the `WA.player.name` property.
{.alert.alert-info}
You need to wait for the end of the initialization before accessing `WA.player.name`
```typescript
WA.onInit().then(() => {
console.log('Player name: ', WA.player.name);
})
```
### Get the player ID
```
WA.player.id: string|undefined;
```
The player ID is available from the `WA.player.id` property.
This is a unique identifier for a given player. Anonymous player might not have an id.
{.alert.alert-info}
You need to wait for the end of the initialization before accessing `WA.player.id`
```typescript
WA.onInit().then(() => {
console.log('Player ID: ', WA.player.id);
})
```
### Get the tags of the player
```
WA.player.tags: string[];
```
The player tags are available from the `WA.player.tags` property.
They represent a set of rights the player acquires after login in.
{.alert.alert-warn}
Tags attributed to a user depend on the authentication system you are using. For the hosted version
of WorkAdventure, you can define tags related to the user in the [administration panel](https://workadventu.re/admin-guide/manage-members).
{.alert.alert-info}
You need to wait for the end of the initialization before accessing `WA.player.tags`
```typescript
WA.onInit().then(() => {
console.log('Tags: ', WA.player.tags);
})
```
### Listen to player movement
```
WA.player.onPlayerMove(callback: HasPlayerMovedEventCallback): void;
```
Listens to the movement of the current user and calls the callback. Sends an event when the user stops moving, changes direction and every 200ms when moving in the same direction.
The event has the following attributes :
* **moving (boolean):** **true** when the current player is moving, **false** otherwise.
* **direction (string):** **"right"** | **"left"** | **"down"** | **"top"** the direction where the current player is moving.
* **x (number):** coordinate X of the current player.
* **y (number):** coordinate Y of the current player.
* **oldX (number):** old coordinate X of the current player.
* **oldY (number):** old coordinate Y of the current player.
**callback:** the function that will be called when the current player is moving. It contains the event.
Example :
```javascript
WA.player.onPlayerMove(console.log);
```

View File

@ -0,0 +1,14 @@
{.section-title.accent.text-primary}
# API Reference
- [Start / Init functions](api-start.md)
- [Navigation functions](api-nav.md)
- [Chat functions](api-chat.md)
- [Room functions](api-room.md)
- [State related functions](api-state.md)
- [Player functions](api-player.md)
- [UI functions](api-ui.md)
- [Sound functions](api-sound.md)
- [Controls functions](api-controls.md)
- [List of deprecated functions](api-deprecated.md)

Some files were not shown because too many files have changed in this diff Show More