diff --git a/website/public/js/controllers/notificationCtrl.js b/website/public/js/controllers/notificationCtrl.js index cd211e8493..99f086efae 100644 --- a/website/public/js/controllers/notificationCtrl.js +++ b/website/public/js/controllers/notificationCtrl.js @@ -148,8 +148,9 @@ habitrpg.controller('NotificationCtrl', }); // Quest invitation modal - $rootScope.$watch('party.quest.key && !party.quest.active && party.quest.members[user._id] == undefined', function(after, before){ - if (after == before || after != true) return; + $rootScope.$watch('user.party.quest.invited == true', function(after, before){ + if (after != true) return; + $rootScope.party.$get(); $rootScope.openModal('questInvitation'); }); diff --git a/website/src/controllers/groups.js b/website/src/controllers/groups.js index b9d2643c61..312e79e262 100644 --- a/website/src/controllers/groups.js +++ b/website/src/controllers/groups.js @@ -912,6 +912,7 @@ api.questAccept = function(req, res, next) { group.quest.members[m] = true; group.quest.leader = user._id; } else { + User.update({_id:m},{$set: {'party.quest.invited': true}}).exec(); group.quest.members[m] = undefined; User.findById(m, function(err,groupMember){ @@ -947,6 +948,7 @@ api.questAccept = function(req, res, next) { } else { if (!group.quest.key) return res.json(400,{err:'No quest invitation has been sent out yet.'}); group.quest.members[user._id] = true; + User.update({_id:user._id}, {$set: {'party.quest.invited': false}}).exec(); questStart(req,res,next); } } @@ -957,6 +959,7 @@ api.questReject = function(req, res, next) { if (!group.quest.key) return res.json(400,{err:'No quest invitation has been sent out yet.'}); group.quest.members[user._id] = false; + User.update({_id:user._id}, {$set: {'party.quest.invited': false}}).exec(); questStart(req,res,next); } @@ -974,6 +977,9 @@ api.questCancel = function(req, res, next){ group.quest = {key:null,progress:{},leader:null}; group.markModified('quest'); group.save(cb); + _.each(group.members, function(m){ + User.update({_id:m}, {$set: {'party.quest.invited': false}}).exec(); + }); } } ], function(err){ diff --git a/website/src/models/group.js b/website/src/models/group.js index d776377488..e85be2dd57 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -141,7 +141,8 @@ var cleanQuestProgress = function(merge){ down: 0, collect: {} }, - completed: null + completed: null, + invited: false }; merge = merge || {progress:{}}; _.merge(clean, _.omit(merge,'progress')); diff --git a/website/src/models/user.js b/website/src/models/user.js index 60385abfbb..a3738f3d1c 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -280,7 +280,8 @@ var UserSchema = new Schema({ down: {type: Number, 'default': 0}, collect: {type: Schema.Types.Mixed, 'default': {}} // {feather:1, ingot:2} }, - completed: String // When quest is done, we move it from key => completed, and it's a one-time flag (for modal) that they unset by clicking "ok" in browser + completed: String, // When quest is done, we move it from key => completed, and it's a one-time flag (for modal) that they unset by clicking "ok" in browser + invited: {type: Boolean, 'default': false} // Set to true when invite is pending, set to false when quest invite is accepted or rejected } }, preferences: {