all files / src/messaging/ notifications.js

25% Statements 12/48
0% Branches 0/26
7.69% Functions 1/13
25% Lines 12/48
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105                                                                                                                                                                                         
'use strict';
 
var async = require('async');
var nconf = require('nconf');
 
var user = require('../user');
var emailer = require('../emailer');
var notifications = require('../notifications');
var meta = require('../meta');
var utils = require('../../public/src/utils');
var sockets = require('../socket.io');
 
module.exports = function(Messaging) {
 
	Messaging.notifyQueue = {};	// Only used to notify a user of a new chat message, see Messaging.notifyUser
 
	Messaging.notifyUsersInRoom = function(fromUid, roomId, messageObj) {
		Messaging.getUidsInRoom(roomId, 0, -1, function(err, uids) {
			if (err) {
				return;
			}
 
			var data = {
				roomId: roomId,
				fromUid: fromUid,
				message: messageObj
			};
			uids.forEach(function(uid) {
				data.self = parseInt(uid, 10) === parseInt(fromUid) ? 1 : 0;
				Messaging.pushUnreadCount(uid);
				sockets.in('uid_' + uid).emit('event:chats.receive', data);
			});
 
			// Delayed notifications
			var queueObj = Messaging.notifyQueue[fromUid + ':' + roomId];
			if (queueObj) {
				queueObj.message.content += '\n' + messageObj.content;
				clearTimeout(queueObj.timeout);
			} else {
				queueObj = Messaging.notifyQueue[fromUid + ':' + roomId] = {
					message: messageObj
				};
			}
 
			queueObj.timeout = setTimeout(function() {
				sendNotifications(fromUid, uids, roomId, queueObj.message, function(err) {
					if (!err) {
						delete Messaging.notifyQueue[fromUid + ':' + roomId];
					}
				});
			}, 1000 * 60); // wait 60s before sending
		});
	};
 
	function sendNotifications(fromuid, uids, roomId, messageObj, callback) {
		user.isOnline(uids, function(err, isOnline) {
			if (err) {
				return callback(err);
			}
 
			uids = uids.filter(function(uid, index) {
				return !isOnline[index] && parseInt(fromuid, 10) !== parseInt(uid, 10);
			});
 
			if (!uids.length) {
				return callback();
			}
 
			notifications.create({
				bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]',
				bodyLong: messageObj.content,
				nid: 'chat_' + fromuid + '_' + roomId,
				from: fromuid,
				path: '/chats/' + messageObj.roomId
			}, function(err, notification) {
				if (!err && notification) {
					notifications.push(notification, uids, callback);
				}
			});
 
			if (parseInt(meta.config.disableEmailSubscriptions, 10) === 1) {
				return callback();
			}
 
			user.getMultipleUserSettings(uids, function(err, userSettings) {
				if (err) {
					return callback(err);
				}
				userSettings = userSettings.filter(function(settings) {
					return settings && settings.sendChatNotifications;
				});
				async.each(userSettings, function(settings, next) {
					emailer.send('notif_chat', settings.uid, {
						subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]',
						summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]',
						message: messageObj,
						site_title: meta.config.title || 'NodeBB',
						url: nconf.get('url'),
						roomId: messageObj.roomId
					}, next);
				}, callback);
			});
		});
	}
};