Prevent progress being cleared when quest ends (#10870)

* Prevent progress being cleared when quest ends

changing group tests to make sure it keeps user's progress

fix and remove .only() from tests

* fix tests and check null case for clearing up user's quest without resetting progress
This commit is contained in:
Rene Cordier
2018-12-29 01:16:21 +07:00
committed by Matteo Pagliazzi
parent d84631255b
commit 7c954f7073
3 changed files with 102 additions and 43 deletions

View File

@@ -173,25 +173,41 @@ schema.pre('remove', true, async function preRemoveGroup (next, done) {
}
});
// return a clean object for user.quest
function _cleanQuestProgress (merge) {
let clean = {
key: null,
progress: {
// return clean updates for each user in a party without resetting their progress
function _cleanQuestParty (merge) {
let updates = {
$set: {
'party.quest.key': null,
'party.quest.completed': null,
'party.quest.RSVPNeeded': false,
},
};
if (merge) _.merge(updates, merge);
return updates;
}
// return a clean user.quest of a particular user while keeping his progress
function _cleanQuestUser (userProgress) {
if (!userProgress) {
userProgress = {
up: 0,
down: 0,
collect: {},
collectedItems: 0,
},
};
} else {
userProgress = userProgress.toObject();
}
let clean = {
key: null,
progress: userProgress,
completed: null,
RSVPNeeded: false,
};
if (merge) {
_.merge(clean, _.omit(merge, 'progress'));
if (merge.progress) _.merge(clean.progress, merge.progress);
}
return clean;
}
@@ -634,11 +650,8 @@ schema.methods.startQuest = async function startQuest (user) {
// Do not block updates
User.update({
_id: { $in: nonMembers },
}, {
$set: {
'party.quest': _cleanQuestProgress(),
},
}, { multi: true }).exec();
}, _cleanQuestParty(),
{ multi: true }).exec();
const newMessage = this.sendChat(`\`Your quest, ${quest.text('en')}, has started.\``, null, {
participatingMembers: this.getParticipatingQuestMembers().join(', '),
@@ -707,7 +720,8 @@ schema.methods.sendGroupChatReceivedWebhooks = function sendGroupChatReceivedWeb
});
};
schema.statics.cleanQuestProgress = _cleanQuestProgress;
schema.statics.cleanQuestParty = _cleanQuestParty;
schema.statics.cleanQuestUser = _cleanQuestUser;
// returns a clean object for group.quest
schema.statics.cleanGroupQuest = function cleanGroupQuest () {
@@ -784,7 +798,7 @@ schema.methods.finishQuest = async function finishQuest (quest) {
if (this._id === TAVERN_ID) {
updates.$set['party.quest.completed'] = questK; // Just show the notif
} else {
updates.$set['party.quest'] = _cleanQuestProgress({completed: questK}); // clear quest progress
_.merge(updates, _cleanQuestParty({$set: {'party.quest.completed': questK}})); // clear quest progress
}
_.each(_.reject(quest.drop.items, 'onlyOwner'), (item) => {