feat(groups): add group chat notifications

This commit is contained in:
Tyler Renelle 2014-02-12 21:20:42 -07:00
parent bb852ce9e5
commit ce82be637d
7 changed files with 52 additions and 6 deletions

View file

@ -114,8 +114,12 @@ window.habitrpg = angular.module('habitrpg',
.state('options.social.guilds.detail', {
url: '/:gid',
templateUrl: 'partials/options.social.guilds.detail.html',
controller: ['$scope', 'Groups', '$stateParams', function($scope, Groups, $stateParams){
$scope.group = Groups.Group.get({gid:$stateParams.gid});
controller: ['$scope', 'Groups', '$stateParams',
function($scope, Groups, $stateParams){
Groups.Group.get({gid:$stateParams.gid}, function(group){
$scope.group = group;
Groups.seenMessage(group._id);
});
}]
})

View file

@ -319,6 +319,9 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
$scope.text = 'Party';
$scope.group = $rootScope.party = Groups.party();
$scope.newGroup = new Groups.Group({type:'party'});
Groups.seenMessage($scope.group._id);
$scope.create = function(group){
group.$save(function(newGroup){
$scope.group = newGroup;

View file

@ -5,8 +5,8 @@
*/
angular.module('groupServices', ['ngResource']).
factory('Groups', ['API_URL', '$resource', '$q',
function(API_URL, $resource, $q) {
factory('Groups', ['API_URL', '$resource', '$q', '$http', 'User',
function(API_URL, $resource, $q, $http, User) {
var Group = $resource(API_URL + '/api/v2/groups/:gid',
{gid:'@_id', messageId: '@_messageId'},
{
@ -44,6 +44,12 @@ angular.module('groupServices', ['ngResource']).
return tavern;
},
// On enter, set chat message to "seen"
seenMessage: function(gid){
$http.post('/api/v2/groups/'+gid+'/chat/seen');
User.user.newMessages[gid] = false;
},
Group: Group
}
}

View file

@ -249,6 +249,14 @@ api.deleteChatMessage = function(req, res){
});
}
api.seenMessage = function(req,res,next){
// Skip the auth step, we want this to be fast. If !found with uuid/token, then it just doesn't save
var update = {$set:{}};
update['$set']['newMessages.'+req.params.gid+'.value'] = false;
User.update({_id:req.headers['x-api-user'], apiToken:req.headers['x-api-key']},update).exec();
res.send(200);
}
api.likeChatMessage = function(req, res, next) {
var user = res.locals.user;
var group = res.locals.group;

View file

@ -106,6 +106,17 @@ GroupSchema.methods.sendChat = function(message, user){
}
group.chat.unshift(message);
group.chat.splice(200);
// Kick off chat notifications in the background.
var lastSeenUpdate = {$set:{}, $inc:{_v:1}};
lastSeenUpdate['$set']['newMessages.'+group._id] = {name:group.name,value:true};
if (group._id == 'habitrpg') {
// TODO For Tavern, only notify them if their name was mentioned
// var profileNames = [] // get usernames from regex of @xyz. how to handle space-delimited profile names?
// User.update({'profile.name':{$in:profileNames}},lastSeenUpdate,{multi:true}).exec();
} else {
mongoose.model('User').update({_id:{$in:group.members, $ne: user ? user._id : ''}},lastSeenUpdate,{multi:true}).exec();
}
}
var cleanQuestProgress = function(merge){

View file

@ -207,9 +207,11 @@ var UserSchema = new Schema({
lastCron: {type: Date, 'default': Date.now},
// {GROUP_ID: Boolean}, represents whether they have unseen chat messages
newMessages: {type: Schema.Types.Mixed, 'default': {}},
party: {
// id // FIXME can we use a populated doc instead of fetching party separate from user?
lastMessageSeen: String,
order: {type:String, 'default':'level'},
quest: {
key: String,
@ -245,7 +247,8 @@ var UserSchema = new Schema({
disableClasses: {type: Boolean, 'default': false},
newTaskEdit: {type: Boolean, 'default': false},
tagsCollapsed: {type: Boolean, 'default': false},
advancedCollapsed: {type: Boolean, 'default': false}
advancedCollapsed: {type: Boolean, 'default': false},
toolbarCollapsed: {type:Boolean, 'default':false}
},
profile: {
blurb: String,

View file

@ -488,6 +488,17 @@ module.exports = (swagger, v2) ->
middleware: [auth.auth, groups.attachGroup]
action: groups.postChat
# placing before route below, so that if !=='seen' it goes to next()
"/groups/{gid}/chat/seen":
spec:
method: 'POST'
description: "Flag chat messages for a particular group as seen"
parameters: [
path 'gid','Group id','string'
]
middleware: []
action: groups.seenMessage
"/groups/{gid}/chat/{messageId}":
spec:
method: 'DELETE'