From 4d11fba20afc0ab515f38ef183be972f3f60d4ed Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 23 Aug 2013 14:30:58 -0400 Subject: [PATCH 01/24] auto-focusing input on login screen --- public/src/forum/login.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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(); }()); From 9bc12f28b410f58499eb49c083d4be2ad49e6593 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 23 Aug 2013 14:55:25 -0400 Subject: [PATCH 02/24] fuck git --- src/postTools.js | 3 ++- src/routes/user.js | 7 +++---- src/threadTools.js | 3 ++- src/topics.js | 7 +++---- src/webserver.js | 2 +- src/websockets.js | 8 ++++---- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/postTools.js b/src/postTools.js index 8d8969a768..b722095e05 100644 --- a/src/postTools.js +++ b/src/postTools.js @@ -41,7 +41,8 @@ var RDB = require('./redis.js'), } function hasEnoughRep(next) { - user.getUserField(uid, 'reputation', function(reputation) { + user.getUserField(uid, 'reputation', function(err, reputation) { + if (err) return next(null, false); next(null, reputation >= meta.config['privileges:manage_content']); }); } diff --git a/src/routes/user.js b/src/routes/user.js index a4c6c38c88..cd17791c31 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -79,8 +79,7 @@ var user = require('./../user.js'), if(!req.user) return res.redirect('/403'); - user.getUserField(req.user.uid, 'userslug', function(userslug) { - + user.getUserField(req.user.uid, 'userslug', function(err, userslug) { if(req.params.userslug && userslug === req.params.userslug) { app.build_header({ req: req, res: res }, function(err, header) { res.send(header + app.create_route('users/'+req.params.userslug+'/edit','accountedit') + templates['footer']); @@ -96,7 +95,7 @@ var user = require('./../user.js'), if(!req.user) return res.redirect('/403'); - user.getUserField(req.user.uid, 'userslug', function(userslug) { + user.getUserField(req.user.uid, 'userslug', function(err, userslug) { if(req.params.userslug && userslug === req.params.userslug) { app.build_header({ req: req, res: res }, function(err, header) { res.send(header + app.create_route('users/'+req.params.userslug+'/settings','accountsettings') + templates['footer']); @@ -127,7 +126,7 @@ var user = require('./../user.js'), return; } - user.getUserField(req.user.uid, 'uploadedpicture', function(oldpicture) { + user.getUserField(req.user.uid, 'uploadedpicture', function(err, oldpicture) { if(!oldpicture) { uploadUserPicture(req.user.uid, path.extname(req.files.userPhoto.name), req.files.userPhoto.path, res); return; diff --git a/src/threadTools.js b/src/threadTools.js index 5bf5321a19..b3a4a9de01 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -31,7 +31,8 @@ var RDB = require('./redis.js'), } function hasEnoughRep(next) { - user.getUserField(uid, 'reputation', function(reputation) { + user.getUserField(uid, 'reputation', function(err, reputation) { + if (err) return next(null, false); next(null, reputation >= meta.config['privileges:manage_topic']); }); } diff --git a/src/topics.js b/src/topics.js index 98545bfbfe..1592fbcef9 100644 --- a/src/topics.js +++ b/src/topics.js @@ -33,8 +33,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); }); @@ -572,8 +571,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; diff --git a/src/webserver.js b/src/webserver.js index 9a57c2aa25..52cfb71c19 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -161,7 +161,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; diff --git a/src/websockets.js b/src/websockets.js index cb4f7b68dc..972e73ac5e 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(); }); @@ -514,7 +514,7 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), 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 Date: Fri, 23 Aug 2013 14:57:33 -0400 Subject: [PATCH 03/24] fuck git pt 2 --- src/user.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/user.js b/src/user.js index 02e1a853fe..b1a8ebccfc 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) { From d2aa2a9a29f411ffd7b9d9890e19e8783c405d49 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 23 Aug 2013 15:22:26 -0400 Subject: [PATCH 04/24] derpiness --- src/posts.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/posts.js b/src/posts.js index 3115dd8661..6573ee433a 100644 --- a/src/posts.js +++ b/src/posts.js @@ -102,8 +102,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 +323,8 @@ 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) { + next(null, postData.content); }); } }, function(err, results) { @@ -335,7 +334,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); }); From aeebd069e2eec7322f4ade97e9c1028175033e3e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 23 Aug 2013 16:25:16 -0400 Subject: [PATCH 05/24] fixing nconf issue where redis js was requiring redis configs before they were defined --- app.js | 8 +++++--- src/redis.js | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index 8a7603b045..44011f8882 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, { 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 Date: Sat, 24 Aug 2013 18:19:01 -0400 Subject: [PATCH 06/24] closes #199 --- src/posts.js | 9 +++++++-- src/threadTools.js | 4 ++-- src/topics.js | 9 +-------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/posts.js b/src/posts.js index 6573ee433a..e34e06ee40 100644 --- a/src/posts.js +++ b/src/posts.js @@ -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); }); diff --git a/src/threadTools.js b/src/threadTools.js index b3a4a9de01..0e2e2370e3 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -160,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) { @@ -180,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 1592fbcef9..9099a32bfe 100644 --- a/src/topics.js +++ b/src/topics.js @@ -649,14 +649,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) { From eff1b174c0189b2ae0219ad565406e0d8f8969ea Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sat, 24 Aug 2013 18:43:06 -0400 Subject: [PATCH 07/24] closes #198 --- src/routes/api.js | 5 ++++- src/webserver.js | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/routes/api.js b/src/routes/api.js index d3bbbdc1cd..f5f19a8075 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -101,9 +101,12 @@ var user = require('./../user.js'), res.json(data); }); - app.get('/api/topic/:id/:slug?', function(req, res) { + app.get('/api/topic/:id/:slug?', function(req, res, next) { var uid = (req.user) ? req.user.uid : 0; topics.getTopicWithPosts(req.params.id, uid, function(err, data) { + if(data.deleted === '1' && data.expose_tools === 0) { + return res.json(404, {}); + } res.json(data); }); }); diff --git a/src/webserver.js b/src/webserver.js index 52cfb71c19..ff0aa67221 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -207,6 +207,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) { @@ -221,13 +222,19 @@ var express = require('express'), } async.waterfall([ + function(next) { + topics.getTopicField(tid, 'deleted', function(err, deleted) { + if(deleted === '1') + return next(1, null); + }); + }, function(next) { topics.getTopicWithPosts(tid, ((req.user) ? req.user.uid : 0), function(err, topicData) { 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; From 23db2e5c9e606a0781cf698d4572449d6bc6d728 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sat, 24 Aug 2013 18:47:10 -0400 Subject: [PATCH 08/24] better fix for #198 --- src/webserver.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/webserver.js b/src/webserver.js index ff0aa67221..5ddb6b3302 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -222,14 +222,11 @@ var express = require('express'), } async.waterfall([ - function(next) { - topics.getTopicField(tid, 'deleted', function(err, deleted) { - if(deleted === '1') - return next(1, null); - }); - }, function(next) { topics.getTopicWithPosts(tid, ((req.user) ? req.user.uid : 0), function(err, topicData) { + if(topicData.deleted === '1' && topicData.expose_tools === 0) + return next(new Error('Topic deleted'), null); + next(err, topicData); }); }, From dd40cbc139b8bc1f02d2d2d1b88e134b9ebd20e4 Mon Sep 17 00:00:00 2001 From: Baris Soner Usakli Date: Sat, 24 Aug 2013 18:51:24 -0400 Subject: [PATCH 09/24] check if topicData is valid --- src/webserver.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/webserver.js b/src/webserver.js index 5ddb6b3302..0738f8b616 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -224,8 +224,10 @@ var express = require('express'), async.waterfall([ function(next) { topics.getTopicWithPosts(tid, ((req.user) ? req.user.uid : 0), function(err, topicData) { - if(topicData.deleted === '1' && topicData.expose_tools === 0) - return next(new Error('Topic deleted'), null); + if(topicData) { + if(topicData.deleted === '1' && topicData.expose_tools === 0) + return next(new Error('Topic deleted'), null); + } next(err, topicData); }); From aefa56221b0eb360a0f8105cc81899756ce73909 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 11:56:28 -0400 Subject: [PATCH 10/24] closed #202 --- src/posts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/posts.js b/src/posts.js index e34e06ee40..7c3cce1345 100644 --- a/src/posts.js +++ b/src/posts.js @@ -329,6 +329,7 @@ var RDB = require('./redis.js'), }, content: function(next) { plugins.fireHook('filter:post.get', postData, function(postData) { + postData.content = postTools.markdownToHTML(postData.content, false); next(null, postData.content); }); } From 154d0160bceaedee58f059fca1cd5a324b02c651 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Mon, 26 Aug 2013 11:58:52 -0400 Subject: [PATCH 11/24] closes #200 --- src/meta.js | 1 + src/user.js | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/meta.js b/src/meta.js index cc84b964c1..9b0660b70b 100644 --- a/src/meta.js +++ b/src/meta.js @@ -118,5 +118,6 @@ var utils = require('./../public/src/utils.js'), } } + }(exports)); diff --git a/src/user.js b/src/user.js index b1a8ebccfc..8a5f37f0f3 100644 --- a/src/user.js +++ b/src/user.js @@ -215,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) { @@ -298,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); @@ -578,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'; @@ -652,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); }); @@ -671,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); }); From 96ee0a2017b29edc89a4b21eab64d4f1f60db7fc Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 12:22:55 -0400 Subject: [PATCH 12/24] closed #184 --- src/webserver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webserver.js b/src/webserver.js index 0738f8b616..23b1a7d652 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -380,7 +380,7 @@ var express = require('express'), app.build_header({ req: req, res: res }, function(err, header) { res.send( header + - '\n\t' + + '\n\t' + templates['footer'] ); }); From 0a485a7ff6012fa2a3c90f6ec1eee4cd72f0b34a Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Mon, 26 Aug 2013 13:18:20 -0400 Subject: [PATCH 13/24] closes #109 --- public/src/forum/topic.js | 6 ++- public/src/modules/chat.js | 18 +++++++-- src/messaging.js | 77 ++++++++++++++++++++++++++++++++++++++ src/websockets.js | 19 +++++++++- 4 files changed, 113 insertions(+), 7 deletions(-) create mode 100644 src/messaging.js diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index c2a0a30479..2edf4659e6 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..3a5decb4bc 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,15 @@ define(['taskbar'], function(taskbar) { taskbar.minimize('chat', uuid); } + function getChatMessages(chatModal, touid) { + socket.emit('getChatMessages', {touid:touid}, function(messages) { + console.log(messages); + for(var i = 0; i Date: Mon, 26 Aug 2013 13:20:10 -0400 Subject: [PATCH 14/24] removed console.log --- public/src/modules/chat.js | 1 - 1 file changed, 1 deletion(-) diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 3a5decb4bc..0b850b5889 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -61,7 +61,6 @@ define(['taskbar'], function(taskbar) { function getChatMessages(chatModal, touid) { socket.emit('getChatMessages', {touid:touid}, function(messages) { - console.log(messages); for(var i = 0; i Date: Mon, 26 Aug 2013 13:21:14 -0400 Subject: [PATCH 15/24] removed console.log --- src/messaging.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/messaging.js b/src/messaging.js index 281adc1ef5..cb6bd0b66c 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -17,7 +17,6 @@ var RDB = require('./redis'), RDB.incr('global:next_message_id', function(err, mid) { if(err) return callback(err, null); - console.log('creating message', mid); var message = { content: content, From 14e7907e06913bf419140960828b35bd4c812204 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 14:56:00 -0400 Subject: [PATCH 16/24] closed #201 --- src/webserver.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/webserver.js b/src/webserver.js index 23b1a7d652..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) { From 15feaafd68310d7cc303c76010303bfc333a05be Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 15:20:06 -0400 Subject: [PATCH 17/24] attempting fix for #179, @barisusakli can you pull and test if this is still present? --- public/src/forum/footer.js | 80 +++++++++++++++++++------------------- src/websockets.js | 4 +- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/public/src/forum/footer.js b/public/src/forum/footer.js index 75ef3d499a..439bbdca50 100644 --- a/public/src/forum/footer.js +++ b/public/src/forum/footer.js @@ -6,7 +6,7 @@ user_label = document.getElementById('user_label'), active_record = document.getElementById('active_record'), right_menu = document.getElementById('right-menu'); - + socket.emit('user.count', {}); socket.on('user.count', function(data) { num_users.innerHTML = "We currently have " + data.count + " registered users."; @@ -28,22 +28,22 @@ socket.emit('api:user.active.get'); socket.on('api:user.active.get', function(data) { - + var plural_users = parseInt(data.users) !== 1, plural_anon = parseInt(data.anon) !== 1; active_users.innerHTML = 'There ' + (plural_users ? 'are' : 'is') + ' ' + data.users + ' user' + (plural_users ? 's' : '') + ' and ' + data.anon + ' guest' + (plural_anon ? 's' : '') + ' online'; }); - + socket.emit('api:user.active.get_record'); socket.on('api:user.active.get_record', function(data) { active_record.innerHTML = "most users ever online was " + data.record + " on " + (new Date(parseInt(data.timestamp,10))).toUTCString() + ""; }); socket.emit('api:updateHeader', { fields: ['username', 'picture', 'userslug'] }); - + socket.on('api:updateHeader', function(data) { - + var rightMenu = $('#right-menu'), isLoggedIn = data.uid > 0; @@ -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,35 +144,6 @@ 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({ @@ -160,12 +160,12 @@ var username = data.username; var fromuid = data.fromuid; var message = data.message; - + require(['chat'], function(chat) { var chatModal = chat.createModalIfDoesntExist(username, fromuid); chatModal.show(); chat.bringModalToTop(chatModal); - + chat.appendChatMessage(chatModal, message); }); }); diff --git a/src/websockets.js b/src/websockets.js index 72940c11eb..c2604eff14 100644 --- a/src/websockets.js +++ b/src/websockets.js @@ -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); }); }); From dda429ab5d8dfd4fe21d8cfcd56addf56eae0a7a Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Mon, 26 Aug 2013 16:04:31 -0400 Subject: [PATCH 18/24] unread count shows total --- src/threadTools.js | 4 +- src/topics.js | 141 +++++++++++++++++++++++++++++++-------------- 2 files changed, 100 insertions(+), 45 deletions(-) diff --git a/src/threadTools.js b/src/threadTools.js index 0e2e2370e3..a20323eb1f 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -90,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); @@ -109,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', { diff --git a/src/topics.js b/src/topics.js index 9099a32bfe..10cf449541 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) @@ -127,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) { @@ -152,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) { @@ -667,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); } @@ -679,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) { From 1961f01cab2aaa9c9b4f03f2327e573734b2ce32 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 16:37:22 -0400 Subject: [PATCH 19/24] possibly fixing issue #203 --- app.js | 8 +++++++- src/posts.js | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index 44011f8882..874341c050 100644 --- a/app.js +++ b/app.js @@ -72,6 +72,7 @@ if(nconf.get('upgrade')) { webserver = require('./src/webserver.js'), websockets = require('./src/websockets.js'), plugins = require('./src/plugins'), + reds = require('reds'), admin = { 'categories': require('./src/admin/categories.js') }; @@ -79,6 +80,11 @@ if(nconf.get('upgrade')) { DEVELOPMENT = true; RDB = require('./src/redis.js'); + // Initial setup for Reds + reds.createClient = function() { + return exports.client || (exports.client = RDB); + } + global.configuration = {}; global.templates = {}; @@ -88,7 +94,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/src/posts.js b/src/posts.js index 7c3cce1345..5ada90d6e5 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) { From eed66c099bb18c505ef569060f9231d8e8cb08c3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 16:42:29 -0400 Subject: [PATCH 20/24] fixing double notif error on new notif --- public/src/forum/footer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/src/forum/footer.js b/public/src/forum/footer.js index 439bbdca50..6eca0edbdf 100644 --- a/public/src/forum/footer.js +++ b/public/src/forum/footer.js @@ -147,6 +147,7 @@ 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: 'notify', From 28e1538fdb54d5c4b51076b87649538e1fa2ca64 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 16:54:15 -0400 Subject: [PATCH 21/24] issue #203 --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 874341c050..1610049e2b 100644 --- a/app.js +++ b/app.js @@ -82,7 +82,7 @@ if(nconf.get('upgrade')) { // Initial setup for Reds reds.createClient = function() { - return exports.client || (exports.client = RDB); + return reds.client || (reds.client = RDB); } global.configuration = {}; From 3a12ba177af2400ac004354108148cab4797b352 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 17:10:41 -0400 Subject: [PATCH 22/24] possibly fixing issue #202 again --- app.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app.js b/app.js index 1610049e2b..eade1bbb3c 100644 --- a/app.js +++ b/app.js @@ -66,24 +66,23 @@ 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'), webserver = require('./src/webserver.js'), websockets = require('./src/websockets.js'), plugins = require('./src/plugins'), - reds = require('reds'), admin = { 'categories': require('./src/admin/categories.js') }; DEVELOPMENT = true; - RDB = require('./src/redis.js'); - - // Initial setup for Reds - reds.createClient = function() { - return reds.client || (reds.client = RDB); - } global.configuration = {}; global.templates = {}; From d4d4c3cc92c954a8765001d0e5641b491bf2be43 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Aug 2013 17:13:14 -0400 Subject: [PATCH 23/24] 0.0.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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", From c4228be86c11f95b29ce1c4eb264bcf750f4ebc1 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Mon, 26 Aug 2013 17:50:31 -0400 Subject: [PATCH 24/24] bold active section in account page --- public/css/style.less | 42 +++++++++++++++++-------------- public/src/forum/accountheader.js | 14 ++++++++--- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/public/css/style.less b/public/css/style.less index da34bf5311..961d0e00ce 100644 --- a/public/css/style.less +++ b/public/css/style.less @@ -16,7 +16,7 @@ body { margin-bottom: 350px; } - @media (min-width: 979px) + @media (min-width: 979px) { padding-top: 70px; } @@ -93,7 +93,7 @@ footer.footer { color: #bebebe; outline: 0; - &:focus { + &:focus { outline: 0; border:none !important; box-shadow:none !important; @@ -201,6 +201,10 @@ footer.footer { font-weight:bold; } +.bold { + font-weight: bold; +} + .account-block { div { padding-bottom:10px; @@ -220,7 +224,7 @@ footer.footer { color:green; } } - + .user-profile-picture { width:128px; } @@ -352,8 +356,8 @@ footer.footer { .users-box{ display: inline-block; margin-top: 20px; - text-align: center; - vertical-align: top; + text-align: center; + vertical-align: top; max-width: 104px; white-space: nowrap; text-overflow: ellipsis; @@ -411,7 +415,7 @@ body .navbar .nodebb-inline-block { font-size: 12px; border-top: 1px solid #ddd; display: inline-block; - + img { max-width:200px; max-height:60px; @@ -466,7 +470,7 @@ body .navbar .nodebb-inline-block { &.active { color: #558; - + text-shadow: 0 0 1em #aaf, 0 0 1em #aaf, 0 0 1em #aaf; -webkit-animation:glow 1.5s infinite linear; animation:glow 1.5s infinite linear; @@ -594,7 +598,7 @@ body .navbar .nodebb-inline-block { color: white; height: 200px; } - + .imagedrop { text-align: center; color: white; @@ -608,7 +612,7 @@ body .navbar .nodebb-inline-block { vertical-align: middle; display: none; } - + .imagelist { position: absolute; bottom: 50px; @@ -617,13 +621,13 @@ body .navbar .nodebb-inline-block { div { margin-right:5px; } - + span { line-height:20px; float:left; } - - button { + + button { padding-left:5px; } } @@ -655,7 +659,7 @@ body .navbar .nodebb-inline-block { #mobile-menu, #mobile-menu-overlay { z-index: 999; - @media (min-width: 979px) + @media (min-width: 979px) { display: none !important; } @@ -747,7 +751,7 @@ body .navbar .nodebb-inline-block { transition: margin-top 250ms ease; margin-top: 20%; - + &.menu-visible { margin-top: 0%; @@ -771,7 +775,7 @@ body .navbar .nodebb-inline-block { .category-box { height:90px; - + .post-preview { padding-left:10px; padding-right:10px; @@ -781,7 +785,7 @@ body .navbar .nodebb-inline-block { height:60px; padding-right:5px; } - + p { overflow: hidden; text-overflow:ellipsis; @@ -845,21 +849,21 @@ body .navbar .nodebb-inline-block { .category-slider-2:hover { position:relative; - -webkit-animation: scroll-2 10s ease 0.5s infinite normal; + -webkit-animation: scroll-2 10s ease 0.5s infinite normal; animation: scroll-2 10s ease 0.5s infinite normal;/* Safari and Chrome: */ } .category-slider-1:hover { position:relative; - -webkit-animation: scroll-1 8s ease 0.5s infinite normal; + -webkit-animation: scroll-1 8s ease 0.5s infinite normal; animation: scroll-1 8s ease 0.5s infinite normal;/* Safari and Chrome: */ } .category-slider-0:hover { position:relative; - -webkit-animation: scroll-0 6s ease 0.5s infinite normal; + -webkit-animation: scroll-0 6s ease 0.5s infinite normal; animation: scroll-0 6s ease 0.5s infinite normal;/* Safari and Chrome: */ } 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