quest: add quest leader. only quest-leader can begin/abort. Abort

restores quest scroll to leader. Bug fixes on clearing quest
data (completion, abort, etc)
This commit is contained in:
Tyler Renelle
2013-12-28 15:29:29 -07:00
parent 1d6679298d
commit ea0b5b9291
4 changed files with 46 additions and 26 deletions
+21 -14
View File
@@ -417,16 +417,13 @@ questStart = function(req, res) {
// 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 == user._id)
if (m == group.quest.leader)
updates['$inc']['items.quests.'+key] = -1;
if (group.quest.members[m] == true) {
updates['$set']['party.quest.key'] = key;
updates['$set']['party.quest.progress'] = {up:0,down:0,collect:collected};
updates['$unset'] = {'party.quest.completed':1};
updates['$set']['party.quest'] = Group.cleanQuestProgress({key:key,progress:{collect:collected}});
questMembers[m] = true;
} else {
updates['$unset'] = {'party.quest.key':1};
updates['$set']['party.quest.progress'] = {};
updates['$set']['party.quest'] = Group.cleanQuestProgress();
}
parallel.push(function(cb2){
User.update({_id:m},updates,cb2);
@@ -464,9 +461,10 @@ api.questAccept = function(req, res) {
// Invite everyone. true means "accepted", false="rejected", undefined="pending". Once we click "start quest"
// or everyone has either accepted/rejected, then we store quest key in user object.
_.each(group.members, function(m){
if (m == user._id)
if (m == user._id) {
group.quest.members[m] = true;
else
group.quest.leader = user._id;
} else
group.quest.members[m] = undefined;
});
@@ -493,14 +491,23 @@ api.questAbort = function(req, res, next){
var group = res.locals.group;
async.parallel([
function(cb){
User.update({_id:{$in: _.keys(group.quest.members)}},{
$unset: {'party.quest.key':1},
$set: {'party.quest.progress.collect':{}},
$inc: {_v:1}
},cb);
User.update(
{_id:{$in: _.keys(group.quest.members)}},
{
$set: {'party.quest':Group.cleanQuestProgress()},
$inc: {_v:1}
},
{multi:true},
cb);
},
// Refund party leader quest scroll
function(cb){
var update = {$inc:{}};
update['$inc']['items.quests.' + group.quest.key] = 1;
User.update({_id:group.quest.leader}, update, cb);
},
function(cb) {
group.quest = {};
group.quest = {key:null,progress:{},leader:null};
group.markModified('quest');
group.save(cb);
}