mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 11:35:55 +01:00
removed bans from downvotes and flags
cleanup thread tools emits
This commit is contained in:
@@ -199,13 +199,8 @@ define('forum/categoryTools', ['forum/topic/move', 'topicSelect'], function(move
|
|||||||
getTopicEl(data.tid).remove();
|
getTopicEl(data.tid).remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTopicPurged(tids) {
|
function onTopicPurged(data) {
|
||||||
if (!tids) {
|
getTopicEl(data.tid).remove();
|
||||||
return;
|
|
||||||
}
|
|
||||||
for(var i=0; i<tids.length; ++i) {
|
|
||||||
getTopicEl(tids[i]).remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CategoryTools;
|
return CategoryTools;
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ define('forum/topic/events', [
|
|||||||
threadTools.setDeleteState(data);
|
threadTools.setDeleteState(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTopicPurged(tid) {
|
function onTopicPurged(data) {
|
||||||
ajaxify.go('category/' + ajaxify.variables.get('category_id'));
|
ajaxify.go('category/' + ajaxify.variables.get('category_id'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -139,38 +139,7 @@ SocketPosts.upvote = function(socket, data, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SocketPosts.downvote = function(socket, data, callback) {
|
SocketPosts.downvote = function(socket, data, callback) {
|
||||||
function banUserForLowReputation(uid, callback) {
|
favouriteCommand(socket, 'downvote', 'voted', '', data, callback);
|
||||||
if (parseInt(meta.config['autoban:downvote'], 10) === 1) {
|
|
||||||
user.getUserFields(uid, ['reputation', 'banned'], function(err, userData) {
|
|
||||||
if (err || parseInt(userData.banned, 10) === 1 || parseInt(userData.reputation) >= parseInt(meta.config['autoban:downvote:threshold'], 10)) {
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
var adminUser = require('./admin/user');
|
|
||||||
adminUser.banUser(uid, function(err) {
|
|
||||||
if (err) {
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
events.log({
|
|
||||||
type: 'banned',
|
|
||||||
reason: 'low-reputation',
|
|
||||||
uid: socket.uid,
|
|
||||||
ip: socket.ip,
|
|
||||||
targetUid: data.uid,
|
|
||||||
reputation: userData.reputation
|
|
||||||
});
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
favouriteCommand(socket, 'downvote', 'voted', '', data, function(err) {
|
|
||||||
if (err) {
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
banUserForLowReputation(data.uid, callback);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketPosts.unvote = function(socket, data, callback) {
|
SocketPosts.unvote = function(socket, data, callback) {
|
||||||
@@ -480,23 +449,7 @@ SocketPosts.flag = function(socket, pid, callback) {
|
|||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
|
|
||||||
db.setAdd('uid:' + post.uid + ':flagged_by', socket.uid, function(err) {
|
db.setAdd('uid:' + post.uid + ':flagged_by', socket.uid, next);
|
||||||
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) && parseInt(meta.config.flagsForBan, 10) !== 0) {
|
|
||||||
var adminUser = require('./admin/user');
|
|
||||||
adminUser.banUser(post.uid, next);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
], callback);
|
], callback);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ var nconf = require('nconf'),
|
|||||||
|
|
||||||
SocketTopics = {};
|
SocketTopics = {};
|
||||||
|
|
||||||
|
|
||||||
SocketTopics.post = function(socket, data, callback) {
|
SocketTopics.post = function(socket, data, callback) {
|
||||||
if(!data) {
|
if(!data) {
|
||||||
return callback(new Error('[[error:invalid-data]]'));
|
return callback(new Error('[[error:invalid-data]]'));
|
||||||
@@ -204,44 +205,34 @@ SocketTopics.markAsUnreadForAll = function(socket, tids, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.delete = function(socket, data, callback) {
|
SocketTopics.delete = function(socket, data, callback) {
|
||||||
doTopicAction('delete', socket, data, callback);
|
doTopicAction('delete', 'event:topic_deleted', socket, data, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.restore = function(socket, data, callback) {
|
SocketTopics.restore = function(socket, data, callback) {
|
||||||
doTopicAction('restore', socket, data, callback);
|
doTopicAction('restore', 'event:topic_restored', socket, data, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.purge = function(socket, data, callback) {
|
SocketTopics.purge = function(socket, data, callback) {
|
||||||
doTopicAction('purge', socket, data, function(err) {
|
doTopicAction('purge', 'event:topic_purged', socket, data, callback);
|
||||||
if (err) {
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
websockets.in('category_' + data.cid).emit('event:topic_purged', data.tids);
|
|
||||||
async.each(data.tids, function(tid, next) {
|
|
||||||
websockets.in('topic_' + tid).emit('event:topic_purged', tid);
|
|
||||||
next();
|
|
||||||
}, callback);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.lock = function(socket, data, callback) {
|
SocketTopics.lock = function(socket, data, callback) {
|
||||||
doTopicAction('lock', socket, data, callback);
|
doTopicAction('lock', 'event:topic_locked', socket, data, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.unlock = function(socket, data, callback) {
|
SocketTopics.unlock = function(socket, data, callback) {
|
||||||
doTopicAction('unlock', socket, data, callback);
|
doTopicAction('unlock', 'event:topic_unlocked', socket, data, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.pin = function(socket, data, callback) {
|
SocketTopics.pin = function(socket, data, callback) {
|
||||||
doTopicAction('pin', socket, data, callback);
|
doTopicAction('pin', 'event:topic_pinned', socket, data, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.unpin = function(socket, data, callback) {
|
SocketTopics.unpin = function(socket, data, callback) {
|
||||||
doTopicAction('unpin', socket, data, callback);
|
doTopicAction('unpin', 'event:topic_unpinned', socket, data, callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
function doTopicAction(action, socket, data, callback) {
|
function doTopicAction(action, event, socket, data, callback) {
|
||||||
if (!socket.uid) {
|
if (!socket.uid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -251,35 +242,45 @@ function doTopicAction(action, socket, data, callback) {
|
|||||||
|
|
||||||
async.each(data.tids, function(tid, next) {
|
async.each(data.tids, function(tid, next) {
|
||||||
privileges.topics.canEdit(tid, socket.uid, function(err, canEdit) {
|
privileges.topics.canEdit(tid, socket.uid, function(err, canEdit) {
|
||||||
if(err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!canEdit) {
|
if (!canEdit) {
|
||||||
return next(new Error('[[error:no-privileges]]'));
|
return next(new Error('[[error:no-privileges]]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(typeof threadTools[action] === 'function') {
|
if (typeof threadTools[action] !== 'function') {
|
||||||
threadTools[action](tid, socket.uid, function(err) {
|
return next();
|
||||||
if (err) {
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (action === 'delete' || action === 'restore' || action === 'purge') {
|
|
||||||
events.log({
|
|
||||||
type: 'topic-' + action,
|
|
||||||
uid: socket.uid,
|
|
||||||
ip: socket.ip,
|
|
||||||
tid: tid
|
|
||||||
});
|
|
||||||
}
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
threadTools[action](tid, socket.uid, function(err, data) {
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
emitToTopicAndCategory(event, data);
|
||||||
|
|
||||||
|
if (action === 'delete' || action === 'restore' || action === 'purge') {
|
||||||
|
events.log({
|
||||||
|
type: 'topic-' + action,
|
||||||
|
uid: socket.uid,
|
||||||
|
ip: socket.ip,
|
||||||
|
tid: tid
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
next();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}, callback);
|
}, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function emitToTopicAndCategory(event, data) {
|
||||||
|
websockets.in('topic_' + data.tid).emit(event, data);
|
||||||
|
websockets.in('category_' + data.cid).emit(event, data);
|
||||||
|
}
|
||||||
|
|
||||||
SocketTopics.createTopicFromPosts = function(socket, data, callback) {
|
SocketTopics.createTopicFromPosts = function(socket, data, callback) {
|
||||||
if(!socket.uid) {
|
if(!socket.uid) {
|
||||||
return callback(new Error('[[error:not-logged-in]]'));
|
return callback(new Error('[[error:not-logged-in]]'));
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ var winston = require('winston'),
|
|||||||
notifications = require('./notifications'),
|
notifications = require('./notifications'),
|
||||||
posts = require('./posts'),
|
posts = require('./posts'),
|
||||||
meta = require('./meta'),
|
meta = require('./meta'),
|
||||||
websockets = require('./socket.io'),
|
|
||||||
events = require('./events'),
|
events = require('./events'),
|
||||||
plugins = require('./plugins'),
|
plugins = require('./plugins'),
|
||||||
batch = require('./batch');
|
batch = require('./batch');
|
||||||
@@ -39,12 +38,6 @@ var winston = require('winston'),
|
|||||||
}
|
}
|
||||||
|
|
||||||
topics[isDelete ? 'delete' : 'restore'](tid, function(err) {
|
topics[isDelete ? 'delete' : 'restore'](tid, function(err) {
|
||||||
function emitTo(room) {
|
|
||||||
websockets.in(room).emit(isDelete ? 'event:topic_deleted' : 'event:topic_restored', {
|
|
||||||
tid: tid,
|
|
||||||
isDelete: isDelete
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
@@ -56,17 +49,20 @@ var winston = require('winston'),
|
|||||||
plugins.fireHook('action:topic.restore', topicData);
|
plugins.fireHook('action:topic.restore', topicData);
|
||||||
}
|
}
|
||||||
|
|
||||||
emitTo('topic_' + tid);
|
var data = {
|
||||||
emitTo('category_' + topicData.cid);
|
tid: tid,
|
||||||
|
cid: topicData.cid,
|
||||||
|
isDelete: isDelete,
|
||||||
|
uid: uid
|
||||||
|
};
|
||||||
|
|
||||||
callback(null, {
|
callback(null, data);
|
||||||
tid: tid
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ThreadTools.purge = function(tid, uid, callback) {
|
ThreadTools.purge = function(tid, uid, callback) {
|
||||||
|
var topic;
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
function(next) {
|
function(next) {
|
||||||
topics.exists(tid, next);
|
topics.exists(tid, next);
|
||||||
@@ -80,13 +76,17 @@ var winston = require('winston'),
|
|||||||
}, {alwaysStartAt: 0}, next);
|
}, {alwaysStartAt: 0}, next);
|
||||||
},
|
},
|
||||||
function(next) {
|
function(next) {
|
||||||
topics.getTopicField(tid, 'mainPid', next);
|
topics.getTopicFields(tid, ['mainPid', 'cid'], next);
|
||||||
},
|
},
|
||||||
function(mainPid, next) {
|
function(_topic, next) {
|
||||||
posts.purge(mainPid, next);
|
topic = _topic;
|
||||||
|
posts.purge(topic.mainPid, next);
|
||||||
},
|
},
|
||||||
function(next) {
|
function(next) {
|
||||||
topics.purge(tid, next);
|
topics.purge(tid, next);
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
next(null, {tid: tid, cid: topic.cid, uid: uid});
|
||||||
}
|
}
|
||||||
], callback);
|
], callback);
|
||||||
};
|
};
|
||||||
@@ -100,35 +100,24 @@ var winston = require('winston'),
|
|||||||
};
|
};
|
||||||
|
|
||||||
function toggleLock(tid, uid, lock, callback) {
|
function toggleLock(tid, uid, lock, callback) {
|
||||||
|
callback = callback || function() {};
|
||||||
topics.getTopicField(tid, 'cid', function(err, cid) {
|
topics.getTopicField(tid, 'cid', function(err, cid) {
|
||||||
function emitTo(room) {
|
if (err) {
|
||||||
websockets.in(room).emit(lock ? 'event:topic_locked' : 'event:topic_unlocked', {
|
|
||||||
tid: tid,
|
|
||||||
isLocked: lock
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err && typeof callback === 'function') {
|
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
topics.setTopicField(tid, 'locked', lock ? 1 : 0);
|
topics.setTopicField(tid, 'locked', lock ? 1 : 0);
|
||||||
|
|
||||||
plugins.fireHook('action:topic.lock', {
|
var data = {
|
||||||
tid: tid,
|
tid: tid,
|
||||||
isLocked: lock,
|
isLocked: lock,
|
||||||
uid: uid
|
uid: uid,
|
||||||
});
|
cid: cid
|
||||||
|
};
|
||||||
|
|
||||||
emitTo('topic_' + tid);
|
plugins.fireHook('action:topic.lock', data);
|
||||||
emitTo('category_' + cid);
|
|
||||||
|
|
||||||
if (typeof callback === 'function') {
|
callback(null, data);
|
||||||
callback(null, {
|
|
||||||
tid: tid,
|
|
||||||
isLocked: lock
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,13 +131,6 @@ var winston = require('winston'),
|
|||||||
|
|
||||||
function togglePin(tid, uid, pin, callback) {
|
function togglePin(tid, uid, pin, callback) {
|
||||||
topics.getTopicFields(tid, ['cid', 'lastposttime'], function(err, topicData) {
|
topics.getTopicFields(tid, ['cid', 'lastposttime'], function(err, topicData) {
|
||||||
function emitTo(room) {
|
|
||||||
websockets.in(room).emit(pin ? 'event:topic_pinned' : 'event:topic_unpinned', {
|
|
||||||
tid: tid,
|
|
||||||
isPinned: pin
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
@@ -156,19 +138,16 @@ var winston = require('winston'),
|
|||||||
topics.setTopicField(tid, 'pinned', pin ? 1 : 0);
|
topics.setTopicField(tid, 'pinned', pin ? 1 : 0);
|
||||||
db.sortedSetAdd('cid:' + topicData.cid + ':tids', pin ? Math.pow(2, 53) : topicData.lastposttime, tid);
|
db.sortedSetAdd('cid:' + topicData.cid + ':tids', pin ? Math.pow(2, 53) : topicData.lastposttime, tid);
|
||||||
|
|
||||||
plugins.fireHook('action:topic.pin', {
|
var data = {
|
||||||
tid: tid,
|
tid: tid,
|
||||||
isPinned: pin,
|
isPinned: pin,
|
||||||
uid: uid
|
uid: uid,
|
||||||
});
|
cid: topicData.cid
|
||||||
|
};
|
||||||
|
|
||||||
emitTo('topic_' + tid);
|
plugins.fireHook('action:topic.pin', data);
|
||||||
emitTo('category_' + topicData.cid);
|
|
||||||
|
|
||||||
callback(null, {
|
callback(null, data);
|
||||||
tid: tid,
|
|
||||||
isPinned: pin
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -97,26 +97,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">User Bans</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
<form>
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Number of flags to ban user</label>
|
|
||||||
<input type="text" class="form-control" value="3" placeholder="" data-field="flagsForBan" />
|
|
||||||
</div>
|
|
||||||
<hr />
|
|
||||||
<div class="checkbox">
|
|
||||||
<label>
|
|
||||||
<input type="checkbox" data-field="autoban:downvote"> <strong>Enable automatic banning for reaching below a reputation threshold</strong>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<label>Reputation threshold before receiving an automatic ban</label>
|
|
||||||
<input type="text" class="form-control" value="" placeholder="-50" data-field="autoban:downvote:threshold" />
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">User Registration</div>
|
<div class="panel-heading">User Registration</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
|||||||
Reference in New Issue
Block a user