diff --git a/src/notifications.js b/src/notifications.js index 4ea446d882..183a4c34a7 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -115,17 +115,21 @@ var async = require('async'), Notifications.get(nid, null, function(notif_data) { async.each(uids, function(uid, next) { - if (parseInt(uid, 10) > 0) { - checkReplace(notif_data.uniqueId, uid, notif_data, function(err, replace) { - if (replace) { - db.sortedSetAdd('uid:' + uid + ':notifications:unread', notif_data.datetime, nid); - websockets.in('uid_' + uid).emit('event:new_notification', notif_data); - } + if (!parseInt(uid, 10)) { + next(); + } - if (callback) { - callback(true); - } - }); + checkReplace(notif_data.uniqueId, uid, notif_data, function(err, replace) { + if (replace) { + db.sortedSetAdd('uid:' + uid + ':notifications:unread', notif_data.datetime, nid); + websockets.in('uid_' + uid).emit('event:new_notification', notif_data); + } + next(); + }); + + }, function(err) { + if (callback) { + callback(true); } }); }); diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index ec20007661..a07cdc1be8 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -39,10 +39,10 @@ User.banUsers = function(socket, uids, callback) { return callback(new Error('[[error:invalid-data]]')); } - async.each(uids, banUser, callback); + async.each(uids, User.banUser, callback); }; -function banUser(uid, callback) { +User.banUser = function(uid, callback) { user.isAdministrator(uid, function(err, isAdmin) { if (err || isAdmin) { return callback(err || new Error('[[error:cant-ban-other-admins]]')); @@ -63,7 +63,7 @@ function banUser(uid, callback) { callback(); }); }); -} +}; User.unbanUsers = function(socket, uids, callback) { if(!Array.isArray(uids)) { diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 32ce86edaa..865c26a769 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -3,6 +3,7 @@ var async = require('async'), nconf = require('nconf'), + db = require('../database'), posts = require('../posts'), meta = require('../meta'), topics = require('../topics'), @@ -262,7 +263,8 @@ SocketPosts.flag = function(socket, pid, callback) { } var message = '', - path = ''; + path = '', + post; async.waterfall([ function(next) { @@ -270,10 +272,11 @@ SocketPosts.flag = function(socket, pid, callback) { }, function(username, next) { message = '[[notifications:user_flagged_post, ' + username + ']]'; - posts.getPostField(pid, 'tid', next); + posts.getPostFields(pid, ['tid', 'uid'], next); }, - function(tid, next) { - topics.getTopicField(tid, 'slug', next); + function(postData, next) { + post = postData; + topics.getTopicField(postData.tid, 'slug', next); }, function(topicSlug, next) { path = nconf.get('relative_path') + '/topic/' + topicSlug + '#' + pid; @@ -287,7 +290,30 @@ SocketPosts.flag = function(socket, pid, callback) { from: socket.uid }, function(nid) { notifications.push(nid, adminGroup.members, function() { - next(null); + next(); + }); + }); + }, + function(next) { + if (!parseInt(post.uid, 10)) { + return next(); + } + + db.setAdd('uid:' + post.uid + ':flagged_by', socket.uid, function(err) { + if (err) { + return next(err); + } + db.setCount('uid:' + post.uid + ':flagged_by', function(err, count) { + if (err) { + return next(err); + } + + if (count >= (meta.config.flagsForBan || 3)) { + var adminUser = require('./admin/user'); + adminUser.banUser(post.uid, next); + return; + } + next(); }); }); } diff --git a/src/user/admin.js b/src/user/admin.js index b6b97b2065..d489f16446 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -50,6 +50,7 @@ module.exports = function(User) { }; User.unban = function(uid, callback) { + db.delete('uid:' + uid + ':flagged_by'); User.setUserField(uid, 'banned', 0, callback); }; };