From ce1d1a763b01e2aa32c7f8e97f921c1c3743bbbf Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Tue, 17 Oct 2023 22:29:02 +0000 Subject: [PATCH] fix(quests): level up if appropriate after completion --- .../achievements/questCompleted.vue | 1 + website/client/src/mixins/notifications.js | 1 + website/client/src/store/actions/user.js | 5 +++++ website/server/controllers/api-v3/user.js | 22 +++++++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/website/client/src/components/achievements/questCompleted.vue b/website/client/src/components/achievements/questCompleted.vue index 90c68775d0..78c38927b3 100644 --- a/website/client/src/components/achievements/questCompleted.vue +++ b/website/client/src/components/achievements/questCompleted.vue @@ -91,6 +91,7 @@ export default { this.close(); }, hide () { + this.$store.dispatch('user:statSync'); this.$store.dispatch('user:set', { 'party.quest.completed': '' }); }, }, diff --git a/website/client/src/mixins/notifications.js b/website/client/src/mixins/notifications.js index 738631c1f3..d489005cc1 100644 --- a/website/client/src/mixins/notifications.js +++ b/website/client/src/mixins/notifications.js @@ -33,6 +33,7 @@ export const NotificationMixins = { this.notify(`${this.sign(val)}${val}`, 'damage'); }, exp (val) { + if (val === 0) return; const message = getXPMessage(val); this.notify(message, 'xp', 'glyphicon glyphicon-star', this.sign(val)); }, diff --git a/website/client/src/store/actions/user.js b/website/client/src/store/actions/user.js index 84bb39adbe..7760c56c00 100644 --- a/website/client/src/store/actions/user.js +++ b/website/client/src/store/actions/user.js @@ -8,6 +8,7 @@ import disableClassesOp from '@/../../common/script/ops/disableClasses'; import openMysteryItemOp from '@/../../common/script/ops/openMysteryItem'; import { unEquipByType } from '../../../../common/script/ops/unequip'; import markPMSRead from '../../../../common/script/ops/markPMSRead'; +import updateStats from '../../../../common/script/fns/updateStats'; export function fetch (store, options = {}) { // eslint-disable-line no-shadow return loadAsyncResource({ @@ -179,6 +180,10 @@ export async function getPurchaseHistory () { return response.data.data; } +export function statSync (store) { + updateStats(store.state.user.data, store.state.user.data.stats); + return axios.post('/api/v4/user/stat-sync'); +} export function newPrivateMessageTo (store, params) { const { member } = params; diff --git a/website/server/controllers/api-v3/user.js b/website/server/controllers/api-v3/user.js index c26a0802eb..02dc79a8cd 100644 --- a/website/server/controllers/api-v3/user.js +++ b/website/server/controllers/api-v3/user.js @@ -1775,4 +1775,26 @@ api.movePinnedItem = { }, }; +/** + * @api {post} /api/v3/user/stat-sync + * Request a refresh of user stats, including processing of pending level-ups + * @apiName StatSync + * @apiGroup User + * + * @apiSuccess {Object} data The user object + */ + +api.statSync = { + method: 'POST', + middlewares: [authWithHeaders()], + url: '/user/stat-sync', + async handler (req, res) { + const { user } = res.locals; + common.fns.updateStats(user, user.stats); + await user.save(); + + res.respond(200, user); + }, +}; + export default api;