refactor: move plugin hook methods to plugin.hooks.*

v1.18.x
Julian Lam 5 years ago
parent 3b1c03ed50
commit 6e2da9966e

@ -41,7 +41,7 @@ Analytics.init = async function () {
Analytics.increment = function (keys, callback) { Analytics.increment = function (keys, callback) {
keys = Array.isArray(keys) ? keys : [keys]; keys = Array.isArray(keys) ? keys : [keys];
plugins.fireHook('action:analytics.increment', { keys: keys }); plugins.hooks.fire('action:analytics.increment', { keys: keys });
keys.forEach(function (key) { keys.forEach(function (key) {
counters[key] = counters[key] || 0; counters[key] = counters[key] || 0;

@ -109,7 +109,7 @@ exports.postCommand = async function (caller, command, eventName, notification,
filter:post.bookmark filter:post.bookmark
filter:post.unbookmark filter:post.unbookmark
*/ */
const filteredData = await plugins.fireHook('filter:post.' + command, { const filteredData = await plugins.hooks.fire('filter:post.' + command, {
data: data, data: data,
uid: caller.uid, uid: caller.uid,
}); });

@ -128,7 +128,7 @@ usersAPI.changePassword = async function (caller, data) {
usersAPI.follow = async function (caller, data) { usersAPI.follow = async function (caller, data) {
await user.follow(caller.uid, data.uid); await user.follow(caller.uid, data.uid);
plugins.fireHook('action:user.follow', { plugins.hooks.fire('action:user.follow', {
fromUid: caller.uid, fromUid: caller.uid,
toUid: data.uid, toUid: data.uid,
}); });
@ -151,7 +151,7 @@ usersAPI.follow = async function (caller, data) {
usersAPI.unfollow = async function (caller, data) { usersAPI.unfollow = async function (caller, data) {
await user.unfollow(caller.uid, data.uid); await user.unfollow(caller.uid, data.uid);
plugins.fireHook('action:user.unfollow', { plugins.hooks.fire('action:user.unfollow', {
fromUid: caller.uid, fromUid: caller.uid,
toUid: data.uid, toUid: data.uid,
}); });
@ -185,7 +185,7 @@ usersAPI.ban = async function (caller, data) {
ip: caller.ip, ip: caller.ip,
reason: data.reason || undefined, reason: data.reason || undefined,
}); });
plugins.fireHook('action:user.banned', { plugins.hooks.fire('action:user.banned', {
callerUid: caller.uid, callerUid: caller.uid,
ip: caller.ip, ip: caller.ip,
uid: data.uid, uid: data.uid,
@ -207,7 +207,7 @@ usersAPI.unban = async function (caller, data) {
targetUid: data.uid, targetUid: data.uid,
ip: caller.ip, ip: caller.ip,
}); });
plugins.fireHook('action:user.unbanned', { plugins.hooks.fire('action:user.unbanned', {
callerUid: caller.uid, callerUid: caller.uid,
ip: caller.ip, ip: caller.ip,
uid: data.uid, uid: data.uid,
@ -278,7 +278,7 @@ async function processDeletion({ uid, method, password, caller }) {
sockets.server.sockets.emit('event:user_status_change', { uid: caller.uid, status: 'offline' }); sockets.server.sockets.emit('event:user_status_change', { uid: caller.uid, status: 'offline' });
plugins.fireHook('action:user.delete', { plugins.hooks.fire('action:user.delete', {
callerUid: caller.uid, callerUid: caller.uid,
uid: uid, uid: uid,
ip: caller.ip, ip: caller.ip,

@ -45,7 +45,7 @@ module.exports = function (Categories) {
category.backgroundImage = data.backgroundImage; category.backgroundImage = data.backgroundImage;
} }
const result = await plugins.fireHook('filter:category.create', { category: category, data: data }); const result = await plugins.hooks.fire('filter:category.create', { category: category, data: data });
category = result.category; category = result.category;
@ -86,7 +86,7 @@ module.exports = function (Categories) {
await duplicateCategoriesChildren(category.cid, data.cloneFromCid, data.uid); await duplicateCategoriesChildren(category.cid, data.cloneFromCid, data.uid);
} }
plugins.fireHook('action:category.create', { category: category }); plugins.hooks.fire('action:category.create', { category: category });
return category; return category;
}; };
@ -170,7 +170,7 @@ module.exports = function (Categories) {
Categories.copyPrivilegesFrom = async function (fromCid, toCid, group) { Categories.copyPrivilegesFrom = async function (fromCid, toCid, group) {
group = group || ''; group = group || '';
const data = await plugins.fireHook('filter:categories.copyPrivilegesFrom', { const data = await plugins.hooks.fire('filter:categories.copyPrivilegesFrom', {
privileges: group ? privileges.groupPrivilegeList.slice() : privileges.privilegeList.slice(), privileges: group ? privileges.groupPrivilegeList.slice() : privileges.privilegeList.slice(),
fromCid: fromCid, fromCid: fromCid,
toCid: toCid, toCid: toCid,

@ -20,7 +20,7 @@ module.exports = function (Categories) {
const keys = cids.map(cid => 'category:' + cid); const keys = cids.map(cid => 'category:' + cid);
const categories = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); const categories = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
const result = await plugins.fireHook('filter:category.getFields', { const result = await plugins.hooks.fire('filter:category.getFields', {
cids: cids, cids: cids,
categories: categories, categories: categories,
fields: fields, fields: fields,

@ -22,7 +22,7 @@ module.exports = function (Categories) {
await topics.purgePostsAndTopic(tid, uid); await topics.purgePostsAndTopic(tid, uid);
}); });
await purgeCategory(cid); await purgeCategory(cid);
plugins.fireHook('action:category.delete', { cid: cid, uid: uid }); plugins.hooks.fire('action:category.delete', { cid: cid, uid: uid });
}; };
async function purgeCategory(cid) { async function purgeCategory(cid) {

@ -59,7 +59,7 @@ Categories.getCategoryById = async function (data) {
calculateTopicPostCount(category); calculateTopicPostCount(category);
const result = await plugins.fireHook('filter:category.get', { category: category, uid: data.uid }); const result = await plugins.hooks.fire('filter:category.get', { category: category, uid: data.uid });
return result.category; return result.category;
}; };

@ -36,7 +36,7 @@ module.exports = function (Categories) {
if (numRecentReplies > 0) { if (numRecentReplies > 0) {
await db.sortedSetAdd('cid:' + cid + ':recent_tids', Date.now(), tid); await db.sortedSetAdd('cid:' + cid + ':recent_tids', Date.now(), tid);
} }
await plugins.fireHook('action:categories.updateRecentTid', { cid: cid, tid: tid }); await plugins.hooks.fire('action:categories.updateRecentTid', { cid: cid, tid: tid });
}; };
Categories.updateRecentTidForCid = async function (cid) { Categories.updateRecentTidForCid = async function (cid) {
@ -68,8 +68,8 @@ module.exports = function (Categories) {
} }
const categoriesToLoad = categoryData.filter(c => c && c.numRecentReplies && parseInt(c.numRecentReplies, 10) > 0); const categoriesToLoad = categoryData.filter(c => c && c.numRecentReplies && parseInt(c.numRecentReplies, 10) > 0);
let keys = []; let keys = [];
if (plugins.hasListeners('filter:categories.getRecentTopicReplies')) { if (plugins.hooks.hasListeners('filter:categories.getRecentTopicReplies')) {
const result = await plugins.fireHook('filter:categories.getRecentTopicReplies', { const result = await plugins.hooks.fire('filter:categories.getRecentTopicReplies', {
categories: categoriesToLoad, categories: categoriesToLoad,
uid: uid, uid: uid,
query: query, query: query,

@ -8,7 +8,7 @@ const user = require('../user');
module.exports = function (Categories) { module.exports = function (Categories) {
Categories.getCategoryTopics = async function (data) { Categories.getCategoryTopics = async function (data) {
let results = await plugins.fireHook('filter:category.topics.prepare', data); let results = await plugins.hooks.fire('filter:category.topics.prepare', data);
const tids = await Categories.getTopicIds(results); const tids = await Categories.getTopicIds(results);
let topicsData = await topics.getTopicsByTids(tids, data.uid); let topicsData = await topics.getTopicsByTids(tids, data.uid);
topicsData = await user.blocks.filter(data.uid, topicsData); topicsData = await user.blocks.filter(data.uid, topicsData);
@ -18,7 +18,7 @@ module.exports = function (Categories) {
} }
topics.calculateTopicIndices(topicsData, data.start); topics.calculateTopicIndices(topicsData, data.start);
results = await plugins.fireHook('filter:category.topics.get', { cid: data.cid, topics: topicsData, uid: data.uid }); results = await plugins.hooks.fire('filter:category.topics.get', { cid: data.cid, topics: topicsData, uid: data.uid });
return { topics: results.topics, nextStart: data.stop + 1 }; return { topics: results.topics, nextStart: data.stop + 1 };
}; };
@ -43,8 +43,8 @@ module.exports = function (Categories) {
return pinnedTidsOnPage; return pinnedTidsOnPage;
} }
if (plugins.hasListeners('filter:categories.getTopicIds')) { if (plugins.hooks.hasListeners('filter:categories.getTopicIds')) {
const result = await plugins.fireHook('filter:categories.getTopicIds', { const result = await plugins.hooks.fire('filter:categories.getTopicIds', {
tids: [], tids: [],
data: data, data: data,
pinnedTids: pinnedTidsOnPage, pinnedTids: pinnedTidsOnPage,
@ -74,8 +74,8 @@ module.exports = function (Categories) {
}; };
Categories.getTopicCount = async function (data) { Categories.getTopicCount = async function (data) {
if (plugins.hasListeners('filter:categories.getTopicCount')) { if (plugins.hooks.hasListeners('filter:categories.getTopicCount')) {
const result = await plugins.fireHook('filter:categories.getTopicCount', { const result = await plugins.hooks.fire('filter:categories.getTopicCount', {
topicCount: data.category.topic_count, topicCount: data.category.topic_count,
data: data, data: data,
}); });
@ -112,7 +112,7 @@ module.exports = function (Categories) {
set = [set, 'tag:' + data.tag + ':topics']; set = [set, 'tag:' + data.tag + ':topics'];
} }
} }
const result = await plugins.fireHook('filter:categories.buildTopicsSortedSet', { const result = await plugins.hooks.fire('filter:categories.buildTopicsSortedSet', {
set: set, set: set,
data: data, data: data,
}); });
@ -122,7 +122,7 @@ module.exports = function (Categories) {
Categories.getSortedSetRangeDirection = async function (sort) { Categories.getSortedSetRangeDirection = async function (sort) {
sort = sort || 'newest_to_oldest'; sort = sort || 'newest_to_oldest';
const direction = sort === 'newest_to_oldest' || sort === 'most_posts' || sort === 'most_votes' ? 'highest-to-lowest' : 'lowest-to-highest'; const direction = sort === 'newest_to_oldest' || sort === 'most_posts' || sort === 'most_votes' ? 'highest-to-lowest' : 'lowest-to-highest';
const result = await plugins.fireHook('filter:categories.getSortedSetRangeDirection', { const result = await plugins.hooks.fire('filter:categories.getSortedSetRangeDirection', {
sort: sort, sort: sort,
direction: direction, direction: direction,
}); });
@ -134,8 +134,8 @@ module.exports = function (Categories) {
}; };
Categories.getPinnedTids = async function (data) { Categories.getPinnedTids = async function (data) {
if (plugins.hasListeners('filter:categories.getPinnedTids')) { if (plugins.hooks.hasListeners('filter:categories.getPinnedTids')) {
const result = await plugins.fireHook('filter:categories.getPinnedTids', { const result = await plugins.hooks.fire('filter:categories.getPinnedTids', {
pinnedTids: [], pinnedTids: [],
data: data, data: data,
}); });

@ -27,7 +27,7 @@ module.exports = function (Categories) {
const translated = await translator.translate(modifiedFields.name); const translated = await translator.translate(modifiedFields.name);
modifiedFields.slug = cid + '/' + slugify(translated); modifiedFields.slug = cid + '/' + slugify(translated);
} }
const result = await plugins.fireHook('filter:category.update', { cid: cid, category: modifiedFields }); const result = await plugins.hooks.fire('filter:category.update', { cid: cid, category: modifiedFields });
const category = result.category; const category = result.category;
var fields = Object.keys(category); var fields = Object.keys(category);
@ -40,7 +40,7 @@ module.exports = function (Categories) {
await async.eachSeries(fields, async function (key) { await async.eachSeries(fields, async function (key) {
await updateCategoryField(cid, key, category[key]); await updateCategoryField(cid, key, category[key]);
}); });
plugins.fireHook('action:category.update', { cid: cid, modified: category }); plugins.hooks.fire('action:category.update', { cid: cid, modified: category });
} }
async function updateCategoryField(cid, key, value) { async function updateCategoryField(cid, key, value) {
@ -92,7 +92,7 @@ module.exports = function (Categories) {
} }
Categories.parseDescription = async function (cid, description) { Categories.parseDescription = async function (cid, description) {
const parsedDescription = await plugins.fireHook('filter:parse.raw', description); const parsedDescription = await plugins.hooks.fire('filter:parse.raw', description);
await Categories.setCategoryField(cid, 'descriptionParsed', parsedDescription); await Categories.setCategoryField(cid, 'descriptionParsed', parsedDescription);
}; };
}; };

@ -12,8 +12,8 @@ exports.handle404 = function handle404(req, res) {
const relativePath = nconf.get('relative_path'); const relativePath = nconf.get('relative_path');
const isClientScript = new RegExp('^' + relativePath + '\\/assets\\/src\\/.+\\.js(\\?v=\\w+)?$'); const isClientScript = new RegExp('^' + relativePath + '\\/assets\\/src\\/.+\\.js(\\?v=\\w+)?$');
if (plugins.hasListeners('action:meta.override404')) { if (plugins.hooks.hasListeners('action:meta.override404')) {
return plugins.fireHook('action:meta.override404', { return plugins.hooks.fire('action:meta.override404', {
req: req, req: req,
res: res, res: res,
error: {}, error: {},

@ -19,7 +19,7 @@ blocksController.getBlocks = async function (req, res, next) {
return next(); return next();
} }
const uids = await user.blocks.list(userData.uid); const uids = await user.blocks.list(userData.uid);
const data = await plugins.fireHook('filter:user.getBlocks', { const data = await plugins.hooks.fire('filter:user.getBlocks', {
uids: uids, uids: uids,
uid: userData.uid, uid: userData.uid,
start: start, start: start,

@ -112,7 +112,7 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID) {
userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%')); userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%'));
userData['username:disableEdit'] = !userData.isAdmin && meta.config['username:disableEdit']; userData['username:disableEdit'] = !userData.isAdmin && meta.config['username:disableEdit'];
userData['email:disableEdit'] = !userData.isAdmin && meta.config['email:disableEdit']; userData['email:disableEdit'] = !userData.isAdmin && meta.config['email:disableEdit'];
const hookData = await plugins.fireHook('filter:helpers.getUserDataByUserSlug', { userData: userData, callerUID: callerUID }); const hookData = await plugins.hooks.fire('filter:helpers.getUserDataByUserSlug', { userData: userData, callerUID: callerUID });
return hookData.userData; return hookData.userData;
}; };
@ -128,7 +128,7 @@ async function getAllData(uid, callerUID) {
ips: user.getIPs(uid, 4), ips: user.getIPs(uid, 4),
profile_menu: getProfileMenu(uid, callerUID), profile_menu: getProfileMenu(uid, callerUID),
groups: groups.getUserGroups([uid]), groups: groups.getUserGroups([uid]),
sso: plugins.fireHook('filter:auth.list', { uid: uid, associations: [] }), sso: plugins.hooks.fire('filter:auth.list', { uid: uid, associations: [] }),
canEdit: privileges.users.canEdit(callerUID, uid), canEdit: privileges.users.canEdit(callerUID, uid),
canBanUser: privileges.users.canBanUser(callerUID, uid), canBanUser: privileges.users.canBanUser(callerUID, uid),
isBlocked: user.blocks.is(uid, callerUID), isBlocked: user.blocks.is(uid, callerUID),
@ -183,7 +183,7 @@ async function getProfileMenu(uid, callerUID) {
}); });
} }
return await plugins.fireHook('filter:user.profileMenu', { return await plugins.hooks.fire('filter:user.profileMenu', {
uid: uid, uid: uid,
callerUID: callerUID, callerUID: callerUID,
links: links, links: links,
@ -197,7 +197,7 @@ async function parseAboutMe(userData) {
return; return;
} }
userData.aboutme = validator.escape(String(userData.aboutme || '')); userData.aboutme = validator.escape(String(userData.aboutme || ''));
const parsed = await plugins.fireHook('filter:parse.aboutme', userData.aboutme); const parsed = await plugins.hooks.fire('filter:parse.aboutme', userData.aboutme);
userData.aboutmeParsed = translator.escape(parsed); userData.aboutmeParsed = translator.escape(parsed);
} }

@ -30,7 +30,7 @@ notificationsController.get = async function (req, res, next) {
const stop = start + itemsPerPage - 1; const stop = start + itemsPerPage - 1;
const [filters, isPrivileged] = await Promise.all([ const [filters, isPrivileged] = await Promise.all([
plugins.fireHook('filter:notifications.addFilters', { plugins.hooks.fire('filter:notifications.addFilters', {
regularFilters: regularFilters, regularFilters: regularFilters,
moderatorFilters: moderatorFilters, moderatorFilters: moderatorFilters,
uid: req.uid, uid: req.uid,

@ -33,7 +33,7 @@ settingsController.get = async function (req, res, next) {
userData.acpLanguages = _.cloneDeep(languagesData); userData.acpLanguages = _.cloneDeep(languagesData);
} }
const data = await plugins.fireHook('filter:user.customSettings', { const data = await plugins.hooks.fire('filter:user.customSettings', {
settings: settings, settings: settings,
customSettings: [], customSettings: [],
uid: req.uid, uid: req.uid,
@ -110,7 +110,7 @@ settingsController.get = async function (req, res, next) {
userData.hideFullname = meta.config.hideFullname || 0; userData.hideFullname = meta.config.hideFullname || 0;
userData.hideEmail = meta.config.hideEmail || 0; userData.hideEmail = meta.config.hideEmail || 0;
userData.inTopicSearchAvailable = plugins.hasListeners('filter:topic.search'); userData.inTopicSearchAvailable = plugins.hooks.hasListeners('filter:topic.search');
userData.maxTopicsPerPage = meta.config.maxTopicsPerPage; userData.maxTopicsPerPage = meta.config.maxTopicsPerPage;
userData.maxPostsPerPage = meta.config.maxPostsPerPage; userData.maxPostsPerPage = meta.config.maxPostsPerPage;
@ -191,7 +191,7 @@ async function getNotificationSettings(userData) {
if (privileges.isAdmin || privileges.isGlobalMod) { if (privileges.isAdmin || privileges.isGlobalMod) {
privilegedTypes.push('notificationType_new-user-flag'); privilegedTypes.push('notificationType_new-user-flag');
} }
const results = await plugins.fireHook('filter:user.notificationTypes', { const results = await plugins.hooks.fire('filter:user.notificationTypes', {
types: notifications.baseTypes.slice(), types: notifications.baseTypes.slice(),
privilegedTypes: privilegedTypes, privilegedTypes: privilegedTypes,
}); });

@ -27,7 +27,7 @@ categoriesController.get = async function (req, res, next) {
}); });
const selectedCategory = allCategories.find(c => c.selected); const selectedCategory = allCategories.find(c => c.selected);
const data = await plugins.fireHook('filter:admin.category.get', { const data = await plugins.hooks.fire('filter:admin.category.get', {
req: req, req: req,
res: res, res: res,
category: category, category: category,
@ -53,7 +53,7 @@ categoriesController.getAll = async function (req, res) {
'color', 'bgColor', 'backgroundImage', 'imageClass', 'color', 'bgColor', 'backgroundImage', 'imageClass',
]; ];
const categoriesData = await categories.getCategoriesFields(cids, fields); const categoriesData = await categories.getCategoriesFields(cids, fields);
const result = await plugins.fireHook('filter:admin.categories.get', { categories: categoriesData, fields: fields }); const result = await plugins.hooks.fire('filter:admin.categories.get', { categories: categoriesData, fields: fields });
const tree = categories.getTree(result.categories, 0); const tree = categories.getTree(result.categories, 0);
res.render('admin/manage/categories', { res.render('admin/manage/categories', {
categories: tree, categories: tree,

@ -47,7 +47,7 @@ async function getNotices() {
notDoneText: '[[admin/dashboard:restart-required]]', notDoneText: '[[admin/dashboard:restart-required]]',
}, },
{ {
done: plugins.hasListeners('filter:search.query'), done: plugins.hooks.hasListeners('filter:search.query'),
doneText: '[[admin/dashboard:search-plugin-installed]]', doneText: '[[admin/dashboard:search-plugin-installed]]',
notDoneText: '[[admin/dashboard:search-plugin-not-installed]]', notDoneText: '[[admin/dashboard:search-plugin-not-installed]]',
tooltip: '[[admin/dashboard:search-plugin-tooltip]]', tooltip: '[[admin/dashboard:search-plugin-tooltip]]',
@ -62,7 +62,7 @@ async function getNotices() {
}); });
} }
return await plugins.fireHook('filter:admin.notices', notices); return await plugins.hooks.fire('filter:admin.notices', notices);
} }
async function getLatestVersion() { async function getLatestVersion() {

@ -237,8 +237,8 @@ function validateUpload(res, uploadedFile, allowedTypes) {
async function uploadImage(filename, folder, uploadedFile, req, res, next) { async function uploadImage(filename, folder, uploadedFile, req, res, next) {
let imageData; let imageData;
try { try {
if (plugins.hasListeners('filter:uploadImage')) { if (plugins.hooks.hasListeners('filter:uploadImage')) {
imageData = await plugins.fireHook('filter:uploadImage', { image: uploadedFile, uid: req.uid, folder: folder }); imageData = await plugins.hooks.fire('filter:uploadImage', { image: uploadedFile, uid: req.uid, folder: folder });
} else { } else {
imageData = await file.saveFileToLocal(filename, folder, uploadedFile.path); imageData = await file.saveFileToLocal(filename, folder, uploadedFile.path);
} }

@ -189,7 +189,7 @@ usersController.registrationQueue = async function (req, res) {
const data = await utils.promiseParallel({ const data = await utils.promiseParallel({
registrationQueueCount: db.sortedSetCard('registration:queue'), registrationQueueCount: db.sortedSetCard('registration:queue'),
users: user.getRegistrationQueue(start, stop), users: user.getRegistrationQueue(start, stop),
customHeaders: plugins.fireHook('filter:admin.registrationQueue.customHeaders', { headers: [] }), customHeaders: plugins.hooks.fire('filter:admin.registrationQueue.customHeaders', { headers: [] }),
invites: getInvites(), invites: getInvites(),
}); });
var pageCount = Math.max(1, Math.ceil(data.registrationQueueCount / itemsPerPage)); var pageCount = Math.max(1, Math.ceil(data.registrationQueueCount / itemsPerPage));

@ -65,7 +65,7 @@ apiController.loadConfig = async function (req) {
topicPostSort: meta.config.topicPostSort || 'oldest_to_newest', topicPostSort: meta.config.topicPostSort || 'oldest_to_newest',
categoryTopicSort: meta.config.categoryTopicSort || 'newest_to_oldest', categoryTopicSort: meta.config.categoryTopicSort || 'newest_to_oldest',
csrf_token: req.uid >= 0 && req.csrfToken && req.csrfToken(), csrf_token: req.uid >= 0 && req.csrfToken && req.csrfToken(),
searchEnabled: plugins.hasListeners('filter:search.query'), searchEnabled: plugins.hooks.hasListeners('filter:search.query'),
bootswatchSkin: meta.config.bootswatchSkin || '', bootswatchSkin: meta.config.bootswatchSkin || '',
enablePostHistory: meta.config.enablePostHistory === 1, enablePostHistory: meta.config.enablePostHistory === 1,
timeagoCutoff: meta.config.timeagoCutoff !== '' ? Math.max(0, parseInt(meta.config.timeagoCutoff, 10)) : meta.config.timeagoCutoff, timeagoCutoff: meta.config.timeagoCutoff !== '' ? Math.max(0, parseInt(meta.config.timeagoCutoff, 10)) : meta.config.timeagoCutoff,
@ -98,7 +98,7 @@ apiController.loadConfig = async function (req) {
config.categoryTopicSort = settings.categoryTopicSort || config.categoryTopicSort; config.categoryTopicSort = settings.categoryTopicSort || config.categoryTopicSort;
config.topicSearchEnabled = settings.topicSearchEnabled || false; config.topicSearchEnabled = settings.topicSearchEnabled || false;
config.bootswatchSkin = (meta.config.disableCustomUserSkins !== 1 && settings.bootswatchSkin && settings.bootswatchSkin !== '') ? settings.bootswatchSkin : ''; config.bootswatchSkin = (meta.config.disableCustomUserSkins !== 1 && settings.bootswatchSkin && settings.bootswatchSkin !== '') ? settings.bootswatchSkin : '';
config = await plugins.fireHook('filter:config.get', config); config = await plugins.hooks.fire('filter:config.get', config);
return config; return config;
}; };

@ -22,7 +22,7 @@ const sockets = require('../socket.io');
const authenticationController = module.exports; const authenticationController = module.exports;
async function registerAndLoginUser(req, res, userData) { async function registerAndLoginUser(req, res, userData) {
const data = await plugins.fireHook('filter:register.interstitial', { const data = await plugins.hooks.fire('filter:register.interstitial', {
userData: userData, userData: userData,
interstitials: [], interstitials: [],
}); });
@ -45,7 +45,7 @@ async function registerAndLoginUser(req, res, userData) {
return; return;
} }
const queue = await user.shouldQueueUser(req.ip); const queue = await user.shouldQueueUser(req.ip);
const result = await plugins.fireHook('filter:register.shouldQueue', { req: req, res: res, userData: userData, queue: queue }); const result = await plugins.hooks.fire('filter:register.shouldQueue', { req: req, res: res, userData: userData, queue: queue });
if (result.queue) { if (result.queue) {
return await addToApprovalQueue(req, userData); return await addToApprovalQueue(req, userData);
} }
@ -61,7 +61,7 @@ async function registerAndLoginUser(req, res, userData) {
} }
await user.deleteInvitationKey(userData.email); await user.deleteInvitationKey(userData.email);
const referrer = req.body.referrer || req.session.referrer || nconf.get('relative_path') + '/'; const referrer = req.body.referrer || req.session.referrer || nconf.get('relative_path') + '/';
const complete = await plugins.fireHook('filter:register.complete', { uid: uid, referrer: referrer }); const complete = await plugins.hooks.fire('filter:register.complete', { uid: uid, referrer: referrer });
req.session.returnTo = complete.referrer; req.session.returnTo = complete.referrer;
return complete; return complete;
} }
@ -105,7 +105,7 @@ authenticationController.register = async function (req, res) {
user.isPasswordValid(userData.password); user.isPasswordValid(userData.password);
res.locals.processLogin = true; // set it to false in plugin if you wish to just register only res.locals.processLogin = true; // set it to false in plugin if you wish to just register only
await plugins.fireHook('filter:register.check', { req: req, res: res, userData: userData }); await plugins.hooks.fire('filter:register.check', { req: req, res: res, userData: userData });
const data = await registerAndLoginUser(req, res, userData); const data = await registerAndLoginUser(req, res, userData);
if (data) { if (data) {
@ -137,7 +137,7 @@ async function addToApprovalQueue(req, userData) {
authenticationController.registerComplete = function (req, res, next) { authenticationController.registerComplete = function (req, res, next) {
// For the interstitials that respond, execute the callback with the form body // For the interstitials that respond, execute the callback with the form body
plugins.fireHook('filter:register.interstitial', { plugins.hooks.fire('filter:register.interstitial', {
userData: req.session.registration, userData: req.session.registration,
interstitials: [], interstitials: [],
}, function (err, data) { }, function (err, data) {
@ -217,14 +217,14 @@ authenticationController.registerAbort = function (req, res) {
}; };
authenticationController.login = function (req, res, next) { authenticationController.login = function (req, res, next) {
if (plugins.hasListeners('action:auth.overrideLogin')) { if (plugins.hooks.hasListeners('action:auth.overrideLogin')) {
return continueLogin(req, res, next); return continueLogin(req, res, next);
} }
var loginWith = meta.config.allowLoginWith || 'username-email'; var loginWith = meta.config.allowLoginWith || 'username-email';
req.body.username = req.body.username.trim(); req.body.username = req.body.username.trim();
plugins.fireHook('filter:login.check', { req: req, res: res, userData: req.body }, (err) => { plugins.hooks.fire('filter:login.check', { req: req, res: res, userData: req.body }, (err) => {
if (err) { if (err) {
return helpers.noScriptErrors(req, res, err.message, 403); return helpers.noScriptErrors(req, res, err.message, 403);
} }
@ -355,7 +355,7 @@ authenticationController.onSuccessfulLogin = async function (req, uid) {
// Force session check for all connected socket.io clients with the same session id // Force session check for all connected socket.io clients with the same session id
sockets.in('sess_' + req.sessionID).emit('checkSession', uid); sockets.in('sess_' + req.sessionID).emit('checkSession', uid);
plugins.fireHook('action:user.loggedIn', { uid: uid, req: req }); plugins.hooks.fire('action:user.loggedIn', { uid: uid, req: req });
} catch (err) { } catch (err) {
req.session.destroy(); req.session.destroy();
throw err; throw err;
@ -428,14 +428,14 @@ authenticationController.logout = async function (req, res, next) {
await user.setUserField(uid, 'lastonline', Date.now() - (meta.config.onlineCutoff * 60000)); await user.setUserField(uid, 'lastonline', Date.now() - (meta.config.onlineCutoff * 60000));
await db.sortedSetAdd('users:online', Date.now() - (meta.config.onlineCutoff * 60000), uid); await db.sortedSetAdd('users:online', Date.now() - (meta.config.onlineCutoff * 60000), uid);
await plugins.fireHook('static:user.loggedOut', { req: req, res: res, uid: uid, sessionID: sessionID }); await plugins.hooks.fire('static:user.loggedOut', { req: req, res: res, uid: uid, sessionID: sessionID });
// Force session check for all connected socket.io clients with the same session id // Force session check for all connected socket.io clients with the same session id
sockets.in('sess_' + sessionID).emit('checkSession', 0); sockets.in('sess_' + sessionID).emit('checkSession', 0);
const payload = { const payload = {
next: nconf.get('relative_path') + '/', next: nconf.get('relative_path') + '/',
}; };
plugins.fireHook('filter:user.logout', payload); plugins.hooks.fire('filter:user.logout', payload);
if (req.body.noscript === 'true') { if (req.body.noscript === 'true') {
return res.redirect(payload.next); return res.redirect(payload.next);

@ -15,7 +15,7 @@ exports.get = async function (req, res, callback) {
content: 'noindex', content: 'noindex',
}; };
const data = await plugins.fireHook('filter:composer.build', { const data = await plugins.hooks.fire('filter:composer.build', {
req: req, req: req,
res: res, res: res,
next: callback, next: callback,

@ -65,7 +65,7 @@ exports.handleErrors = function handleErrors(err, req, res, next) { // eslint-di
} }
}; };
plugins.fireHook('filter:error.handle', { plugins.hooks.fire('filter:error.handle', {
cases: cases, cases: cases,
}, function (_err, data) { }, function (_err, data) {
if (_err) { if (_err) {

@ -116,7 +116,7 @@ helpers.buildTerms = function (url, term, query) {
}; };
helpers.notAllowed = async function (req, res, error) { helpers.notAllowed = async function (req, res, error) {
const data = await plugins.fireHook('filter:helpers.notAllowed', { const data = await plugins.hooks.fire('filter:helpers.notAllowed', {
req: req, req: req,
res: res, res: res,
error: error, error: error,
@ -336,7 +336,7 @@ helpers.getHomePageRoutes = async function (uid) {
name: 'Custom', name: 'Custom',
}, },
]); ]);
const data = await plugins.fireHook('filter:homepage.get', { routes: routes }); const data = await plugins.hooks.fire('filter:homepage.get', { routes: routes });
return data.routes; return data.routes;
}; };

@ -39,7 +39,7 @@ async function rewrite(req, res, next) {
const pathname = parsedUrl.pathname; const pathname = parsedUrl.pathname;
const hook = 'action:homepage.get:' + pathname; const hook = 'action:homepage.get:' + pathname;
if (!plugins.hasListeners(hook)) { if (!plugins.hooks.hasListeners(hook)) {
req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + pathname; req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + pathname;
} else { } else {
res.locals.homePageRoute = pathname; res.locals.homePageRoute = pathname;
@ -54,7 +54,7 @@ exports.rewrite = rewrite;
function pluginHook(req, res, next) { function pluginHook(req, res, next) {
var hook = 'action:homepage.get:' + res.locals.homePageRoute; var hook = 'action:homepage.get:' + res.locals.homePageRoute;
plugins.fireHook(hook, { plugins.hooks.fire(hook, {
req: req, req: req,
res: res, res: res,
next: next, next: next,

@ -184,7 +184,7 @@ Controllers.registerInterstitial = async function (req, res, next) {
return res.redirect(nconf.get('relative_path') + '/register'); return res.redirect(nconf.get('relative_path') + '/register');
} }
try { try {
const data = await plugins.fireHook('filter:register.interstitial', { const data = await plugins.hooks.fire('filter:register.interstitial', {
userData: req.session.registration, userData: req.session.registration,
interstitials: [], interstitials: [],
}); });
@ -298,7 +298,7 @@ Controllers.manifest = async function (req, res) {
}); });
} }
const data = await plugins.fireHook('filter:manifest.build', { const data = await plugins.hooks.fire('filter:manifest.build', {
req: req, req: req,
res: res, res: res,
manifest: manifest, manifest: manifest,
@ -331,7 +331,7 @@ Controllers.termsOfUse = async function (req, res, next) {
if (!meta.config.termsOfUse) { if (!meta.config.termsOfUse) {
return next(); return next();
} }
const termsOfUse = await plugins.fireHook('filter:parse.post', { const termsOfUse = await plugins.hooks.fire('filter:parse.post', {
postData: { postData: {
content: meta.config.termsOfUse || '', content: meta.config.termsOfUse || '',
}, },

@ -30,8 +30,8 @@ modsController.flags.list = async function (req, res, next) {
const results = await Promise.all([ const results = await Promise.all([
user.isAdminOrGlobalMod(req.uid), user.isAdminOrGlobalMod(req.uid),
user.getModeratedCids(req.uid), user.getModeratedCids(req.uid),
plugins.fireHook('filter:flags.validateFilters', { filters: validFilters }), plugins.hooks.fire('filter:flags.validateFilters', { filters: validFilters }),
plugins.fireHook('filter:flags.validateSort', { sorts: validSorts }), plugins.hooks.fire('filter:flags.validateSort', { sorts: validSorts }),
]); ]);
const [isAdminOrGlobalMod, moderatedCids,, { sorts }] = results; const [isAdminOrGlobalMod, moderatedCids,, { sorts }] = results;
let [,, { filters }] = results; let [,, { filters }] = results;
@ -226,7 +226,7 @@ modsController.postQueue = async function (req, res, next) {
(!categoriesData.selectedCids.length || categoriesData.selectedCids.includes(p.category.cid)) && (!categoriesData.selectedCids.length || categoriesData.selectedCids.includes(p.category.cid)) &&
(isAdminOrGlobalMod || moderatedCids.includes(String(p.category.cid)))); (isAdminOrGlobalMod || moderatedCids.includes(String(p.category.cid))));
({ posts: postData } = await plugins.fireHook('filter:post-queue.get', { ({ posts: postData } = await plugins.hooks.fire('filter:post-queue.get', {
posts: postData, posts: postData,
req: req, req: req,
})); }));
@ -281,6 +281,6 @@ async function addMetaData(postData) {
postData.topic = await topics.getTopicFields(postData.data.tid, ['title', 'cid']); postData.topic = await topics.getTopicFields(postData.data.tid, ['title', 'cid']);
} }
postData.category = await categories.getCategoryData(postData.topic.cid); postData.category = await categories.getCategoryData(postData.topic.cid);
const result = await plugins.fireHook('filter:parse.post', { postData: postData.data }); const result = await plugins.hooks.fire('filter:parse.post', { postData: postData.data });
postData.data.content = result.postData.content; postData.data.content = result.postData.content;
} }

@ -7,7 +7,7 @@ const plugins = require('../plugins');
const meta = require('../meta'); const meta = require('../meta');
module.exports.handle = function (req, res, next) { module.exports.handle = function (req, res, next) {
if (plugins.hasListeners('filter:search.query')) { if (plugins.hooks.hasListeners('filter:search.query')) {
res.type('application/opensearchdescription+xml').send(generateXML()); res.type('application/opensearchdescription+xml').send(generateXML());
} else { } else {
next(); next();

@ -15,7 +15,7 @@ const helpers = require('./helpers');
const searchController = module.exports; const searchController = module.exports;
searchController.search = async function (req, res, next) { searchController.search = async function (req, res, next) {
if (!plugins.hasListeners('filter:search.query')) { if (!plugins.hooks.hasListeners('filter:search.query')) {
return next(); return next();
} }
const page = Math.max(1, parseInt(req.query.page, 10)) || 1; const page = Math.max(1, parseInt(req.query.page, 10)) || 1;

@ -64,8 +64,8 @@ unreadController.get = async function (req, res) {
}; };
async function getWatchedCategories(uid, cid, filter) { async function getWatchedCategories(uid, cid, filter) {
if (plugins.hasListeners('filter:unread.categories')) { if (plugins.hooks.hasListeners('filter:unread.categories')) {
return await plugins.fireHook('filter:unread.categories', { uid: uid, cid: cid }); return await plugins.hooks.fire('filter:unread.categories', { uid: uid, cid: cid });
} }
const states = [categories.watchStates.watching]; const states = [categories.watchStates.watching];
if (filter === 'watched') { if (filter === 'watched') {

@ -56,8 +56,8 @@ async function uploadAsImage(req, uploadedFile) {
await image.checkDimensions(uploadedFile.path); await image.checkDimensions(uploadedFile.path);
await image.stripEXIF(uploadedFile.path); await image.stripEXIF(uploadedFile.path);
if (plugins.hasListeners('filter:uploadImage')) { if (plugins.hooks.hasListeners('filter:uploadImage')) {
return await plugins.fireHook('filter:uploadImage', { return await plugins.hooks.fire('filter:uploadImage', {
image: uploadedFile, image: uploadedFile,
uid: req.uid, uid: req.uid,
folder: 'files', folder: 'files',
@ -122,8 +122,8 @@ uploadsController.uploadThumb = async function (req, res, next) {
width: meta.config.topicThumbSize, width: meta.config.topicThumbSize,
height: meta.config.topicThumbSize, height: meta.config.topicThumbSize,
}); });
if (plugins.hasListeners('filter:uploadImage')) { if (plugins.hooks.hasListeners('filter:uploadImage')) {
return await plugins.fireHook('filter:uploadImage', { return await plugins.hooks.fire('filter:uploadImage', {
image: uploadedFile, image: uploadedFile,
uid: req.uid, uid: req.uid,
folder: 'files', folder: 'files',
@ -135,8 +135,8 @@ uploadsController.uploadThumb = async function (req, res, next) {
}; };
uploadsController.uploadFile = async function (uid, uploadedFile) { uploadsController.uploadFile = async function (uid, uploadedFile) {
if (plugins.hasListeners('filter:uploadFile')) { if (plugins.hooks.hasListeners('filter:uploadFile')) {
return await plugins.fireHook('filter:uploadFile', { return await plugins.hooks.fire('filter:uploadFile', {
file: uploadedFile, file: uploadedFile,
uid: uid, uid: uid,
folder: 'files', folder: 'files',
@ -175,7 +175,7 @@ async function saveFileToLocal(uid, folder, uploadedFile) {
}; };
const fileKey = upload.url.replace(nconf.get('upload_url'), ''); const fileKey = upload.url.replace(nconf.get('upload_url'), '');
await db.sortedSetAdd('uid:' + uid + ':uploads', Date.now(), fileKey); await db.sortedSetAdd('uid:' + uid + ':uploads', Date.now(), fileKey);
const data = await plugins.fireHook('filter:uploadStored', { uid: uid, uploadedFile: uploadedFile, storedFile: storedFile }); const data = await plugins.hooks.fire('filter:uploadStored', { uid: uid, uploadedFile: uploadedFile, storedFile: storedFile });
return data.storedFile; return data.storedFile;
} }

@ -264,7 +264,7 @@ Emailer.sendToEmail = async (template, email, language, params) => {
params.unsubUrl = unsubUrl; params.unsubUrl = unsubUrl;
} }
const result = await Plugins.fireHook('filter:email.params', { const result = await Plugins.hooks.fire('filter:email.params', {
template: template, template: template,
email: email, email: email,
language: lang, language: lang,
@ -280,7 +280,7 @@ Emailer.sendToEmail = async (template, email, language, params) => {
translator.translate(params.subject, result.language), translator.translate(params.subject, result.language),
]); ]);
const data = await Plugins.fireHook('filter:email.modify', { const data = await Plugins.hooks.fire('filter:email.modify', {
_raw: params, _raw: params,
to: email, to: email,
from: meta.config['email:from'] || 'no-reply@' + getHostname(), from: meta.config['email:from'] || 'no-reply@' + getHostname(),
@ -299,8 +299,8 @@ Emailer.sendToEmail = async (template, email, language, params) => {
}); });
try { try {
if (Plugins.hasListeners('filter:email.send')) { if (Plugins.hooks.hasListeners('filter:email.send')) {
await Plugins.fireHook('filter:email.send', data); await Plugins.hooks.fire('filter:email.send', data);
} else { } else {
await Emailer.sendViaFallback(data); await Emailer.sendViaFallback(data);
} }

@ -79,7 +79,7 @@ events.log = async function (data) {
], data.timestamp, eid), ], data.timestamp, eid),
db.setObject('event:' + eid, data), db.setObject('event:' + eid, data),
]); ]);
plugins.fireHook('action:events.log', { data: data }); plugins.hooks.fire('action:events.log', { data: data });
}; };
events.getEvents = async function (filter, start, stop, from, to) { events.getEvents = async function (filter, start, stop, from, to) {

@ -76,7 +76,7 @@ Flags.init = async function () {
}; };
try { try {
const data = await plugins.fireHook('filter:flags.getFilters', hookData); const data = await plugins.hooks.fire('filter:flags.getFilters', hookData);
Flags._filters = data.filters; Flags._filters = data.filters;
} catch (err) { } catch (err) {
winston.error('[flags/init] Could not retrieve filters', err.stack); winston.error('[flags/init] Could not retrieve filters', err.stack);
@ -107,7 +107,7 @@ Flags.get = async function (flagId) {
reports: reports, reports: reports,
}; };
const data = await plugins.fireHook('filter:flags.get', { const data = await plugins.hooks.fire('filter:flags.get', {
flag: flagObj, flag: flagObj,
}); });
return data.flag; return data.flag;
@ -177,7 +177,7 @@ Flags.list = async function (data) {
}); });
})); }));
const payload = await plugins.fireHook('filter:flags.list', { const payload = await plugins.hooks.fire('filter:flags.list', {
flags: flags, flags: flags,
page: filters.page, page: filters.page,
uid: data.uid, uid: data.uid,
@ -587,7 +587,7 @@ Flags.update = async function (flagId, uid, changeset) {
tasks.push(Flags.appendHistory(flagId, uid, changeset)); tasks.push(Flags.appendHistory(flagId, uid, changeset));
await Promise.all(tasks); await Promise.all(tasks);
plugins.fireHook('action:flags.update', { flagId: flagId, changeset: changeset, uid: uid }); plugins.hooks.fire('action:flags.update', { flagId: flagId, changeset: changeset, uid: uid });
}; };
Flags.resolveFlag = async function (type, id, uid) { Flags.resolveFlag = async function (type, id, uid) {
@ -712,7 +712,7 @@ Flags.notify = async function (flagObj, uid) {
throw new Error('[[error:invalid-data]]'); throw new Error('[[error:invalid-data]]');
} }
plugins.fireHook('action:flags.create', { plugins.hooks.fire('action:flags.create', {
flag: flagObj, flag: flagObj,
}); });
uids = uids.filter(_uid => parseInt(_uid, 10) !== parseInt(uid, 10)); uids = uids.filter(_uid => parseInt(_uid, 10) !== parseInt(uid, 10));

@ -40,7 +40,7 @@ module.exports = function (Groups) {
disableLeave: disableLeave, disableLeave: disableLeave,
}; };
await plugins.fireHook('filter:group.create', { group: groupData, data: data }); await plugins.hooks.fire('filter:group.create', { group: groupData, data: data });
await db.sortedSetAdd('groups:createtime', groupData.createtime, groupData.name); await db.sortedSetAdd('groups:createtime', groupData.createtime, groupData.name);
await db.setObject('group:' + groupData.name, groupData); await db.setObject('group:' + groupData.name, groupData);
@ -61,7 +61,7 @@ module.exports = function (Groups) {
await db.setObjectField('groupslug:groupname', groupData.slug, groupData.name); await db.setObjectField('groupslug:groupname', groupData.slug, groupData.name);
groupData = await Groups.getGroupData(groupData.name); groupData = await Groups.getGroupData(groupData.name);
plugins.fireHook('action:group.create', { group: groupData }); plugins.hooks.fire('action:group.create', { group: groupData });
return groupData; return groupData;
}; };

@ -36,7 +36,7 @@ module.exports = function (Groups) {
groupData.forEach(group => modifyGroup(group, fields)); groupData.forEach(group => modifyGroup(group, fields));
const results = await plugins.fireHook('filter:groups.get', { groups: groupData }); const results = await plugins.hooks.fire('filter:groups.get', { groups: groupData });
return results.groups; return results.groups;
}; };
@ -61,7 +61,7 @@ module.exports = function (Groups) {
Groups.setGroupField = async function (groupName, field, value) { Groups.setGroupField = async function (groupName, field, value) {
await db.setObjectField('group:' + groupName, field, value); await db.setObjectField('group:' + groupName, field, value);
plugins.fireHook('action:group.set', { field: field, value: value, type: 'set' }); plugins.hooks.fire('action:group.set', { field: field, value: value, type: 'set' });
}; };
}; };

@ -41,7 +41,7 @@ module.exports = function (Groups) {
removeGroupsFromPrivilegeGroups(groupNames), removeGroupsFromPrivilegeGroups(groupNames),
]); ]);
Groups.cache.reset(); Groups.cache.reset();
plugins.fireHook('action:groups.destroy', { groups: groupsData }); plugins.hooks.fire('action:groups.destroy', { groups: groupsData });
}; };
async function removeGroupsFromPrivilegeGroups(groupNames) { async function removeGroupsFromPrivilegeGroups(groupNames) {

@ -135,7 +135,7 @@ Groups.get = async function (groupName, options) {
if (!groupData) { if (!groupData) {
return null; return null;
} }
const descriptionParsed = await plugins.fireHook('filter:parse.raw', groupData.description); const descriptionParsed = await plugins.hooks.fire('filter:parse.raw', groupData.description);
groupData.descriptionParsed = descriptionParsed; groupData.descriptionParsed = descriptionParsed;
groupData.categories = selectCategories.map((category) => { groupData.categories = selectCategories.map((category) => {
category.selected = groupData.memberPostCids.includes(category.cid); category.selected = groupData.memberPostCids.includes(category.cid);
@ -149,7 +149,7 @@ Groups.get = async function (groupName, options) {
groupData.isPending = isPending; groupData.isPending = isPending;
groupData.isInvited = isInvited; groupData.isInvited = isInvited;
groupData.isOwner = isOwner; groupData.isOwner = isOwner;
const results = await plugins.fireHook('filter:group.get', { group: groupData }); const results = await plugins.hooks.fire('filter:group.get', { group: groupData });
return results.group; return results.group;
}; };
@ -194,7 +194,7 @@ Groups.getOwnersAndMembers = async function (groupName, uid, start, stop) {
} }
} }
returnUsers = countToReturn > 0 ? returnUsers.slice(0, countToReturn) : returnUsers; returnUsers = countToReturn > 0 ? returnUsers.slice(0, countToReturn) : returnUsers;
const result = await plugins.fireHook('filter:group.getOwnersAndMembers', { const result = await plugins.hooks.fire('filter:group.getOwnersAndMembers', {
users: returnUsers, users: returnUsers,
uid: uid, uid: uid,
start: start, start: start,

@ -83,7 +83,7 @@ module.exports = function (Groups) {
const set = type === 'invite' ? 'group:' + groupName + ':invited' : 'group:' + groupName + ':pending'; const set = type === 'invite' ? 'group:' + groupName + ':invited' : 'group:' + groupName + ':pending';
await db.setAdd(set, uids); await db.setAdd(set, uids);
const hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership'; const hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership';
plugins.fireHook(hookName, { plugins.hooks.fire(hookName, {
groupName: groupName, groupName: groupName,
uids: uids, uids: uids,
}); });

@ -63,7 +63,7 @@ module.exports = function (Groups) {
await setGroupTitleIfNotSet(groupsToJoin, uid); await setGroupTitleIfNotSet(groupsToJoin, uid);
plugins.fireHook('action:group.join', { plugins.hooks.fire('action:group.join', {
groupNames: groupsToJoin, groupNames: groupsToJoin,
uid: uid, uid: uid,
}); });

@ -53,7 +53,7 @@ module.exports = function (Groups) {
await clearGroupTitleIfSet(groupsToLeave, uid); await clearGroupTitleIfSet(groupsToLeave, uid);
plugins.fireHook('action:group.leave', { plugins.hooks.fire('action:group.leave', {
groupNames: groupsToLeave, groupNames: groupsToLeave,
uid: uid, uid: uid,
}); });

@ -24,7 +24,7 @@ module.exports = function (Groups) {
Groups.ownership.grant = async function (toUid, groupName) { Groups.ownership.grant = async function (toUid, groupName) {
// Note: No ownership checking is done here on purpose! // Note: No ownership checking is done here on purpose!
await db.setAdd('group:' + groupName + ':owners', toUid); await db.setAdd('group:' + groupName + ':owners', toUid);
plugins.fireHook('action:group.grantOwnership', { uid: toUid, groupName: groupName }); plugins.hooks.fire('action:group.grantOwnership', { uid: toUid, groupName: groupName });
}; };
Groups.ownership.rescind = async function (toUid, groupName) { Groups.ownership.rescind = async function (toUid, groupName) {
@ -35,6 +35,6 @@ module.exports = function (Groups) {
throw new Error('[[error:group-needs-owner]]'); throw new Error('[[error:group-needs-owner]]');
} }
await db.setRemove('group:' + groupName + ':owners', toUid); await db.setRemove('group:' + groupName + ':owners', toUid);
plugins.fireHook('action:group.rescindOwnership', { uid: toUid, groupName: groupName }); plugins.hooks.fire('action:group.rescindOwnership', { uid: toUid, groupName: groupName });
}; };
}; };

@ -19,7 +19,7 @@ module.exports = function (Groups) {
throw new Error('[[error:no-group]]'); throw new Error('[[error:no-group]]');
} }
({ values } = await plugins.fireHook('filter:group.update', { ({ values } = await plugins.hooks.fire('filter:group.update', {
groupName: groupName, groupName: groupName,
values: values, values: values,
})); }));
@ -75,7 +75,7 @@ module.exports = function (Groups) {
await db.setObject('group:' + groupName, payload); await db.setObject('group:' + groupName, payload);
await Groups.renameGroup(groupName, values.name); await Groups.renameGroup(groupName, values.name);
plugins.fireHook('action:group.update', { plugins.hooks.fire('action:group.update', {
name: groupName, name: groupName,
values: values, values: values,
}); });
@ -199,7 +199,7 @@ module.exports = function (Groups) {
await renameGroupsMember(['groups:createtime', 'groups:visible:createtime', 'groups:visible:memberCount'], oldName, newName); await renameGroupsMember(['groups:createtime', 'groups:visible:createtime', 'groups:visible:memberCount'], oldName, newName);
await renameGroupsMember(['groups:visible:name'], oldName.toLowerCase() + ':' + oldName, newName.toLowerCase() + ':' + newName); await renameGroupsMember(['groups:visible:name'], oldName.toLowerCase() + ':' + oldName, newName.toLowerCase() + ':' + newName);
plugins.fireHook('action:group.rename', { plugins.hooks.fire('action:group.rename', {
old: oldName, old: oldName,
new: newName, new: newName,
}); });

@ -23,8 +23,8 @@ function requireSharp() {
image.isFileTypeAllowed = async function (path) { image.isFileTypeAllowed = async function (path) {
const plugins = require('./plugins'); const plugins = require('./plugins');
if (plugins.hasListeners('filter:image.isFileTypeAllowed')) { if (plugins.hooks.hasListeners('filter:image.isFileTypeAllowed')) {
return await plugins.fireHook('filter:image.isFileTypeAllowed', path); return await plugins.hooks.fire('filter:image.isFileTypeAllowed', path);
} }
const sharp = require('sharp'); const sharp = require('sharp');
await sharp(path, { await sharp(path, {
@ -33,8 +33,8 @@ image.isFileTypeAllowed = async function (path) {
}; };
image.resizeImage = async function (data) { image.resizeImage = async function (data) {
if (plugins.hasListeners('filter:image.resize')) { if (plugins.hooks.hasListeners('filter:image.resize')) {
await plugins.fireHook('filter:image.resize', { await plugins.hooks.fire('filter:image.resize', {
path: data.path, path: data.path,
target: data.target, target: data.target,
width: data.width, width: data.width,
@ -61,8 +61,8 @@ image.resizeImage = async function (data) {
}; };
image.normalise = async function (path) { image.normalise = async function (path) {
if (plugins.hasListeners('filter:image.normalise')) { if (plugins.hooks.hasListeners('filter:image.normalise')) {
await plugins.fireHook('filter:image.normalise', { await plugins.hooks.fire('filter:image.normalise', {
path: path, path: path,
}); });
} else { } else {
@ -74,8 +74,8 @@ image.normalise = async function (path) {
image.size = async function (path) { image.size = async function (path) {
let imageData; let imageData;
if (plugins.hasListeners('filter:image.size')) { if (plugins.hooks.hasListeners('filter:image.size')) {
imageData = await plugins.fireHook('filter:image.size', { imageData = await plugins.hooks.fire('filter:image.size', {
path: path, path: path,
}); });
} else { } else {
@ -138,8 +138,8 @@ image.sizeFromBase64 = function (imageData) {
}; };
image.uploadImage = async function (filename, folder, imageData) { image.uploadImage = async function (filename, folder, imageData) {
if (plugins.hasListeners('filter:uploadImage')) { if (plugins.hooks.hasListeners('filter:uploadImage')) {
return await plugins.fireHook('filter:uploadImage', { return await plugins.hooks.fire('filter:uploadImage', {
image: imageData, image: imageData,
uid: imageData.uid, uid: imageData.uid,
folder: folder, folder: folder,

@ -24,7 +24,7 @@ module.exports = function (Messaging) {
const maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000; const maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000;
content = String(content).trim(); content = String(content).trim();
let length = String(content.length).trim(); let length = String(content.length).trim();
({ content, length } = await plugins.fireHook('filter:messaging.checkContent', { content, length })); ({ content, length } = await plugins.hooks.fire('filter:messaging.checkContent', { content, length }));
if (!content) { if (!content) {
throw new Error('[[error:invalid-chat-message]]'); throw new Error('[[error:invalid-chat-message]]');
} }
@ -49,7 +49,7 @@ module.exports = function (Messaging) {
message.ip = data.ip; message.ip = data.ip;
} }
message = await plugins.fireHook('filter:messaging.save', message); message = await plugins.hooks.fire('filter:messaging.save', message);
await db.setObject('message:' + mid, message); await db.setObject('message:' + mid, message);
const isNewSet = await Messaging.isNewSet(data.uid, data.roomId, timestamp); const isNewSet = await Messaging.isNewSet(data.uid, data.roomId, timestamp);
let uids = await db.getSortedSetRange('chat:room:' + data.roomId + ':uids', 0, -1); let uids = await db.getSortedSetRange('chat:room:' + data.roomId + ':uids', 0, -1);
@ -69,7 +69,7 @@ module.exports = function (Messaging) {
messages[0].newSet = isNewSet; messages[0].newSet = isNewSet;
messages[0].mid = mid; messages[0].mid = mid;
messages[0].roomId = data.roomId; messages[0].roomId = data.roomId;
plugins.fireHook('action:messaging.save', { message: messages[0], data: data }); plugins.hooks.fire('action:messaging.save', { message: messages[0], data: data });
return messages[0]; return messages[0];
}; };

@ -121,7 +121,7 @@ module.exports = function (Messaging) {
messages = []; messages = [];
} }
const data = await plugins.fireHook('filter:messaging.getMessages', { const data = await plugins.hooks.fire('filter:messaging.getMessages', {
messages: messages, messages: messages,
uid: uid, uid: uid,
roomId: roomId, roomId: roomId,
@ -144,7 +144,7 @@ async function modifyMessage(message, fields, mid) {
} }
} }
const payload = await plugins.fireHook('filter:messaging.getFields', { const payload = await plugins.hooks.fire('filter:messaging.getFields', {
mid: mid, mid: mid,
message: message, message: message,
fields: fields, fields: fields,

@ -16,7 +16,7 @@ module.exports = function (Messaging) {
return; return;
} }
const payload = await plugins.fireHook('filter:messaging.edit', { const payload = await plugins.hooks.fire('filter:messaging.edit', {
content: content, content: content,
edited: Date.now(), edited: Date.now(),
}); });

@ -54,7 +54,7 @@ Messaging.getMessages = async (params) => {
}; };
async function canGet(hook, callerUid, uid) { async function canGet(hook, callerUid, uid) {
const data = await plugins.fireHook(hook, { const data = await plugins.hooks.fire(hook, {
callerUid: callerUid, callerUid: callerUid,
uid: uid, uid: uid,
canGet: parseInt(callerUid, 10) === parseInt(uid, 10), canGet: parseInt(callerUid, 10) === parseInt(uid, 10),
@ -64,7 +64,7 @@ async function canGet(hook, callerUid, uid) {
} }
Messaging.parse = async (message, fromuid, uid, roomId, isNew) => { Messaging.parse = async (message, fromuid, uid, roomId, isNew) => {
const parsed = await plugins.fireHook('filter:parse.raw', message); const parsed = await plugins.hooks.fire('filter:parse.raw', message);
let messageData = { let messageData = {
message: message, message: message,
parsed: parsed, parsed: parsed,
@ -75,7 +75,7 @@ Messaging.parse = async (message, fromuid, uid, roomId, isNew) => {
parsedMessage: parsed, parsedMessage: parsed,
}; };
messageData = await plugins.fireHook('filter:messaging.parse', messageData); messageData = await plugins.hooks.fire('filter:messaging.parse', messageData);
return messageData ? messageData.parsedMessage : ''; return messageData ? messageData.parsedMessage : '';
}; };
@ -129,7 +129,7 @@ Messaging.getRecentChats = async (callerUid, uid, start, stop) => {
results.roomData = results.roomData.filter(Boolean); results.roomData = results.roomData.filter(Boolean);
const ref = { rooms: results.roomData, nextStart: stop + 1 }; const ref = { rooms: results.roomData, nextStart: stop + 1 };
return await plugins.fireHook('filter:messaging.getRecentChats', { return await plugins.hooks.fire('filter:messaging.getRecentChats', {
rooms: ref.rooms, rooms: ref.rooms,
nextStart: ref.nextStart, nextStart: ref.nextStart,
uid: uid, uid: uid,
@ -160,7 +160,7 @@ Messaging.getTeaser = async (uid, roomId) => {
teaser.content = validator.escape(String(teaser.content)); teaser.content = validator.escape(String(teaser.content));
} }
const payload = await plugins.fireHook('filter:messaging.getTeaser', { teaser: teaser }); const payload = await plugins.hooks.fire('filter:messaging.getTeaser', { teaser: teaser });
return payload.teaser; return payload.teaser;
}; };
@ -222,7 +222,7 @@ Messaging.canMessageUser = async (uid, toUid) => {
throw new Error('[[error:chat-restricted]]'); throw new Error('[[error:chat-restricted]]');
} }
await plugins.fireHook('static:messaging.canMessageUser', { await plugins.hooks.fire('static:messaging.canMessageUser', {
uid: uid, uid: uid,
toUid: toUid, toUid: toUid,
}); });
@ -247,7 +247,7 @@ Messaging.canMessageRoom = async (uid, roomId) => {
throw new Error('[[error:no-privileges]]'); throw new Error('[[error:no-privileges]]');
} }
await plugins.fireHook('static:messaging.canMessageRoom', { await plugins.hooks.fire('static:messaging.canMessageRoom', {
uid: uid, uid: uid,
roomId: roomId, roomId: roomId,
}); });

@ -19,7 +19,7 @@ module.exports = function (Messaging) {
message: messageObj, message: messageObj,
uids: uids, uids: uids,
}; };
data = await plugins.fireHook('filter:messaging.notify', data); data = await plugins.hooks.fire('filter:messaging.notify', data);
if (!data || !data.uids || !data.uids.length) { if (!data || !data.uids || !data.uids.length) {
return; return;
} }

@ -61,7 +61,7 @@ module.exports = function (Messaging) {
Messaging.isUserInRoom = async (uid, roomId) => { Messaging.isUserInRoom = async (uid, roomId) => {
const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid); const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid);
const data = await plugins.fireHook('filter:messaging.isUserInRoom', { uid: uid, roomId: roomId, inRoom: inRoom }); const data = await plugins.hooks.fire('filter:messaging.isUserInRoom', { uid: uid, roomId: roomId, inRoom: inRoom });
return data.inRoom; return data.inRoom;
}; };
@ -185,7 +185,7 @@ module.exports = function (Messaging) {
throw new Error('[[error:chat-room-name-too-long]]'); throw new Error('[[error:chat-room-name-too-long]]');
} }
const payload = await plugins.fireHook('filter:chat.renameRoom', { const payload = await plugins.hooks.fire('filter:chat.renameRoom', {
uid: uid, uid: uid,
roomId: roomId, roomId: roomId,
newName: newName, newName: newName,
@ -198,7 +198,7 @@ module.exports = function (Messaging) {
await db.setObjectField('chat:room:' + payload.roomId, 'roomName', payload.newName); await db.setObjectField('chat:room:' + payload.roomId, 'roomName', payload.newName);
await Messaging.addSystemMessage('room-rename, ' + payload.newName.replace(',', ','), payload.uid, payload.roomId); await Messaging.addSystemMessage('room-rename, ' + payload.newName.replace(',', ','), payload.uid, payload.roomId);
plugins.fireHook('action:chat.renameRoom', { plugins.hooks.fire('action:chat.renameRoom', {
roomId: payload.roomId, roomId: payload.roomId,
newName: payload.newName, newName: payload.newName,
}); });
@ -206,7 +206,7 @@ module.exports = function (Messaging) {
Messaging.canReply = async (roomId, uid) => { Messaging.canReply = async (roomId, uid) => {
const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid); const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid);
const data = await plugins.fireHook('filter:messaging.canReply', { uid: uid, roomId: roomId, inRoom: inRoom, canReply: inRoom }); const data = await plugins.hooks.fire('filter:messaging.canReply', { uid: uid, roomId: roomId, inRoom: inRoom, canReply: inRoom });
return data.canReply; return data.canReply;
}; };

@ -74,7 +74,7 @@ Blacklist.test = async function (clientIp) {
) { ) {
try { try {
// To return test failure, pass back an error in callback // To return test failure, pass back an error in callback
await plugins.fireHook('filter:blacklist.test', { ip: clientIp }); await plugins.hooks.fire('filter:blacklist.test', { ip: clientIp });
} catch (err) { } catch (err) {
analytics.increment('blacklist'); analytics.increment('blacklist');
throw err; throw err;

@ -150,7 +150,7 @@ Configs.remove = async function (field) {
}; };
Configs.registerHooks = () => { Configs.registerHooks = () => {
plugins.registerHook('core', { plugins.hooks.register('core', {
hook: 'filter:settings.set', hook: 'filter:settings.set',
method: async ({ plugin, settings, quiet }) => { method: async ({ plugin, settings, quiet }) => {
if (plugin === 'core.api' && Array.isArray(settings.tokens)) { if (plugin === 'core.api' && Array.isArray(settings.tokens)) {
@ -170,7 +170,7 @@ Configs.registerHooks = () => {
}, },
}); });
plugins.registerHook('core', { plugins.hooks.register('core', {
hook: 'filter:settings.get', hook: 'filter:settings.get',
method: async ({ plugin, values }) => { method: async ({ plugin, values }) => {
if (plugin === 'core.api' && Array.isArray(values.tokens)) { if (plugin === 'core.api' && Array.isArray(values.tokens)) {

@ -31,7 +31,7 @@ Settings.get = async function (hash) {
}); });
})); }));
({ values: data } = await plugins.fireHook('filter:settings.get', { plugin: hash, values: data })); ({ values: data } = await plugins.hooks.fire('filter:settings.get', { plugin: hash, values: data }));
cache.set('settings:' + hash, data); cache.set('settings:' + hash, data);
return data; return data;
}; };
@ -54,7 +54,7 @@ Settings.set = async function (hash, values, quiet) {
} }
} }
({ plugin: hash, settings: values, quiet } = await plugins.fireHook('filter:settings.set', { plugin: hash, settings: values, quiet })); ({ plugin: hash, settings: values, quiet } = await plugins.hooks.fire('filter:settings.set', { plugin: hash, settings: values, quiet }));
if (sortedLists.length) { if (sortedLists.length) {
await db.delete('settings:' + hash + ':sorted-lists'); await db.delete('settings:' + hash + ':sorted-lists');
@ -87,7 +87,7 @@ Settings.set = async function (hash, values, quiet) {
cache.del('settings:' + hash); cache.del('settings:' + hash);
plugins.fireHook('action:settings.set', { plugins.hooks.fire('action:settings.set', {
plugin: hash, plugin: hash,
settings: values, settings: values,
}); });

@ -65,7 +65,7 @@ Tags.parse = async (req, data, meta, link) => {
href: relative_path + '/manifest.webmanifest', href: relative_path + '/manifest.webmanifest',
}]; }];
if (plugins.hasListeners('filter:search.query')) { if (plugins.hooks.hasListeners('filter:search.query')) {
defaultLinks.push({ defaultLinks.push({
rel: 'search', rel: 'search',
type: 'application/opensearchdescription+xml', type: 'application/opensearchdescription+xml',
@ -140,8 +140,8 @@ Tags.parse = async (req, data, meta, link) => {
} }
const results = await utils.promiseParallel({ const results = await utils.promiseParallel({
tags: plugins.fireHook('filter:meta.getMetaTags', { req: req, data: data, tags: defaultTags }), tags: plugins.hooks.fire('filter:meta.getMetaTags', { req: req, data: data, tags: defaultTags }),
links: plugins.fireHook('filter:meta.getLinkTags', { req: req, data: data, links: defaultLinks }), links: plugins.hooks.fire('filter:meta.getLinkTags', { req: req, data: data, links: defaultLinks }),
}); });
meta = results.tags.tags.concat(meta || []).map(function (tag) { meta = results.tags.tags.concat(meta || []).map(function (tag) {

@ -36,7 +36,7 @@ middleware.renderHeader = async (req, res, data) => {
const results = await utils.promiseParallel({ const results = await utils.promiseParallel({
userData: user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed']), userData: user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed']),
scripts: getAdminScripts(), scripts: getAdminScripts(),
custom_header: plugins.fireHook('filter:admin.header.build', custom_header), custom_header: plugins.hooks.fire('filter:admin.header.build', custom_header),
configs: meta.configs.list(), configs: meta.configs.list(),
latestVersion: getLatestVersion(), latestVersion: getLatestVersion(),
privileges: privileges.admin.get(req.uid), privileges: privileges.admin.get(req.uid),
@ -83,7 +83,7 @@ middleware.renderHeader = async (req, res, data) => {
}; };
async function getAdminScripts() { async function getAdminScripts() {
const scripts = await plugins.fireHook('filter:admin.scripts.get', []); const scripts = await plugins.hooks.fire('filter:admin.scripts.get', []);
return scripts.map(function (script) { return scripts.map(function (script) {
return { src: script }; return { src: script };
}); });

@ -34,7 +34,7 @@ middleware.buildHeader = helpers.try(async function buildHeader(req, res, next)
const [config, isBanned] = await Promise.all([ const [config, isBanned] = await Promise.all([
controllers.api.loadConfig(req), controllers.api.loadConfig(req),
user.bans.isBanned(req.uid), user.bans.isBanned(req.uid),
plugins.fireHook('filter:middleware.buildHeader', { req: req, locals: res.locals }), plugins.hooks.fire('filter:middleware.buildHeader', { req: req, locals: res.locals }),
]); ]);
if (isBanned) { if (isBanned) {
@ -60,7 +60,7 @@ middleware.renderHeader = async function renderHeader(req, res, data) {
'brand:logo:alt': meta.config['brand:logo:alt'] || '', 'brand:logo:alt': meta.config['brand:logo:alt'] || '',
'brand:logo:display': meta.config['brand:logo'] ? '' : 'hide', 'brand:logo:display': meta.config['brand:logo'] ? '' : 'hide',
allowRegistration: registrationType === 'normal', allowRegistration: registrationType === 'normal',
searchEnabled: plugins.hasListeners('filter:search.query'), searchEnabled: plugins.hooks.hasListeners('filter:search.query'),
config: res.locals.config, config: res.locals.config,
relative_path, relative_path,
bodyClass: data.bodyClass, bodyClass: data.bodyClass,
@ -173,7 +173,7 @@ middleware.renderHeader = async function renderHeader(req, res, data) {
modifyTitle(templateValues); modifyTitle(templateValues);
} }
const hookReturn = await plugins.fireHook('filter:middleware.renderHeader', { const hookReturn = await plugins.hooks.fire('filter:middleware.renderHeader', {
req: req, req: req,
res: res, res: res,
templateValues: templateValues, templateValues: templateValues,
@ -184,13 +184,13 @@ middleware.renderHeader = async function renderHeader(req, res, data) {
}; };
middleware.renderFooter = async function renderFooter(req, res, templateValues) { middleware.renderFooter = async function renderFooter(req, res, templateValues) {
const data = await plugins.fireHook('filter:middleware.renderFooter', { const data = await plugins.hooks.fire('filter:middleware.renderFooter', {
req: req, req: req,
res: res, res: res,
templateValues: templateValues, templateValues: templateValues,
}); });
const scripts = await plugins.fireHook('filter:scripts.get', []); const scripts = await plugins.hooks.fire('filter:scripts.get', []);
data.templateValues.scripts = scripts.map(function (script) { data.templateValues.scripts = scripts.map(function (script) {
return { src: script }; return { src: script };

@ -82,7 +82,7 @@ middleware.pageView = helpers.try(async function pageView(req, res, next) {
} }
next(); next();
await analytics.pageView({ ip: req.ip, uid: req.uid }); await analytics.pageView({ ip: req.ip, uid: req.uid });
plugins.fireHook('action:middleware.pageView', { req: req }); plugins.hooks.fire('action:middleware.pageView', { req: req });
}); });
middleware.pluginHooks = helpers.try(async function pluginHooks(req, res, next) { middleware.pluginHooks = helpers.try(async function pluginHooks(req, res, next) {
@ -91,7 +91,7 @@ middleware.pluginHooks = helpers.try(async function pluginHooks(req, res, next)
hookObj.method(req, res, next); hookObj.method(req, res, next);
}); });
await plugins.fireHook('response:router.page', { await plugins.hooks.fire('response:router.page', {
req: req, req: req,
res: res, res: res,
}); });
@ -227,7 +227,7 @@ middleware.trimUploadTimestamps = function trimUploadTimestamps(req, res, next)
middleware.validateAuth = helpers.try(async function validateAuth(req, res, next) { middleware.validateAuth = helpers.try(async function validateAuth(req, res, next) {
try { try {
await plugins.fireHook('static:auth.validate', { await plugins.hooks.fire('static:auth.validate', {
user: res.locals.user, user: res.locals.user,
strategy: res.locals.strategy, strategy: res.locals.strategy,
}); });

@ -33,10 +33,10 @@ module.exports = function (middleware) {
options.url = (req.baseUrl + req.path.replace(/^\/api/, '')); options.url = (req.baseUrl + req.path.replace(/^\/api/, ''));
options.bodyClass = buildBodyClass(req, res, options); options.bodyClass = buildBodyClass(req, res, options);
const buildResult = await plugins.fireHook('filter:' + template + '.build', { req: req, res: res, templateData: options }); const buildResult = await plugins.hooks.fire('filter:' + template + '.build', { req: req, res: res, templateData: options });
const templateToRender = buildResult.templateData.templateToRender || template; const templateToRender = buildResult.templateData.templateToRender || template;
const renderResult = await plugins.fireHook('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData }); const renderResult = await plugins.hooks.fire('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData });
options = renderResult.templateData; options = renderResult.templateData;
options._header = { options._header = {
tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags), tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags),

@ -69,7 +69,7 @@ module.exports = function (middleware) {
} }
} }
await plugins.fireHook('response:middleware.authenticate', { await plugins.hooks.fire('response:middleware.authenticate', {
req: req, req: req,
res: res, res: res,
next: function () {}, // no-op for backwards compatibility next: function () {}, // no-op for backwards compatibility

@ -78,7 +78,7 @@ async function getAvailable() {
return item; return item;
}); });
return await plugins.fireHook('filter:navigation.available', core); return await plugins.hooks.fire('filter:navigation.available', core);
} }
require('../promisify')(admin); require('../promisify')(admin);

@ -38,7 +38,7 @@ Notifications.privilegedTypes = [
]; ];
Notifications.getAllNotificationTypes = async function () { Notifications.getAllNotificationTypes = async function () {
const results = await plugins.fireHook('filter:user.notificationTypes', { const results = await plugins.hooks.fire('filter:user.notificationTypes', {
types: Notifications.baseTypes.slice(), types: Notifications.baseTypes.slice(),
privilegedTypes: Notifications.privilegedTypes.slice(), privilegedTypes: Notifications.privilegedTypes.slice(),
}); });
@ -213,7 +213,7 @@ async function pushToUids(uids, notification) {
// Remove uid from recipients list if they have blocked the user triggering the notification // Remove uid from recipients list if they have blocked the user triggering the notification
uids = await User.blocks.filterUids(notification.from, uids); uids = await User.blocks.filterUids(notification.from, uids);
const data = await plugins.fireHook('filter:notification.push', { notification: notification, uids: uids }); const data = await plugins.hooks.fire('filter:notification.push', { notification: notification, uids: uids });
if (!data || !data.notification || !data.uids || !data.uids.length) { if (!data || !data.notification || !data.uids || !data.uids.length) {
return; return;
} }
@ -227,7 +227,7 @@ async function pushToUids(uids, notification) {
sendNotification(results.uidsToNotify), sendNotification(results.uidsToNotify),
sendEmail(results.uidsToEmail), sendEmail(results.uidsToEmail),
]); ]);
plugins.fireHook('action:notification.pushed', { plugins.hooks.fire('action:notification.pushed', {
notification: notification, notification: notification,
uids: results.uidsToNotify, uids: results.uidsToNotify,
uidsNotified: results.uidsToNotify, uidsNotified: results.uidsToNotify,
@ -419,7 +419,7 @@ Notifications.merge = async function (notifications) {
return notifications; return notifications;
}, notifications); }, notifications);
const data = await plugins.fireHook('filter:notifications.merge', { const data = await plugins.hooks.fire('filter:notifications.merge', {
notifications: notifications, notifications: notifications,
}); });
return data && data.notifications; return data && data.notifications;

@ -3,42 +3,45 @@
const winston = require('winston'); const winston = require('winston');
const async = require('async'); const async = require('async');
const utils = require('../utils'); const utils = require('../utils');
const plugins = require('.');
module.exports = function (Plugins) { const Hooks = {};
Plugins.deprecatedHooks = { module.exports = Hooks;
Hooks.deprecatedHooks = {
'filter:privileges:isUserAllowedTo': 'filter:privileges:isAllowedTo', // 👋 @ 1.16.0 'filter:privileges:isUserAllowedTo': 'filter:privileges:isAllowedTo', // 👋 @ 1.16.0
'filter:router.page': 'response:router.page', // 👋 @ 2.0.0 'filter:router.page': 'response:router.page', // 👋 @ 2.0.0
}; };
Plugins.internals = { Hooks.internals = {
_register: function (data) { _register: function (data) {
Plugins.loadedHooks[data.hook] = Plugins.loadedHooks[data.hook] || []; plugins.loadedHooks[data.hook] = plugins.loadedHooks[data.hook] || [];
Plugins.loadedHooks[data.hook].push(data); plugins.loadedHooks[data.hook].push(data);
}, },
}; };
const hookTypeToMethod = { const hookTypeToMethod = {
filter: fireFilterHook, filter: fireFilterHook,
action: fireActionHook, action: fireActionHook,
static: fireStaticHook, static: fireStaticHook,
response: fireResponseHook, response: fireResponseHook,
}; };
/* /*
`data` is an object consisting of (* is required): `data` is an object consisting of (* is required):
`data.hook`*, the name of the NodeBB hook `data.hook`*, the name of the NodeBB hook
`data.method`*, the method called in that plugin (can be an array of functions) `data.method`*, the method called in that plugin (can be an array of functions)
`data.priority`, the relative priority of the method when it is eventually called (default: 10) `data.priority`, the relative priority of the method when it is eventually called (default: 10)
*/ */
Plugins.registerHook = function (id, data) { Hooks.register = function (id, data) {
if (!data.hook || !data.method) { if (!data.hook || !data.method) {
winston.warn('[plugins/' + id + '] registerHook called with invalid data.hook/method', data); winston.warn('[plugins/' + id + '] registerHook called with invalid data.hook/method', data);
return; return;
} }
// `hasOwnProperty` needed for hooks with no alternative (set to null) // `hasOwnProperty` needed for hooks with no alternative (set to null)
if (Plugins.deprecatedHooks.hasOwnProperty(data.hook)) { if (Hooks.deprecatedHooks.hasOwnProperty(data.hook)) {
const deprecated = Plugins.deprecatedHooks[data.hook]; const deprecated = Hooks.deprecatedHooks[data.hook];
if (deprecated) { if (deprecated) {
winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, please use "${deprecated}" instead.`); winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, please use "${deprecated}" instead.`);
@ -56,7 +59,7 @@ module.exports = function (Plugins) {
// Go go gadget recursion! // Go go gadget recursion!
data.method.forEach(function (method) { data.method.forEach(function (method) {
const singularData = { ...data, method: method }; const singularData = { ...data, method: method };
Plugins.registerHook(id, singularData); Hooks.register(id, singularData);
}); });
} else if (typeof data.method === 'string' && data.method.length > 0) { } else if (typeof data.method === 'string' && data.method.length > 0) {
const method = data.method.split('.').reduce(function (memo, prop) { const method = data.method.split('.').reduce(function (memo, prop) {
@ -65,30 +68,30 @@ module.exports = function (Plugins) {
} }
// Couldn't find method by path, aborting // Couldn't find method by path, aborting
return null; return null;
}, Plugins.libraries[data.id]); }, plugins.libraries[data.id]);
// Write the actual method reference to the hookObj // Write the actual method reference to the hookObj
data.method = method; data.method = method;
Plugins.internals._register(data); Hooks.internals._register(data);
} else if (typeof data.method === 'function') { } else if (typeof data.method === 'function') {
Plugins.internals._register(data); Hooks.internals._register(data);
} else { } else {
winston.warn('[plugins/' + id + '] Hook method mismatch: ' + data.hook + ' => ' + data.method); winston.warn('[plugins/' + id + '] Hook method mismatch: ' + data.hook + ' => ' + data.method);
} }
}; };
Plugins.unregisterHook = function (id, hook, method) { Hooks.unregister = function (id, hook, method) {
var hooks = Plugins.loadedHooks[hook] || []; var hooks = plugins.loadedHooks[hook] || [];
Plugins.loadedHooks[hook] = hooks.filter(function (hookData) { plugins.loadedHooks[hook] = hooks.filter(function (hookData) {
return hookData && hookData.id !== id && hookData.method !== method; return hookData && hookData.id !== id && hookData.method !== method;
}); });
}; };
Plugins.fireHook = async function (hook, params) { Hooks.fire = async function (hook, params) {
const hookList = Plugins.loadedHooks[hook]; const hookList = plugins.loadedHooks[hook];
const hookType = hook.split(':')[0]; const hookType = hook.split(':')[0];
if (global.env === 'development' && hook !== 'action:plugins.firehook') { if (global.env === 'development' && hook !== 'action:plugins.fireHook') {
winston.verbose('[plugins/fireHook] ' + hook); winston.verbose('[plugins/fireHook] ' + hook);
} }
@ -98,15 +101,19 @@ module.exports = function (Plugins) {
} }
const result = await hookTypeToMethod[hookType](hook, hookList, params); const result = await hookTypeToMethod[hookType](hook, hookList, params);
if (hook !== 'action:plugins.firehook') { if (hook !== 'action:plugins.fireHook') {
Plugins.fireHook('action:plugins.firehook', { hook: hook, params: params }); Hooks.fire('action:plugins.fireHook', { hook: hook, params: params });
} }
if (result !== undefined) { if (result !== undefined) {
return result; return result;
} }
}; };
Hooks.hasListeners = function (hook) {
return !!(plugins.loadedHooks[hook] && plugins.loadedHooks[hook].length > 0);
};
async function fireFilterHook(hook, hookList, params) { async function fireFilterHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) { if (!Array.isArray(hookList) || !hookList.length) {
return params; return params;
} }
@ -126,9 +133,9 @@ module.exports = function (Plugins) {
); );
} }
}); });
} }
async function fireActionHook(hook, hookList, params) { async function fireActionHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) { if (!Array.isArray(hookList) || !hookList.length) {
return; return;
} }
@ -142,9 +149,9 @@ module.exports = function (Plugins) {
await hookObj.method(params); await hookObj.method(params);
} }
} }
} }
async function fireStaticHook(hook, hookList, params) { async function fireStaticHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) { if (!Array.isArray(hookList) || !hookList.length) {
return; return;
} }
@ -184,9 +191,9 @@ module.exports = function (Plugins) {
callback(err); callback(err);
} }
}); });
} }
async function fireResponseHook(hook, hookList, params) { async function fireResponseHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) { if (!Array.isArray(hookList) || !hookList.length) {
return; return;
} }
@ -205,9 +212,4 @@ module.exports = function (Plugins) {
await hookObj.method(params); await hookObj.method(params);
}); });
} }
Plugins.hasListeners = function (hook) {
return !!(Plugins.loadedHooks[hook] && Plugins.loadedHooks[hook].length > 0);
};
};

@ -21,9 +21,16 @@ const Plugins = module.exports;
require('./install')(Plugins); require('./install')(Plugins);
require('./load')(Plugins); require('./load')(Plugins);
require('./hooks')(Plugins);
require('./usage')(Plugins); require('./usage')(Plugins);
Plugins.data = require('./data'); Plugins.data = require('./data');
Plugins.hooks = require('./hooks');
// Backwards compatibility for hooks, remove in v1.16.0
Plugins.registerHook = Plugins.hooks.register;
Plugins.unregisterHook = Plugins.hooks.unregister;
Plugins.fireHook = Plugins.hooks.fire;
Plugins.hasListeners = Plugins.hooks.hasListeners;
// end
Plugins.getPluginPaths = Plugins.data.getPluginPaths; Plugins.getPluginPaths = Plugins.data.getPluginPaths;
Plugins.loadPluginInfo = Plugins.data.loadPluginInfo; Plugins.loadPluginInfo = Plugins.data.loadPluginInfo;
@ -138,7 +145,7 @@ Plugins.reload = async function () {
Plugins.reloadRoutes = async function (params) { Plugins.reloadRoutes = async function (params) {
var controllers = require('../controllers'); var controllers = require('../controllers');
await Plugins.fireHook('static:app.load', { app: app, router: params.router, middleware: middleware, controllers: controllers }); await Plugins.hooks.fire('static:app.load', { app: app, router: params.router, middleware: middleware, controllers: controllers });
winston.verbose('[plugins] All plugins reloaded and rerouted'); winston.verbose('[plugins] All plugins reloaded and rerouted');
}; };

@ -64,7 +64,7 @@ module.exports = function (Plugins) {
await db.sortedSetAdd('plugins:active', count, id); await db.sortedSetAdd('plugins:active', count, id);
} }
meta.reloadRequired = true; meta.reloadRequired = true;
Plugins.fireHook(isActive ? 'action:plugin.deactivate' : 'action:plugin.activate', { id: id }); Plugins.hooks.fire(isActive ? 'action:plugin.deactivate' : 'action:plugin.activate', { id: id });
return { id: id, active: !isActive }; return { id: id, active: !isActive };
}; };
@ -100,7 +100,7 @@ module.exports = function (Plugins) {
} }
await runPackageManagerCommandAsync(type, id, version || 'latest'); await runPackageManagerCommandAsync(type, id, version || 'latest');
const pluginData = await Plugins.get(id); const pluginData = await Plugins.get(id);
Plugins.fireHook('action:plugin.' + type, { id: id, version: version }); Plugins.hooks.fire('action:plugin.' + type, { id: id, version: version });
return pluginData; return pluginData;
} }

@ -160,7 +160,7 @@ module.exports = function (Plugins) {
} }
if (Array.isArray(pluginData.hooks)) { if (Array.isArray(pluginData.hooks)) {
pluginData.hooks.forEach(hook => Plugins.registerHook(pluginData.id, hook)); pluginData.hooks.forEach(hook => Plugins.hooks.register(pluginData.id, hook));
} }
} catch (err) { } catch (err) {
winston.warn('[plugins] Unable to load library for: ' + pluginData.id); winston.warn('[plugins] Unable to load library for: ' + pluginData.id);

@ -41,7 +41,7 @@ module.exports = function (Posts) {
postData.bookmarks = await db.setCount('pid:' + pid + ':users_bookmarked'); postData.bookmarks = await db.setCount('pid:' + pid + ':users_bookmarked');
await Posts.setPostField(pid, 'bookmarks', postData.bookmarks); await Posts.setPostField(pid, 'bookmarks', postData.bookmarks);
plugins.fireHook('action:post.' + type, { plugins.hooks.fire('action:post.' + type, {
pid: pid, pid: pid,
uid: uid, uid: uid,
owner: postData.uid, owner: postData.uid,

@ -47,7 +47,7 @@ module.exports = function (Posts) {
postData.handle = data.handle; postData.handle = data.handle;
} }
let result = await plugins.fireHook('filter:post.create', { post: postData, data: data }); let result = await plugins.hooks.fire('filter:post.create', { post: postData, data: data });
postData = result.post; postData = result.post;
await db.setObject('post:' + postData.pid, postData); await db.setObject('post:' + postData.pid, postData);
@ -65,9 +65,9 @@ module.exports = function (Posts) {
Posts.uploads.sync(postData.pid), Posts.uploads.sync(postData.pid),
]); ]);
result = await plugins.fireHook('filter:post.get', { post: postData, uid: data.uid }); result = await plugins.hooks.fire('filter:post.get', { post: postData, uid: data.uid });
result.post.isMain = isMain; result.post.isMain = isMain;
plugins.fireHook('action:post.save', { post: _.clone(result.post) }); plugins.hooks.fire('action:post.save', { post: _.clone(result.post) });
return result.post; return result.post;
}; };

@ -17,7 +17,7 @@ module.exports = function (Posts) {
} }
const keys = pids.map(pid => 'post:' + pid); const keys = pids.map(pid => 'post:' + pid);
const postData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); const postData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
const result = await plugins.fireHook('filter:post.getFields', { const result = await plugins.hooks.fire('filter:post.getFields', {
pids: pids, pids: pids,
posts: postData, posts: postData,
fields: fields, fields: fields,
@ -51,7 +51,7 @@ module.exports = function (Posts) {
Posts.setPostFields = async function (pid, data) { Posts.setPostFields = async function (pid, data) {
await db.setObject('post:' + pid, data); await db.setObject('post:' + pid, data);
plugins.fireHook('action:post.setFields', { data: { ...data, pid } }); plugins.hooks.fire('action:post.setFields', { data: { ...data, pid } });
}; };
}; };

@ -22,7 +22,7 @@ module.exports = function (Posts) {
async function deleteOrRestore(type, pid, uid) { async function deleteOrRestore(type, pid, uid) {
const isDeleting = type === 'delete'; const isDeleting = type === 'delete';
await plugins.fireHook('filter:post.' + type, { pid: pid, uid: uid }); await plugins.hooks.fire('filter:post.' + type, { pid: pid, uid: uid });
await Posts.setPostFields(pid, { await Posts.setPostFields(pid, {
deleted: isDeleting ? 1 : 0, deleted: isDeleting ? 1 : 0,
deleterUid: isDeleting ? uid : 0, deleterUid: isDeleting ? uid : 0,
@ -38,7 +38,7 @@ module.exports = function (Posts) {
db.sortedSetAdd('cid:' + topicData.cid + ':pids', postData.timestamp, pid), db.sortedSetAdd('cid:' + topicData.cid + ':pids', postData.timestamp, pid),
]); ]);
await categories.updateRecentTidForCid(postData.cid); await categories.updateRecentTidForCid(postData.cid);
plugins.fireHook('action:post.' + type, { post: _.clone(postData), uid: uid }); plugins.hooks.fire('action:post.' + type, { post: _.clone(postData), uid: uid });
if (type === 'delete') { if (type === 'delete') {
await flags.resolveFlag('post', pid, uid); await flags.resolveFlag('post', pid, uid);
} }
@ -52,7 +52,7 @@ module.exports = function (Posts) {
} }
const topicData = await topics.getTopicFields(postData.tid, ['tid', 'cid', 'pinned']); const topicData = await topics.getTopicFields(postData.tid, ['tid', 'cid', 'pinned']);
postData.cid = topicData.cid; postData.cid = topicData.cid;
await plugins.fireHook('filter:post.purge', { post: postData, pid: pid, uid: uid }); await plugins.hooks.fire('filter:post.purge', { post: postData, pid: pid, uid: uid });
await Promise.all([ await Promise.all([
deletePostFromTopicUserNotification(postData, topicData), deletePostFromTopicUserNotification(postData, topicData),
deletePostFromCategoryRecentPosts(postData), deletePostFromCategoryRecentPosts(postData),
@ -64,7 +64,7 @@ module.exports = function (Posts) {
Posts.uploads.dissociateAll(pid), Posts.uploads.dissociateAll(pid),
]); ]);
await flags.resolveFlag('post', pid, uid); await flags.resolveFlag('post', pid, uid);
plugins.fireHook('action:post.purge', { post: postData, uid: uid }); plugins.hooks.fire('action:post.purge', { post: postData, uid: uid });
await db.delete('post:' + pid); await db.delete('post:' + pid);
}; };

@ -55,7 +55,7 @@ module.exports = function (Posts) {
const post = await postDiffLoad(pid, since, uid); const post = await postDiffLoad(pid, since, uid);
post.content = String(post.content || ''); post.content = String(post.content || '');
const result = await plugins.fireHook('filter:parse.post', { postData: post }); const result = await plugins.hooks.fire('filter:parse.post', { postData: post });
result.postData.content = translator.escape(result.postData.content); result.postData.content = translator.escape(result.postData.content);
return result.postData; return result.postData;
}; };

@ -40,7 +40,7 @@ module.exports = function (Posts) {
editPostData.handle = data.handle; editPostData.handle = data.handle;
} }
const result = await plugins.fireHook('filter:post.edit', { const result = await plugins.hooks.fire('filter:post.edit', {
req: data.req, req: data.req,
post: editPostData, post: editPostData,
data: data, data: data,
@ -79,7 +79,7 @@ module.exports = function (Posts) {
nid: 'edit_post:' + data.pid + ':uid:' + data.uid, nid: 'edit_post:' + data.pid + ':uid:' + data.uid,
}); });
plugins.fireHook('action:post.edit', { post: _.clone(returnPostData), data: data, uid: data.uid }); plugins.hooks.fire('action:post.edit', { post: _.clone(returnPostData), data: data, uid: data.uid });
require('./cache').del(String(postData.pid)); require('./cache').del(String(postData.pid));
pubsub.publish('post:edit', String(postData.pid)); pubsub.publish('post:edit', String(postData.pid));
@ -134,7 +134,7 @@ module.exports = function (Posts) {
} }
await topics.validateTags(data.tags, topicData.cid); await topics.validateTags(data.tags, topicData.cid);
const results = await plugins.fireHook('filter:topic.edit', { const results = await plugins.hooks.fire('filter:topic.edit', {
req: data.req, req: data.req,
topic: newTopicData, topic: newTopicData,
data: data, data: data,
@ -147,7 +147,7 @@ module.exports = function (Posts) {
newTopicData.oldTitle = topicData.title; newTopicData.oldTitle = topicData.title;
newTopicData.timestamp = topicData.timestamp; newTopicData.timestamp = topicData.timestamp;
const renamed = translator.escape(validator.escape(String(title))) !== topicData.title; const renamed = translator.escape(validator.escape(String(title))) !== topicData.title;
plugins.fireHook('action:topic.edit', { topic: newTopicData, uid: data.uid }); plugins.hooks.fire('action:topic.edit', { topic: newTopicData, uid: data.uid });
return { return {
tid: tid, tid: tid,
cid: newTopicData.cid, cid: newTopicData.cid,

@ -48,7 +48,7 @@ Posts.getPostsByPids = async function (pids, uid) {
let posts = await Posts.getPostsData(pids); let posts = await Posts.getPostsData(pids);
posts = await Promise.all(posts.map(p => Posts.parsePost(p))); posts = await Promise.all(posts.map(p => Posts.parsePost(p)));
posts = await user.blocks.filter(uid, posts); posts = await user.blocks.filter(uid, posts);
const data = await plugins.fireHook('filter:post.getPosts', { posts: posts, uid: uid }); const data = await plugins.hooks.fire('filter:post.getPosts', { posts: posts, uid: uid });
if (!data || !Array.isArray(data.posts)) { if (!data || !Array.isArray(data.posts)) {
return []; return [];
} }

@ -60,7 +60,7 @@ module.exports = function (Posts) {
return postData; return postData;
} }
const data = await plugins.fireHook('filter:parse.post', { postData: postData }); const data = await plugins.hooks.fire('filter:parse.post', { postData: postData });
data.postData.content = translator.escape(data.postData.content); data.postData.content = translator.escape(data.postData.content);
if (data.postData.pid) { if (data.postData.pid) {
cache.set(pid, data.postData.content); cache.set(pid, data.postData.content);
@ -70,7 +70,7 @@ module.exports = function (Posts) {
Posts.parseSignature = async function (userData, uid) { Posts.parseSignature = async function (userData, uid) {
userData.signature = sanitizeSignature(userData.signature || ''); userData.signature = sanitizeSignature(userData.signature || '');
return await plugins.fireHook('filter:parse.signature', { userData: userData, uid: uid }); return await plugins.hooks.fire('filter:parse.signature', { userData: userData, uid: uid });
}; };
Posts.relativeToAbsolute = function (content, regex) { Posts.relativeToAbsolute = function (content, regex) {
@ -121,11 +121,11 @@ module.exports = function (Posts) {
}); });
// Some plugins might need to adjust or whitelist their own tags... // Some plugins might need to adjust or whitelist their own tags...
sanitizeConfig = await plugins.fireHook('filter:sanitize.config', sanitizeConfig); sanitizeConfig = await plugins.hooks.fire('filter:sanitize.config', sanitizeConfig);
}; };
Posts.registerHooks = () => { Posts.registerHooks = () => {
plugins.registerHook('core', { plugins.hooks.register('core', {
hook: 'filter:parse.post', hook: 'filter:parse.post',
method: async (data) => { method: async (data) => {
data.postData.content = Posts.sanitize(data.postData.content); data.postData.content = Posts.sanitize(data.postData.content);
@ -133,17 +133,17 @@ module.exports = function (Posts) {
}, },
}); });
plugins.registerHook('core', { plugins.hooks.register('core', {
hook: 'filter:parse.raw', hook: 'filter:parse.raw',
method: async content => Posts.sanitize(content), method: async content => Posts.sanitize(content),
}); });
plugins.registerHook('core', { plugins.hooks.register('core', {
hook: 'filter:parse.aboutme', hook: 'filter:parse.aboutme',
method: async content => Posts.sanitize(content), method: async content => Posts.sanitize(content),
}); });
plugins.registerHook('core', { plugins.hooks.register('core', {
hook: 'filter:parse.signature', hook: 'filter:parse.signature',
method: async (data) => { method: async (data) => {
data.userData.signature = Posts.sanitize(data.userData.signature); data.userData.signature = Posts.sanitize(data.userData.signature);

@ -18,7 +18,7 @@ module.exports = function (Posts) {
const userData = await user.getUserFields(uid, ['uid', 'reputation', 'postcount']); const userData = await user.getUserFields(uid, ['uid', 'reputation', 'postcount']);
const isMemberOfExempt = await groups.isMemberOfAny(userData.uid, meta.config.groupsExemptFromPostQueue); const isMemberOfExempt = await groups.isMemberOfAny(userData.uid, meta.config.groupsExemptFromPostQueue);
const shouldQueue = meta.config.postQueue && !isMemberOfExempt && (!userData.uid || userData.reputation < meta.config.postQueueReputationThreshold || userData.postcount <= 0); const shouldQueue = meta.config.postQueue && !isMemberOfExempt && (!userData.uid || userData.reputation < meta.config.postQueueReputationThreshold || userData.postcount <= 0);
const result = await plugins.fireHook('filter:post.shouldQueue', { const result = await plugins.hooks.fire('filter:post.shouldQueue', {
shouldQueue: !!shouldQueue, shouldQueue: !!shouldQueue,
uid: uid, uid: uid,
data: data, data: data,
@ -57,7 +57,7 @@ module.exports = function (Posts) {
type: type, type: type,
data: data, data: data,
}; };
payload = await plugins.fireHook('filter:post-queue.save', payload); payload = await plugins.hooks.fire('filter:post-queue.save', payload);
payload.data = JSON.stringify(data); payload.data = JSON.stringify(data);
await db.sortedSetAdd('post:queue', now, id); await db.sortedSetAdd('post:queue', now, id);

@ -54,7 +54,7 @@ module.exports = function (Posts) {
posts = posts.filter(post => tidToTopic[post.tid]); posts = posts.filter(post => tidToTopic[post.tid]);
posts = await parsePosts(posts, options); posts = await parsePosts(posts, options);
const result = await plugins.fireHook('filter:post.getPostSummaryByPids', { posts: posts, uid: uid }); const result = await plugins.hooks.fire('filter:post.getPostSummaryByPids', { posts: posts, uid: uid });
return result.posts; return result.posts;
}; };

@ -36,7 +36,7 @@ module.exports = function (Posts) {
const [isMemberOfGroups, signature, customProfileInfo] = await Promise.all([ const [isMemberOfGroups, signature, customProfileInfo] = await Promise.all([
checkGroupMembership(userData.uid, userData.groupTitleArray), checkGroupMembership(userData.uid, userData.groupTitleArray),
parseSignature(userData, uid, canUseSignature), parseSignature(userData, uid, canUseSignature),
plugins.fireHook('filter:posts.custom_profile_info', { profile: [], uid: userData.uid }), plugins.hooks.fire('filter:posts.custom_profile_info', { profile: [], uid: userData.uid }),
]); ]);
if (isMemberOfGroups && userData.groupTitleArray) { if (isMemberOfGroups && userData.groupTitleArray) {
@ -49,7 +49,7 @@ module.exports = function (Posts) {
userData.signature = signature; userData.signature = signature;
userData.custom_profile_info = customProfileInfo.profile; userData.custom_profile_info = customProfileInfo.profile;
return await plugins.fireHook('filter:posts.modifyUserInfo', userData); return await plugins.hooks.fire('filter:posts.modifyUserInfo', userData);
})); }));
}; };
@ -94,7 +94,7 @@ module.exports = function (Posts) {
'signature', 'banned', 'banned:expire', 'status', 'signature', 'banned', 'banned:expire', 'status',
'lastonline', 'groupTitle', 'lastonline', 'groupTitle',
]; ];
const result = await plugins.fireHook('filter:posts.addUserFields', { const result = await plugins.hooks.fire('filter:posts.addUserFields', {
fields: fields, fields: fields,
uid: uid, uid: uid,
uids: uids, uids: uids,
@ -166,7 +166,7 @@ module.exports = function (Posts) {
updateTopicPosters(postData, toUid), updateTopicPosters(postData, toUid),
]); ]);
plugins.fireHook('action:post.changeOwner', { plugins.hooks.fire('action:post.changeOwner', {
posts: _.cloneDeep(postData), posts: _.cloneDeep(postData),
toUid: toUid, toUid: toUid,
}); });
@ -228,7 +228,7 @@ module.exports = function (Posts) {
]); ]);
const changedTopics = mainPosts.map(p => tidToTopic[p.tid]); const changedTopics = mainPosts.map(p => tidToTopic[p.tid]);
plugins.fireHook('action:topic.changeOwner', { plugins.hooks.fire('action:topic.changeOwner', {
topics: _.cloneDeep(changedTopics), topics: _.cloneDeep(changedTopics),
toUid: toUid, toUid: toUid,
}); });

@ -144,7 +144,7 @@ module.exports = function (Posts) {
current = 'unvote'; current = 'unvote';
} }
plugins.fireHook('action:post.' + hook, { plugins.hooks.fire('action:post.' + hook, {
pid: pid, pid: pid,
uid: uid, uid: uid,
owner: owner, owner: owner,
@ -251,7 +251,7 @@ module.exports = function (Posts) {
downvotes: postData.downvotes, downvotes: postData.downvotes,
}), }),
]); ]);
plugins.fireHook('action:post.updatePostVoteCount', { post: postData }); plugins.hooks.fire('action:post.updatePostVoteCount', { post: postData });
}; };
async function updateTopicVoteCount(postData) { async function updateTopicVoteCount(postData) {

@ -120,14 +120,14 @@ module.exports = function (privileges) {
async function getLabels() { async function getLabels() {
return await utils.promiseParallel({ return await utils.promiseParallel({
users: plugins.fireHook('filter:privileges.admin.list_human', privilegeLabels.slice()), users: plugins.hooks.fire('filter:privileges.admin.list_human', privilegeLabels.slice()),
groups: plugins.fireHook('filter:privileges.admin.groups.list_human', privilegeLabels.slice()), groups: plugins.hooks.fire('filter:privileges.admin.groups.list_human', privilegeLabels.slice()),
}); });
} }
const keys = await utils.promiseParallel({ const keys = await utils.promiseParallel({
users: plugins.fireHook('filter:privileges.admin.list', userPrivilegeList.slice()), users: plugins.hooks.fire('filter:privileges.admin.list', userPrivilegeList.slice()),
groups: plugins.fireHook('filter:privileges.admin.groups.list', groupPrivilegeList.slice()), groups: plugins.hooks.fire('filter:privileges.admin.groups.list', groupPrivilegeList.slice()),
}); });
const payload = await utils.promiseParallel({ const payload = await utils.promiseParallel({
@ -152,7 +152,7 @@ module.exports = function (privileges) {
const privData = _.zipObject(privileges.admin.userPrivilegeList, combined); const privData = _.zipObject(privileges.admin.userPrivilegeList, combined);
privData.superadmin = isAdministrator; privData.superadmin = isAdministrator;
return await plugins.fireHook('filter:privileges.admin.get', privData); return await plugins.hooks.fire('filter:privileges.admin.get', privData);
}; };
privileges.admin.can = async function (privilege, uid) { privileges.admin.can = async function (privilege, uid) {
@ -169,7 +169,7 @@ module.exports = function (privileges) {
privileges.admin.give = async function (privileges, groupName) { privileges.admin.give = async function (privileges, groupName) {
await helpers.giveOrRescind(groups.join, privileges, 'admin', groupName); await helpers.giveOrRescind(groups.join, privileges, 'admin', groupName);
plugins.fireHook('action:privileges.admin.give', { plugins.hooks.fire('action:privileges.admin.give', {
privileges: privileges, privileges: privileges,
groupNames: Array.isArray(groupName) ? groupName : [groupName], groupNames: Array.isArray(groupName) ? groupName : [groupName],
}); });
@ -177,7 +177,7 @@ module.exports = function (privileges) {
privileges.admin.rescind = async function (privileges, groupName) { privileges.admin.rescind = async function (privileges, groupName) {
await helpers.giveOrRescind(groups.leave, privileges, 'admin', groupName); await helpers.giveOrRescind(groups.leave, privileges, 'admin', groupName);
plugins.fireHook('action:privileges.admin.rescind', { plugins.hooks.fire('action:privileges.admin.rescind', {
privileges: privileges, privileges: privileges,
groupNames: Array.isArray(groupName) ? groupName : [groupName], groupNames: Array.isArray(groupName) ? groupName : [groupName],
}); });

@ -17,14 +17,14 @@ module.exports = function (privileges) {
privileges.categories.list = async function (cid) { privileges.categories.list = async function (cid) {
async function getLabels() { async function getLabels() {
return await utils.promiseParallel({ return await utils.promiseParallel({
users: plugins.fireHook('filter:privileges.list_human', privileges.privilegeLabels.slice()), users: plugins.hooks.fire('filter:privileges.list_human', privileges.privilegeLabels.slice()),
groups: plugins.fireHook('filter:privileges.groups.list_human', privileges.privilegeLabels.slice()), groups: plugins.hooks.fire('filter:privileges.groups.list_human', privileges.privilegeLabels.slice()),
}); });
} }
const keys = await utils.promiseParallel({ const keys = await utils.promiseParallel({
users: plugins.fireHook('filter:privileges.list', privileges.userPrivilegeList.slice()), users: plugins.hooks.fire('filter:privileges.list', privileges.userPrivilegeList.slice()),
groups: plugins.fireHook('filter:privileges.groups.list', privileges.groupPrivilegeList.slice()), groups: plugins.hooks.fire('filter:privileges.groups.list', privileges.groupPrivilegeList.slice()),
}); });
const payload = await utils.promiseParallel({ const payload = await utils.promiseParallel({
@ -55,7 +55,7 @@ module.exports = function (privileges) {
const privData = _.zipObject(privs, combined); const privData = _.zipObject(privs, combined);
const isAdminOrMod = isAdministrator || isModerator; const isAdminOrMod = isAdministrator || isModerator;
return await plugins.fireHook('filter:privileges.categories.get', { return await plugins.hooks.fire('filter:privileges.categories.get', {
...privData, ...privData,
cid: cid, cid: cid,
uid: uid, uid: uid,
@ -135,7 +135,7 @@ module.exports = function (privileges) {
privileges.categories.give = async function (privileges, cid, members) { privileges.categories.give = async function (privileges, cid, members) {
await helpers.giveOrRescind(groups.join, privileges, cid, members); await helpers.giveOrRescind(groups.join, privileges, cid, members);
plugins.fireHook('action:privileges.categories.give', { plugins.hooks.fire('action:privileges.categories.give', {
privileges: privileges, privileges: privileges,
cids: Array.isArray(cid) ? cid : [cid], cids: Array.isArray(cid) ? cid : [cid],
members: Array.isArray(members) ? members : [members], members: Array.isArray(members) ? members : [members],
@ -144,7 +144,7 @@ module.exports = function (privileges) {
privileges.categories.rescind = async function (privileges, cid, members) { privileges.categories.rescind = async function (privileges, cid, members) {
await helpers.giveOrRescind(groups.leave, privileges, cid, members); await helpers.giveOrRescind(groups.leave, privileges, cid, members);
plugins.fireHook('action:privileges.categories.rescind', { plugins.hooks.fire('action:privileges.categories.rescind', {
privileges: privileges, privileges: privileges,
cids: Array.isArray(cid) ? cid : [cid], cids: Array.isArray(cid) ? cid : [cid],
members: Array.isArray(members) ? members : [members], members: Array.isArray(members) ? members : [members],

@ -53,14 +53,14 @@ module.exports = function (privileges) {
privileges.global.list = async function () { privileges.global.list = async function () {
async function getLabels() { async function getLabels() {
return await utils.promiseParallel({ return await utils.promiseParallel({
users: plugins.fireHook('filter:privileges.global.list_human', privileges.global.privilegeLabels.slice()), users: plugins.hooks.fire('filter:privileges.global.list_human', privileges.global.privilegeLabels.slice()),
groups: plugins.fireHook('filter:privileges.global.groups.list_human', privileges.global.privilegeLabels.slice()), groups: plugins.hooks.fire('filter:privileges.global.groups.list_human', privileges.global.privilegeLabels.slice()),
}); });
} }
const keys = await utils.promiseParallel({ const keys = await utils.promiseParallel({
users: plugins.fireHook('filter:privileges.global.list', privileges.global.userPrivilegeList.slice()), users: plugins.hooks.fire('filter:privileges.global.list', privileges.global.userPrivilegeList.slice()),
groups: plugins.fireHook('filter:privileges.global.groups.list', privileges.global.groupPrivilegeList.slice()), groups: plugins.hooks.fire('filter:privileges.global.groups.list', privileges.global.groupPrivilegeList.slice()),
}); });
const payload = await utils.promiseParallel({ const payload = await utils.promiseParallel({
@ -84,7 +84,7 @@ module.exports = function (privileges) {
const combined = userPrivileges.map(allowed => allowed || isAdministrator); const combined = userPrivileges.map(allowed => allowed || isAdministrator);
const privData = _.zipObject(privileges.global.userPrivilegeList, combined); const privData = _.zipObject(privileges.global.userPrivilegeList, combined);
return await plugins.fireHook('filter:privileges.global.get', privData); return await plugins.hooks.fire('filter:privileges.global.get', privData);
}; };
privileges.global.can = async function (privilege, uid) { privileges.global.can = async function (privilege, uid) {
@ -101,7 +101,7 @@ module.exports = function (privileges) {
privileges.global.give = async function (privileges, groupName) { privileges.global.give = async function (privileges, groupName) {
await helpers.giveOrRescind(groups.join, privileges, 0, groupName); await helpers.giveOrRescind(groups.join, privileges, 0, groupName);
plugins.fireHook('action:privileges.global.give', { plugins.hooks.fire('action:privileges.global.give', {
privileges: privileges, privileges: privileges,
groupNames: Array.isArray(groupName) ? groupName : [groupName], groupNames: Array.isArray(groupName) ? groupName : [groupName],
}); });
@ -109,7 +109,7 @@ module.exports = function (privileges) {
privileges.global.rescind = async function (privileges, groupName) { privileges.global.rescind = async function (privileges, groupName) {
await helpers.giveOrRescind(groups.leave, privileges, 0, groupName); await helpers.giveOrRescind(groups.leave, privileges, 0, groupName);
plugins.fireHook('action:privileges.global.rescind', { plugins.hooks.fire('action:privileges.global.rescind', {
privileges: privileges, privileges: privileges,
groupNames: Array.isArray(groupName) ? groupName : [groupName], groupNames: Array.isArray(groupName) ? groupName : [groupName],
}); });

@ -22,7 +22,7 @@ helpers.isUsersAllowedTo = async function (privilege, uids, cid) {
groups.isMembersOfGroupList(uids, 'cid:' + cid + ':privileges:groups:' + privilege), groups.isMembersOfGroupList(uids, 'cid:' + cid + ':privileges:groups:' + privilege),
]); ]);
const allowed = uids.map((uid, index) => hasUserPrivilege[index] || hasGroupPrivilege[index]); const allowed = uids.map((uid, index) => hasUserPrivilege[index] || hasGroupPrivilege[index]);
const result = await plugins.fireHook('filter:privileges:isUsersAllowedTo', { allowed: allowed, privilege: privilege, uids: uids, cid: cid }); const result = await plugins.hooks.fire('filter:privileges:isUsersAllowedTo', { allowed: allowed, privilege: privilege, uids: uids, cid: cid });
return result.allowed; return result.allowed;
}; };
@ -34,8 +34,8 @@ helpers.isAllowedTo = async function (privilege, uidOrGroupName, cid) {
allowed = await isAllowedToCids(privilege, uidOrGroupName, cid); allowed = await isAllowedToCids(privilege, uidOrGroupName, cid);
} }
if (allowed) { if (allowed) {
({ allowed } = await plugins.fireHook('filter:privileges:isUserAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid })); ({ allowed } = await plugins.hooks.fire('filter:privileges:isUserAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid }));
({ allowed } = await plugins.fireHook('filter:privileges:isAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid })); ({ allowed } = await plugins.hooks.fire('filter:privileges:isAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid }));
return allowed; return allowed;
} }
throw new Error('[[error:invalid-data]]'); throw new Error('[[error:invalid-data]]');

@ -101,7 +101,7 @@ module.exports = function (privileges) {
((!post.topic.deleted && !post.deleted) || canViewDeleted[post.topic.cid] || results.isAdmin); ((!post.topic.deleted && !post.deleted) || canViewDeleted[post.topic.cid] || results.isAdmin);
}).map(post => post.pid); }).map(post => post.pid);
const data = await plugins.fireHook('filter:privileges.posts.filter', { const data = await plugins.hooks.fire('filter:privileges.posts.filter', {
privilege: privilege, privilege: privilege,
uid: uid, uid: uid,
pids: pids, pids: pids,
@ -144,7 +144,7 @@ module.exports = function (privileges) {
results.pid = parseInt(pid, 10); results.pid = parseInt(pid, 10);
results.uid = uid; results.uid = uid;
const result = await plugins.fireHook('filter:privileges.posts.edit', results); const result = await plugins.hooks.fire('filter:privileges.posts.edit', results);
return { flag: result.edit && (result.owner || result.isMod), message: '[[error:no-privileges]]' }; return { flag: result.edit && (result.owner || result.isMod), message: '[[error:no-privileges]]' };
}; };

@ -34,7 +34,7 @@ module.exports = function (privileges) {
const editable = isAdminOrMod; const editable = isAdminOrMod;
const deletable = (privData['topics:delete'] && (isOwner || isModerator)) || isAdministrator; const deletable = (privData['topics:delete'] && (isOwner || isModerator)) || isAdministrator;
return await plugins.fireHook('filter:privileges.topics.get', { return await plugins.hooks.fire('filter:privileges.topics.get', {
'topics:reply': (privData['topics:reply'] && ((!topicData.locked && !topicData.deleted) || isModerator)) || isAdministrator, 'topics:reply': (privData['topics:reply'] && ((!topicData.locked && !topicData.deleted) || isModerator)) || isAdministrator,
'topics:read': privData['topics:read'] || isAdministrator, 'topics:read': privData['topics:read'] || isAdministrator,
'topics:tag': privData['topics:tag'] || isAdministrator, 'topics:tag': privData['topics:tag'] || isAdministrator,
@ -78,7 +78,7 @@ module.exports = function (privileges) {
tids = topicsData.filter(t => cidsSet.has(t.cid) && (!t.deleted || canViewDeleted[t.cid] || results.isAdmin)).map(t => t.tid); tids = topicsData.filter(t => cidsSet.has(t.cid) && (!t.deleted || canViewDeleted[t.cid] || results.isAdmin)).map(t => t.tid);
const data = await plugins.fireHook('filter:privileges.topics.filter', { const data = await plugins.hooks.fire('filter:privileges.topics.filter', {
privilege: privilege, privilege: privilege,
uid: uid, uid: uid,
tids: tids, tids: tids,

@ -64,7 +64,7 @@ module.exports = function (privileges) {
} }
async function filterIsModerator(cid, uid, isModerator) { async function filterIsModerator(cid, uid, isModerator) {
const data = await plugins.fireHook('filter:user.isModerator', { uid: uid, cid: cid, isModerator: isModerator }); const data = await plugins.hooks.fire('filter:user.isModerator', { uid: uid, cid: cid, isModerator: isModerator });
if ((Array.isArray(uid) || Array.isArray(cid)) && !Array.isArray(data.isModerator)) { if ((Array.isArray(uid) || Array.isArray(cid)) && !Array.isArray(data.isModerator)) {
throw new Error('filter:user.isModerator - i/o mismatch'); throw new Error('filter:user.isModerator - i/o mismatch');
} }
@ -82,7 +82,7 @@ module.exports = function (privileges) {
privileges.users.isAdministrator(uid), privileges.users.isAdministrator(uid),
]); ]);
const data = await plugins.fireHook('filter:user.canEdit', { const data = await plugins.hooks.fire('filter:user.canEdit', {
isAdmin: isAdmin, isAdmin: isAdmin,
isGlobalMod: isGlobalMod, isGlobalMod: isGlobalMod,
isTargetAdmin: isTargetAdmin, isTargetAdmin: isTargetAdmin,
@ -99,7 +99,7 @@ module.exports = function (privileges) {
privileges.users.isAdministrator(uid), privileges.users.isAdministrator(uid),
]); ]);
const data = await plugins.fireHook('filter:user.canBanUser', { const data = await plugins.hooks.fire('filter:user.canBanUser', {
canBan: canBan && !isTargetAdmin, canBan: canBan && !isTargetAdmin,
callerUid: callerUid, callerUid: callerUid,
uid: uid, uid: uid,
@ -114,7 +114,7 @@ module.exports = function (privileges) {
const privilegeName = privilege.split('-').map(word => word.slice(0, 1).toUpperCase() + word.slice(1)).join(''); const privilegeName = privilege.split('-').map(word => word.slice(0, 1).toUpperCase() + word.slice(1)).join('');
let payload = { uid }; let payload = { uid };
payload[`can${privilegeName}`] = await privileges.global.can(privilege, uid); payload[`can${privilegeName}`] = await privileges.global.can(privilege, uid);
payload = await plugins.fireHook(`filter:user.has${privilegeName}Privilege`, payload); payload = await plugins.hooks.fire(`filter:user.has${privilegeName}Privilege`, payload);
return payload[`can${privilegeName}`]; return payload[`can${privilegeName}`];
} }
}; };

@ -37,9 +37,9 @@ rewards.delete = async function (data) {
rewards.get = async function () { rewards.get = async function () {
return await utils.promiseParallel({ return await utils.promiseParallel({
active: getActiveRewards(), active: getActiveRewards(),
conditions: plugins.fireHook('filter:rewards.conditions', []), conditions: plugins.hooks.fire('filter:rewards.conditions', []),
conditionals: plugins.fireHook('filter:rewards.conditionals', []), conditionals: plugins.hooks.fire('filter:rewards.conditionals', []),
rewards: plugins.fireHook('filter:rewards.rewards', []), rewards: plugins.hooks.fire('filter:rewards.rewards', []),
}); });
}; };

@ -64,7 +64,7 @@ async function checkCondition(reward, method) {
method = util.promisify(method); method = util.promisify(method);
} }
const value = await method(); const value = await method();
const bool = await plugins.fireHook('filter:rewards.checkConditional:' + reward.conditional, { left: value, right: reward.value }); const bool = await plugins.hooks.fire('filter:rewards.checkConditional:' + reward.conditional, { left: value, right: reward.value });
return bool; return bool;
} }
@ -72,7 +72,7 @@ async function giveRewards(uid, rewards) {
const rewardData = await getRewardsByRewardData(rewards); const rewardData = await getRewardsByRewardData(rewards);
for (let i = 0; i < rewards.length; i++) { for (let i = 0; i < rewards.length; i++) {
/* eslint-disable no-await-in-loop */ /* eslint-disable no-await-in-loop */
await plugins.fireHook('action:rewards.award:' + rewards[i].rid, { uid: uid, reward: rewardData[i] }); await plugins.hooks.fire('action:rewards.award:' + rewards[i].rid, { uid: uid, reward: rewardData[i] });
await db.sortedSetIncrBy('uid:' + uid + ':rewards', 1, rewards[i].id); await db.sortedSetIncrBy('uid:' + uid + ':rewards', 1, rewards[i].id);
} }
} }

@ -79,9 +79,9 @@ Auth.reloadRoutes = async function (params) {
const router = params.router; const router = params.router;
// Local Logins // Local Logins
if (plugins.hasListeners('action:auth.overrideLogin')) { if (plugins.hooks.hasListeners('action:auth.overrideLogin')) {
winston.warn('[authentication] Login override detected, skipping local login strategy.'); winston.warn('[authentication] Login override detected, skipping local login strategy.');
plugins.fireHook('action:auth.overrideLogin'); plugins.hooks.fire('action:auth.overrideLogin');
} else { } else {
passport.use(new passportLocal({ passReqToCallback: true }, controllers.authentication.localLogin)); passport.use(new passportLocal({ passReqToCallback: true }, controllers.authentication.localLogin));
} }
@ -91,7 +91,7 @@ Auth.reloadRoutes = async function (params) {
// Additional logins via SSO plugins // Additional logins via SSO plugins
try { try {
loginStrategies = await plugins.fireHook('filter:auth.init', loginStrategies); loginStrategies = await plugins.hooks.fire('filter:auth.init', loginStrategies);
} catch (err) { } catch (err) {
winston.error('[authentication] ' + err.stack); winston.error('[authentication] ' + err.stack);
} }

@ -48,7 +48,7 @@ Write.reload = async (params) => {
* `/api/v3/plugins`. * `/api/v3/plugins`.
*/ */
const pluginRouter = require('express').Router(); const pluginRouter = require('express').Router();
await plugins.fireHook('static:api.routes', { await plugins.hooks.fire('static:api.routes', {
router: pluginRouter, router: pluginRouter,
middleware, middleware,
helpers, helpers,

@ -43,7 +43,7 @@ async function searchInContent(data) {
async function doSearch(type, searchIn) { async function doSearch(type, searchIn) {
if (searchIn.includes(data.searchIn)) { if (searchIn.includes(data.searchIn)) {
return await plugins.fireHook('filter:search.query', { return await plugins.hooks.fire('filter:search.query', {
index: type, index: type,
content: data.query, content: data.query,
matchWords: data.matchWords || 'all', matchWords: data.matchWords || 'all',
@ -70,7 +70,7 @@ async function searchInContent(data) {
allPids = await privileges.posts.filter('topics:read', allPids, data.uid); allPids = await privileges.posts.filter('topics:read', allPids, data.uid);
allPids = await filterAndSort(allPids, data); allPids = await filterAndSort(allPids, data);
const metadata = await plugins.fireHook('filter:search.inContent', { const metadata = await plugins.hooks.fire('filter:search.inContent', {
pids: allPids, pids: allPids,
}); });
@ -87,13 +87,13 @@ async function searchInContent(data) {
} }
returnData.posts = await posts.getPostSummaryByPids(metadata.pids, data.uid, {}); returnData.posts = await posts.getPostSummaryByPids(metadata.pids, data.uid, {});
await plugins.fireHook('filter:search.contentGetResult', { result: returnData, data: data }); await plugins.hooks.fire('filter:search.contentGetResult', { result: returnData, data: data });
delete metadata.pids; delete metadata.pids;
return Object.assign(returnData, metadata); return Object.assign(returnData, metadata);
} }
async function filterAndSort(pids, data) { async function filterAndSort(pids, data) {
if (data.sortBy === 'relevance' && !data.replies && !data.timeRange && !data.hasTags && !plugins.hasListeners('filter:search.filterAndSort')) { if (data.sortBy === 'relevance' && !data.replies && !data.timeRange && !data.hasTags && !plugins.hooks.hasListeners('filter:search.filterAndSort')) {
return pids; return pids;
} }
let postsData = await getMatchedPosts(pids, data); let postsData = await getMatchedPosts(pids, data);
@ -108,7 +108,7 @@ async function filterAndSort(pids, data) {
sortPosts(postsData, data); sortPosts(postsData, data);
const result = await plugins.fireHook('filter:search.filterAndSort', { pids: pids, posts: postsData, data: data }); const result = await plugins.hooks.fire('filter:search.filterAndSort', { pids: pids, posts: postsData, data: data });
return result.posts.map(post => post && post.pid); return result.posts.map(post => post && post.pid);
} }

@ -54,7 +54,7 @@ sitemap.getPages = async function () {
priority: 0.4, priority: 0.4,
}]; }];
const data = await plugins.fireHook('filter:sitemap.getPages', { urls: urls }); const data = await plugins.hooks.fire('filter:sitemap.getPages', { urls: urls });
const smStream = new SitemapStream({ hostname: nconf.get('url') }); const smStream = new SitemapStream({ hostname: nconf.get('url') });
data.urls.forEach(url => smStream.write(url)); data.urls.forEach(url => smStream.write(url));

@ -24,7 +24,7 @@ social.getPostSharing = async function () {
class: 'fa-twitter', class: 'fa-twitter',
}, },
]; ];
networks = await plugins.fireHook('filter:social.posts', networks); networks = await plugins.hooks.fire('filter:social.posts', networks);
const activated = await db.getSetMembers('social:posts.activated'); const activated = await db.getSetMembers('social:posts.activated');
networks.forEach(function (network) { networks.forEach(function (network) {
network.activated = activated.includes(network.id); network.activated = activated.includes(network.id);

@ -31,7 +31,7 @@ Categories.getAll = async function () {
'color', 'bgColor', 'backgroundImage', 'imageClass', 'color', 'bgColor', 'backgroundImage', 'imageClass',
]; ];
const categoriesData = await categories.getCategoriesFields(cids, fields); const categoriesData = await categories.getCategoriesFields(cids, fields);
const result = await plugins.fireHook('filter:admin.categories.get', { categories: categoriesData, fields: fields }); const result = await plugins.hooks.fire('filter:admin.categories.get', { categories: categoriesData, fields: fields });
return categories.getTree(result.categories, 0); return categories.getTree(result.categories, 0);
}; };

@ -38,7 +38,7 @@ Config.setMultiple = async function (socket, data) {
key: field, key: field,
value: data[field], value: data[field],
}; };
plugins.fireHook('action:config.set', setting); plugins.hooks.fire('action:config.set', setting);
logger.monitorConfig({ io: index.server }, setting); logger.monitorConfig({ io: index.server }, setting);
} }
} }

@ -48,7 +48,7 @@ async function notifyUids(uid, uids, type, result) {
uids = filterTidCidIgnorers(watchStateUids, watchStates); uids = filterTidCidIgnorers(watchStateUids, watchStates);
uids = await user.blocks.filterUids(uid, uids); uids = await user.blocks.filterUids(uid, uids);
uids = await user.blocks.filterUids(post.topic.uid, uids); uids = await user.blocks.filterUids(post.topic.uid, uids);
const data = await plugins.fireHook('filter:sockets.sendNewPostToUids', { uidsTo: uids, uidFrom: uid, type: type }); const data = await plugins.hooks.fire('filter:sockets.sendNewPostToUids', { uidsTo: uids, uidFrom: uid, type: type });
post.ip = undefined; post.ip = undefined;

@ -179,7 +179,7 @@ async function validateSession(socket) {
if (!sessionData) { if (!sessionData) {
throw new Error('[[error:invalid-session]]'); throw new Error('[[error:invalid-session]]');
} }
const result = await plugins.fireHook('static:sockets.validateSession', { const result = await plugins.hooks.fire('static:sockets.validateSession', {
req: req, req: req,
socket: socket, socket: socket,
session: sessionData, session: sessionData,

@ -71,7 +71,7 @@ SocketModules.chats.send = async function (socket, data) {
if (!canChat) { if (!canChat) {
throw new Error('[[error:no-privileges]]'); throw new Error('[[error:no-privileges]]');
} }
const results = await plugins.fireHook('filter:messaging.send', { const results = await plugins.hooks.fire('filter:messaging.send', {
data: data, data: data,
uid: socket.uid, uid: socket.uid,
}); });

@ -67,7 +67,7 @@ SocketPosts.getRawPost = async function (socket, pid) {
throw new Error('[[error:no-post]]'); throw new Error('[[error:no-post]]');
} }
postData.pid = pid; postData.pid = pid;
const result = await plugins.fireHook('filter:post.getRawPost', { uid: socket.uid, postData: postData }); const result = await plugins.hooks.fire('filter:post.getRawPost', { uid: socket.uid, postData: postData });
return result.postData.content; return result.postData.content;
}; };
@ -182,7 +182,7 @@ SocketPosts.editQueuedContent = async function (socket, data) {
} }
await posts.editQueuedContent(socket.uid, data); await posts.editQueuedContent(socket.uid, data);
if (data.content) { if (data.content) {
return await plugins.fireHook('filter:parse.post', { postData: data }); return await plugins.hooks.fire('filter:parse.post', { postData: data });
} }
return { postData: data }; return { postData: data };
}; };

@ -29,7 +29,7 @@ module.exports = function (SocketPosts) {
canFlag: privileges.posts.canFlag(data.pid, socket.uid), canFlag: privileges.posts.canFlag(data.pid, socket.uid),
flagged: flags.exists('post', data.pid, socket.uid), // specifically, whether THIS calling user flagged flagged: flags.exists('post', data.pid, socket.uid), // specifically, whether THIS calling user flagged
bookmarked: posts.hasBookmarked(data.pid, socket.uid), bookmarked: posts.hasBookmarked(data.pid, socket.uid),
tools: plugins.fireHook('filter:post.tools', { pid: data.pid, uid: socket.uid, tools: [] }), tools: plugins.hooks.fire('filter:post.tools', { pid: data.pid, uid: socket.uid, tools: [] }),
postSharing: social.getActivePostSharing(), postSharing: social.getActivePostSharing(),
history: posts.diffs.exists(data.pid), history: posts.diffs.exists(data.pid),
canViewInfo: privileges.global.can('view:users:info', socket.uid), canViewInfo: privileges.global.can('view:users:info', socket.uid),

@ -27,7 +27,7 @@ module.exports = function (SocketTopics) {
throw new Error('[[error:no-privileges]]'); throw new Error('[[error:no-privileges]]');
} }
topicData.privileges = userPrivileges; topicData.privileges = userPrivileges;
const result = await plugins.fireHook('filter:topic.thread_tools', { topic: topicData, uid: socket.uid, tools: [] }); const result = await plugins.hooks.fire('filter:topic.thread_tools', { topic: topicData, uid: socket.uid, tools: [] });
result.topic.thread_tools = result.tools; result.topic.thread_tools = result.tools;
return result.topic; return result.topic;
}; };

@ -100,7 +100,7 @@ SocketUser.reset.commit = async function (socket, data) {
const [uid] = await Promise.all([ const [uid] = await Promise.all([
db.getObjectField('reset:uid', data.code), db.getObjectField('reset:uid', data.code),
user.reset.commit(data.code, data.password), user.reset.commit(data.code, data.password),
plugins.fireHook('action:password.reset', { uid: socket.uid }), plugins.hooks.fire('action:password.reset', { uid: socket.uid }),
]); ]);
await events.log({ await events.log({

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save