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

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

@ -41,7 +41,7 @@ Analytics.init = async function () {
Analytics.increment = function (keys, callback) {
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) {
counters[key] = counters[key] || 0;

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

@ -128,7 +128,7 @@ usersAPI.changePassword = async function (caller, data) {
usersAPI.follow = async function (caller, data) {
await user.follow(caller.uid, data.uid);
plugins.fireHook('action:user.follow', {
plugins.hooks.fire('action:user.follow', {
fromUid: caller.uid,
toUid: data.uid,
});
@ -151,7 +151,7 @@ usersAPI.follow = async function (caller, data) {
usersAPI.unfollow = async function (caller, data) {
await user.unfollow(caller.uid, data.uid);
plugins.fireHook('action:user.unfollow', {
plugins.hooks.fire('action:user.unfollow', {
fromUid: caller.uid,
toUid: data.uid,
});
@ -185,7 +185,7 @@ usersAPI.ban = async function (caller, data) {
ip: caller.ip,
reason: data.reason || undefined,
});
plugins.fireHook('action:user.banned', {
plugins.hooks.fire('action:user.banned', {
callerUid: caller.uid,
ip: caller.ip,
uid: data.uid,
@ -207,7 +207,7 @@ usersAPI.unban = async function (caller, data) {
targetUid: data.uid,
ip: caller.ip,
});
plugins.fireHook('action:user.unbanned', {
plugins.hooks.fire('action:user.unbanned', {
callerUid: caller.uid,
ip: caller.ip,
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' });
plugins.fireHook('action:user.delete', {
plugins.hooks.fire('action:user.delete', {
callerUid: caller.uid,
uid: uid,
ip: caller.ip,

@ -45,7 +45,7 @@ module.exports = function (Categories) {
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;
@ -86,7 +86,7 @@ module.exports = function (Categories) {
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;
};
@ -170,7 +170,7 @@ module.exports = function (Categories) {
Categories.copyPrivilegesFrom = async function (fromCid, toCid, 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(),
fromCid: fromCid,
toCid: toCid,

@ -20,7 +20,7 @@ module.exports = function (Categories) {
const keys = cids.map(cid => 'category:' + cid);
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,
categories: categories,
fields: fields,

@ -22,7 +22,7 @@ module.exports = function (Categories) {
await topics.purgePostsAndTopic(tid, uid);
});
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) {

@ -59,7 +59,7 @@ Categories.getCategoryById = async function (data) {
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;
};

@ -36,7 +36,7 @@ module.exports = function (Categories) {
if (numRecentReplies > 0) {
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) {
@ -68,8 +68,8 @@ module.exports = function (Categories) {
}
const categoriesToLoad = categoryData.filter(c => c && c.numRecentReplies && parseInt(c.numRecentReplies, 10) > 0);
let keys = [];
if (plugins.hasListeners('filter:categories.getRecentTopicReplies')) {
const result = await plugins.fireHook('filter:categories.getRecentTopicReplies', {
if (plugins.hooks.hasListeners('filter:categories.getRecentTopicReplies')) {
const result = await plugins.hooks.fire('filter:categories.getRecentTopicReplies', {
categories: categoriesToLoad,
uid: uid,
query: query,

@ -8,7 +8,7 @@ const user = require('../user');
module.exports = function (Categories) {
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);
let topicsData = await topics.getTopicsByTids(tids, data.uid);
topicsData = await user.blocks.filter(data.uid, topicsData);
@ -18,7 +18,7 @@ module.exports = function (Categories) {
}
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 };
};
@ -43,8 +43,8 @@ module.exports = function (Categories) {
return pinnedTidsOnPage;
}
if (plugins.hasListeners('filter:categories.getTopicIds')) {
const result = await plugins.fireHook('filter:categories.getTopicIds', {
if (plugins.hooks.hasListeners('filter:categories.getTopicIds')) {
const result = await plugins.hooks.fire('filter:categories.getTopicIds', {
tids: [],
data: data,
pinnedTids: pinnedTidsOnPage,
@ -74,8 +74,8 @@ module.exports = function (Categories) {
};
Categories.getTopicCount = async function (data) {
if (plugins.hasListeners('filter:categories.getTopicCount')) {
const result = await plugins.fireHook('filter:categories.getTopicCount', {
if (plugins.hooks.hasListeners('filter:categories.getTopicCount')) {
const result = await plugins.hooks.fire('filter:categories.getTopicCount', {
topicCount: data.category.topic_count,
data: data,
});
@ -112,7 +112,7 @@ module.exports = function (Categories) {
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,
data: data,
});
@ -122,7 +122,7 @@ module.exports = function (Categories) {
Categories.getSortedSetRangeDirection = async function (sort) {
sort = sort || 'newest_to_oldest';
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,
direction: direction,
});
@ -134,8 +134,8 @@ module.exports = function (Categories) {
};
Categories.getPinnedTids = async function (data) {
if (plugins.hasListeners('filter:categories.getPinnedTids')) {
const result = await plugins.fireHook('filter:categories.getPinnedTids', {
if (plugins.hooks.hasListeners('filter:categories.getPinnedTids')) {
const result = await plugins.hooks.fire('filter:categories.getPinnedTids', {
pinnedTids: [],
data: data,
});

@ -27,7 +27,7 @@ module.exports = function (Categories) {
const translated = await translator.translate(modifiedFields.name);
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;
var fields = Object.keys(category);
@ -40,7 +40,7 @@ module.exports = function (Categories) {
await async.eachSeries(fields, async function (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) {
@ -92,7 +92,7 @@ module.exports = function (Categories) {
}
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);
};
};

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

@ -19,7 +19,7 @@ blocksController.getBlocks = async function (req, res, next) {
return next();
}
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,
uid: userData.uid,
start: start,

@ -112,7 +112,7 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID) {
userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%'));
userData['username:disableEdit'] = !userData.isAdmin && meta.config['username: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;
};
@ -128,7 +128,7 @@ async function getAllData(uid, callerUID) {
ips: user.getIPs(uid, 4),
profile_menu: getProfileMenu(uid, callerUID),
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),
canBanUser: privileges.users.canBanUser(callerUID, uid),
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,
callerUID: callerUID,
links: links,
@ -197,7 +197,7 @@ async function parseAboutMe(userData) {
return;
}
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);
}

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

@ -33,7 +33,7 @@ settingsController.get = async function (req, res, next) {
userData.acpLanguages = _.cloneDeep(languagesData);
}
const data = await plugins.fireHook('filter:user.customSettings', {
const data = await plugins.hooks.fire('filter:user.customSettings', {
settings: settings,
customSettings: [],
uid: req.uid,
@ -110,7 +110,7 @@ settingsController.get = async function (req, res, next) {
userData.hideFullname = meta.config.hideFullname || 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.maxPostsPerPage = meta.config.maxPostsPerPage;
@ -191,7 +191,7 @@ async function getNotificationSettings(userData) {
if (privileges.isAdmin || privileges.isGlobalMod) {
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(),
privilegedTypes: privilegedTypes,
});

@ -27,7 +27,7 @@ categoriesController.get = async function (req, res, next) {
});
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,
res: res,
category: category,
@ -53,7 +53,7 @@ categoriesController.getAll = async function (req, res) {
'color', 'bgColor', 'backgroundImage', 'imageClass',
];
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);
res.render('admin/manage/categories', {
categories: tree,

@ -47,7 +47,7 @@ async function getNotices() {
notDoneText: '[[admin/dashboard:restart-required]]',
},
{
done: plugins.hasListeners('filter:search.query'),
done: plugins.hooks.hasListeners('filter:search.query'),
doneText: '[[admin/dashboard:search-plugin-installed]]',
notDoneText: '[[admin/dashboard:search-plugin-not-installed]]',
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() {

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

@ -189,7 +189,7 @@ usersController.registrationQueue = async function (req, res) {
const data = await utils.promiseParallel({
registrationQueueCount: db.sortedSetCard('registration:queue'),
users: user.getRegistrationQueue(start, stop),
customHeaders: plugins.fireHook('filter:admin.registrationQueue.customHeaders', { headers: [] }),
customHeaders: plugins.hooks.fire('filter:admin.registrationQueue.customHeaders', { headers: [] }),
invites: getInvites(),
});
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',
categoryTopicSort: meta.config.categoryTopicSort || 'newest_to_oldest',
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 || '',
enablePostHistory: meta.config.enablePostHistory === 1,
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.topicSearchEnabled = settings.topicSearchEnabled || false;
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;
};

@ -22,7 +22,7 @@ const sockets = require('../socket.io');
const authenticationController = module.exports;
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,
interstitials: [],
});
@ -45,7 +45,7 @@ async function registerAndLoginUser(req, res, userData) {
return;
}
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) {
return await addToApprovalQueue(req, userData);
}
@ -61,7 +61,7 @@ async function registerAndLoginUser(req, res, userData) {
}
await user.deleteInvitationKey(userData.email);
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;
return complete;
}
@ -105,7 +105,7 @@ authenticationController.register = async function (req, res) {
user.isPasswordValid(userData.password);
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);
if (data) {
@ -137,7 +137,7 @@ async function addToApprovalQueue(req, userData) {
authenticationController.registerComplete = function (req, res, next) {
// 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,
interstitials: [],
}, function (err, data) {
@ -217,14 +217,14 @@ authenticationController.registerAbort = function (req, res) {
};
authenticationController.login = function (req, res, next) {
if (plugins.hasListeners('action:auth.overrideLogin')) {
if (plugins.hooks.hasListeners('action:auth.overrideLogin')) {
return continueLogin(req, res, next);
}
var loginWith = meta.config.allowLoginWith || 'username-email';
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) {
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
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) {
req.session.destroy();
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 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
sockets.in('sess_' + sessionID).emit('checkSession', 0);
const payload = {
next: nconf.get('relative_path') + '/',
};
plugins.fireHook('filter:user.logout', payload);
plugins.hooks.fire('filter:user.logout', payload);
if (req.body.noscript === 'true') {
return res.redirect(payload.next);

@ -15,7 +15,7 @@ exports.get = async function (req, res, callback) {
content: 'noindex',
};
const data = await plugins.fireHook('filter:composer.build', {
const data = await plugins.hooks.fire('filter:composer.build', {
req: req,
res: res,
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,
}, function (_err, data) {
if (_err) {

@ -116,7 +116,7 @@ helpers.buildTerms = function (url, term, query) {
};
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,
res: res,
error: error,
@ -336,7 +336,7 @@ helpers.getHomePageRoutes = async function (uid) {
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;
};

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

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

@ -30,8 +30,8 @@ modsController.flags.list = async function (req, res, next) {
const results = await Promise.all([
user.isAdminOrGlobalMod(req.uid),
user.getModeratedCids(req.uid),
plugins.fireHook('filter:flags.validateFilters', { filters: validFilters }),
plugins.fireHook('filter:flags.validateSort', { sorts: validSorts }),
plugins.hooks.fire('filter:flags.validateFilters', { filters: validFilters }),
plugins.hooks.fire('filter:flags.validateSort', { sorts: validSorts }),
]);
const [isAdminOrGlobalMod, moderatedCids,, { sorts }] = results;
let [,, { filters }] = results;
@ -226,7 +226,7 @@ modsController.postQueue = async function (req, res, next) {
(!categoriesData.selectedCids.length || categoriesData.selectedCids.includes(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,
req: req,
}));
@ -281,6 +281,6 @@ async function addMetaData(postData) {
postData.topic = await topics.getTopicFields(postData.data.tid, ['title', '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;
}

@ -7,7 +7,7 @@ const plugins = require('../plugins');
const meta = require('../meta');
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());
} else {
next();

@ -15,7 +15,7 @@ const helpers = require('./helpers');
const searchController = module.exports;
searchController.search = async function (req, res, next) {
if (!plugins.hasListeners('filter:search.query')) {
if (!plugins.hooks.hasListeners('filter:search.query')) {
return next();
}
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) {
if (plugins.hasListeners('filter:unread.categories')) {
return await plugins.fireHook('filter:unread.categories', { uid: uid, cid: cid });
if (plugins.hooks.hasListeners('filter:unread.categories')) {
return await plugins.hooks.fire('filter:unread.categories', { uid: uid, cid: cid });
}
const states = [categories.watchStates.watching];
if (filter === 'watched') {

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

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

@ -79,7 +79,7 @@ events.log = async function (data) {
], data.timestamp, eid),
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) {

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

@ -40,7 +40,7 @@ module.exports = function (Groups) {
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.setObject('group:' + groupData.name, groupData);
@ -61,7 +61,7 @@ module.exports = function (Groups) {
await db.setObjectField('groupslug:groupname', groupData.slug, 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;
};

@ -36,7 +36,7 @@ module.exports = function (Groups) {
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;
};
@ -61,7 +61,7 @@ module.exports = function (Groups) {
Groups.setGroupField = async function (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),
]);
Groups.cache.reset();
plugins.fireHook('action:groups.destroy', { groups: groupsData });
plugins.hooks.fire('action:groups.destroy', { groups: groupsData });
};
async function removeGroupsFromPrivilegeGroups(groupNames) {

@ -135,7 +135,7 @@ Groups.get = async function (groupName, options) {
if (!groupData) {
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.categories = selectCategories.map((category) => {
category.selected = groupData.memberPostCids.includes(category.cid);
@ -149,7 +149,7 @@ Groups.get = async function (groupName, options) {
groupData.isPending = isPending;
groupData.isInvited = isInvited;
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;
};
@ -194,7 +194,7 @@ Groups.getOwnersAndMembers = async function (groupName, uid, start, stop) {
}
}
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,
uid: uid,
start: start,

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

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

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

@ -24,7 +24,7 @@ module.exports = function (Groups) {
Groups.ownership.grant = async function (toUid, groupName) {
// Note: No ownership checking is done here on purpose!
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) {
@ -35,6 +35,6 @@ module.exports = function (Groups) {
throw new Error('[[error:group-needs-owner]]');
}
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]]');
}
({ values } = await plugins.fireHook('filter:group.update', {
({ values } = await plugins.hooks.fire('filter:group.update', {
groupName: groupName,
values: values,
}));
@ -75,7 +75,7 @@ module.exports = function (Groups) {
await db.setObject('group:' + groupName, payload);
await Groups.renameGroup(groupName, values.name);
plugins.fireHook('action:group.update', {
plugins.hooks.fire('action:group.update', {
name: groupName,
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:visible:name'], oldName.toLowerCase() + ':' + oldName, newName.toLowerCase() + ':' + newName);
plugins.fireHook('action:group.rename', {
plugins.hooks.fire('action:group.rename', {
old: oldName,
new: newName,
});

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

@ -24,7 +24,7 @@ module.exports = function (Messaging) {
const maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000;
content = String(content).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) {
throw new Error('[[error:invalid-chat-message]]');
}
@ -49,7 +49,7 @@ module.exports = function (Messaging) {
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);
const isNewSet = await Messaging.isNewSet(data.uid, data.roomId, timestamp);
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].mid = mid;
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];
};

@ -121,7 +121,7 @@ module.exports = function (Messaging) {
messages = [];
}
const data = await plugins.fireHook('filter:messaging.getMessages', {
const data = await plugins.hooks.fire('filter:messaging.getMessages', {
messages: messages,
uid: uid,
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,
message: message,
fields: fields,

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

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

@ -19,7 +19,7 @@ module.exports = function (Messaging) {
message: messageObj,
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) {
return;
}

@ -61,7 +61,7 @@ module.exports = function (Messaging) {
Messaging.isUserInRoom = async (uid, roomId) => {
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;
};
@ -185,7 +185,7 @@ module.exports = function (Messaging) {
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,
roomId: roomId,
newName: newName,
@ -198,7 +198,7 @@ module.exports = function (Messaging) {
await db.setObjectField('chat:room:' + payload.roomId, 'roomName', payload.newName);
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,
newName: payload.newName,
});
@ -206,7 +206,7 @@ module.exports = function (Messaging) {
Messaging.canReply = async (roomId, 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;
};

@ -74,7 +74,7 @@ Blacklist.test = async function (clientIp) {
) {
try {
// 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) {
analytics.increment('blacklist');
throw err;

@ -150,7 +150,7 @@ Configs.remove = async function (field) {
};
Configs.registerHooks = () => {
plugins.registerHook('core', {
plugins.hooks.register('core', {
hook: 'filter:settings.set',
method: async ({ plugin, settings, quiet }) => {
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',
method: async ({ plugin, values }) => {
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);
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) {
await db.delete('settings:' + hash + ':sorted-lists');
@ -87,7 +87,7 @@ Settings.set = async function (hash, values, quiet) {
cache.del('settings:' + hash);
plugins.fireHook('action:settings.set', {
plugins.hooks.fire('action:settings.set', {
plugin: hash,
settings: values,
});

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

@ -36,7 +36,7 @@ middleware.renderHeader = async (req, res, data) => {
const results = await utils.promiseParallel({
userData: user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed']),
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(),
latestVersion: getLatestVersion(),
privileges: privileges.admin.get(req.uid),
@ -83,7 +83,7 @@ middleware.renderHeader = async (req, res, data) => {
};
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 { src: script };
});

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

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

@ -33,10 +33,10 @@ module.exports = function (middleware) {
options.url = (req.baseUrl + req.path.replace(/^\/api/, ''));
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 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._header = {
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,
res: res,
next: function () {}, // no-op for backwards compatibility

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

@ -38,7 +38,7 @@ Notifications.privilegedTypes = [
];
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(),
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
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) {
return;
}
@ -227,7 +227,7 @@ async function pushToUids(uids, notification) {
sendNotification(results.uidsToNotify),
sendEmail(results.uidsToEmail),
]);
plugins.fireHook('action:notification.pushed', {
plugins.hooks.fire('action:notification.pushed', {
notification: notification,
uids: results.uidsToNotify,
uidsNotified: results.uidsToNotify,
@ -419,7 +419,7 @@ Notifications.merge = async function (notifications) {
return notifications;
}, notifications);
const data = await plugins.fireHook('filter:notifications.merge', {
const data = await plugins.hooks.fire('filter:notifications.merge', {
notifications: notifications,
});
return data && data.notifications;

@ -3,211 +3,213 @@
const winston = require('winston');
const async = require('async');
const utils = require('../utils');
const plugins = require('.');
module.exports = function (Plugins) {
Plugins.deprecatedHooks = {
'filter:privileges:isUserAllowedTo': 'filter:privileges:isAllowedTo', // 👋 @ 1.16.0
'filter:router.page': 'response:router.page', // 👋 @ 2.0.0
};
Plugins.internals = {
_register: function (data) {
Plugins.loadedHooks[data.hook] = Plugins.loadedHooks[data.hook] || [];
Plugins.loadedHooks[data.hook].push(data);
},
};
const hookTypeToMethod = {
filter: fireFilterHook,
action: fireActionHook,
static: fireStaticHook,
response: fireResponseHook,
};
/*
`data` is an object consisting of (* is required):
`data.hook`*, the name of the NodeBB hook
`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)
*/
Plugins.registerHook = function (id, data) {
if (!data.hook || !data.method) {
winston.warn('[plugins/' + id + '] registerHook called with invalid data.hook/method', data);
return;
}
const Hooks = {};
module.exports = Hooks;
// `hasOwnProperty` needed for hooks with no alternative (set to null)
if (Plugins.deprecatedHooks.hasOwnProperty(data.hook)) {
const deprecated = Plugins.deprecatedHooks[data.hook];
Hooks.deprecatedHooks = {
'filter:privileges:isUserAllowedTo': 'filter:privileges:isAllowedTo', // 👋 @ 1.16.0
'filter:router.page': 'response:router.page', // 👋 @ 2.0.0
};
if (deprecated) {
winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, please use "${deprecated}" instead.`);
} else {
winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, there is no alternative.`);
}
}
Hooks.internals = {
_register: function (data) {
plugins.loadedHooks[data.hook] = plugins.loadedHooks[data.hook] || [];
plugins.loadedHooks[data.hook].push(data);
},
};
data.id = id;
if (!data.priority) {
data.priority = 10;
}
const hookTypeToMethod = {
filter: fireFilterHook,
action: fireActionHook,
static: fireStaticHook,
response: fireResponseHook,
};
if (Array.isArray(data.method) && data.method.every(method => typeof method === 'function' || typeof method === 'string')) {
// Go go gadget recursion!
data.method.forEach(function (method) {
const singularData = { ...data, method: method };
Plugins.registerHook(id, singularData);
});
} else if (typeof data.method === 'string' && data.method.length > 0) {
const method = data.method.split('.').reduce(function (memo, prop) {
if (memo && memo[prop]) {
return memo[prop];
}
// Couldn't find method by path, aborting
return null;
}, Plugins.libraries[data.id]);
// Write the actual method reference to the hookObj
data.method = method;
Plugins.internals._register(data);
} else if (typeof data.method === 'function') {
Plugins.internals._register(data);
/*
`data` is an object consisting of (* is required):
`data.hook`*, the name of the NodeBB hook
`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)
*/
Hooks.register = function (id, data) {
if (!data.hook || !data.method) {
winston.warn('[plugins/' + id + '] registerHook called with invalid data.hook/method', data);
return;
}
// `hasOwnProperty` needed for hooks with no alternative (set to null)
if (Hooks.deprecatedHooks.hasOwnProperty(data.hook)) {
const deprecated = Hooks.deprecatedHooks[data.hook];
if (deprecated) {
winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, please use "${deprecated}" instead.`);
} else {
winston.warn('[plugins/' + id + '] Hook method mismatch: ' + data.hook + ' => ' + data.method);
winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, there is no alternative.`);
}
};
}
Plugins.unregisterHook = function (id, hook, method) {
var hooks = Plugins.loadedHooks[hook] || [];
Plugins.loadedHooks[hook] = hooks.filter(function (hookData) {
return hookData && hookData.id !== id && hookData.method !== method;
data.id = id;
if (!data.priority) {
data.priority = 10;
}
if (Array.isArray(data.method) && data.method.every(method => typeof method === 'function' || typeof method === 'string')) {
// Go go gadget recursion!
data.method.forEach(function (method) {
const singularData = { ...data, method: method };
Hooks.register(id, singularData);
});
};
} else if (typeof data.method === 'string' && data.method.length > 0) {
const method = data.method.split('.').reduce(function (memo, prop) {
if (memo && memo[prop]) {
return memo[prop];
}
// Couldn't find method by path, aborting
return null;
}, plugins.libraries[data.id]);
// Write the actual method reference to the hookObj
data.method = method;
Hooks.internals._register(data);
} else if (typeof data.method === 'function') {
Hooks.internals._register(data);
} else {
winston.warn('[plugins/' + id + '] Hook method mismatch: ' + data.hook + ' => ' + data.method);
}
};
Plugins.fireHook = async function (hook, params) {
const hookList = Plugins.loadedHooks[hook];
const hookType = hook.split(':')[0];
if (global.env === 'development' && hook !== 'action:plugins.firehook') {
winston.verbose('[plugins/fireHook] ' + hook);
}
Hooks.unregister = function (id, hook, method) {
var hooks = plugins.loadedHooks[hook] || [];
plugins.loadedHooks[hook] = hooks.filter(function (hookData) {
return hookData && hookData.id !== id && hookData.method !== method;
});
};
if (!hookTypeToMethod[hookType]) {
winston.warn('[plugins] Unknown hookType: ' + hookType + ', hook : ' + hook);
return;
}
const result = await hookTypeToMethod[hookType](hook, hookList, params);
Hooks.fire = async function (hook, params) {
const hookList = plugins.loadedHooks[hook];
const hookType = hook.split(':')[0];
if (global.env === 'development' && hook !== 'action:plugins.fireHook') {
winston.verbose('[plugins/fireHook] ' + hook);
}
if (!hookTypeToMethod[hookType]) {
winston.warn('[plugins] Unknown hookType: ' + hookType + ', hook : ' + hook);
return;
}
const result = await hookTypeToMethod[hookType](hook, hookList, params);
if (hook !== 'action:plugins.fireHook') {
Hooks.fire('action:plugins.fireHook', { hook: hook, params: params });
}
if (result !== undefined) {
return result;
}
};
Hooks.hasListeners = function (hook) {
return !!(plugins.loadedHooks[hook] && plugins.loadedHooks[hook].length > 0);
};
async function fireFilterHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) {
return params;
}
if (hook !== 'action:plugins.firehook') {
Plugins.fireHook('action:plugins.firehook', { hook: hook, params: params });
return await async.reduce(hookList, params, function (params, hookObj, next) {
if (typeof hookObj.method !== 'function') {
if (global.env === 'development') {
winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.');
}
return next(null, params);
}
const returned = hookObj.method(params, next);
if (utils.isPromise(returned)) {
returned.then(
payload => setImmediate(next, null, payload),
err => setImmediate(next, err)
);
}
if (result !== undefined) {
return result;
});
}
async function fireActionHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) {
return;
}
for (const hookObj of hookList) {
if (typeof hookObj.method !== 'function') {
if (global.env === 'development') {
winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.');
}
} else {
/* eslint-disable no-await-in-loop */
await hookObj.method(params);
}
};
}
}
async function fireFilterHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) {
return params;
async function fireStaticHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) {
return;
}
// don't bubble errors from these hooks, so bad plugins don't stop startup
const noErrorHooks = ['static:app.load', 'static:assets.prepare', 'static:app.preload'];
await async.each(hookList, function (hookObj, next) {
if (typeof hookObj.method !== 'function') {
return next();
}
return await async.reduce(hookList, params, function (params, hookObj, next) {
if (typeof hookObj.method !== 'function') {
if (global.env === 'development') {
winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.');
}
return next(null, params);
let timedOut = false;
const timeoutId = setTimeout(function () {
winston.warn('[plugins] Callback timed out, hook \'' + hook + '\' in plugin \'' + hookObj.id + '\'');
timedOut = true;
next();
}, 5000);
const callback = (err) => {
clearTimeout(timeoutId);
if (err) {
winston.error('[plugins] Error executing \'' + hook + '\' in plugin \'' + hookObj.id + '\'');
winston.error(err.stack);
}
if (!timedOut) {
next(noErrorHooks.includes(hook) ? null : err);
}
const returned = hookObj.method(params, next);
};
try {
const returned = hookObj.method(params, callback);
if (utils.isPromise(returned)) {
returned.then(
payload => setImmediate(next, null, payload),
err => setImmediate(next, err)
payload => setImmediate(callback, null, payload),
err => setImmediate(callback, err)
);
}
});
}
async function fireActionHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) {
return;
}
for (const hookObj of hookList) {
if (typeof hookObj.method !== 'function') {
if (global.env === 'development') {
winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.');
}
} else {
/* eslint-disable no-await-in-loop */
await hookObj.method(params);
}
} catch (err) {
callback(err);
}
}
});
}
async function fireStaticHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) {
async function fireResponseHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) {
return;
}
await async.eachSeries(hookList, async (hookObj) => {
if (typeof hookObj.method !== 'function') {
if (global.env === 'development') {
winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.');
}
return;
}
// don't bubble errors from these hooks, so bad plugins don't stop startup
const noErrorHooks = ['static:app.load', 'static:assets.prepare', 'static:app.preload'];
await async.each(hookList, function (hookObj, next) {
if (typeof hookObj.method !== 'function') {
return next();
}
let timedOut = false;
const timeoutId = setTimeout(function () {
winston.warn('[plugins] Callback timed out, hook \'' + hook + '\' in plugin \'' + hookObj.id + '\'');
timedOut = true;
next();
}, 5000);
const callback = (err) => {
clearTimeout(timeoutId);
if (err) {
winston.error('[plugins] Error executing \'' + hook + '\' in plugin \'' + hookObj.id + '\'');
winston.error(err.stack);
}
if (!timedOut) {
next(noErrorHooks.includes(hook) ? null : err);
}
};
try {
const returned = hookObj.method(params, callback);
if (utils.isPromise(returned)) {
returned.then(
payload => setImmediate(callback, null, payload),
err => setImmediate(callback, err)
);
}
} catch (err) {
callback(err);
}
});
}
async function fireResponseHook(hook, hookList, params) {
if (!Array.isArray(hookList) || !hookList.length) {
// Skip remaining hooks if headers have been sent
if (params.res.headersSent) {
return;
}
await async.eachSeries(hookList, async (hookObj) => {
if (typeof hookObj.method !== 'function') {
if (global.env === 'development') {
winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.');
}
return;
}
// Skip remaining hooks if headers have been sent
if (params.res.headersSent) {
return;
}
await hookObj.method(params);
});
}
Plugins.hasListeners = function (hook) {
return !!(Plugins.loadedHooks[hook] && Plugins.loadedHooks[hook].length > 0);
};
};
await hookObj.method(params);
});
}

@ -21,9 +21,16 @@ const Plugins = module.exports;
require('./install')(Plugins);
require('./load')(Plugins);
require('./hooks')(Plugins);
require('./usage')(Plugins);
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.loadPluginInfo = Plugins.data.loadPluginInfo;
@ -138,7 +145,7 @@ Plugins.reload = async function () {
Plugins.reloadRoutes = async function (params) {
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');
};

@ -64,7 +64,7 @@ module.exports = function (Plugins) {
await db.sortedSetAdd('plugins:active', count, id);
}
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 };
};
@ -100,7 +100,7 @@ module.exports = function (Plugins) {
}
await runPackageManagerCommandAsync(type, id, version || 'latest');
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;
}

@ -160,7 +160,7 @@ module.exports = function (Plugins) {
}
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) {
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');
await Posts.setPostField(pid, 'bookmarks', postData.bookmarks);
plugins.fireHook('action:post.' + type, {
plugins.hooks.fire('action:post.' + type, {
pid: pid,
uid: uid,
owner: postData.uid,

@ -47,7 +47,7 @@ module.exports = function (Posts) {
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;
await db.setObject('post:' + postData.pid, postData);
@ -65,9 +65,9 @@ module.exports = function (Posts) {
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;
plugins.fireHook('action:post.save', { post: _.clone(result.post) });
plugins.hooks.fire('action:post.save', { post: _.clone(result.post) });
return result.post;
};

@ -17,7 +17,7 @@ module.exports = function (Posts) {
}
const keys = pids.map(pid => 'post:' + pid);
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,
posts: postData,
fields: fields,
@ -51,7 +51,7 @@ module.exports = function (Posts) {
Posts.setPostFields = async function (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) {
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, {
deleted: isDeleting ? 1 : 0,
deleterUid: isDeleting ? uid : 0,
@ -38,7 +38,7 @@ module.exports = function (Posts) {
db.sortedSetAdd('cid:' + topicData.cid + ':pids', postData.timestamp, pid),
]);
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') {
await flags.resolveFlag('post', pid, uid);
}
@ -52,7 +52,7 @@ module.exports = function (Posts) {
}
const topicData = await topics.getTopicFields(postData.tid, ['tid', 'cid', 'pinned']);
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([
deletePostFromTopicUserNotification(postData, topicData),
deletePostFromCategoryRecentPosts(postData),
@ -64,7 +64,7 @@ module.exports = function (Posts) {
Posts.uploads.dissociateAll(pid),
]);
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);
};

@ -55,7 +55,7 @@ module.exports = function (Posts) {
const post = await postDiffLoad(pid, since, uid);
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);
return result.postData;
};

@ -40,7 +40,7 @@ module.exports = function (Posts) {
editPostData.handle = data.handle;
}
const result = await plugins.fireHook('filter:post.edit', {
const result = await plugins.hooks.fire('filter:post.edit', {
req: data.req,
post: editPostData,
data: data,
@ -79,7 +79,7 @@ module.exports = function (Posts) {
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));
pubsub.publish('post:edit', String(postData.pid));
@ -134,7 +134,7 @@ module.exports = function (Posts) {
}
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,
topic: newTopicData,
data: data,
@ -147,7 +147,7 @@ module.exports = function (Posts) {
newTopicData.oldTitle = topicData.title;
newTopicData.timestamp = topicData.timestamp;
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 {
tid: tid,
cid: newTopicData.cid,

@ -48,7 +48,7 @@ Posts.getPostsByPids = async function (pids, uid) {
let posts = await Posts.getPostsData(pids);
posts = await Promise.all(posts.map(p => Posts.parsePost(p)));
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)) {
return [];
}

@ -60,7 +60,7 @@ module.exports = function (Posts) {
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);
if (data.postData.pid) {
cache.set(pid, data.postData.content);
@ -70,7 +70,7 @@ module.exports = function (Posts) {
Posts.parseSignature = async function (userData, uid) {
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) {
@ -121,11 +121,11 @@ module.exports = function (Posts) {
});
// 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 = () => {
plugins.registerHook('core', {
plugins.hooks.register('core', {
hook: 'filter:parse.post',
method: async (data) => {
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',
method: async content => Posts.sanitize(content),
});
plugins.registerHook('core', {
plugins.hooks.register('core', {
hook: 'filter:parse.aboutme',
method: async content => Posts.sanitize(content),
});
plugins.registerHook('core', {
plugins.hooks.register('core', {
hook: 'filter:parse.signature',
method: async (data) => {
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 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 result = await plugins.fireHook('filter:post.shouldQueue', {
const result = await plugins.hooks.fire('filter:post.shouldQueue', {
shouldQueue: !!shouldQueue,
uid: uid,
data: data,
@ -57,7 +57,7 @@ module.exports = function (Posts) {
type: type,
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);
await db.sortedSetAdd('post:queue', now, id);

@ -54,7 +54,7 @@ module.exports = function (Posts) {
posts = posts.filter(post => tidToTopic[post.tid]);
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;
};

@ -36,7 +36,7 @@ module.exports = function (Posts) {
const [isMemberOfGroups, signature, customProfileInfo] = await Promise.all([
checkGroupMembership(userData.uid, userData.groupTitleArray),
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) {
@ -49,7 +49,7 @@ module.exports = function (Posts) {
userData.signature = signature;
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',
'lastonline', 'groupTitle',
];
const result = await plugins.fireHook('filter:posts.addUserFields', {
const result = await plugins.hooks.fire('filter:posts.addUserFields', {
fields: fields,
uid: uid,
uids: uids,
@ -166,7 +166,7 @@ module.exports = function (Posts) {
updateTopicPosters(postData, toUid),
]);
plugins.fireHook('action:post.changeOwner', {
plugins.hooks.fire('action:post.changeOwner', {
posts: _.cloneDeep(postData),
toUid: toUid,
});
@ -228,7 +228,7 @@ module.exports = function (Posts) {
]);
const changedTopics = mainPosts.map(p => tidToTopic[p.tid]);
plugins.fireHook('action:topic.changeOwner', {
plugins.hooks.fire('action:topic.changeOwner', {
topics: _.cloneDeep(changedTopics),
toUid: toUid,
});

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

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

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

@ -53,14 +53,14 @@ module.exports = function (privileges) {
privileges.global.list = async function () {
async function getLabels() {
return await utils.promiseParallel({
users: plugins.fireHook('filter:privileges.global.list_human', privileges.global.privilegeLabels.slice()),
groups: plugins.fireHook('filter:privileges.global.groups.list_human', privileges.global.privilegeLabels.slice()),
users: plugins.hooks.fire('filter:privileges.global.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({
users: plugins.fireHook('filter:privileges.global.list', privileges.global.userPrivilegeList.slice()),
groups: plugins.fireHook('filter:privileges.global.groups.list', privileges.global.groupPrivilegeList.slice()),
users: plugins.hooks.fire('filter:privileges.global.list', privileges.global.userPrivilegeList.slice()),
groups: plugins.hooks.fire('filter:privileges.global.groups.list', privileges.global.groupPrivilegeList.slice()),
});
const payload = await utils.promiseParallel({
@ -84,7 +84,7 @@ module.exports = function (privileges) {
const combined = userPrivileges.map(allowed => allowed || isAdministrator);
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) {
@ -101,7 +101,7 @@ module.exports = function (privileges) {
privileges.global.give = async function (privileges, groupName) {
await helpers.giveOrRescind(groups.join, privileges, 0, groupName);
plugins.fireHook('action:privileges.global.give', {
plugins.hooks.fire('action:privileges.global.give', {
privileges: privileges,
groupNames: Array.isArray(groupName) ? groupName : [groupName],
});
@ -109,7 +109,7 @@ module.exports = function (privileges) {
privileges.global.rescind = async function (privileges, groupName) {
await helpers.giveOrRescind(groups.leave, privileges, 0, groupName);
plugins.fireHook('action:privileges.global.rescind', {
plugins.hooks.fire('action:privileges.global.rescind', {
privileges: privileges,
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),
]);
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;
};
@ -34,8 +34,8 @@ helpers.isAllowedTo = async function (privilege, uidOrGroupName, cid) {
allowed = await isAllowedToCids(privilege, uidOrGroupName, cid);
}
if (allowed) {
({ allowed } = await plugins.fireHook('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:isUserAllowedTo', { 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;
}
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);
}).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,
uid: uid,
pids: pids,
@ -144,7 +144,7 @@ module.exports = function (privileges) {
results.pid = parseInt(pid, 10);
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]]' };
};

@ -34,7 +34,7 @@ module.exports = function (privileges) {
const editable = isAdminOrMod;
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:read': privData['topics:read'] || 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);
const data = await plugins.fireHook('filter:privileges.topics.filter', {
const data = await plugins.hooks.fire('filter:privileges.topics.filter', {
privilege: privilege,
uid: uid,
tids: tids,

@ -64,7 +64,7 @@ module.exports = function (privileges) {
}
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)) {
throw new Error('filter:user.isModerator - i/o mismatch');
}
@ -82,7 +82,7 @@ module.exports = function (privileges) {
privileges.users.isAdministrator(uid),
]);
const data = await plugins.fireHook('filter:user.canEdit', {
const data = await plugins.hooks.fire('filter:user.canEdit', {
isAdmin: isAdmin,
isGlobalMod: isGlobalMod,
isTargetAdmin: isTargetAdmin,
@ -99,7 +99,7 @@ module.exports = function (privileges) {
privileges.users.isAdministrator(uid),
]);
const data = await plugins.fireHook('filter:user.canBanUser', {
const data = await plugins.hooks.fire('filter:user.canBanUser', {
canBan: canBan && !isTargetAdmin,
callerUid: callerUid,
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('');
let payload = { 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}`];
}
};

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

@ -64,7 +64,7 @@ async function checkCondition(reward, method) {
method = util.promisify(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;
}
@ -72,7 +72,7 @@ async function giveRewards(uid, rewards) {
const rewardData = await getRewardsByRewardData(rewards);
for (let i = 0; i < rewards.length; i++) {
/* 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);
}
}

@ -79,9 +79,9 @@ Auth.reloadRoutes = async function (params) {
const router = params.router;
// 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.');
plugins.fireHook('action:auth.overrideLogin');
plugins.hooks.fire('action:auth.overrideLogin');
} else {
passport.use(new passportLocal({ passReqToCallback: true }, controllers.authentication.localLogin));
}
@ -91,7 +91,7 @@ Auth.reloadRoutes = async function (params) {
// Additional logins via SSO plugins
try {
loginStrategies = await plugins.fireHook('filter:auth.init', loginStrategies);
loginStrategies = await plugins.hooks.fire('filter:auth.init', loginStrategies);
} catch (err) {
winston.error('[authentication] ' + err.stack);
}

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

@ -43,7 +43,7 @@ async function searchInContent(data) {
async function doSearch(type, searchIn) {
if (searchIn.includes(data.searchIn)) {
return await plugins.fireHook('filter:search.query', {
return await plugins.hooks.fire('filter:search.query', {
index: type,
content: data.query,
matchWords: data.matchWords || 'all',
@ -70,7 +70,7 @@ async function searchInContent(data) {
allPids = await privileges.posts.filter('topics:read', allPids, data.uid);
allPids = await filterAndSort(allPids, data);
const metadata = await plugins.fireHook('filter:search.inContent', {
const metadata = await plugins.hooks.fire('filter:search.inContent', {
pids: allPids,
});
@ -87,13 +87,13 @@ async function searchInContent(data) {
}
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;
return Object.assign(returnData, metadata);
}
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;
}
let postsData = await getMatchedPosts(pids, data);
@ -108,7 +108,7 @@ async function filterAndSort(pids, 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);
}

@ -54,7 +54,7 @@ sitemap.getPages = async function () {
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') });
data.urls.forEach(url => smStream.write(url));

@ -24,7 +24,7 @@ social.getPostSharing = async function () {
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');
networks.forEach(function (network) {
network.activated = activated.includes(network.id);

@ -31,7 +31,7 @@ Categories.getAll = async function () {
'color', 'bgColor', 'backgroundImage', 'imageClass',
];
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);
};

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

@ -48,7 +48,7 @@ async function notifyUids(uid, uids, type, result) {
uids = filterTidCidIgnorers(watchStateUids, watchStates);
uids = await user.blocks.filterUids(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;

@ -179,7 +179,7 @@ async function validateSession(socket) {
if (!sessionData) {
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,
socket: socket,
session: sessionData,

@ -71,7 +71,7 @@ SocketModules.chats.send = async function (socket, data) {
if (!canChat) {
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,
uid: socket.uid,
});

@ -67,7 +67,7 @@ SocketPosts.getRawPost = async function (socket, pid) {
throw new Error('[[error:no-post]]');
}
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;
};
@ -182,7 +182,7 @@ SocketPosts.editQueuedContent = async function (socket, data) {
}
await posts.editQueuedContent(socket.uid, data);
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 };
};

@ -29,7 +29,7 @@ module.exports = function (SocketPosts) {
canFlag: privileges.posts.canFlag(data.pid, socket.uid),
flagged: flags.exists('post', data.pid, socket.uid), // specifically, whether THIS calling user flagged
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(),
history: posts.diffs.exists(data.pid),
canViewInfo: privileges.global.can('view:users:info', socket.uid),

@ -27,7 +27,7 @@ module.exports = function (SocketTopics) {
throw new Error('[[error:no-privileges]]');
}
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;
return result.topic;
};

@ -100,7 +100,7 @@ SocketUser.reset.commit = async function (socket, data) {
const [uid] = await Promise.all([
db.getObjectField('reset:uid', data.code),
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({

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

Loading…
Cancel
Save