diff --git a/app.js b/app.js index 8a7603b045..eade1bbb3c 100644 --- a/app.js +++ b/app.js @@ -16,18 +16,20 @@ along with this program. If not, see . */ +// Configuration setup +nconf = require('nconf'); +nconf.argv().file({ file: __dirname + '/config.json'}); + var fs = require('fs'), winston = require('winston'), pkg = require('./package.json'), url = require('url'), meta = require('./src/meta.js'); -nconf = require('nconf'); // Runtime environment global.env = process.env.NODE_ENV || 'production', -// Configuration setup -nconf.argv().file({ file: __dirname + '/config.json'}); + winston.remove(winston.transports.Console); winston.add(winston.transports.Console, { @@ -64,6 +66,12 @@ if(nconf.get('upgrade')) { winston.info('Base Configuration OK.'); meta.configs.init(function() { + // Initial setup for Redis & Reds + var reds = require('reds'); + RDB = require('./src/redis.js'); + reds.createClient = function() { + return reds.client || (reds.client = RDB); + } var categories = require('./src/categories.js'), templates = require('./public/src/templates.js'), @@ -75,7 +83,6 @@ if(nconf.get('upgrade')) { }; DEVELOPMENT = true; - RDB = require('./src/redis.js'); global.configuration = {}; global.templates = {}; @@ -86,7 +93,7 @@ if(nconf.get('upgrade')) { templates.init([ 'header', 'footer', 'logout', 'outgoing', 'admin/header', 'admin/footer', 'admin/index', 'emails/reset', 'emails/reset_plaintext', 'emails/email_confirm', 'emails/email_confirm_plaintext', - 'emails/header', 'emails/footer', 'install/header', 'install/footer', 'install/redis', + 'emails/header', 'emails/footer', 'noscript/header', 'noscript/home', 'noscript/category', 'noscript/topic' ]); diff --git a/package.json b/package.json index 0a71eeb5cf..6a039fd17c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPLv3 or later", "description": "NodeBB Forum", - "version": "0.0.5", + "version": "0.0.6", "homepage": "http://www.nodebb.org", "repository": { "type": "git", diff --git a/public/css/style.less b/public/css/style.less index 580b9f74d0..8416dc9917 100644 --- a/public/css/style.less +++ b/public/css/style.less @@ -202,6 +202,10 @@ footer.footer { font-weight:bold; } +.bold { + font-weight: bold; +} + .account-block { div { padding-bottom:10px; @@ -850,4 +854,4 @@ a:hover, .btn-link:hover, .btn-link:active, .btn-link:focus { margin-right: -11px; } -//END: FIXES FOR BS3, may need to remove these when we get out of the RC releases \ No newline at end of file +//END: FIXES FOR BS3, may need to remove these when we get out of the RC releases diff --git a/public/src/forum/accountheader.js b/public/src/forum/accountheader.js index ed15af4ccb..b6fccea441 100644 --- a/public/src/forum/accountheader.js +++ b/public/src/forum/accountheader.js @@ -14,23 +14,29 @@ '); $('.account-username-box').append(links); - } $(document).ready(function() { - + createMenu(); var editLink = $('#editLink'); var settingsLink = $('#settingsLink'); var favouritesLink = $('#favouritesLink'); - + if(yourid === "0" || yourid !== theirid) { editLink.hide(); settingsLink.hide(); favouritesLink.hide(); } - + + jQuery('.account-sub-links span a').removeClass('bold').each(function() { + var href = this.getAttribute('href'); + if (window.location.href.indexOf(href) !== -1) { + jQuery(this).addClass('bold'); + return false; + } + }); }); }()); \ No newline at end of file diff --git a/public/src/forum/footer.js b/public/src/forum/footer.js index 487c7ae0aa..4d53a81b92 100644 --- a/public/src/forum/footer.js +++ b/public/src/forum/footer.js @@ -96,10 +96,39 @@ notifTrigger.addEventListener('click', function(e) { e.preventDefault(); if (notifContainer.className.indexOf('open') === -1) { - socket.emit('api:notifications.get'); - socket.emit('api:notifications.mark_all_read', null, function() { - notifIcon.className = 'icon-circle-blank'; - utils.refreshTitle(); + socket.emit('api:notifications.get', null, function(data) { + var notifFrag = document.createDocumentFragment(), + notifEl = document.createElement('li'), + numRead = data.read.length, + numUnread = data.unread.length, + x; + notifList.innerHTML = ''; + if ((data.read.length + data.unread.length) > 0) { + for(x=0;x' + utils.relativeTime(data.unread[x].datetime, true) + '' + data.unread[x].text + ''; + notifFrag.appendChild(notifEl.cloneNode(true)); + } + for(x=0;x' + utils.relativeTime(data.read[x].datetime, true) + '' + data.read[x].text + ''; + notifFrag.appendChild(notifEl.cloneNode(true)); + } + } else { + notifEl.innerHTML = 'You have no notifications'; + notifFrag.appendChild(notifEl); + } + notifList.appendChild(notifFrag); + + if (data.unread.length > 0) notifIcon.className = 'icon-circle active'; + else notifIcon.className = 'icon-circle-blank'; + + socket.emit('api:notifications.mark_all_read', null, function() { + notifIcon.className = 'icon-circle-blank'; + utils.refreshTitle(); + }); }); } }); @@ -115,38 +144,10 @@ if (nid > 0) socket.emit('api:notifications.mark_read', nid); } }); - socket.on('api:notifications.get', function(data) { - var notifFrag = document.createDocumentFragment(), - notifEl = document.createElement('li'), - numRead = data.read.length, - numUnread = data.unread.length, - x; - notifList.innerHTML = ''; - if ((data.read.length + data.unread.length) > 0) { - for(x=0;x' + utils.relativeTime(data.unread[x].datetime, true) + '' + data.unread[x].text + ''; - notifFrag.appendChild(notifEl.cloneNode(true)); - } - for(x=0;x' + utils.relativeTime(data.read[x].datetime, true) + '' + data.read[x].text + ''; - notifFrag.appendChild(notifEl.cloneNode(true)); - } - } else { - notifEl.innerHTML = 'You have no notifications'; - notifFrag.appendChild(notifEl); - } - notifList.appendChild(notifFrag); - - if (data.unread.length > 0) notifIcon.className = 'icon-circle active'; - else notifIcon.className = 'icon-circle-blank'; - }); socket.on('event:new_notification', function() { document.querySelector('.notifications a i').className = 'icon-circle active'; app.alert({ + alert_id: 'new_notif', title: 'New notification', message: 'You have unread notifications.', type: 'warning', diff --git a/public/src/forum/login.js b/public/src/forum/login.js index 2be3b5e701..74bedd54ba 100644 --- a/public/src/forum/login.js +++ b/public/src/forum/login.js @@ -12,16 +12,15 @@ if (target) { document.location.href = target.getAttribute('data-url'); } - }); - + }); + $('#login').on('click', function() { - var loginData = { 'username': $('#username').val(), 'password': $('#password').val(), '_csrf': $('#csrf-token').val() }; - + $.ajax({ type: "POST", url: RELATIVE_PATH + '/login', @@ -44,5 +43,6 @@ return false; }); - + + document.querySelector('#content input').focus(); }()); diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index d95684617c..07c8e970ab 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -287,12 +287,14 @@ var username = $(this).parents('li').attr('data-username'); var touid = $(this).parents('li').attr('data-uid'); - require(['chat'], function(chat){ + if(username === app.username || !app.username) + return; + + require(['chat'], function(chat) { var chatModal = chat.createModalIfDoesntExist(username, touid); chatModal.show(); chat.bringModalToTop(chatModal); }); - }); ajaxify.register_events([ diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 7c866fcce4..0b850b5889 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -1,8 +1,7 @@ define(['taskbar'], function(taskbar) { - + var module = {}; - module.bringModalToTop = function(chatModal) { var topZ = 0; $('.modal').each(function() { @@ -11,7 +10,7 @@ define(['taskbar'], function(taskbar) { topZ = thisZ; } }); - chatModal.css('zIndex', topZ+1); + chatModal.css('zIndex', topZ + 1); } module.createModalIfDoesntExist = function(username, touid) { @@ -39,7 +38,9 @@ define(['taskbar'], function(taskbar) { module.bringModalToTop(chatModal); }); - addSendHandler(chatModal, touid); + addSendHandler(chatModal, touid); + + getChatMessages(chatModal, touid); } taskbar.push('chat', chatModal.attr('UUID'), {title:'chat with '+username}); @@ -58,6 +59,14 @@ define(['taskbar'], function(taskbar) { taskbar.minimize('chat', uuid); } + function getChatMessages(chatModal, touid) { + socket.emit('getChatMessages', {touid:touid}, function(messages) { + for(var i = 0; i= meta.config['privileges:manage_content']); }); } diff --git a/src/posts.js b/src/posts.js index 162c791458..4e57088ca7 100644 --- a/src/posts.js +++ b/src/posts.js @@ -10,9 +10,9 @@ var RDB = require('./redis.js'), async = require('async'), plugins = require('./plugins'), reds = require('reds'), + postSearch = reds.createSearch('nodebbpostsearch'), nconf = require('nconf'), meta = require('./meta.js'), - postSearch = reds.createSearch('nodebbpostsearch'), winston = require('winston'); (function(Posts) { @@ -70,13 +70,18 @@ var RDB = require('./redis.js'), } Posts.addUserInfoToPost(postData, function() { - topics.getTopicField(postData.tid, 'slug', function(err, topicSlug) { + topics.getTopicFields(postData.tid, ['slug', 'deleted'], function(err, topicData) { + if(err) + return callback(err); + + if(topicData.deleted === '1') + return callback(null); if(postData.content) postData.content = utils.strip_tags(postTools.markdownToHTML(postData.content)); postData.relativeTime = utils.relativeTime(postData.timestamp); - postData.topicSlug = topicSlug; + postData.topicSlug = topicData.slug; posts.push(postData); callback(null); }); @@ -102,8 +107,7 @@ var RDB = require('./redis.js'), Posts.getPostData = function(pid, callback) { RDB.hgetall('post:' + pid, function(err, data) { if(err === null) { - plugins.fireHook('filter:post.get', data.content, function(content) { - data.content = content; + plugins.fireHook('filter:post.get', data, function(data) { callback(data); }); } @@ -324,8 +328,9 @@ var RDB = require('./redis.js'), }); }, content: function(next) { - plugins.fireHook('filter:post.get', content, function(content) { - next(null, content); + plugins.fireHook('filter:post.get', postData, function(postData) { + postData.content = postTools.markdownToHTML(postData.content, false); + next(null, postData.content); }); } }, function(err, results) { @@ -335,7 +340,7 @@ var RDB = require('./redis.js'), callback(postData); }); - plugins.fireHook('action:post.save', [pid, content]); + plugins.fireHook('action:post.save', [postData]); postSearch.index(content, pid); }); diff --git a/src/redis.js b/src/redis.js index e2d5615421..1d8d41bf2e 100644 --- a/src/redis.js +++ b/src/redis.js @@ -3,7 +3,7 @@ nconf = require('nconf'), utils = require('./../public/src/utils.js'), winston = require('winston'); - + RedisDB.exports = redis.createClient(nconf.get('redis:port'), nconf.get('redis:host')); if(nconf.get('redis:password')) { @@ -40,7 +40,7 @@ RedisDB.exports.hmget(key, fields, function(err, data) { if(err === null) { var returnData = {}; - + for(var i=0, ii=fields.length; i= meta.config['privileges:manage_topic']); }); } @@ -89,7 +90,7 @@ var RDB = require('./redis.js'), ThreadTools.privileges(tid, uid, function(privileges) { if (privileges.editable || uid === -1) { - topics.setTopicField(tid, 'deleted', 1); + topics.delete(tid); ThreadTools.lock(tid, uid); topicSearch.remove(tid); @@ -108,7 +109,7 @@ var RDB = require('./redis.js'), ThreadTools.privileges(tid, uid, function(privileges) { if (privileges.editable) { - topics.setTopicField(tid, 'deleted', 0); + topics.restore(tid); ThreadTools.unlock(tid, uid); io.sockets.in('topic_' + tid).emit('event:topic_restored', { @@ -159,7 +160,7 @@ var RDB = require('./redis.js'), if (privileges.editable) { topics.setTopicField(tid, 'pinned', 0); - topics.getTopicFields(tid, ['cid', 'lastposttime'], function(topicData) { + topics.getTopicFields(tid, ['cid', 'lastposttime'], function(err, topicData) { RDB.zadd('categories:' + topicData.cid + ':tid', topicData.lastposttime, tid); }); if (socket) { @@ -179,7 +180,7 @@ var RDB = require('./redis.js'), ThreadTools.move = function(tid, cid, socket) { - topics.getTopicFields(tid, ['cid', 'lastposttime'], function(topicData) { + topics.getTopicFields(tid, ['cid', 'lastposttime'], function(err, topicData) { var oldCid = topicData.cid; var multi = RDB.multi(); diff --git a/src/topics.js b/src/topics.js index 447038d584..25611f3550 100644 --- a/src/topics.js +++ b/src/topics.js @@ -20,8 +20,6 @@ marked.setOptions({ (function(Topics) { - - Topics.getTopicData = function(tid, callback) { RDB.hgetall('topic:' + tid, function(err, data) { if(err === null) @@ -33,8 +31,7 @@ marked.setOptions({ Topics.getTopicDataWithUsername = function(tid, callback) { Topics.getTopicData(tid, function(topic) { - user.getUserField(topic.uid, 'username', function(username) { - + user.getUserField(topic.uid, 'username', function(err, username) { topic.username = username; callback(topic); }); @@ -128,17 +125,45 @@ marked.setOptions({ } Topics.getTotalUnread = function(uid, callback) { - RDB.zrevrange('topics:recent', 0, 21, function (err, tids) { - Topics.hasReadTopics(tids, uid, function(read) { - var unreadTids = tids.filter(function(tid, index, self) { - return read[index] === 0; - }); + var unreadTids = [], + start = 0, + stop = 21, + done = false; + + async.whilst( + function () { return unreadTids.length < 21 && !done; }, + function (callback) { + RDB.zrevrange('topics:recent', start, stop, function(err, tids) { + + if(err) + return callback(err); + + if(tids && !tids.length) { + done = true; + return callback(null); + } + + Topics.hasReadTopics(tids, uid, function(read) { + + var newtids = tids.filter(function(tid, index, self) { + return read[index] === 0; + }); + + unreadTids.push.apply(unreadTids, newtids); + + start = stop + 1; + stop = start + 21; + callback(null); + }); + }); + }, + function (err) { callback({ count: unreadTids.length }); - }); - }); + } + ); }; Topics.getUnreadTopics = function(uid, start, stop, callback) { @@ -153,50 +178,67 @@ marked.setOptions({ 'topics' : [] }; - RDB.zrevrange('topics:recent', start, stop, function (err, tids) { + function noUnreadTopics() { + unreadTopics.no_topics_message = 'show'; + unreadTopics.show_markallread_button = 'hidden'; + callback(unreadTopics); + } - function noUnreadTopics() { - unreadTopics.no_topics_message = 'show'; - unreadTopics.show_markallread_button = 'hidden'; + function sendUnreadTopics(topicIds) { + Topics.getTopicsByTids(topicIds, uid, function(topicData) { + unreadTopics.topics = topicData; + unreadTopics.nextStart = start + topicIds.length; + if(!topicData || topicData.length === 0) + unreadTopics.no_topics_message = 'show'; + if(uid === 0 || topicData.length === 0) + unreadTopics.show_markallread_button = 'hidden'; callback(unreadTopics); - } + }); + } - function sendUnreadTopics(topicIds) { - Topics.getTopicsByTids(topicIds, uid, function(topicData) { - unreadTopics.topics = topicData; - unreadTopics.nextStart = start + tids.length; - if(!topicData || topicData.length === 0) - unreadTopics.no_topics_message = 'show'; - if(uid === 0 || topicData.length === 0) - unreadTopics.show_markallread_button = 'hidden'; - callback(unreadTopics); - }); - } + var unreadTids = [], + done = false; - if (!tids || !tids.length) { - noUnreadTopics(); - return; - } + async.whilst( + function () { return unreadTids.length < 20 && !done; }, + function (callback) { + RDB.zrevrange('topics:recent', start, stop, function(err, tids) { + if(err) + return callback(err); - if(uid === 0) { - sendUnreadTopics(tids); - } else { + if(tids && !tids.length) { + done = true; + return callback(null); + } - Topics.hasReadTopics(tids, uid, function(read) { + if(uid === 0) { + unreadTids.push.apply(unreadTids, tids); + callback(null); + } else { + Topics.hasReadTopics(tids, uid, function(read) { - var unreadTids = tids.filter(function(tid, index, self) { - return read[index] === 0; - }); + var newtids = tids.filter(function(tid, index, self) { + return read[index] === 0; + }); - if (!unreadTids || !unreadTids.length) { - noUnreadTopics(); - return; + unreadTids.push.apply(unreadTids, newtids); + start = stop + 1; + stop = start + 19; + callback(null); + }); } - - sendUnreadTopics(unreadTids); }); + }, + function (err) { + if(err) + return callback([]); + if(unreadTids.length) + sendUnreadTopics(unreadTids); + else + noUnreadTopics(); + } - }); + ); } Topics.getTopicsByTids = function(tids, current_user, callback, category_id) { @@ -572,8 +614,8 @@ marked.setOptions({ return; } - user.getUserField(uid, 'lastposttime', function(lastposttime) { - + user.getUserField(uid, 'lastposttime', function(err, lastposttime) { + if (err) lastposttime = 0; if(Date.now() - lastposttime < meta.config.postDelay) { callback(new Error('too-many-posts'), null); return; @@ -650,14 +692,7 @@ marked.setOptions({ } Topics.getTopicFields = function(tid, fields, callback) { - RDB.hmgetObject('topic:' + tid, fields, function(err, data) { - if(err === null) { - callback(data); - } - else { - console.log(err); - } - }); + RDB.hmgetObject('topic:' + tid, fields, callback); } Topics.setTopicField = function(tid, field, value) { @@ -675,7 +710,7 @@ marked.setOptions({ } Topics.updateTimestamp = function(tid, timestamp) { - RDB.zadd(schema.topics().recent, timestamp, tid); + RDB.zadd('topics:recent', timestamp, tid); Topics.setTopicField(tid, 'lastposttime', timestamp); } @@ -687,6 +722,18 @@ marked.setOptions({ RDB.lrange('tid:' + tid + ':posts', 0, -1, callback); } + Topics.delete = function(tid) { + Topics.setTopicField(tid, 'deleted', 1); + RDB.zrem('topics:recent', tid); + } + + Topics.restore = function(tid) { + Topics.setTopicField(tid, 'deleted', 0); + Topics.getTopicField(tid, 'lastposttime', function(err, lastposttime) { + RDB.zadd('topics:recent', lastposttime, tid); + }); + } + Topics.reIndexTopic = function(tid, callback) { Topics.getPids(tid, function(err, pids) { if(err) { diff --git a/src/user.js b/src/user.js index 02e1a853fe..8a5f37f0f3 100644 --- a/src/user.js +++ b/src/user.js @@ -139,13 +139,7 @@ var utils = require('./../public/src/utils.js'), } User.getUserField = function(uid, field, callback) { - RDB.hget('user:' + uid, field, function(err, data) { - if(err === null) { - callback(data); - } else { - console.log(err); - } - }); + RDB.hget('user:' + uid, field, callback); } User.getUserFields = function(uid, fields, callback) { @@ -221,7 +215,7 @@ var utils = require('./../public/src/utils.js'), return next(null, true); } - User.getUserField(uid, 'email', function(email) { + User.getUserField(uid, 'email', function(err, email) { if(email !== data['email']) { User.isEmailAvailable(data['email'], function(available) { if(!available) { @@ -304,7 +298,7 @@ var utils = require('./../public/src/utils.js'), return; } - User.getUserField(uid, 'password', function(user_password) { + User.getUserField(uid, 'password', function(err, user_password) { bcrypt.compare(data.currentPassword, user_password, function(err, res) { if(err) { console.log(err); @@ -584,7 +578,7 @@ var utils = require('./../public/src/utils.js'), } User.sendPostNotificationToFollowers = function(uid, tid, pid) { - User.getUserField(uid, 'username', function(username) { + User.getUserField(uid, 'username', function(err, username) { RDB.smembers('followers:' + uid, function(err, followers) { topics.getTopicField(tid, 'slug', function(err, slug) { var message = username + ' made a new post'; @@ -658,7 +652,7 @@ var utils = require('./../public/src/utils.js'), } function iterator(uid, callback) { - User.getUserField(uid, 'username', function(username) { + User.getUserField(uid, 'username', function(err, username) { usernames.push(username); callback(null); }); @@ -677,7 +671,7 @@ var utils = require('./../public/src/utils.js'), } function iterator(uid, callback) { - User.getUserField(uid, 'userslug', function(userslug) { + User.getUserField(uid, 'userslug', function(err, userslug) { userslugs.push(userslug); callback(null); }); diff --git a/src/webserver.js b/src/webserver.js index 9a57c2aa25..8eb83f76aa 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -70,7 +70,10 @@ var express = require('express'), ttl: 60*60*24*14 }), secret: nconf.get('secret'), - key: 'express.sid' + key: 'express.sid', + cookie: { + maxAge: 60*60*24*30 // 30 days + } })); app.use(express.csrf()); app.use(function(req, res, next) { @@ -161,7 +164,7 @@ var express = require('express'), app.get('/' + route, function(req, res) { if ((route === 'login' || route ==='register') && (req.user && req.user.uid > 0)) { - user.getUserField(req.user.uid, 'userslug', function(userslug) { + user.getUserField(req.user.uid, 'userslug', function(err, userslug) { res.redirect('/users/'+userslug); }); return; @@ -207,6 +210,7 @@ var express = require('express'), app.get('/topic/:topic_id/:slug?', function(req, res) { + var tid = req.params.topic_id; if (tid.match(/^\d+\.rss$/)) { fs.readFile('feeds/topics/' + tid, function (err, data) { @@ -223,11 +227,16 @@ var express = require('express'), async.waterfall([ function(next) { topics.getTopicWithPosts(tid, ((req.user) ? req.user.uid : 0), function(err, topicData) { + if(topicData) { + if(topicData.deleted === '1' && topicData.expose_tools === 0) + return next(new Error('Topic deleted'), null); + } + next(err, topicData); }); }, function(topicData, next) { - var posts = topicData.posts.push(topicData.main_posts[0]), + var posts = topicData.posts.push(topicData.main_posts[0]), lastMod = 0, timestamp; @@ -374,7 +383,7 @@ var express = require('express'), app.build_header({ req: req, res: res }, function(err, header) { res.send( header + - '\n\t' + + '\n\t' + templates['footer'] ); }); diff --git a/src/websockets.js b/src/websockets.js index 0be9ae0864..2bb328bf50 100644 --- a/src/websockets.js +++ b/src/websockets.js @@ -54,7 +54,7 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), socket.join('uid_' + uid); io.sockets.in('global').emit('api:user.isOnline', isUserOnline(uid)); - user.getUserField(uid, 'username', function(username) { + user.getUserField(uid, 'username', function(err, username) { socket.emit('event:connect', {status: 1, username:username}); }); } @@ -275,12 +275,12 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), } if(type === 'gravatar') { - user.getUserField(uid, 'gravatarpicture', function(gravatar) { + user.getUserField(uid, 'gravatarpicture', function(err, gravatar) { user.setUserField(uid, 'picture', gravatar); updateHeader(); }); } else if(type === 'uploaded') { - user.getUserField(uid, 'uploadedpicture', function(uploadedpicture) { + user.getUserField(uid, 'uploadedpicture', function(err, uploadedpicture) { user.setUserField(uid, 'picture', uploadedpicture); updateHeader(); }); @@ -484,9 +484,9 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), postTools.restore(uid, data.pid); }); - socket.on('api:notifications.get', function(data) { + socket.on('api:notifications.get', function(data, callback) { user.notifications.get(uid, function(notifs) { - socket.emit('api:notifications.get', notifs); + callback(notifs); }); }); @@ -506,26 +506,43 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), }); }); + socket.on('getChatMessages', function(data, callback) { + var touid = data.touid; + require('./messaging').getMessages(uid, touid, function(err, messages) { + if(err) + return callback(null); + + callback(messages); + }); + }); + socket.on('sendChatMessage', function(data) { var touid = data.touid; + if(touid === uid || uid === 0) { + return; + } if(userSockets[touid]) { var msg = utils.strip_tags(data.message), numSockets = userSockets[touid].length; - user.getUserField(uid, 'username', function(username) { + user.getUserField(uid, 'username', function(err, username) { var finalMessage = username + ' says : ' + msg; for(var x=0;x