@ -12,6 +12,23 @@ const meta = require('../meta');
module . exports = function ( Messaging ) {
// Only used to notify a user of a new chat message
Messaging . notifyQueue = { } ;
Messaging . setUserNotificationSetting = async ( uid , roomId , value ) => {
if ( parseInt ( value , 10 ) === - 1 ) {
// go back to default
return await db . deleteObjectField ( ` chat:room: ${ roomId } :notification:settings ` , uid ) ;
}
await db . setObjectField ( ` chat:room: ${ roomId } :notification:settings ` , uid , parseInt ( value , 10 ) ) ;
} ;
Messaging . getUidsNotificationSetting = async ( uids , roomId ) => {
const [ settings , roomData ] = await Promise . all ( [
db . getObjectFields ( ` chat:room: ${ roomId } :notification:settings ` , uids ) ,
Messaging . getRoomData ( roomId , [ 'notificationSetting' ] ) ,
] ) ;
return uids . map ( uid => parseInt ( settings [ uid ] || roomData . notificationSetting , 10 ) ) ;
} ;
Messaging . notifyUsersInRoom = async ( fromUid , roomId , messageObj ) => {
const isPublic = parseInt ( await db . getObjectField ( ` chat:room: ${ roomId } ` , 'public' ) , 10 ) === 1 ;
@ -34,13 +51,15 @@ module.exports = function (Messaging) {
// delivers unread public msg to all online users on the chats page
io . in ( ` chat_room_public_ ${ roomId } ` ) . emit ( 'event:chats.public.unread' , unreadData ) ;
}
if ( messageObj . system || isPublic ) {
if ( messageObj . system ) {
return ;
}
// push unread count only for private rooms
const uids = await Messaging . getAllUidsInRoomFromSet ( ` chat:room: ${ roomId } :uids:online ` ) ;
Messaging . pushUnreadCount ( uids , unreadData ) ;
if ( ! isPublic ) {
const uids = await Messaging . getAllUidsInRoomFromSet ( ` chat:room: ${ roomId } :uids:online ` ) ;
Messaging . pushUnreadCount ( uids , unreadData ) ;
}
// Delayed notifications
let queueObj = Messaging . notifyQueue [ ` ${ fromUid } : ${ roomId } ` ] ;
@ -65,27 +84,41 @@ module.exports = function (Messaging) {
} ;
async function sendNotification ( fromUid , roomId , messageObj ) {
const { displayname } = messageObj . fromUser ;
const isGroupChat = await Messaging . isGroupChat ( roomId ) ;
const notification = await notifications . create ( {
type : isGroupChat ? 'new-group-chat' : 'new-chat' ,
subject : ` [[email:notif.chat.subject, ${ displayname } ]] ` ,
bodyShort : ` [[notifications:new_message_from, ${ displayname } ]] ` ,
bodyLong : messageObj . content ,
nid : ` chat_ ${ fromUid } _ ${ roomId } ` ,
from : fromUid ,
path : ` /chats/ ${ messageObj . roomId } ` ,
} ) ;
fromUid = parseInt ( fromUid , 10 ) ;
const [ settings , roomData ] = await Promise . all ( [
db . getObject ( ` chat:room: ${ roomId } :notification:settings ` ) ,
Messaging . getRoomData ( roomId , [ 'notificationSetting' ] ) ,
] ) ;
const roomDefault = roomData . notificationSetting ;
const uidsToNotify = [ ] ;
const { ALLMESSAGES } = Messaging . notificationSettings ;
await batch . processSortedSet ( ` chat:room: ${ roomId } :uids:online ` , async ( uids ) => {
uids = uids . filter (
uid => ( parseInt ( ( settings && settings [ uid ] ) || roomDefault , 10 ) === ALLMESSAGES ) &&
fromUid !== parseInt ( uid , 10 )
) ;
const hasRead = await Messaging . hasRead ( uids , roomId ) ;
uids = uids . filter ( ( uid , index ) => ! hasRead [ index ] && parseInt ( fromUid , 10 ) !== parseInt ( uid , 10 ) ) ;
notifications . push ( notification , uids ) ;
uidsToNotify . push ( ... uids . filter ( ( uid , index ) => ! hasRead [ index ] ) ) ;
} , {
reverse : true ,
batch : 500 ,
interval : 100 0 ,
interval : 100 ,
} ) ;
if ( uidsToNotify . length ) {
const { displayname } = messageObj . fromUser ;
const isGroupChat = await Messaging . isGroupChat ( roomId ) ;
const notification = await notifications . create ( {
type : isGroupChat ? 'new-group-chat' : 'new-chat' ,
subject : ` [[email:notif.chat.subject, ${ displayname } ]] ` ,
bodyShort : ` [[notifications:new_message_from, ${ displayname } ]] ` ,
bodyLong : messageObj . content ,
nid : ` chat_ ${ fromUid } _ ${ roomId } ` ,
from : fromUid ,
path : ` /chats/ ${ messageObj . roomId } ` ,
} ) ;
await notifications . push ( notification , uidsToNotify ) ;
}
}
} ;