| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var async = require('async'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var meta = require('../meta'); | 
					
						
							|  |  |  | var plugins = require('../plugins'); | 
					
						
							|  |  |  | var db = require('../database'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = function(Messaging) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 	Messaging.sendMessage = function(uid, roomId, content, timestamp, callback) { | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function (next) { | 
					
						
							|  |  |  | 				Messaging.checkContent(content, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function (next) { | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 				Messaging.isUserInRoom(uid, roomId, next); | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 			function (inRoom, next) { | 
					
						
							|  |  |  | 				if (!inRoom) { | 
					
						
							|  |  |  | 					return next(new Error('[[error:not-allowed]]')); | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-12-16 15:09:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 				Messaging.addMessage(uid, roomId, content, timestamp, next); | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Messaging.checkContent = function(content, callback) { | 
					
						
							|  |  |  | 		if (!content) { | 
					
						
							|  |  |  | 			return callback(new Error('[[error:invalid-chat-message]]')); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (content.length > (meta.config.maximumChatMessageLength || 1000)) { | 
					
						
							|  |  |  | 			return callback(new Error('[[error:chat-message-too-long]]')); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-12-16 15:09:14 +02:00
										 |  |  | 		callback(); | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Messaging.addMessage = function(fromuid, roomId, content, timestamp, callback) { | 
					
						
							|  |  |  | 		var mid; | 
					
						
							|  |  |  | 		var message; | 
					
						
							| 
									
										
										
										
											2015-12-16 21:52:42 +02:00
										 |  |  | 		var isNewSet; | 
					
						
							| 
									
										
										
										
											2015-12-16 15:09:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 		async.waterfall([ | 
					
						
							|  |  |  | 			function (next) { | 
					
						
							|  |  |  | 				Messaging.checkContent(content, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function (next) { | 
					
						
							|  |  |  | 				db.incrObjectField('global', 'nextMid', next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function (_mid, next) { | 
					
						
							|  |  |  | 				mid = _mid; | 
					
						
							|  |  |  | 				message = { | 
					
						
							|  |  |  | 					content: content, | 
					
						
							|  |  |  | 					timestamp: timestamp, | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 					fromuid: fromuid | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				plugins.fireHook('filter:messaging.save', message, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function (message, next) { | 
					
						
							|  |  |  | 				db.setObject('message:' + mid, message, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function (next) { | 
					
						
							| 
									
										
										
										
											2015-12-16 21:52:42 +02:00
										 |  |  | 				Messaging.isNewSet(fromuid, roomId, timestamp, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function (_isNewSet, next) { | 
					
						
							|  |  |  | 				isNewSet = _isNewSet; | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 				db.getSortedSetRange('chat:room:' + roomId + ':uids', 0, -1, next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function (uids, next) { | 
					
						
							|  |  |  | 				async.parallel([ | 
					
						
							| 
									
										
										
										
											2015-12-16 13:35:24 +02:00
										 |  |  | 					async.apply(Messaging.addRoomToUsers, roomId, uids, timestamp), | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 					async.apply(Messaging.addMessageToUsers, roomId, uids, mid, timestamp), | 
					
						
							| 
									
										
										
										
											2015-12-23 10:10:59 +02:00
										 |  |  | 					async.apply(Messaging.markUnread, uids, roomId), | 
					
						
							|  |  |  | 					async.apply(Messaging.addUsersToRoom, fromuid, [fromuid], roomId) | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 				], next); | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			function (results, next) { | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 				async.parallel({ | 
					
						
							| 
									
										
										
										
											2015-12-16 15:43:01 +02:00
										 |  |  | 					markRead: async.apply(Messaging.markRead, fromuid, roomId), | 
					
						
							| 
									
										
										
										
											2015-12-23 10:10:59 +02:00
										 |  |  | 					messages: async.apply(Messaging.getMessagesData, [mid], fromuid, roomId, true) | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 				}, next); | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 			function (results, next) { | 
					
						
							|  |  |  | 				if (!results.messages || !results.messages[0]) { | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 					return next(null, null); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-16 21:52:42 +02:00
										 |  |  | 				results.messages[0].newSet = isNewSet; | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 				results.messages[0].mid = mid; | 
					
						
							| 
									
										
										
										
											2015-12-16 11:15:43 +02:00
										 |  |  | 				results.messages[0].roomId = roomId; | 
					
						
							| 
									
										
										
										
											2015-12-15 20:00:51 +02:00
										 |  |  | 				next(null, results.messages[0]); | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		], callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-16 13:35:24 +02:00
										 |  |  | 	Messaging.addRoomToUsers = function(roomId, uids, timestamp, callback) { | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 		if (!uids.length) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		var keys = uids.map(function(uid) { | 
					
						
							|  |  |  | 			return 'uid:' + uid + ':chat:rooms'; | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-12-15 17:50:30 +02:00
										 |  |  | 		db.sortedSetsAdd(keys, timestamp, roomId, callback); | 
					
						
							| 
									
										
										
										
											2015-12-15 14:10:32 +02:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Messaging.addMessageToUsers = function(roomId, uids, mid, timestamp, callback) { | 
					
						
							|  |  |  | 		if (!uids.length) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		var keys = uids.map(function(uid) { | 
					
						
							|  |  |  | 			return 'uid:' + uid + ':chat:room:' + roomId + ':mids'; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		db.sortedSetsAdd(keys, timestamp, mid, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; |