mirror of
https://github.com/wassname/talk.git
synced 2026-06-29 03:21:58 +08:00
113 lines
3.6 KiB
JavaScript
113 lines
3.6 KiB
JavaScript
const debug = require('debug')('talk-plugin-notifications');
|
|
const path = require('path');
|
|
const linkify = require('linkifyjs/html');
|
|
const NotificationManager = require('./NotificationManager');
|
|
const { map, reduce } = require('lodash');
|
|
|
|
module.exports = connectors => {
|
|
const {
|
|
graph: { subscriptions: { getBroker }, Context },
|
|
services: { Mailer, Plugins },
|
|
} = connectors;
|
|
|
|
// Setup the mailer. Other plugins registered before this one can replace the
|
|
// notification template by passing the same name + format for the template
|
|
// registration.
|
|
['notification', 'notification-digest'].forEach(name => {
|
|
['txt', 'html'].forEach(format => {
|
|
Mailer.templates.register(
|
|
path.join(__dirname, 'emails', `${name}.${format}.ejs`),
|
|
name,
|
|
format
|
|
);
|
|
});
|
|
});
|
|
// Register the mail helpers. You can register your own helpers by calling
|
|
// this function in another plugin.
|
|
Mailer.registerHelpers({ linkify });
|
|
|
|
// Get the handle for the broker to attach to notifications.
|
|
const broker = getBroker();
|
|
|
|
// Create a NotificationManager to handle notifications.
|
|
const manager = new NotificationManager(Context);
|
|
|
|
// Get all the notification handlers. Additional plugins registered before
|
|
// this one can expose a `notifications` hook, that contains an array of
|
|
// notification handlers.
|
|
//
|
|
// A notification handler has the following form:
|
|
//
|
|
// {
|
|
// event // the graph event to listen for
|
|
// handle // the function called when the event is fired. It is called with
|
|
// // the (ctx, arg1, arg2, ...) where arg1, arg2 are args from the
|
|
// // event.
|
|
// category // the name representing the notification type (like 'reply')
|
|
// hydrate // returns the replacement parameters (in order!) to be used
|
|
// // in the translation.
|
|
// }
|
|
//
|
|
const notificationHandlers = Plugins.get('server', 'notifications').reduce(
|
|
(handlers, { plugin, notifications }) => {
|
|
debug(
|
|
`registered the ${
|
|
plugin.name
|
|
} plugin for notifications ${notifications.map(
|
|
({ category }) => category
|
|
)}`
|
|
);
|
|
handlers.push(...notifications);
|
|
return handlers;
|
|
},
|
|
[]
|
|
);
|
|
|
|
// Attach all the notification handlers.
|
|
manager.register(...notificationHandlers);
|
|
|
|
// Digest handlers should export the following to the `notificationDigests`
|
|
// plugin hook:
|
|
//
|
|
// {DAILY: { cronTime: '0 0 * * *', timeZone: 'America/New_York' }}
|
|
//
|
|
// Where `DAILY` is the key referenced in the typeDefs as a new type of
|
|
// `DIGEST_FREQUENCY`, and the value of that key is the one provided to the
|
|
// constructor for the Cron object:
|
|
//
|
|
// https://github.com/kelektiv/node-cron
|
|
//
|
|
// Which is used to trigger the digest operation for those uses setup with
|
|
// that type of digesting.
|
|
const digestHandlers = Plugins.get('server', 'notificationDigests').reduce(
|
|
(handlers, { plugin, notificationDigests }) => {
|
|
debug(
|
|
`registered the ${plugin.name} plugin for digest notifications ${map(
|
|
notificationDigests,
|
|
(config, frequency) => frequency
|
|
)}`
|
|
);
|
|
|
|
return reduce(
|
|
notificationDigests,
|
|
(handlers, config, frequency) => {
|
|
handlers.push({ config, frequency });
|
|
|
|
return handlers;
|
|
},
|
|
handlers
|
|
);
|
|
},
|
|
[]
|
|
);
|
|
|
|
// Attach all the notification digest handlers.
|
|
manager.registerDigests(...digestHandlers);
|
|
|
|
// Attach the broker to the manager so it can listen for the events.
|
|
manager.attach(broker);
|
|
|
|
// Start processing digests.
|
|
manager.startDigesting();
|
|
};
|