diff --git a/lib/game/client/game-client.js b/lib/game/client/game-client.js index 48d67d93..28ffbb6f 100644 --- a/lib/game/client/game-client.js +++ b/lib/game/client/game-client.js @@ -29,10 +29,12 @@ class GameClient this.gameRoomsByServer = {}; this.featuresByServerFlag = {}; this.featuresRoomsByServer = {}; + this.lastErrorMessage = ''; } async joinOrCreate(roomName, options) { + this.lastErrorMessage = ''; try { let client = this.roomClient(roomName); if(!client){ @@ -48,9 +50,11 @@ class GameClient await new Promise(resolve => setTimeout(resolve, 500)); return await this.joinOrCreate(roomName, options); } - // any connection errors will be handled in the higher level class, see snippet "game.errors.joiningRoom" + this.lastErrorMessage = error.message; + // any connection errors will be handled in the higher level class Logger.error('Joining room error: '+error.message); } + return false; } async connectToGlobalGameRoom(roomUrl, client, options) diff --git a/lib/game/client/game-manager.js b/lib/game/client/game-manager.js index 1e52d60f..e3e83812 100644 --- a/lib/game/client/game-manager.js +++ b/lib/game/client/game-manager.js @@ -66,70 +66,88 @@ class GameManager this.startHandler.clientStart(); } - startGame(formData, isNewUser) + async startGame(formData, isNewUser) { this.events.emitSync('reldens.startGameBefore', this); - let gameRoom = this.joinGame(formData, isNewUser); - let errorElement = this.gameDom.getElement('#'+formData.formId+' '+GameConst.SELECTORS.RESPONSE_ERROR); - errorElement.innerHTML = ''; + let gameRoom = await this.joinGame(formData, isNewUser); + if(gameRoom){ + this.handleLoginSuccess(); + return true; + } + this.handleLoginError(formData); + return false; + } + + handleLoginSuccess() + { let body = this.gameDom.getElement(GameConst.SELECTORS.BODY); - gameRoom.then(() => { - body.classList.add(GameConst.CLASSES.GAME_STARTED); - body.classList.remove(GameConst.CLASSES.GAME_ERROR); - this.gameDom.getElement(GameConst.SELECTORS.FORMS_CONTAINER).remove(); - this.gameDom.getElement(GameConst.SELECTORS.GAME_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN); - }).catch((error) => { - body.classList.remove(GameConst.CLASSES.GAME_STARTED); - body.classList.add(GameConst.CLASSES.GAME_ERROR); - // @NOTE: game room errors should be always because some wrong login or registration data. For these cases - // we will check the isNewUser variable to know where display the error. - this.submitedForm = false; - if(errorElement){ - Logger.error(error); - errorElement.innerHTML = error.message || error; - } - this.events.emitSync('reldens.gameRoomError', this, error); - // @TODO - BETA - Move to firebase plugin with an event subscriber. - if(this.firebase && 'firebase-login' === formData.formId){ - this.firebase.app.auth().signOut(); - } - }); + body.classList.add(GameConst.CLASSES.GAME_STARTED); + body.classList.remove(GameConst.CLASSES.GAME_ERROR); + this.gameDom.getElement(GameConst.SELECTORS.FORMS_CONTAINER).remove(); + this.gameDom.getElement(GameConst.SELECTORS.GAME_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN); this.events.emitSync('reldens.startGameAfter', this); } + handleLoginError(formData) + { + let body = this.gameDom.getElement(GameConst.SELECTORS.BODY); + body.classList.remove(GameConst.CLASSES.GAME_STARTED); + body.classList.add(GameConst.CLASSES.GAME_ERROR); + // @NOTE: game room errors should be always because some wrong login or registration data. For these cases + // we will check the isNewUser variable to know where display the error. + this.submitedForm = false; + this.events.emitSync('reldens.gameRoomError', this); + // @TODO - BETA - Move to firebase plugin with an event subscriber. + if(this.firebase && 'firebase-login' === formData.formId){ + this.firebase.app.auth().signOut(); + } + } + async joinGame(formData, isNewUser = false) { // reset the user data in the object in case another form was used before: this.userData = {}; await this.events.emit('reldens.beforeJoinGame', {gameManager: this, formData, isNewUser}); - if(sc.hasOwn(formData, 'forgot')){ + this.mapFormDataToUserData(formData, isNewUser); + // join initial game room, since we return the promise we don't need to catch the error here: + this.gameRoom = await this.gameClient.joinOrCreate(GameConst.ROOM_GAME, this.userData); + if(!this.gameRoom){ + this.displayFormError('#'+formData.formId, this.gameClient.lastErrorMessage); + return false; + } + await this.events.emit('reldens.beforeJoinGameRoom', this.gameRoom); + this.handleGameRoomMessages(); + this.activateResponsiveBehavior(); + return this.gameRoom; + } + + mapFormDataToUserData(formData, isNewUser) + { + if (sc.hasOwn(formData, 'forgot')) { this.userData.forgot = 1; this.userData.email = formData['email']; } this.initializeClient(); - if(formData.isGuest){ + if (formData.isGuest) { this.userData.isGuest = true; this.userData.isNewUser = true; } - if(isNewUser){ + if (isNewUser) { this.userData.isNewUser = true; this.userData.email = formData['email']; } this.userData.username = formData['username']; this.userData.password = formData['password']; - // join initial game room, since we return the promise we don't need to catch the error here: - this.gameRoom = await this.gameClient.joinOrCreate(GameConst.ROOM_GAME, this.userData); - if(!this.gameRoom){ - this.displayPlayerCreateError('GameRoom not available, try again later please.'); - return false; - } - await this.events.emit('reldens.beforeJoinGameRoom', this.gameRoom); + } + + handleGameRoomMessages() + { this.gameRoom.onMessage('*', async (message) => { - if(message.error){ - this.displayPlayerCreateError(message); - return false; + if(message.error){ + Logger.error('Game Room message error.', message.error); + this.displayFormError(GameConst.SELECTORS.PLAYER_CREATE_FORM, message.error); + return false; } - // only the current client will get this message: if(GameConst.START_GAME === message.act){ this.initialGameData = message; return await this.beforeStartGame(); @@ -144,26 +162,28 @@ class GameManager } await this.initEngine(); }); + } + + activateResponsiveBehavior() + { this.events.on('reldens.afterSceneDynamicCreate', async () => { - if(this.config.get('client/ui/screen/responsive')){ - this.gameEngine.updateGameSize(this); - this.gameDom.getWindow().addEventListener('resize', () => { - this.gameEngine.updateGameSize(this); - }); + if(!this.config.getWithoutLogs('client/ui/screen/responsive', true)){ + return; } + this.gameEngine.updateGameSize(this); + this.gameDom.getWindow().addEventListener('resize', () => { + this.gameEngine.updateGameSize(this); + }); }); - return this.gameRoom; } - displayPlayerCreateError(message) + displayFormError(formId, message) { - let errorElement = this.gameDom.getElement( - GameConst.SELECTORS.PLAYER_CREATE_FORM+' '+GameConst.SELECTORS.RESPONSE_ERROR - ); + let errorElement = this.gameDom.getElement(formId+' '+GameConst.SELECTORS.RESPONSE_ERROR); if(!errorElement){ return false; } - errorElement.innerHTML = message.message; + errorElement.innerHTML = message; return true; } diff --git a/lib/game/client/handlers/login-form-handler.js b/lib/game/client/handlers/login-form-handler.js index 738bd76c..004463c9 100644 --- a/lib/game/client/handlers/login-form-handler.js +++ b/lib/game/client/handlers/login-form-handler.js @@ -38,7 +38,7 @@ class LoginFormHandler username: this.form.querySelector(GameConst.SELECTORS.LOGIN.USERNAME).value, password: this.form.querySelector(GameConst.SELECTORS.LOGIN.PASSWORD).value }; - this.gameManager.startGame(formData, false); + return this.gameManager.startGame(formData, false); }); } diff --git a/lib/inventory/server/message-actions.js b/lib/inventory/server/message-actions.js index 6a485632..8887837c 100644 --- a/lib/inventory/server/message-actions.js +++ b/lib/inventory/server/message-actions.js @@ -212,7 +212,6 @@ class InventoryMessageActions { // @TODO - BETA - Refactor when include false conditions in the shortcuts and include a new property "tradable". let fromInventoryItems = [ - // @TODO - BETA - Refactor to make findItemsByPropertyValue always return an array. ...(playerOwner.inventory.manager.findItemsByPropertyValue('equipped', false) || []), ...(playerOwner.inventory.manager.findItemsByPropertyValue('equipped', undefined) || []) ]; diff --git a/package-lock.json b/package-lock.json index 62edeba4..943407f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "reldens", - "version": "4.0.0-beta.38", + "version": "4.0.0-beta.38.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "reldens", - "version": "4.0.0-beta.38", + "version": "4.0.0-beta.38.2", "license": "MIT", "dependencies": { "@colyseus/core": "0.15.55", @@ -72,7 +72,7 @@ "@reldens/skills": "^0.33.0", "@reldens/storage": "^0.30.0", "@reldens/tile-map-generator": "^0.16.0", - "@reldens/utils": "^0.38.0", + "@reldens/utils": "^0.39.0", "@sendgrid/mail": "8.1.4", "bcrypt": "5.1.1", "body-parser": "1.20.3", @@ -3839,6 +3839,14 @@ "@reldens/utils": "^0.38.0" } }, + "node_modules/@reldens/items-system/node_modules/@reldens/utils": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", + "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "dependencies": { + "await-event-emitter": "2.0.2" + } + }, "node_modules/@reldens/modifiers": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/@reldens/modifiers/-/modifiers-0.25.0.tgz", @@ -3847,6 +3855,14 @@ "@reldens/utils": "^0.38.0" } }, + "node_modules/@reldens/modifiers/node_modules/@reldens/utils": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", + "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "dependencies": { + "await-event-emitter": "2.0.2" + } + }, "node_modules/@reldens/skills": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@reldens/skills/-/skills-0.33.0.tgz", @@ -3857,6 +3873,14 @@ "@reldens/utils": "^0.38.0" } }, + "node_modules/@reldens/skills/node_modules/@reldens/utils": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", + "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "dependencies": { + "await-event-emitter": "2.0.2" + } + }, "node_modules/@reldens/storage": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/@reldens/storage/-/storage-0.30.0.tgz", @@ -3870,6 +3894,14 @@ "objection": "^3.1.5" } }, + "node_modules/@reldens/storage/node_modules/@reldens/utils": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", + "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "dependencies": { + "await-event-emitter": "2.0.2" + } + }, "node_modules/@reldens/tile-map-generator": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@reldens/tile-map-generator/-/tile-map-generator-0.16.0.tgz", @@ -3906,9 +3938,9 @@ } }, "node_modules/@reldens/utils": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", - "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.39.0.tgz", + "integrity": "sha512-U+japIXXmroiC/MxLxDswkavM8M/YRm1VB75tC8kR5PJZ4TA9QLdcgPzMRwcrFDeuNyvloGdftQg5wwXCIWX1Q==", "dependencies": { "await-event-emitter": "2.0.2" } @@ -4705,9 +4737,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001680", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", - "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "version": "1.0.30001683", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", + "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", "funding": [ { "type": "opencollective", @@ -11967,6 +11999,16 @@ "@reldens/modifiers": "^0.25.0", "@reldens/storage": "^0.30.0", "@reldens/utils": "^0.38.0" + }, + "dependencies": { + "@reldens/utils": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", + "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "requires": { + "await-event-emitter": "2.0.2" + } + } } }, "@reldens/modifiers": { @@ -11975,6 +12017,16 @@ "integrity": "sha512-5KClhPJE23uIbL+mW8XxAWzC/k/UO8k8xFhmHxuBx0GaLKTPLsooUGZnKVFgtsBk8Ow8EvUm1fBErQjXJFwEog==", "requires": { "@reldens/utils": "^0.38.0" + }, + "dependencies": { + "@reldens/utils": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", + "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "requires": { + "await-event-emitter": "2.0.2" + } + } } }, "@reldens/skills": { @@ -11985,6 +12037,16 @@ "@reldens/modifiers": "^0.25.0", "@reldens/storage": "^0.30.0", "@reldens/utils": "^0.38.0" + }, + "dependencies": { + "@reldens/utils": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", + "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "requires": { + "await-event-emitter": "2.0.2" + } + } } }, "@reldens/storage": { @@ -11998,6 +12060,16 @@ "knex": "^3.1.0", "mysql": "^2.18.1", "objection": "^3.1.5" + }, + "dependencies": { + "@reldens/utils": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", + "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "requires": { + "await-event-emitter": "2.0.2" + } + } } }, "@reldens/tile-map-generator": { @@ -12040,9 +12112,9 @@ } }, "@reldens/utils": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.38.0.tgz", - "integrity": "sha512-fqouyi+57YINYkwMjTPi7NsqEzMTH/DZSVfbU06QBwnXB2vuG+61YGOOa3546x9Wt6GdTGjIOldLBwOXIZ6qrw==", + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@reldens/utils/-/utils-0.39.0.tgz", + "integrity": "sha512-U+japIXXmroiC/MxLxDswkavM8M/YRm1VB75tC8kR5PJZ4TA9QLdcgPzMRwcrFDeuNyvloGdftQg5wwXCIWX1Q==", "requires": { "await-event-emitter": "2.0.2" } @@ -12604,9 +12676,9 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "caniuse-lite": { - "version": "1.0.30001680", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", - "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==" + "version": "1.0.30001683", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", + "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==" }, "chalk": { "version": "4.1.2", diff --git a/package.json b/package.json index bf8481fc..26fc2a26 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "reldens", - "version": "4.0.0-beta.38.1", + "version": "4.0.0-beta.38.2", "description": "Reldens - MMORPG Platform", "author": "Damian A. Pastorini", "license": "MIT", @@ -105,7 +105,7 @@ "@reldens/skills": "^0.33.0", "@reldens/storage": "^0.30.0", "@reldens/tile-map-generator": "^0.16.0", - "@reldens/utils": "^0.38.0", + "@reldens/utils": "^0.39.0", "@sendgrid/mail": "8.1.4", "bcrypt": "5.1.1", "body-parser": "1.20.3", diff --git a/theme/admin/reldens-admin-client.js b/theme/admin/reldens-admin-client.js index 80a794b9..5ee2cf02 100644 --- a/theme/admin/reldens-admin-client.js +++ b/theme/admin/reldens-admin-client.js @@ -84,7 +84,7 @@ window.addEventListener('DOMContentLoaded', () => { let links = container.querySelectorAll('.side-bar-item a'); for(let link of links){ let linkWithoutHost = link.href.replace(location.host, '').replace(location.protocol+'//', ''); - if(-1 !== currentPath.indexOf(linkWithoutHost)){ + if(currentPath === linkWithoutHost || 0 === currentPath.indexOf(linkWithoutHost+'/')){ link.parentNode.classList.add('active'); container.classList.add('active'); done = true;