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.
This commit is contained in:
Travis
2018-03-24 09:18:33 -07:00
committed by Sabe Jones
parent 48fa78bef2
commit b5872a9577
2 changed files with 72 additions and 29 deletions

View File

@@ -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);

View File

@@ -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);
}));
}