diff --git a/src/controllers/accounts/chats.js b/src/controllers/accounts/chats.js index 409e71d12f..657a6cbc5f 100644 --- a/src/controllers/accounts/chats.js +++ b/src/controllers/accounts/chats.js @@ -27,7 +27,6 @@ chatsController.get = function (req, res, callback) { if (!uid) { return callback(); } - privileges.global.can('chat', req.uid, next); }, function (canChat, next) { @@ -51,48 +50,17 @@ chatsController.get = function (req, res, callback) { title: '[[pages:chats]]', }); } - messaging.isUserInRoom(req.uid, req.params.roomid, next); + messaging.loadRoom(req.uid, { uid: uid, roomId: req.params.roomid }, next); }, - function (inRoom, next) { - if (!inRoom) { + function (room) { + if (!room) { return callback(); } - async.parallel({ - users: async.apply(messaging.getUsersInRoom, req.params.roomid, 0, -1), - canReply: async.apply(messaging.canReply, req.params.roomid, req.uid), - room: async.apply(messaging.getRoomData, req.params.roomid), - messages: async.apply(messaging.getMessages, { - callerUid: req.uid, - uid: uid, - roomId: req.params.roomid, - isNew: false, - }), - isAdminOrGlobalMod: function (next) { - user.isAdminOrGlobalMod(req.uid, next); - }, - }, next); - }, - function (data) { - var room = data.room; - room.messages = data.messages; - - room.isOwner = parseInt(room.owner, 10) === parseInt(req.uid, 10); - room.users = data.users.filter(function (user) { - return user && parseInt(user.uid, 10) && parseInt(user.uid, 10) !== req.uid; - }); - - room.canReply = data.canReply; - room.groupChat = room.hasOwnProperty('groupChat') ? room.groupChat : room.users.length > 2; room.rooms = recentChats.rooms; - room.uid = uid; - room.userslug = req.params.userslug; room.nextStart = recentChats.nextStart; - room.usernames = messaging.generateUsernames(room.users, req.uid); room.title = room.roomName || room.usernames || '[[pages:chats]]'; - room.maximumUsersInChatRoom = parseInt(meta.config.maximumUsersInChatRoom, 10) || 0; - room.maximumChatMessageLength = parseInt(meta.config.maximumChatMessageLength, 10) || 1000; - room.showUserInput = !room.maximumUsersInChatRoom || room.maximumUsersInChatRoom > 2; - room.isAdminOrGlobalMod = data.isAdminOrGlobalMod; + room.uid = uid; + room.userslug = req.params.userslug; res.render('chats', room); }, ], callback); diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js index 721076224d..219f19513c 100644 --- a/src/messaging/rooms.js +++ b/src/messaging/rooms.js @@ -6,6 +6,8 @@ var validator = require('validator'); var db = require('../database'); var user = require('../user'); var plugins = require('../plugins'); +var privileges = require('../privileges'); +var meta = require('../meta'); module.exports = function (Messaging) { Messaging.getRoomData = function (roomId, callback) { @@ -268,4 +270,55 @@ module.exports = function (Messaging) { }, ], callback); }; + + Messaging.loadRoom = function (uid, data, callback) { + async.waterfall([ + function (next) { + privileges.global.can('chat', uid, next); + }, + function (canChat, next) { + if (!canChat) { + return next(new Error('[[error:no-privileges]]')); + } + + Messaging.isUserInRoom(uid, data.roomId, next); + }, + function (inRoom, next) { + if (!inRoom) { + return callback(null, null); + } + + async.parallel({ + roomData: async.apply(Messaging.getRoomData, data.roomId), + canReply: async.apply(Messaging.canReply, data.roomId, uid), + users: async.apply(Messaging.getUsersInRoom, data.roomId, 0, -1), + messages: async.apply(Messaging.getMessages, { + callerUid: uid, + uid: data.uid || uid, + roomId: data.roomId, + isNew: false, + }), + isAdminOrGlobalMod: function (next) { + user.isAdminOrGlobalMod(uid, next); + }, + }, next); + }, + function (results, next) { + var room = results.roomData; + room.messages = results.messages; + room.isOwner = parseInt(room.owner, 10) === parseInt(uid, 10); + room.users = results.users.filter(function (user) { + return user && parseInt(user.uid, 10) && parseInt(user.uid, 10) !== uid; + }); + room.canReply = results.canReply; + room.groupChat = room.hasOwnProperty('groupChat') ? room.groupChat : results.users.length > 2; + room.usernames = Messaging.generateUsernames(results.users, uid); + room.maximumUsersInChatRoom = parseInt(meta.config.maximumUsersInChatRoom, 10) || 0; + room.maximumChatMessageLength = parseInt(meta.config.maximumChatMessageLength, 10) || 1000; + room.showUserInput = !room.maximumUsersInChatRoom || room.maximumUsersInChatRoom > 2; + room.isAdminOrGlobalMod = results.isAdminOrGlobalMod; + next(null, room); + }, + ], callback); + }; }; diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 70f7aa8719..30459f75eb 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -151,51 +151,7 @@ SocketModules.chats.loadRoom = function (socket, data, callback) { return callback(new Error('[[error:invalid-data]]')); } - async.waterfall([ - function (next) { - privileges.global.can('chat', socket.uid, next); - }, - function (canChat, next) { - if (!canChat) { - return next(new Error('[[error:no-privileges]]')); - } - - Messaging.isUserInRoom(socket.uid, data.roomId, next); - }, - function (inRoom, next) { - if (!inRoom) { - return next(new Error('[[error:not-allowed]]')); - } - - async.parallel({ - roomData: async.apply(Messaging.getRoomData, data.roomId), - canReply: async.apply(Messaging.canReply, data.roomId, socket.uid), - users: async.apply(Messaging.getUsersInRoom, data.roomId, 0, -1), - messages: async.apply(Messaging.getMessages, { - callerUid: socket.uid, - uid: data.uid || socket.uid, - roomId: data.roomId, - isNew: false, - }), - isAdminOrGlobalMod: function (next) { - user.isAdminOrGlobalMod(socket.uid, next); - }, - }, next); - }, - function (results, next) { - results.roomData.users = results.users; - results.roomData.canReply = results.canReply; - results.roomData.usernames = Messaging.generateUsernames(results.users, socket.uid); - results.roomData.messages = results.messages; - results.roomData.groupChat = results.roomData.hasOwnProperty('groupChat') ? results.roomData.groupChat : results.users.length > 2; - results.roomData.isOwner = parseInt(results.roomData.owner, 10) === socket.uid; - results.roomData.maximumUsersInChatRoom = parseInt(meta.config.maximumUsersInChatRoom, 10) || 0; - results.roomData.maximumChatMessageLength = parseInt(meta.config.maximumChatMessageLength, 10) || 1000; - results.roomData.showUserInput = !results.roomData.maximumUsersInChatRoom || results.roomData.maximumUsersInChatRoom > 2; - results.roomData.isAdminOrGlobalMod = results.isAdminOrGlobalMod; - next(null, results.roomData); - }, - ], callback); + Messaging.loadRoom(socket.uid, data, callback); }; SocketModules.chats.getUsersInRoom = function (socket, data, callback) {