mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-03 04:25:55 +01:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -63,10 +63,10 @@ define(function() {
|
|||||||
templates['users'].parse({users:[]});
|
templates['users'].parse({users:[]});
|
||||||
var html = templates.prepare(templates['users'].blocks['users']).parse({
|
var html = templates.prepare(templates['users'].blocks['users']).parse({
|
||||||
users: data.users
|
users: data.users
|
||||||
}),
|
});
|
||||||
userListEl = $('#users-container');
|
|
||||||
|
|
||||||
userListEl.html(html);
|
translator.translate(html, function(translated) {
|
||||||
|
$('#users-container').html(translated);
|
||||||
|
|
||||||
|
|
||||||
if (data && data.users.length === 0) {
|
if (data && data.users.length === 0) {
|
||||||
@@ -78,6 +78,7 @@ define(function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}, 500); //replace this with global throttling function/constant
|
}, 500); //replace this with global throttling function/constant
|
||||||
|
|
||||||
}, 250);
|
}, 250);
|
||||||
|
|||||||
@@ -9,16 +9,7 @@ var async = require('async'),
|
|||||||
|
|
||||||
module.exports = function(Categories) {
|
module.exports = function(Categories) {
|
||||||
Categories.getRecentReplies = function(cid, uid, count, callback) {
|
Categories.getRecentReplies = function(cid, uid, count, callback) {
|
||||||
if(count === 0 || !count) {
|
if(!parseInt(count, 10)) {
|
||||||
return callback(null, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
CategoryTools.privileges(cid, uid, function(err, privileges) {
|
|
||||||
if(err) {
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!privileges.read) {
|
|
||||||
return callback(null, []);
|
return callback(null, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,7 +24,6 @@ module.exports = function(Categories) {
|
|||||||
|
|
||||||
posts.getPostSummaryByPids(pids, true, callback);
|
posts.getPostSummaryByPids(pids, true, callback);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Categories.moveRecentReplies = function(tid, oldCid, cid, callback) {
|
Categories.moveRecentReplies = function(tid, oldCid, cid, callback) {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ usersController.sortByJoinDate = function(req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function getUsers(set, req, res, next) {
|
function getUsers(set, req, res, next) {
|
||||||
user.getUsers(set, 0, 49, function(err, users) {
|
user.getUsersFromSet(set, 0, 49, function(err, users) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ var async = require('async'),
|
|||||||
usersController.getOnlineUsers = function(req, res, next) {
|
usersController.getOnlineUsers = function(req, res, next) {
|
||||||
var websockets = require('../socket.io');
|
var websockets = require('../socket.io');
|
||||||
|
|
||||||
user.getUsers('users:online', 0, 49, function (err, data) {
|
user.getUsersFromSet('users:online', 0, 49, function (err, data) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
@@ -72,7 +72,7 @@ usersController.getUsersSortedByJoinDate = function(req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function getUsers(set, res, next) {
|
function getUsers(set, res, next) {
|
||||||
user.getUsers(set, 0, 49, function (err, data) {
|
user.getUsersFromSet(set, 0, 49, function (err, data) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|||||||
89
src/posts.js
89
src/posts.js
@@ -278,76 +278,85 @@ var db = require('./database'),
|
|||||||
|
|
||||||
Posts.getPostSummaryByPids = function(pids, stripTags, callback) {
|
Posts.getPostSummaryByPids = function(pids, stripTags, callback) {
|
||||||
|
|
||||||
function getPostSummary(pid, callback) {
|
function getPostSummary(post, callback) {
|
||||||
|
|
||||||
async.waterfall([
|
post.relativeTime = utils.toISOString(post.timestamp);
|
||||||
|
|
||||||
|
async.parallel([
|
||||||
function(next) {
|
function(next) {
|
||||||
Posts.getPostFields(pid, ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted'], function(err, postData) {
|
Posts.addUserInfoToPost(post, function() {
|
||||||
if(err) {
|
next(null, post);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
topics.getTopicFields(post.tid, ['title', 'cid', 'slug', 'deleted'], function(err, topicData) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
} else if (parseInt(topicData.deleted, 10) === 1) {
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
categories.getCategoryFields(topicData.cid, ['name', 'icon', 'slug'], function(err, categoryData) {
|
||||||
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parseInt(postData.deleted, 10) === 1) {
|
post.category = categoryData;
|
||||||
return callback(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
postData.relativeTime = utils.toISOString(postData.timestamp);
|
|
||||||
next(null, postData);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
function(postData, next) {
|
|
||||||
Posts.addUserInfoToPost(postData, function() {
|
|
||||||
next(null, postData);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
function(postData, next) {
|
|
||||||
topics.getTopicFields(postData.tid, ['title', 'cid', 'slug', 'deleted'], function(err, topicData) {
|
|
||||||
if (err) {
|
|
||||||
return callback(err);
|
|
||||||
} else if (parseInt(topicData.deleted, 10) === 1) {
|
|
||||||
return callback(null);
|
|
||||||
}
|
|
||||||
categories.getCategoryFields(topicData.cid, ['name', 'icon', 'slug'], function(err, categoryData) {
|
|
||||||
postData.category = categoryData;
|
|
||||||
topicData.title = validator.escape(topicData.title);
|
topicData.title = validator.escape(topicData.title);
|
||||||
postData.topic = topicData;
|
post.topic = topicData;
|
||||||
next(null, postData);
|
next();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
function(postData, next) {
|
function(next) {
|
||||||
if (!postData.content) {
|
if (!post.content) {
|
||||||
return next(null, postData);
|
return next();
|
||||||
}
|
}
|
||||||
|
|
||||||
postTools.parse(postData.content, function(err, content) {
|
postTools.parse(post.content, function(err, content) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(stripTags) {
|
if(stripTags) {
|
||||||
var s = S(content);
|
var s = S(content);
|
||||||
postData.content = s.stripTags.apply(s, utils.getTagsExcept(['img', 'i', 'p'])).s;
|
post.content = s.stripTags.apply(s, utils.getTagsExcept(['img', 'i', 'p'])).s;
|
||||||
} else {
|
} else {
|
||||||
postData.content = content;
|
post.content = content;
|
||||||
}
|
}
|
||||||
|
|
||||||
next(null, postData);
|
next();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
], callback);
|
], function(err) {
|
||||||
|
callback(err, post);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async.map(pids, getPostSummary, function(err, posts) {
|
var keys = pids.map(function(pid) {
|
||||||
if(err) {
|
return 'post:' + pid;
|
||||||
|
});
|
||||||
|
|
||||||
|
db.getObjectsFields(keys, ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted'], function(err, posts) {
|
||||||
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
posts = posts.filter(function(p) {
|
posts = posts.filter(function(p) {
|
||||||
return p;
|
return !!p || parseInt(p.deleted, 10) !== 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
callback(null, posts);
|
async.map(posts, getPostSummary, function(err, posts) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
posts = posts.filter(function(post) {
|
||||||
|
return !!post;
|
||||||
|
});
|
||||||
|
|
||||||
|
return callback(null, posts);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,24 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
var categories = require('../categories'),
|
var categories = require('../categories'),
|
||||||
|
categoryTools = require('../categoryTools'),
|
||||||
meta = require('./../meta'),
|
meta = require('./../meta'),
|
||||||
user = require('./../user'),
|
user = require('./../user'),
|
||||||
|
|
||||||
SocketCategories = {};
|
SocketCategories = {};
|
||||||
|
|
||||||
SocketCategories.getRecentReplies = function(socket, tid, callback) {
|
SocketCategories.getRecentReplies = function(socket, cid, callback) {
|
||||||
categories.getRecentReplies(tid, socket.uid, 4, callback);
|
categoryTools.privileges(cid, socket.uid, function(err, privileges) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (privileges && !privileges.read) {
|
||||||
|
return callback(null, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
categories.getRecentReplies(cid, socket.uid, 4, callback);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketCategories.get = function(socket, data, callback) {
|
SocketCategories.get = function(socket, data, callback) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ var async = require('async'),
|
|||||||
user = require('../user'),
|
user = require('../user'),
|
||||||
topics = require('../topics'),
|
topics = require('../topics'),
|
||||||
utils = require('./../../public/src/utils'),
|
utils = require('./../../public/src/utils'),
|
||||||
|
meta = require('../meta'),
|
||||||
SocketUser = {};
|
SocketUser = {};
|
||||||
|
|
||||||
SocketUser.exists = function(socket, data, callback) {
|
SocketUser.exists = function(socket, data, callback) {
|
||||||
@@ -204,10 +205,14 @@ SocketUser.loadMore = function(socket, data, callback) {
|
|||||||
return callback(new Error('invalid-data'));
|
return callback(new Error('invalid-data'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!socket.uid && !!parseInt(meta.config.privateUserInfo, 10)) {
|
||||||
|
return callback(new Error('not-allowed'));
|
||||||
|
}
|
||||||
|
|
||||||
var start = data.after,
|
var start = data.after,
|
||||||
end = start + 19;
|
end = start + 19;
|
||||||
|
|
||||||
user.getUsers(data.set, start, end, function(err, userData) {
|
user.getUsersFromSet(data.set, start, end, function(err, userData) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
@@ -231,7 +236,6 @@ SocketUser.loadMore = function(socket, data, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SocketUser.setStatus = function(socket, status, callback) {
|
SocketUser.setStatus = function(socket, status, callback) {
|
||||||
var server = require('./index');
|
var server = require('./index');
|
||||||
user.setUserField(socket.uid, 'status', status, function(err) {
|
user.setUserField(socket.uid, 'status', status, function(err) {
|
||||||
|
|||||||
38
src/user.js
38
src/user.js
@@ -142,7 +142,18 @@ var bcrypt = require('bcryptjs'),
|
|||||||
db.incrObjectFieldBy('user:' + uid, field, -value, callback);
|
db.incrObjectFieldBy('user:' + uid, field, -value, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
User.getUsers = function(set, start, stop, callback) {
|
User.getUsersFromSet = function(set, start, stop, callback) {
|
||||||
|
async.waterfall([
|
||||||
|
function(next) {
|
||||||
|
db.getSortedSetRevRange(set, start, stop, next);
|
||||||
|
},
|
||||||
|
function(uids, next) {
|
||||||
|
User.getUsers(uids, next);
|
||||||
|
}
|
||||||
|
], callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
User.getUsers = function(uids, callback) {
|
||||||
function loadUserInfo(user, callback) {
|
function loadUserInfo(user, callback) {
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return callback(null, user);
|
return callback(null, user);
|
||||||
@@ -155,13 +166,10 @@ var bcrypt = require('bcryptjs'),
|
|||||||
function(isAdmin, next) {
|
function(isAdmin, next) {
|
||||||
user.status = !user.status ? 'online' : user.status;
|
user.status = !user.status ? 'online' : user.status;
|
||||||
user.administrator = isAdmin ? '1':'0';
|
user.administrator = isAdmin ? '1':'0';
|
||||||
if (set === 'users:online') {
|
db.isSortedSetMember('users:online', user.uid, next);
|
||||||
return callback(null, user);
|
|
||||||
}
|
|
||||||
db.sortedSetScore('users:online', user.uid, next);
|
|
||||||
},
|
},
|
||||||
function(score, next) {
|
function(isMember, next) {
|
||||||
if (!score) {
|
if (!isMember) {
|
||||||
user.status = 'offline';
|
user.status = 'offline';
|
||||||
}
|
}
|
||||||
next(null, user);
|
next(null, user);
|
||||||
@@ -169,17 +177,13 @@ var bcrypt = require('bcryptjs'),
|
|||||||
], callback);
|
], callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
async.waterfall([
|
User.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'postcount', 'reputation'], function(err, usersData) {
|
||||||
function(next) {
|
if (err) {
|
||||||
db.getSortedSetRevRange(set, start, stop, next);
|
return callback(err);
|
||||||
},
|
|
||||||
function(uids, next) {
|
|
||||||
User.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'postcount', 'reputation'], next);
|
|
||||||
},
|
|
||||||
function(users, next) {
|
|
||||||
async.map(users, loadUserInfo, next);
|
|
||||||
}
|
}
|
||||||
], callback);
|
|
||||||
|
async.map(usersData, loadUserInfo, callback);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
User.createGravatarURLFromEmail = function(email) {
|
User.createGravatarURLFromEmail = function(email) {
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ module.exports = function(User) {
|
|||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
User.getUsersData(uids, callback);
|
User.getUsers(uids, callback);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,8 @@ module.exports = function(User) {
|
|||||||
|
|
||||||
query = query.toLowerCase();
|
query = query.toLowerCase();
|
||||||
|
|
||||||
var usernames = Object.keys(usernamesHash),
|
var usernames = Object.keys(usernamesHash);
|
||||||
uids = [];
|
var uids = usernames.filter(function(username) {
|
||||||
|
|
||||||
uids = usernames.filter(function(username) {
|
|
||||||
return username.toLowerCase().indexOf(query) === 0;
|
return username.toLowerCase().indexOf(query) === 0;
|
||||||
})
|
})
|
||||||
.slice(0, 10)
|
.slice(0, 10)
|
||||||
@@ -31,10 +29,11 @@ module.exports = function(User) {
|
|||||||
return usernamesHash[username];
|
return usernamesHash[username];
|
||||||
});
|
});
|
||||||
|
|
||||||
User.getUsersData(uids, function(err, userdata) {
|
User.getUsers(uids, function(err, userdata) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
var diff = process.hrtime(start);
|
var diff = process.hrtime(start);
|
||||||
var timing = (diff[0] * 1e3 + diff[1] / 1e6).toFixed(1);
|
var timing = (diff[0] * 1e3 + diff[1] / 1e6).toFixed(1);
|
||||||
callback(null, {timing: timing, users: userdata});
|
callback(null, {timing: timing, users: userdata});
|
||||||
|
|||||||
Reference in New Issue
Block a user