mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-11 16:35:47 +01:00
Upvote notification frequency selection (#6087)
Closes #5963 - Notify on every upvote - Notify on every tenth upvote - Notify logarithmically (on 10, 100, 1000...) - Disable upvote notifications
This commit is contained in:
committed by
Julian Lam
parent
3fd25257e0
commit
74ceb78800
@@ -110,6 +110,11 @@
|
|||||||
"outgoing-message-sound": "Outgoing message sound",
|
"outgoing-message-sound": "Outgoing message sound",
|
||||||
"notification-sound": "Notification sound",
|
"notification-sound": "Notification sound",
|
||||||
"no-sound": "No sound",
|
"no-sound": "No sound",
|
||||||
|
"upvote-notif-freq": "Upvote Notification Frequency",
|
||||||
|
"upvote-notif-freq.all": "All Upvotes",
|
||||||
|
"upvote-notif-freq.everyTen": "Every Ten Upvotes",
|
||||||
|
"upvote-notif-freq.logarithmic": "On 10, 100, 1000...",
|
||||||
|
"upvote-notif-freq.disabled": "Disabled",
|
||||||
|
|
||||||
"browsing": "Browsing Settings",
|
"browsing": "Browsing Settings",
|
||||||
"open_links_in_new_tab": "Open outgoing links in new tab",
|
"open_links_in_new_tab": "Open outgoing links in new tab",
|
||||||
|
|||||||
@@ -135,6 +135,20 @@ settingsController.get = function (req, res, callback) {
|
|||||||
language.selected = language.code === userData.settings.userLang;
|
language.selected = language.code === userData.settings.userLang;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var notifFreqOptions = [
|
||||||
|
'all',
|
||||||
|
'everyTen',
|
||||||
|
'logarithmic',
|
||||||
|
'disabled',
|
||||||
|
];
|
||||||
|
|
||||||
|
userData.upvoteNotifFreq = notifFreqOptions.map(function (name) {
|
||||||
|
return {
|
||||||
|
name: name,
|
||||||
|
selected: name === userData.notifFreqOptions,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
userData.disableCustomUserSkins = parseInt(meta.config.disableCustomUserSkins, 10) === 1;
|
userData.disableCustomUserSkins = parseInt(meta.config.disableCustomUserSkins, 10) === 1;
|
||||||
|
|
||||||
userData.allowUserHomePage = parseInt(meta.config.allowUserHomePage, 10) === 1;
|
userData.allowUserHomePage = parseInt(meta.config.allowUserHomePage, 10) === 1;
|
||||||
|
|||||||
@@ -232,6 +232,7 @@ module.exports = function (Posts) {
|
|||||||
user: {
|
user: {
|
||||||
reputation: newreputation,
|
reputation: newreputation,
|
||||||
},
|
},
|
||||||
|
fromuid: uid,
|
||||||
post: postData,
|
post: postData,
|
||||||
upvote: type === 'upvote' && !unvote,
|
upvote: type === 'upvote' && !unvote,
|
||||||
downvote: type === 'downvote' && !unvote,
|
downvote: type === 'downvote' && !unvote,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ var notifications = require('../notifications');
|
|||||||
var plugins = require('../plugins');
|
var plugins = require('../plugins');
|
||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
|
|
||||||
var SocketHelpers = {};
|
var SocketHelpers = module.exports;
|
||||||
|
|
||||||
SocketHelpers.notifyOnlineUsers = function (uid, result) {
|
SocketHelpers.notifyOnlineUsers = function (uid, result) {
|
||||||
winston.warn('[deprecated] SocketHelpers.notifyOnlineUsers, consider using socketHelpers.notifyNew(uid, \'newPost\', result);');
|
winston.warn('[deprecated] SocketHelpers.notifyOnlineUsers, consider using socketHelpers.notifyNew(uid, \'newPost\', result);');
|
||||||
@@ -171,6 +171,51 @@ SocketHelpers.sendNotificationToTopicOwner = function (tid, fromuid, command, no
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SocketHelpers.upvote = function (data, notification) {
|
||||||
|
if (!data || !data.post || !data.post.uid || !data.post.votes || !data.post.pid || !data.fromuid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var votes = data.post.votes;
|
||||||
|
var touid = data.post.uid;
|
||||||
|
var fromuid = data.fromuid;
|
||||||
|
var pid = data.post.pid;
|
||||||
|
|
||||||
|
var shouldNotify = {
|
||||||
|
all: function () {
|
||||||
|
return votes > 0;
|
||||||
|
},
|
||||||
|
everyTen: function () {
|
||||||
|
return votes > 0 && votes % 10 === 0;
|
||||||
|
},
|
||||||
|
logarithmic: function () {
|
||||||
|
return votes > 1 && Math.log10(votes) % 1 === 0;
|
||||||
|
},
|
||||||
|
disabled: function () {
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
async.waterfall([
|
||||||
|
function (next) {
|
||||||
|
user.getSettings(touid, next);
|
||||||
|
},
|
||||||
|
function (settings, next) {
|
||||||
|
var should = shouldNotify[settings.upvoteNotifFreq] || shouldNotify.all;
|
||||||
|
|
||||||
|
if (should()) {
|
||||||
|
SocketHelpers.sendNotificationToPostOwner(pid, fromuid, 'upvote', notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
], function (err) {
|
||||||
|
if (err) {
|
||||||
|
winston.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
SocketHelpers.rescindUpvoteNotification = function (pid, fromuid) {
|
SocketHelpers.rescindUpvoteNotification = function (pid, fromuid) {
|
||||||
var uid;
|
var uid;
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
@@ -199,5 +244,3 @@ SocketHelpers.emitToTopicAndCategory = function (event, data) {
|
|||||||
websockets.in('topic_' + data.tid).emit(event, data);
|
websockets.in('topic_' + data.tid).emit(event, data);
|
||||||
websockets.in('category_' + data.cid).emit(event, data);
|
websockets.in('category_' + data.cid).emit(event, data);
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = SocketHelpers;
|
|
||||||
|
|||||||
@@ -69,7 +69,9 @@ function executeCommand(socket, command, eventName, notification, data, callback
|
|||||||
websockets.in(data.room_id).emit('event:' + eventName, result);
|
websockets.in(data.room_id).emit('event:' + eventName, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result && notification) {
|
if (result && command === 'upvote') {
|
||||||
|
socketHelpers.upvote(result, notification);
|
||||||
|
} else if (result && notification) {
|
||||||
socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, command, notification);
|
socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, command, notification);
|
||||||
} else if (result && command === 'unvote') {
|
} else if (result && command === 'unvote') {
|
||||||
socketHelpers.rescindUpvoteNotification(data.pid, socket.uid);
|
socketHelpers.rescindUpvoteNotification(data.pid, socket.uid);
|
||||||
|
|||||||
@@ -74,8 +74,7 @@ module.exports = function (User) {
|
|||||||
settings.categoryTopicSort = getSetting(settings, 'categoryTopicSort', 'newest_to_oldest');
|
settings.categoryTopicSort = getSetting(settings, 'categoryTopicSort', 'newest_to_oldest');
|
||||||
settings.followTopicsOnCreate = parseInt(getSetting(settings, 'followTopicsOnCreate', 1), 10) === 1;
|
settings.followTopicsOnCreate = parseInt(getSetting(settings, 'followTopicsOnCreate', 1), 10) === 1;
|
||||||
settings.followTopicsOnReply = parseInt(getSetting(settings, 'followTopicsOnReply', 0), 10) === 1;
|
settings.followTopicsOnReply = parseInt(getSetting(settings, 'followTopicsOnReply', 0), 10) === 1;
|
||||||
settings.sendChatNotifications = parseInt(getSetting(settings, 'sendChatNotifications', 0), 10) === 1;
|
settings.upvoteNotifFreq = getSetting(settings, 'upvoteNotifFreq', 'all');
|
||||||
settings.sendPostNotifications = parseInt(getSetting(settings, 'sendPostNotifications', 0), 10) === 1;
|
|
||||||
settings.restrictChat = parseInt(getSetting(settings, 'restrictChat', 0), 10) === 1;
|
settings.restrictChat = parseInt(getSetting(settings, 'restrictChat', 0), 10) === 1;
|
||||||
settings.topicSearchEnabled = parseInt(getSetting(settings, 'topicSearchEnabled', 0), 10) === 1;
|
settings.topicSearchEnabled = parseInt(getSetting(settings, 'topicSearchEnabled', 0), 10) === 1;
|
||||||
settings.delayImageLoading = parseInt(getSetting(settings, 'delayImageLoading', 1), 10) === 1;
|
settings.delayImageLoading = parseInt(getSetting(settings, 'delayImageLoading', 1), 10) === 1;
|
||||||
@@ -131,6 +130,7 @@ module.exports = function (User) {
|
|||||||
notificationSound: data.notificationSound,
|
notificationSound: data.notificationSound,
|
||||||
incomingChatSound: data.incomingChatSound,
|
incomingChatSound: data.incomingChatSound,
|
||||||
outgoingChatSound: data.outgoingChatSound,
|
outgoingChatSound: data.outgoingChatSound,
|
||||||
|
upvoteNotifFreq: data.upvoteNotifFreq,
|
||||||
notificationType_upvote: data.notificationType_upvote,
|
notificationType_upvote: data.notificationType_upvote,
|
||||||
'notificationType_new-topic': data['notificationType_new-topic'],
|
'notificationType_new-topic': data['notificationType_new-topic'],
|
||||||
'notificationType_new-reply': data['notificationType_new-reply'],
|
'notificationType_new-reply': data['notificationType_new-reply'],
|
||||||
|
|||||||
Reference in New Issue
Block a user