diff --git a/public/src/app.js b/public/src/app.js
index 3feb9b3f2e..daf8fb2427 100644
--- a/public/src/app.js
+++ b/public/src/app.js
@@ -21,7 +21,12 @@ var socket,
socket.socket.connect();
}, 200);
} else {
- socket = io.connect(RELATIVE_PATH);
+ var max_reconnection_attemps = 5;
+ var reconnection_delay = 200;
+ socket = io.connect(RELATIVE_PATH, {
+ 'max reconnection attempts': max_reconnection_attemps,
+ 'reconnection delay': reconnection_delay
+ });
var reconnecting = false,
reconnectEl, reconnectTimer;
@@ -59,7 +64,13 @@ var socket,
socket.socket.connect();
});
- socket.on('reconnecting', function (data) {
+ socket.on('reconnecting', function (data, attempt) {
+ if(attempt == max_reconnection_attemps) {
+ socket.socket.reconnectionAttempts = 0;
+ socket.socket.reconnectionDelay = reconnection_delay;
+ return;
+ }
+
if (!reconnectEl) reconnectEl = $('#reconnect');
reconnecting = true;
@@ -322,7 +333,7 @@ var socket,
if (data.posts[0].uid !== app.uid) {
data.posts[0].display_moderator_tools = 'none';
}
-
+
var html = templates.prepare(templates['topic'].blocks['posts']).parse(data);
translator.translate(html, function(translatedHTML) {
var uniqueid = new Date().getTime(),
diff --git a/public/src/forum/footer.js b/public/src/forum/footer.js
index 31e96395df..b577647aa6 100644
--- a/public/src/forum/footer.js
+++ b/public/src/forum/footer.js
@@ -58,9 +58,10 @@
$('#search-button').show();
var userLabel = loggedInMenu.find('#user_label');
+
if (userLabel.length) {
if (data['userslug'])
- userLabel.attr('href', '/user/' + data['userslug']);
+ userLabel.find('#user-profile-link').attr('href', '/user/' + data['userslug']);
if (data['picture'])
userLabel.find('img').attr('src', data['picture']);
if (data['username'])
@@ -87,7 +88,7 @@
}
- $('#main-nav a,#right-menu a').off('click').on('click', function() {
+ $('#main-nav a,#user-control-list a,#logged-out-menu .dropdown-menu a').off('click').on('click', function() {
if($('.navbar .navbar-collapse').hasClass('in'))
$('.navbar-header button').click();
});
diff --git a/public/src/utils.js b/public/src/utils.js
index c99fbb99a3..223c8a745c 100644
--- a/public/src/utils.js
+++ b/public/src/utils.js
@@ -129,6 +129,23 @@
return tags;
},
+ buildLinkTags: function(tagsArr) {
+ var tags = '',
+ tag;
+ for (var x = 0, numTags = tagsArr.length; x < numTags; x++) {
+ if (tags.length > 0) tags += "\n\t";
+ tag = '';
+
+ tags += tag;
+ }
+
+ return tags;
+ },
+
refreshTitle: function(url) {
if (!url) {
var a = document.createElement('a');
diff --git a/public/templates/admin/settings.tpl b/public/templates/admin/settings.tpl
index 7aa4fefb30..9172ba310e 100644
--- a/public/templates/admin/settings.tpl
+++ b/public/templates/admin/settings.tpl
@@ -10,6 +10,8 @@
+
+
diff --git a/public/templates/header.tpl b/public/templates/header.tpl
index e0056401b0..100d2d71df 100644
--- a/public/templates/header.tpl
+++ b/public/templates/header.tpl
@@ -5,6 +5,7 @@
{meta_tags}
+ {link_tags}
@@ -40,9 +41,14 @@
-
- {title}
-
+
@@ -65,13 +71,25 @@
-
+
diff --git a/src/postTools.js b/src/postTools.js
index ca3dd2dae0..bdf69943d6 100644
--- a/src/postTools.js
+++ b/src/postTools.js
@@ -61,9 +61,20 @@ var RDB = require('./redis.js'),
PostTools.edit = function(uid, pid, title, content) {
var success = function() {
- posts.setPostField(pid, 'content', content);
- posts.setPostField(pid, 'edited', Date.now());
- posts.setPostField(pid, 'editor', uid);
+ async.waterfall([
+ function(next) {
+ posts.setPostField(pid, 'edited', Date.now());
+ next(null);
+ },
+ function(next) {
+ posts.setPostField(pid, 'editor', uid);
+ next(null);
+ },
+ function(next) {
+ posts.setPostField(pid, 'content', content);
+ next(null);
+ }
+ ]);
postSearch.remove(pid, function() {
postSearch.index(content, pid);
diff --git a/src/posts.js b/src/posts.js
index ef285a8bcd..5199be6f2d 100644
--- a/src/posts.js
+++ b/src/posts.js
@@ -24,9 +24,16 @@ var RDB = require('./redis.js'),
RDB.handle(err);
if (pids.length) {
- Posts.getPostsByPids(pids, function(err, posts) {
- callback(posts);
- });
+ plugins.fireHook('filter:post.getTopic', pids, function(err, posts) {
+ if (!err & 0 < posts.length) {
+ Posts.getPostsByPids(pids, function(err, posts) {
+ plugins.fireHook('action:post.gotTopic', posts);
+ callback(posts);
+ });
+ } else {
+ callback(posts);
+ }
+ });
} else {
callback([]);
}
@@ -131,6 +138,7 @@ var RDB = require('./redis.js'),
});
}
+ // TODO: this function is never called except from some debug route. clean up?
Posts.getPostData = function(pid, callback) {
RDB.hgetall('post:' + pid, function(err, data) {
if (err === null) {
@@ -146,7 +154,14 @@ var RDB = require('./redis.js'),
Posts.getPostFields = function(pid, fields, callback) {
RDB.hmgetObject('post:' + pid, fields, function(err, data) {
if (err === null) {
- callback(data);
+ // TODO: I think the plugins system needs an optional 'parameters' paramter so I don't have to do this:
+ data = data || {};
+ data.pid = pid;
+ data.fields = fields;
+
+ plugins.fireHook('filter:post.getFields', data, function(err, data) {
+ callback(data);
+ });
} else {
console.log(err);
}
@@ -155,15 +170,28 @@ var RDB = require('./redis.js'),
Posts.getPostField = function(pid, field, callback) {
RDB.hget('post:' + pid, field, function(err, data) {
- if (err === null)
- callback(data);
- else
+ if (err === null) {
+ // TODO: I think the plugins system needs an optional 'parameters' paramter so I don't have to do this:
+ data = data || {};
+ data.pid = pid;
+ data.field = field;
+
+ plugins.fireHook('filter:post.getField', data, function(err, data) {
+ callback(data);
+ });
+ } else {
console.log(err);
+ }
});
}
- Posts.setPostField = function(pid, field, value) {
+ Posts.setPostField = function(pid, field, value, done) {
RDB.hset('post:' + pid, field, value);
+ plugins.fireHook('action:post.setField', {
+ 'pid': pid,
+ 'field': field,
+ 'value': value
+ }, done);
}
Posts.getPostsByPids = function(pids, callback) {
@@ -400,13 +428,17 @@ var RDB = require('./redis.js'),
}
Posts.getPostsByUid = function(uid, start, end, callback) {
-
user.getPostIds(uid, start, end, function(pids) {
-
if (pids && pids.length) {
-
- Posts.getPostsByPids(pids, function(err, posts) {
- callback(posts);
+ plugins.fireHook('filter:post.getTopic', pids, function(err, posts) {
+ if (!err & 0 < posts.length) {
+ Posts.getPostsByPids(pids, function(err, posts) {
+ plugins.fireHook('action:post.gotTopic', posts);
+ callback(posts);
+ });
+ } else {
+ callback(posts);
+ }
});
} else
callback([]);
diff --git a/src/threadTools.js b/src/threadTools.js
index 478f25fd7e..e375876ef0 100644
--- a/src/threadTools.js
+++ b/src/threadTools.js
@@ -303,7 +303,7 @@ var RDB = require('./redis.js'),
pids.reverse();
async.detectSeries(pids, function(pid, next) {
- RDB.hget('post:' + pid, 'deleted', function(err, deleted) {
+ posts.getPostField(pid, 'deleted', function(deleted) {
if (deleted === '0') next(true);
else next(false);
});
diff --git a/src/webserver.js b/src/webserver.js
index 78485cb55d..e216c6ebfa 100644
--- a/src/webserver.js
+++ b/src/webserver.js
@@ -53,30 +53,34 @@ var express = require('express'),
plugins.fireHook('filter:header.build', custom_header, function(err, custom_header) {
var defaultMetaTags = [{
- name: 'viewport',
- content: 'width=device-width, initial-scale=1.0, user-scalable=no'
- }, {
- name: 'content-type',
- content: 'text/html; charset=UTF-8'
- }, {
- name: 'apple-mobile-web-app-capable',
- content: 'yes'
- }, {
- property: 'og:site_name',
- content: meta.config.title || 'NodeBB'
- }, {
- property: 'keywords',
- content: meta.config['keywords'] || ''
- }],
+ name: 'viewport',
+ content: 'width=device-width, initial-scale=1.0, user-scalable=no'
+ }, {
+ name: 'content-type',
+ content: 'text/html; charset=UTF-8'
+ }, {
+ name: 'apple-mobile-web-app-capable',
+ content: 'yes'
+ }, {
+ property: 'og:site_name',
+ content: meta.config.title || 'NodeBB'
+ }, {
+ property: 'keywords',
+ content: meta.config['keywords'] || ''
+ }],
metaString = utils.buildMetaTags(defaultMetaTags.concat(options.metaTags || [])),
+ linkTags = utils.buildLinkTags(options.linkTags || []),
templateValues = {
cssSrc: meta.config['theme:src'] || nconf.get('relative_path') + '/vendor/bootstrap/css/bootstrap.min.css',
pluginCSS: plugins.cssFiles.map(function(file) { return { path: file } }),
- title: meta.config.title || 'NodeBB',
+ title: meta.config.title || '',
+ 'brand:logo': meta.config['brand:logo'] || '',
+ 'brand:logo:display': meta.config['brand:logo']?'':'hide',
browserTitle: meta.config.title || 'NodeBB',
csrf: options.res.locals.csrf_token,
relative_path: nconf.get('relative_path'),
meta_tags: metaString,
+ link_tags: linkTags,
clientScripts: clientScripts,
navigation: custom_header.navigation
};
@@ -425,7 +429,18 @@ var express = require('express'),
}, {
property: 'article:section',
content: topicData.category_name
- }]
+ }],
+ linkTags: [
+ {
+ rel: 'alternate',
+ type: 'application/rss+xml',
+ href: nconf.get('url') + 'topic/' + tid + '.rss'
+ },
+ {
+ rel: 'up',
+ href: nconf.get('url') + 'category/' + topicData.category_slug
+ }
+ ]
}, function (err, header) {
next(err, {
header: header,
@@ -494,7 +509,18 @@ var express = require('express'),
}, {
property: "og:type",
content: 'website'
- }]
+ }],
+ linkTags: [
+ {
+ rel: 'alternate',
+ type: 'application/rss+xml',
+ href: nconf.get('url') + 'category/' + cid + '.rss'
+ },
+ {
+ rel: 'up',
+ href: nconf.get('url')
+ }
+ ]
}, function (err, header) {
next(err, {
header: header,