diff --git a/public/language/en_GB/email.json b/public/language/en_GB/email.json index 9c1cacb36b..75813bcb58 100644 --- a/public/language/en_GB/email.json +++ b/public/language/en_GB/email.json @@ -17,7 +17,7 @@ "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.daily.no_topics": "There have been no active topics in the past day", + "digest.no_topics": "There have been no active topics in the past %1", "notif.chat.subject": "New chat message received from %1", "notif.chat.cta": "Click here to continue the conversation", diff --git a/src/user.js b/src/user.js index f55f65e14d..0a027410ad 100644 --- a/src/user.js +++ b/src/user.js @@ -15,6 +15,7 @@ var async = require('async'), User.email = require('./user/email'); User.notifications = require('./user/notifications'); User.reset = require('./user/reset'); + User.digest = require('./user/digest'); require('./user/auth')(User); require('./user/create')(User); diff --git a/src/user/digest.js b/src/user/digest.js new file mode 100644 index 0000000000..6c3adba7f7 --- /dev/null +++ b/src/user/digest.js @@ -0,0 +1,110 @@ +"use strict"; + +var async = require('async'), + winston = require('winston'), + nconf = require('nconf'), + + db = require('../database'), + meta = require('../meta'), + user = require('../user'), + topics = require('../topics'), + batch = require('../batch'), + emailer = require('../emailer'); + +module.exports = (function(Digest) { + Digest.execute = function(interval) { + var digestsDisabled = meta.config.disableEmailSubscriptions !== undefined && parseInt(meta.config.disableEmailSubscriptions, 10) === 1; + if (digestsDisabled) { + return winston.verbose('[user/jobs] Did not send digests (' + interval + ') because subscription system is disabled.'); + } + + if (!interval) { + // interval is one of: day, week, month, or year + interval = 'day'; + } + + async.parallel({ + topics: async.apply(topics.getLatestTopics, 0, 0, 9, interval), + subscribers: async.apply(Digest.getSubscribers, interval) + }, function(err, data) { + if (err) { + return winston.error('[user/jobs] Could not send digests (' + interval + '): ' + err.message); + } + + data.interval = interval; + + if (data.subscribers.length) { + Digest.send(data, function(err) { + if (err) { + winston.error('[user/jobs] Could not send digests (' + interval + '): ' + err.message); + } else { + winston.info('[user/jobs] Digest (' + interval + ') scheduling completed.'); + } + }); + } else { + winston.verbose('[user/jobs] No users subscribing to digest (' + interval + '). Digest not sent.'); + } + }); + }; + + Digest.getSubscribers = function(interval, callback) { + async.waterfall([ + async.apply(db.getSortedSetRange, 'users:joindate', 0, -1), + async.apply(user.getMultipleUserSettings) + ], function(err, userSettings) { + if (err) { + return callback(err); + } + + var subscribed = userSettings.filter(function(setting) { + return setting.dailyDigestFreq === interval; + }).map(function(setting) { + return setting.uid; + }); + + callback(null, subscribed); + }); + }; + + Digest.send = function(data, callback) { + var now = new Date(); + + user.getMultipleUserFields(data.subscribers, ['uid', 'username', 'lastonline'], function(err, users) { + if (err) { + winston.error('[user/jobs] Could not send digests (' + interval + '): ' + err.message); + return callback(err); + } + + async.eachLimit(users, 100, function(userObj, next) { + user.notifications.getDailyUnread(userObj.uid, function(err, notifications) { + if (err) { + winston.error('[user/jobs] Could not send digests (' + interval + '): ' + err.message); + return next(err); + } + + notifications = notifications.filter(Boolean); + + for(var i=0; i
  • - [[email:digest.daily.no_topics]] + [[email:digest.no_topics, {interval}]]
  • diff --git a/src/views/emails/dailydigest_plaintext.tpl b/src/views/emails/digest_plaintext.tpl similarity index 91% rename from src/views/emails/dailydigest_plaintext.tpl rename to src/views/emails/digest_plaintext.tpl index 9a34b0615f..eb539eb59a 100644 --- a/src/views/emails/dailydigest_plaintext.tpl +++ b/src/views/emails/digest_plaintext.tpl @@ -17,7 +17,7 @@ * {recent.title} ({url}/topic/{recent.slug}) -* [[email:digest.daily.no_topics]] +* [[email:digest.no_topics, {interval}]] [[email:digest.cta, {site_title}]]: {url}