| 
									
										
										
										
											2014-03-08 15:45:42 -05:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 21:20:55 -05:00
										 |  |  | var db = require('./database'), | 
					
						
							| 
									
										
										
										
											2013-10-17 12:05:53 -04:00
										 |  |  | 	async = require('async'), | 
					
						
							| 
									
										
										
										
											2013-12-27 14:09:22 -05:00
										 |  |  | 	user = require('./user'), | 
					
						
							| 
									
										
										
										
											2014-01-25 01:34:56 -05:00
										 |  |  | 	plugins = require('./plugins'), | 
					
						
							| 
									
										
										
										
											2013-12-27 14:09:22 -05:00
										 |  |  | 	meta = require('./meta'); | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (function(Messaging) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function sortUids(fromuid, touid) { | 
					
						
							| 
									
										
										
										
											2014-03-14 20:06:46 -04:00
										 |  |  | 		return [fromuid, touid].sort(); | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Messaging.addMessage = function(fromuid, touid, content, callback) { | 
					
						
							|  |  |  | 		var uids = sortUids(fromuid, touid); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 21:20:55 -05:00
										 |  |  | 		db.incrObjectField('global', 'nextMid', function(err, mid) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 				return callback(err, null); | 
					
						
							| 
									
										
										
										
											2013-12-02 21:20:55 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			var message = { | 
					
						
							|  |  |  | 				content: content, | 
					
						
							|  |  |  | 				timestamp: Date.now(), | 
					
						
							|  |  |  | 				fromuid: fromuid, | 
					
						
							|  |  |  | 				touid: touid | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 21:20:55 -05:00
										 |  |  | 			db.setObject('message:' + mid, message); | 
					
						
							|  |  |  | 			db.listAppend('messages:' + uids[0] + ':' + uids[1], mid); | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 17:35:44 -05:00
										 |  |  | 			Messaging.updateChatTime(fromuid, touid); | 
					
						
							|  |  |  | 			Messaging.updateChatTime(touid, fromuid); | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 			callback(null, message); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-03-08 15:45:42 -05:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Messaging.getMessages = function(fromuid, touid, callback) { | 
					
						
							|  |  |  | 		var uids = sortUids(fromuid, touid); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-27 14:09:22 -05:00
										 |  |  | 		db.getListRange('messages:' + uids[0] + ':' + uids[1], -((meta.config.chatMessagesToDisplay || 50) - 1), -1, function(err, mids) { | 
					
						
							| 
									
										
										
										
											2013-12-02 21:20:55 -05:00
										 |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 				return callback(err, null); | 
					
						
							| 
									
										
										
										
											2013-12-02 21:20:55 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-17 13:09:37 -04:00
										 |  |  | 			if (!mids || !mids.length) { | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 				return callback(null, []); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-05 20:29:13 -05:00
										 |  |  | 			user.getMultipleUserFields([fromuid, touid], ['username', 'userslug', 'picture'], function(err, userData) { | 
					
						
							| 
									
										
										
										
											2013-12-27 14:09:22 -05:00
										 |  |  | 				if(err) { | 
					
						
							|  |  |  | 					return callback(err, null); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-26 22:10:06 -05:00
										 |  |  | 				userData[0].uid = touid; | 
					
						
							|  |  |  | 				userData[1].uid = fromuid; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 				function getMessage(mid, next) { | 
					
						
							| 
									
										
										
										
											2013-12-02 21:20:55 -05:00
										 |  |  | 					db.getObject('message:' + mid, function(err, message) { | 
					
						
							|  |  |  | 						if (err) { | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 							return next(err); | 
					
						
							| 
									
										
										
										
											2013-12-02 21:20:55 -05:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-26 22:10:06 -05:00
										 |  |  | 						Messaging.parse(message.content, message.fromuid, fromuid, userData[1], userData[0], false, function(result) { | 
					
						
							| 
									
										
										
										
											2014-01-18 15:35:51 -05:00
										 |  |  | 							message.content = result; | 
					
						
							| 
									
										
										
										
											2014-02-11 23:44:14 -05:00
										 |  |  | 							next(null, message); | 
					
						
							| 
									
										
										
										
											2014-01-18 15:35:51 -05:00
										 |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-11 23:44:14 -05:00
										 |  |  | 				async.map(mids, getMessage, callback); | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2013-12-27 14:09:22 -05:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-26 22:10:06 -05:00
										 |  |  | 	Messaging.parse = function (message, fromuid, myuid, toUserData, myUserData, isNew, callback) { | 
					
						
							| 
									
										
										
										
											2014-01-18 15:35:51 -05:00
										 |  |  | 		plugins.fireHook('filter:post.parse', message, function(err, parsed) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(message); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-01-20 12:56:09 -05:00
										 |  |  | 			var username, | 
					
						
							|  |  |  | 				picture; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (parseInt(fromuid, 10) === parseInt(myuid, 10)) { | 
					
						
							| 
									
										
										
										
											2014-02-05 20:29:13 -05:00
										 |  |  | 				picture = '<a href="/user/' + myUserData.userslug + '"><img class="chat-user-image" src="' + myUserData.picture + '"></a>'; | 
					
						
							| 
									
										
										
										
											2014-01-20 12:56:09 -05:00
										 |  |  | 				username = '<span class="chat-user chat-user-you"> '+ myUserData.username + '</span>: '; | 
					
						
							| 
									
										
										
										
											2014-01-18 15:35:51 -05:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2014-02-05 20:29:13 -05:00
										 |  |  | 				picture = '<a href="/user/' + toUserData.userslug + '"><img class="chat-user-image" src="' + toUserData.picture + '"></a>'; | 
					
						
							| 
									
										
										
										
											2014-01-20 12:56:09 -05:00
										 |  |  | 				username = '<span class="chat-user"> ' + toUserData.username + '</span>: '; | 
					
						
							| 
									
										
										
										
											2014-01-18 15:35:51 -05:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-26 16:50:59 -05:00
										 |  |  | 			var messageData = { | 
					
						
							|  |  |  | 				message: message, | 
					
						
							|  |  |  | 				parsed: parsed, | 
					
						
							|  |  |  | 				fromuid: fromuid, | 
					
						
							|  |  |  | 				myuid: myuid, | 
					
						
							|  |  |  | 				toUserData: toUserData, | 
					
						
							|  |  |  | 				myUserData: myUserData, | 
					
						
							| 
									
										
										
										
											2014-01-26 22:10:06 -05:00
										 |  |  | 				isNew: isNew, | 
					
						
							| 
									
										
										
										
											2014-01-26 16:50:59 -05:00
										 |  |  | 				parsedMessage: picture + username + parsed | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			plugins.fireHook('filter:messaging.parse', messageData, function(err, messageData) { | 
					
						
							|  |  |  | 				callback(messageData.parsedMessage); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2014-01-18 15:35:51 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-01-15 18:20:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 17:35:44 -05:00
										 |  |  | 	Messaging.updateChatTime = function(uid, toUid, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-05 21:29:51 -05:00
										 |  |  | 		db.sortedSetAdd('uid:' + uid + ':chats', Date.now(), toUid, function(err) { | 
					
						
							| 
									
										
										
										
											2013-12-05 17:35:44 -05:00
										 |  |  | 			if (callback) { | 
					
						
							|  |  |  | 				callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Messaging.getRecentChats = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2013-12-05 21:29:51 -05:00
										 |  |  | 		db.getSortedSetRevRange('uid:' + uid + ':chats', 0, 9, function(err, uids) { | 
					
						
							| 
									
										
										
										
											2013-12-27 14:09:22 -05:00
										 |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2013-12-05 17:35:44 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-27 14:09:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-14 19:34:05 -04:00
										 |  |  | 			user.getMultipleUserFields(uids, ['username', 'picture', 'uid'], function(err, users) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							| 
									
										
										
										
											2014-03-14 20:06:46 -04:00
										 |  |  | 					return callback(err); | 
					
						
							| 
									
										
										
										
											2014-03-14 19:34:05 -04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				users = users.filter(function(user) { | 
					
						
							|  |  |  | 					return !!user.uid; | 
					
						
							| 
									
										
										
										
											2014-03-14 20:06:46 -04:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2014-03-14 19:34:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-17 16:27:56 -04:00
										 |  |  | 				async.map(users, function(userData, next) { | 
					
						
							|  |  |  | 					user.isOnline(userData.uid, function(err, data) { | 
					
						
							|  |  |  | 						if (err) { | 
					
						
							|  |  |  | 							return next(err); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						userData.status = data.status; | 
					
						
							|  |  |  | 						next(null, userData); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				}, callback); | 
					
						
							| 
									
										
										
										
											2014-03-14 19:34:05 -04:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-12-05 17:35:44 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-26 13:18:20 -04:00
										 |  |  | }(exports)); |