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