improve new code for cancelling quests in invitation stage and for handling the cases where the quest owner is no longer in the quest or in the party

This commit is contained in:
Alice Harris
2014-09-08 18:46:39 +10:00
parent 801753b37a
commit b5ac0c635a
3 changed files with 69 additions and 25 deletions
+19 -5
View File
@@ -464,7 +464,15 @@ api.removeMember = function(req, res, next){
}
if(_.contains(group.members, uuid)){
Group.update({_id:group._id},{$pull:{members:uuid},$inc:{memberCount:-1}}, function(err, saved){
var update = {$pull:{members:uuid}};
if(group.quest && group.quest.members){
// remove member from quest
update['$unset'] = {};
update['$unset']['quest.members.' + uuid] = "";
// TODO: run cleanQuestProgress and return scroll to member if member was quest owner
}
update['$inc'] = {memberCount: -1};
Group.update({_id:group._id},update, function(err, saved){
if (err) return next(err);
// Sending an empty 204 because Group.update doesn't return the group
@@ -530,7 +538,6 @@ questStart = function(req, res, next) {
quest = shared.content.quests[key],
collected = quest.collect ? _.transform(quest.collect, function(m,v,k){m[k]=0}) : {};
// TODO will this handle appropriately when people leave/join party between quest invite?
_.each(group.members, function(m){
var updates = {$set:{},$inc:{'_v':1}};
if (m == group.quest.leader)
@@ -611,12 +618,19 @@ api.questReject = function(req, res, next) {
api.questCancel = function(req, res, next){
// Cancel a quest BEFORE it has begun (i.e., in the invitation stage)
// Quest scroll has not yet left quest owner's inventory so no need to return it.
// Do not wipe quest progress for members because they'll want it to be applied to the next quest that's started.
var group = res.locals.group;
async.parallel([
function(cb){
group.quest = {key:null,progress:{},leader:null};
group.markModified('quest');
group.save(cb);
if (! group.quest.active) {
// Do not cancel active quests because this function does
// not do the clean-up required for that.
// TODO: return an informative error when quest is active
group.quest = {key:null,progress:{},leader:null};
group.markModified('quest');
group.save(cb);
}
}
], function(err){
if (err) return next(err);