From 91ce3634fcd969412a01be737f69dc092475db53 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 25 Jul 2014 16:46:04 -0400 Subject: [PATCH] fixed #1904 --- src/messaging.js | 20 +++++++++++++------- src/notifications.js | 23 ++++++++++++++++++++++- src/socket.io/modules.js | 2 +- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/messaging.js b/src/messaging.js index 25c68ae64a..812d91353f 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -2,9 +2,12 @@ var db = require('./database'), async = require('async'), + winston = require('winston'), user = require('./user'), plugins = require('./plugins'), - meta = require('./meta'); + meta = require('./meta'), + notifications = require('./notifications'), + userNotifications = require('./user/notifications'); (function(Messaging) { @@ -33,12 +36,6 @@ var db = require('./database'), return callback(err); } - /* - TODO: Here I'd check the score of the previous message in this chat's sorted set. - but unfortunately, chats are stored as a list. Once nodebb/nodebb#1902 is resolved, - I can finish it up here. - */ - db.setObject('message:' + mid, message, function(err) { if (err) { return callback(err); @@ -99,6 +96,15 @@ var db = require('./database'), getMessages(mids, fromuid, touid, isNew, callback); }); + + // Mark any chat notifications pertaining to this chat as read + notifications.mark_read_by_uniqueid(fromuid, 'chat_' + touid + '_' + fromuid, function(err) { + if (err) { + winston.error('[messaging] Could not mark notifications related to this chat as read: ' + err.message); + } + + userNotifications.pushCount(fromuid); + }); }; function getMessages(mids, fromuid, touid, isNew, callback) { diff --git a/src/notifications.js b/src/notifications.js index 6a363620f4..f471b70ca2 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -34,7 +34,7 @@ var async = require('async'), db.sortedSetRank('uid:' + uid + ':notifications:read', nid, function(err, rank) { db.getObject('notifications:' + nid, function(err, notification) { notification.read = rank !== null ? true:false; - + // Backwards compatibility for old notification schema // Remove this block when NodeBB v0.6.0 is released. if (notification.hasOwnProperty('text')) { @@ -289,6 +289,27 @@ var async = require('async'), }); }; + // why_are_we_using_underscores_here_? + // maybe_camel_case_ALL_THE_THINGS + Notifications.mark_read_by_uniqueid = function(uid, uniqueId, callback) { + async.waterfall([ + async.apply(db.getSortedSetRange, 'uid:' + uid + ':notifications:unread', 0, 10), + function(nids, next) { + async.filter(nids, function(nid, next) { + db.getObjectField('notifications:' + nid, 'uniqueId', function(err, value) { + next(uniqueId === value); + }); + }, function(nids) { + next(null, nids); + }); + }, + function(nids, next) { + console.log('matches:', nids); + Notifications.mark_read_multiple(nids, uid, next); + } + ], callback); + }; + Notifications.prune = function(cutoff) { var start = process.hrtime(); diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index ac51cbdf93..b396299fa9 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -229,7 +229,7 @@ function sendChatNotification(fromuid, touid, messageObj) { bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', bodyLong: messageObj.content, path: nconf.get('relative_path') + '/chats/' + utils.slugify(messageObj.fromUser.username), - uniqueId: 'notification_' + fromuid + '_' + touid, + uniqueId: 'chat_' + fromuid + '_' + touid, from: fromuid }, function(nid) { notifications.push(nid, [touid]);