From b5872a9577ff642a5f8047fec98695dba0c35d87 Mon Sep 17 00:00:00 2001 From: Travis Date: Sat, 24 Mar 2018 09:18:33 -0700 Subject: [PATCH] Give MasterClasser Acheivement on completion of any of the series quests, not just the final. (#10086) * Adding check to give master classer acheivement on any master classer series quest completion fixes #9461 * Fixing concat bug by assigning the variable after concatenation. * Fixing retry query. --- test/api/v3/unit/models/group.test.js | 40 +++++++++++++++++- website/server/models/group.js | 61 +++++++++++++++------------ 2 files changed, 72 insertions(+), 29 deletions(-) diff --git a/test/api/v3/unit/models/group.test.js b/test/api/v3/unit/models/group.test.js index 18cdb23b8b..8c963e26de 100644 --- a/test/api/v3/unit/models/group.test.js +++ b/test/api/v3/unit/models/group.test.js @@ -1403,8 +1403,44 @@ describe('Group Model', () => { updatedLeader, updatedParticipatingMember, ] = await Promise.all([ - User.findById(questLeader._id), - User.findById(participatingMember._id), + User.findById(questLeader._id).exec(), + User.findById(participatingMember._id).exec(), + ]); + + expect(updatedLeader.achievements.lostMasterclasser).to.eql(true); + expect(updatedParticipatingMember.achievements.lostMasterclasser).to.not.eql(true); + }); + + it('gives out super awesome Masterclasser achievement when quests done out of order', async () => { + quest = questScrolls.lostMasterclasser1; + party.quest.key = quest.key; + + questLeader.achievements.quests = { + mayhemMistiflying1: 1, + mayhemMistiflying2: 1, + mayhemMistiflying3: 1, + stoikalmCalamity1: 1, + stoikalmCalamity2: 1, + stoikalmCalamity3: 1, + taskwoodsTerror1: 1, + taskwoodsTerror2: 1, + taskwoodsTerror3: 1, + dilatoryDistress1: 1, + dilatoryDistress2: 1, + dilatoryDistress3: 1, + lostMasterclasser2: 1, + lostMasterclasser3: 1, + lostMasterclasser4: 1, + }; + await questLeader.save(); + await party.finishQuest(quest); + + let [ + updatedLeader, + updatedParticipatingMember, + ] = await Promise.all([ + User.findById(questLeader._id).exec(), + User.findById(participatingMember._id).exec(), ]); expect(updatedLeader.achievements.lostMasterclasser).to.eql(true); diff --git a/website/server/models/group.js b/website/server/models/group.js index 5ea63aa784..c619edf8c2 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -792,16 +792,15 @@ function _getUserUpdateForQuestReward (itemToAward, allAwardedItems) { async function _updateUserWithRetries (userId, updates, numTry = 1, query = {}) { query._id = userId; - return await User.update(query, updates).exec() - .then((raw) => { - return raw; - }).catch((err) => { - if (numTry < MAX_UPDATE_RETRIES) { - return _updateUserWithRetries(userId, updates, ++numTry, query); - } else { - throw err; - } - }); + try { + return await User.update(query, updates).exec(); + } catch (err) { + if (numTry < MAX_UPDATE_RETRIES) { + return _updateUserWithRetries(userId, updates, ++numTry, query); + } else { + throw err; + } + } } // Participants: Grant rewards & achievements, finish quest. @@ -851,29 +850,37 @@ schema.methods.finishQuest = async function finishQuest (quest) { } }); - if (questK === 'lostMasterclasser4') { + let masterClasserQuests = [ + 'dilatoryDistress1', + 'dilatoryDistress2', + 'dilatoryDistress3', + 'mayhemMistiflying1', + 'mayhemMistiflying2', + 'mayhemMistiflying3', + 'stoikalmCalamity1', + 'stoikalmCalamity2', + 'stoikalmCalamity3', + 'taskwoodsTerror1', + 'taskwoodsTerror2', + 'taskwoodsTerror3', + 'lostMasterclasser1', + 'lostMasterclasser2', + 'lostMasterclasser3', + 'lostMasterclasser4', + ]; + + if (masterClasserQuests.includes(questK)) { let lostMasterclasserQuery = { 'achievements.lostMasterclasser': {$ne: true}, - 'achievements.quests.mayhemMistiflying1': {$gt: 0}, - 'achievements.quests.mayhemMistiflying2': {$gt: 0}, - 'achievements.quests.mayhemMistiflying3': {$gt: 0}, - 'achievements.quests.stoikalmCalamity1': {$gt: 0}, - 'achievements.quests.stoikalmCalamity2': {$gt: 0}, - 'achievements.quests.stoikalmCalamity3': {$gt: 0}, - 'achievements.quests.taskwoodsTerror1': {$gt: 0}, - 'achievements.quests.taskwoodsTerror2': {$gt: 0}, - 'achievements.quests.taskwoodsTerror3': {$gt: 0}, - 'achievements.quests.dilatoryDistress1': {$gt: 0}, - 'achievements.quests.dilatoryDistress2': {$gt: 0}, - 'achievements.quests.dilatoryDistress3': {$gt: 0}, - 'achievements.quests.lostMasterclasser1': {$gt: 0}, - 'achievements.quests.lostMasterclasser2': {$gt: 0}, - 'achievements.quests.lostMasterclasser3': {$gt: 0}, }; + masterClasserQuests.forEach(questName => { + lostMasterclasserQuery[`achievements.quests.${questName}`] = {$gt: 0}; + }); let lostMasterclasserUpdate = { $set: {'achievements.lostMasterclasser': true}, }; - promises.concat(participants.map(userId => { + + promises = promises.concat(participants.map(userId => { return _updateUserWithRetries(userId, lostMasterclasserUpdate, null, lostMasterclasserQuery); })); }