From 6e2da9966e6d05f39aa94be65711a2e4745feb48 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 20 Nov 2020 16:06:26 -0500 Subject: [PATCH] refactor: move plugin hook methods to plugin.hooks.* --- src/analytics.js | 2 +- src/api/helpers.js | 2 +- src/api/users.js | 10 +- src/categories/create.js | 6 +- src/categories/data.js | 2 +- src/categories/delete.js | 2 +- src/categories/index.js | 2 +- src/categories/recentreplies.js | 6 +- src/categories/topics.js | 20 +- src/categories/update.js | 6 +- src/controllers/404.js | 4 +- src/controllers/accounts/blocks.js | 2 +- src/controllers/accounts/helpers.js | 8 +- src/controllers/accounts/notifications.js | 2 +- src/controllers/accounts/settings.js | 6 +- src/controllers/admin/categories.js | 4 +- src/controllers/admin/dashboard.js | 4 +- src/controllers/admin/uploads.js | 4 +- src/controllers/admin/users.js | 2 +- src/controllers/api.js | 4 +- src/controllers/authentication.js | 20 +- src/controllers/composer.js | 2 +- src/controllers/errors.js | 2 +- src/controllers/helpers.js | 4 +- src/controllers/home.js | 4 +- src/controllers/index.js | 6 +- src/controllers/mods.js | 8 +- src/controllers/osd.js | 2 +- src/controllers/search.js | 2 +- src/controllers/unread.js | 4 +- src/controllers/uploads.js | 14 +- src/emailer.js | 8 +- src/events.js | 2 +- src/flags.js | 10 +- src/groups/create.js | 4 +- src/groups/data.js | 4 +- src/groups/delete.js | 2 +- src/groups/index.js | 6 +- src/groups/invite.js | 2 +- src/groups/join.js | 2 +- src/groups/leave.js | 2 +- src/groups/ownership.js | 4 +- src/groups/update.js | 6 +- src/image.js | 20 +- src/messaging/create.js | 6 +- src/messaging/data.js | 4 +- src/messaging/edit.js | 2 +- src/messaging/index.js | 14 +- src/messaging/notifications.js | 2 +- src/messaging/rooms.js | 8 +- src/meta/blacklist.js | 2 +- src/meta/configs.js | 4 +- src/meta/settings.js | 6 +- src/meta/tags.js | 6 +- src/middleware/admin.js | 4 +- src/middleware/header.js | 10 +- src/middleware/index.js | 6 +- src/middleware/render.js | 4 +- src/middleware/user.js | 2 +- src/navigation/admin.js | 2 +- src/notifications.js | 8 +- src/plugins/hooks.js | 358 +++++++++++----------- src/plugins/index.js | 11 +- src/plugins/install.js | 4 +- src/plugins/load.js | 2 +- src/posts/bookmarks.js | 2 +- src/posts/create.js | 6 +- src/posts/data.js | 4 +- src/posts/delete.js | 8 +- src/posts/diffs.js | 2 +- src/posts/edit.js | 8 +- src/posts/index.js | 2 +- src/posts/parse.js | 14 +- src/posts/queue.js | 4 +- src/posts/summary.js | 2 +- src/posts/user.js | 10 +- src/posts/votes.js | 4 +- src/privileges/admin.js | 14 +- src/privileges/categories.js | 14 +- src/privileges/global.js | 14 +- src/privileges/helpers.js | 6 +- src/privileges/posts.js | 4 +- src/privileges/topics.js | 4 +- src/privileges/users.js | 8 +- src/rewards/admin.js | 6 +- src/rewards/index.js | 4 +- src/routes/authentication.js | 6 +- src/routes/write/index.js | 2 +- src/search.js | 10 +- src/sitemap.js | 2 +- src/social.js | 2 +- src/socket.io/admin/categories.js | 2 +- src/socket.io/admin/config.js | 2 +- src/socket.io/helpers.js | 2 +- src/socket.io/index.js | 2 +- src/socket.io/modules.js | 2 +- src/socket.io/posts.js | 4 +- src/socket.io/posts/tools.js | 2 +- src/socket.io/topics/tools.js | 2 +- src/socket.io/user.js | 2 +- src/socket.io/user/picture.js | 6 +- src/socket.io/user/profile.js | 2 +- src/topics/create.js | 12 +- src/topics/data.js | 2 +- src/topics/delete.js | 2 +- src/topics/follow.js | 2 +- src/topics/fork.js | 4 +- src/topics/index.js | 8 +- src/topics/merge.js | 2 +- src/topics/posts.js | 4 +- src/topics/recent.js | 4 +- src/topics/sorted.js | 6 +- src/topics/tags.js | 22 +- src/topics/teaser.js | 4 +- src/topics/thumb.js | 4 +- src/topics/tools.js | 14 +- src/topics/unread.js | 10 +- src/user/admin.js | 2 +- src/user/approval.js | 6 +- src/user/blocks.js | 6 +- src/user/create.js | 4 +- src/user/data.js | 10 +- src/user/delete.js | 2 +- src/user/digest.js | 2 +- src/user/email.js | 8 +- src/user/follow.js | 2 +- src/user/index.js | 8 +- src/user/notifications.js | 2 +- src/user/online.js | 2 +- src/user/picture.js | 2 +- src/user/profile.js | 6 +- src/user/search.js | 2 +- src/user/settings.js | 6 +- src/webserver.js | 6 +- src/widgets/admin.js | 4 +- src/widgets/index.js | 4 +- 136 files changed, 543 insertions(+), 534 deletions(-) diff --git a/src/analytics.js b/src/analytics.js index b3f706e0aa..d1ec60af2d 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -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; diff --git a/src/api/helpers.js b/src/api/helpers.js index da4d76fddc..2e82cd2399 100644 --- a/src/api/helpers.js +++ b/src/api/helpers.js @@ -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, }); diff --git a/src/api/users.js b/src/api/users.js index d83d740371..4256ca8634 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -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, diff --git a/src/categories/create.js b/src/categories/create.js index 56f7a694f2..46aae0a097 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -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, diff --git a/src/categories/data.js b/src/categories/data.js index 9097fb5aa0..4e3dbb1365 100644 --- a/src/categories/data.js +++ b/src/categories/data.js @@ -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, diff --git a/src/categories/delete.js b/src/categories/delete.js index 30c92ae441..74395f0658 100644 --- a/src/categories/delete.js +++ b/src/categories/delete.js @@ -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) { diff --git a/src/categories/index.js b/src/categories/index.js index f13f7a7a2d..5fb73e475f 100644 --- a/src/categories/index.js +++ b/src/categories/index.js @@ -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; }; diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index 3a7e37d383..efb9381d90 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -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, diff --git a/src/categories/topics.js b/src/categories/topics.js index 8dbe3501ef..1326960754 100644 --- a/src/categories/topics.js +++ b/src/categories/topics.js @@ -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, }); diff --git a/src/categories/update.js b/src/categories/update.js index 3086b1bf8c..51ca422380 100644 --- a/src/categories/update.js +++ b/src/categories/update.js @@ -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); }; }; diff --git a/src/controllers/404.js b/src/controllers/404.js index eb9f94c8d8..529d8f339b 100644 --- a/src/controllers/404.js +++ b/src/controllers/404.js @@ -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: {}, diff --git a/src/controllers/accounts/blocks.js b/src/controllers/accounts/blocks.js index 2dec4776fe..cc9101e788 100644 --- a/src/controllers/accounts/blocks.js +++ b/src/controllers/accounts/blocks.js @@ -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, diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index b56a725bc8..ac69266855 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -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); } diff --git a/src/controllers/accounts/notifications.js b/src/controllers/accounts/notifications.js index 9ef4ece4cf..2e1bb83833 100644 --- a/src/controllers/accounts/notifications.js +++ b/src/controllers/accounts/notifications.js @@ -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, diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index f52d43a483..b80bb4b46a 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -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, }); diff --git a/src/controllers/admin/categories.js b/src/controllers/admin/categories.js index 49f987da63..796b36de25 100644 --- a/src/controllers/admin/categories.js +++ b/src/controllers/admin/categories.js @@ -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, diff --git a/src/controllers/admin/dashboard.js b/src/controllers/admin/dashboard.js index 89d8c1b222..cef8c8921a 100644 --- a/src/controllers/admin/dashboard.js +++ b/src/controllers/admin/dashboard.js @@ -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() { diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 15f02e664c..01b3d5da6e 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -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); } diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 99f3d4231b..ccb7fa1e42 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -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)); diff --git a/src/controllers/api.js b/src/controllers/api.js index 6407b01d32..c3d36999ff 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -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; }; diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 7d52e76082..b04b84afda 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -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); diff --git a/src/controllers/composer.js b/src/controllers/composer.js index 3a30e3dab0..ca0dc208f6 100644 --- a/src/controllers/composer.js +++ b/src/controllers/composer.js @@ -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, diff --git a/src/controllers/errors.js b/src/controllers/errors.js index 2052952067..bb8951b038 100644 --- a/src/controllers/errors.js +++ b/src/controllers/errors.js @@ -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) { diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 8bbe2ffe1a..8b15ff4d2b 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -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; }; diff --git a/src/controllers/home.js b/src/controllers/home.js index e882f57e21..4b69e719c7 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -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, diff --git a/src/controllers/index.js b/src/controllers/index.js index 51e866a051..18f9ea3820 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -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 || '', }, diff --git a/src/controllers/mods.js b/src/controllers/mods.js index 859d24406c..b043ce98e7 100644 --- a/src/controllers/mods.js +++ b/src/controllers/mods.js @@ -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; } diff --git a/src/controllers/osd.js b/src/controllers/osd.js index 58fa13a8e1..95142b0111 100644 --- a/src/controllers/osd.js +++ b/src/controllers/osd.js @@ -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(); diff --git a/src/controllers/search.js b/src/controllers/search.js index 178fe2dc6f..c93e33dba3 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -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; diff --git a/src/controllers/unread.js b/src/controllers/unread.js index ef9c804836..ff155b72a8 100644 --- a/src/controllers/unread.js +++ b/src/controllers/unread.js @@ -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') { diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index a916ba62db..709eed54ea 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -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; } diff --git a/src/emailer.js b/src/emailer.js index 9a5d67e07d..83e16f5d97 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -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); } diff --git a/src/events.js b/src/events.js index 7630dfcfa7..46a67b27d9 100644 --- a/src/events.js +++ b/src/events.js @@ -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) { diff --git a/src/flags.js b/src/flags.js index 98ecfb2251..8c716765b2 100644 --- a/src/flags.js +++ b/src/flags.js @@ -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)); diff --git a/src/groups/create.js b/src/groups/create.js index 637f919e6a..9bd56ebc1b 100644 --- a/src/groups/create.js +++ b/src/groups/create.js @@ -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; }; diff --git a/src/groups/data.js b/src/groups/data.js index 1f7761340f..ae518c27ca 100644 --- a/src/groups/data.js +++ b/src/groups/data.js @@ -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' }); }; }; diff --git a/src/groups/delete.js b/src/groups/delete.js index eb6ef3b64e..24a5cc8694 100644 --- a/src/groups/delete.js +++ b/src/groups/delete.js @@ -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) { diff --git a/src/groups/index.js b/src/groups/index.js index 732f415e6b..9cb83e7ab4 100644 --- a/src/groups/index.js +++ b/src/groups/index.js @@ -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, diff --git a/src/groups/invite.js b/src/groups/invite.js index b96869d856..10d56a076b 100644 --- a/src/groups/invite.js +++ b/src/groups/invite.js @@ -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, }); diff --git a/src/groups/join.js b/src/groups/join.js index 09d94954a4..b2e1edc153 100644 --- a/src/groups/join.js +++ b/src/groups/join.js @@ -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, }); diff --git a/src/groups/leave.js b/src/groups/leave.js index b7ca0c9b7c..32d27bbeca 100644 --- a/src/groups/leave.js +++ b/src/groups/leave.js @@ -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, }); diff --git a/src/groups/ownership.js b/src/groups/ownership.js index b3002e7169..4296c307c0 100644 --- a/src/groups/ownership.js +++ b/src/groups/ownership.js @@ -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 }); }; }; diff --git a/src/groups/update.js b/src/groups/update.js index 50027fc9bd..26d0cdad5c 100644 --- a/src/groups/update.js +++ b/src/groups/update.js @@ -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, }); diff --git a/src/image.js b/src/image.js index a1afc49677..a6b5310adb 100644 --- a/src/image.js +++ b/src/image.js @@ -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, diff --git a/src/messaging/create.js b/src/messaging/create.js index 2d6a10b8e8..9c5c453eb7 100644 --- a/src/messaging/create.js +++ b/src/messaging/create.js @@ -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]; }; diff --git a/src/messaging/data.js b/src/messaging/data.js index 7a99d648c3..2098986ad5 100644 --- a/src/messaging/data.js +++ b/src/messaging/data.js @@ -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, diff --git a/src/messaging/edit.js b/src/messaging/edit.js index ca1e5a80eb..3e94d55bbb 100644 --- a/src/messaging/edit.js +++ b/src/messaging/edit.js @@ -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(), }); diff --git a/src/messaging/index.js b/src/messaging/index.js index 757884e9a8..f5202d236f 100644 --- a/src/messaging/index.js +++ b/src/messaging/index.js @@ -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, }); diff --git a/src/messaging/notifications.js b/src/messaging/notifications.js index 7571187190..63ccbc193e 100644 --- a/src/messaging/notifications.js +++ b/src/messaging/notifications.js @@ -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; } diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js index 87582b77d0..2d511199ca 100644 --- a/src/messaging/rooms.js +++ b/src/messaging/rooms.js @@ -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; }; diff --git a/src/meta/blacklist.js b/src/meta/blacklist.js index 2c7ddf4678..7e2bd4d280 100644 --- a/src/meta/blacklist.js +++ b/src/meta/blacklist.js @@ -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; diff --git a/src/meta/configs.js b/src/meta/configs.js index a01654f7d3..ba00a1d712 100644 --- a/src/meta/configs.js +++ b/src/meta/configs.js @@ -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)) { diff --git a/src/meta/settings.js b/src/meta/settings.js index eb8b87890a..5a290411da 100644 --- a/src/meta/settings.js +++ b/src/meta/settings.js @@ -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, }); diff --git a/src/meta/tags.js b/src/meta/tags.js index c54c79554a..4282575e45 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -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) { diff --git a/src/middleware/admin.js b/src/middleware/admin.js index 7f4a09acc7..765463281b 100644 --- a/src/middleware/admin.js +++ b/src/middleware/admin.js @@ -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 }; }); diff --git a/src/middleware/header.js b/src/middleware/header.js index a5e041bc8e..2174f7c461 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -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 }; diff --git a/src/middleware/index.js b/src/middleware/index.js index 1a9309cd1c..5e7e93e734 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -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, }); diff --git a/src/middleware/render.js b/src/middleware/render.js index 44a0689c0b..0462ca3671 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -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), diff --git a/src/middleware/user.js b/src/middleware/user.js index 63c3090160..903195ebd9 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -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 diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 6cfba3b738..04ecd7bc43 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -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); diff --git a/src/notifications.js b/src/notifications.js index 72e6e7ee07..f4f526c6d5 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -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; diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index 3990468443..a2509b35dc 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -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); + }); +} diff --git a/src/plugins/index.js b/src/plugins/index.js index 172dceedec..e0097aebfd 100644 --- a/src/plugins/index.js +++ b/src/plugins/index.js @@ -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'); }; diff --git a/src/plugins/install.js b/src/plugins/install.js index 9394cb784a..49d0068b7e 100644 --- a/src/plugins/install.js +++ b/src/plugins/install.js @@ -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; } diff --git a/src/plugins/load.js b/src/plugins/load.js index 2c639659b3..8977e40900 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -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); diff --git a/src/posts/bookmarks.js b/src/posts/bookmarks.js index fd50af9465..51ab7677bd 100644 --- a/src/posts/bookmarks.js +++ b/src/posts/bookmarks.js @@ -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, diff --git a/src/posts/create.js b/src/posts/create.js index babbce94f2..91da2c2903 100644 --- a/src/posts/create.js +++ b/src/posts/create.js @@ -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; }; diff --git a/src/posts/data.js b/src/posts/data.js index e4894fc61e..dcd50b32b5 100644 --- a/src/posts/data.js +++ b/src/posts/data.js @@ -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 } }); }; }; diff --git a/src/posts/delete.js b/src/posts/delete.js index e1429cd854..0504eec5f4 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -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); }; diff --git a/src/posts/diffs.js b/src/posts/diffs.js index eeb44927da..79bdd5223a 100644 --- a/src/posts/diffs.js +++ b/src/posts/diffs.js @@ -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; }; diff --git a/src/posts/edit.js b/src/posts/edit.js index 9b3a00775a..4bcb8a4d9f 100644 --- a/src/posts/edit.js +++ b/src/posts/edit.js @@ -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, diff --git a/src/posts/index.js b/src/posts/index.js index a17556644b..a145976acd 100644 --- a/src/posts/index.js +++ b/src/posts/index.js @@ -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 []; } diff --git a/src/posts/parse.js b/src/posts/parse.js index 6b2d59600e..131b47e221 100644 --- a/src/posts/parse.js +++ b/src/posts/parse.js @@ -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); diff --git a/src/posts/queue.js b/src/posts/queue.js index 9fd302eeed..bd8121399e 100644 --- a/src/posts/queue.js +++ b/src/posts/queue.js @@ -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); diff --git a/src/posts/summary.js b/src/posts/summary.js index 0b4e5c8467..6a0bda8c2b 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -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; }; diff --git a/src/posts/user.js b/src/posts/user.js index 6547e9f295..fef2eadd58 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -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, }); diff --git a/src/posts/votes.js b/src/posts/votes.js index fd224695d4..81f340b314 100644 --- a/src/posts/votes.js +++ b/src/posts/votes.js @@ -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) { diff --git a/src/privileges/admin.js b/src/privileges/admin.js index 305ea98fde..31c0b3022d 100644 --- a/src/privileges/admin.js +++ b/src/privileges/admin.js @@ -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], }); diff --git a/src/privileges/categories.js b/src/privileges/categories.js index b915f289da..1276bf6d3b 100644 --- a/src/privileges/categories.js +++ b/src/privileges/categories.js @@ -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], diff --git a/src/privileges/global.js b/src/privileges/global.js index 3585a432cc..44ad5ecd16 100644 --- a/src/privileges/global.js +++ b/src/privileges/global.js @@ -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], }); diff --git a/src/privileges/helpers.js b/src/privileges/helpers.js index cda8eca5b9..cf4c5fc998 100644 --- a/src/privileges/helpers.js +++ b/src/privileges/helpers.js @@ -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]]'); diff --git a/src/privileges/posts.js b/src/privileges/posts.js index f1274b892e..cfbfeedb1c 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -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]]' }; }; diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 75a3e01fb3..ff5890740c 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -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, diff --git a/src/privileges/users.js b/src/privileges/users.js index 9a391f2f13..b23df4d198 100644 --- a/src/privileges/users.js +++ b/src/privileges/users.js @@ -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}`]; } }; diff --git a/src/rewards/admin.js b/src/rewards/admin.js index 0377ed19e3..a2566768b3 100644 --- a/src/rewards/admin.js +++ b/src/rewards/admin.js @@ -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', []), }); }; diff --git a/src/rewards/index.js b/src/rewards/index.js index 7144c7c4ae..19d25168e3 100644 --- a/src/rewards/index.js +++ b/src/rewards/index.js @@ -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); } } diff --git a/src/routes/authentication.js b/src/routes/authentication.js index b2f994ea74..8de1915c21 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -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); } diff --git a/src/routes/write/index.js b/src/routes/write/index.js index dcb5995bf1..d20f1470ac 100644 --- a/src/routes/write/index.js +++ b/src/routes/write/index.js @@ -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, diff --git a/src/search.js b/src/search.js index e67f185d2f..043a69f12d 100644 --- a/src/search.js +++ b/src/search.js @@ -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); } diff --git a/src/sitemap.js b/src/sitemap.js index f506a96a36..cb47e4bc57 100644 --- a/src/sitemap.js +++ b/src/sitemap.js @@ -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)); diff --git a/src/social.js b/src/social.js index e7ef401696..802fa3e754 100644 --- a/src/social.js +++ b/src/social.js @@ -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); diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index fa50939768..08643b2cdf 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -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); }; diff --git a/src/socket.io/admin/config.js b/src/socket.io/admin/config.js index 63ab6d149c..6ec194e2a6 100644 --- a/src/socket.io/admin/config.js +++ b/src/socket.io/admin/config.js @@ -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); } } diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index c5262fe210..08545b9093 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -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; diff --git a/src/socket.io/index.js b/src/socket.io/index.js index b2423541a6..9dad7cda4b 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -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, diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 5e9f087281..f9057d523a 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -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, }); diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 0bdc4fc82f..9c5318198e 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -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 }; }; diff --git a/src/socket.io/posts/tools.js b/src/socket.io/posts/tools.js index b62f651e7a..2b6255a449 100644 --- a/src/socket.io/posts/tools.js +++ b/src/socket.io/posts/tools.js @@ -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), diff --git a/src/socket.io/topics/tools.js b/src/socket.io/topics/tools.js index f4181a5d45..a4b6804576 100644 --- a/src/socket.io/topics/tools.js +++ b/src/socket.io/topics/tools.js @@ -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; }; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index bac1a08266..b9ba83097d 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -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({ diff --git a/src/socket.io/user/picture.js b/src/socket.io/user/picture.js index 21d2a453b8..5fe4b0ea98 100644 --- a/src/socket.io/user/picture.js +++ b/src/socket.io/user/picture.js @@ -25,7 +25,7 @@ module.exports = function (SocketUser) { } else if (type === 'uploaded') { picture = await user.getUserField(data.uid, 'uploadedpicture'); } else { - const returnData = await plugins.fireHook('filter:user.getPicture', { + const returnData = await plugins.hooks.fire('filter:user.getPicture', { uid: socket.uid, type: type, picture: undefined, @@ -53,7 +53,7 @@ module.exports = function (SocketUser) { // if current picture is uploaded picture, reset to user icon picture: userData.uploadedpicture === userData.picture ? '' : userData.picture, }); - plugins.fireHook('action:user.removeUploadedPicture', { + plugins.hooks.fire('action:user.removeUploadedPicture', { callerUid: socket.uid, uid: data.uid, user: userData, @@ -66,7 +66,7 @@ module.exports = function (SocketUser) { } const [list, uploaded] = await Promise.all([ - plugins.fireHook('filter:user.listPictures', { + plugins.hooks.fire('filter:user.listPictures', { uid: data.uid, pictures: [], }), diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js index 463d509e71..c17f643ffd 100644 --- a/src/socket.io/user/profile.js +++ b/src/socket.io/user/profile.js @@ -46,7 +46,7 @@ module.exports = function (SocketUser) { await user.isAdminOrGlobalModOrSelf(socket.uid, data.uid); const userData = await user.getUserFields(data.uid, ['cover:url']); await user.removeCoverPicture(data); - plugins.fireHook('action:user.removeCoverPicture', { + plugins.hooks.fire('action:user.removeCoverPicture', { callerUid: socket.uid, uid: data.uid, user: userData, diff --git a/src/topics/create.js b/src/topics/create.js index ca55a8066e..741447200f 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -39,7 +39,7 @@ module.exports = function (Topics) { if (data.thumb) { topicData.thumb = data.thumb; } - const result = await plugins.fireHook('filter:topic.create', { topic: topicData, data: data }); + const result = await plugins.hooks.fire('filter:topic.create', { topic: topicData, data: data }); topicData = result.topic; await db.setObject('topic:' + topicData.tid, topicData); @@ -61,7 +61,7 @@ module.exports = function (Topics) { Topics.createTags(data.tags, topicData.tid, timestamp), ]); - plugins.fireHook('action:topic.save', { topic: _.clone(topicData), data: data }); + plugins.hooks.fire('action:topic.save', { topic: _.clone(topicData), data: data }); return topicData.tid; }; @@ -94,7 +94,7 @@ module.exports = function (Topics) { if (!data.fromQueue) { await user.isReadyToPost(data.uid, data.cid); } - const filteredData = await plugins.fireHook('filter:topic.post', data); + const filteredData = await plugins.hooks.fire('filter:topic.post', data); data = filteredData; const tid = await Topics.create(data); @@ -124,7 +124,7 @@ module.exports = function (Topics) { postData.index = 0; analytics.increment(['topics', 'topics:byCid:' + topicData.cid]); - plugins.fireHook('action:topic.post', { topic: topicData, post: postData, data: data }); + plugins.hooks.fire('action:topic.post', { topic: topicData, post: postData, data: data }); if (parseInt(uid, 10)) { user.notifications.sendTopicNotificationToFollowers(uid, topicData, postData); @@ -168,7 +168,7 @@ module.exports = function (Topics) { if (!data.fromQueue) { await user.isReadyToPost(uid, data.cid); } - await plugins.fireHook('filter:topic.reply', data); + await plugins.hooks.fire('filter:topic.reply', data); if (data.content) { data.content = utils.rtrim(data.content); } @@ -197,7 +197,7 @@ module.exports = function (Topics) { } analytics.increment(['posts', 'posts:byCid:' + data.cid]); - plugins.fireHook('action:topic.reply', { post: _.clone(postData), data: data }); + plugins.hooks.fire('action:topic.reply', { post: _.clone(postData), data: data }); return postData; }; diff --git a/src/topics/data.js b/src/topics/data.js index 06476755ef..720d2e63ad 100644 --- a/src/topics/data.js +++ b/src/topics/data.js @@ -22,7 +22,7 @@ module.exports = function (Topics) { } const keys = tids.map(tid => 'topic:' + tid); const topics = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); - const result = await plugins.fireHook('filter:topic.getFields', { + const result = await plugins.hooks.fire('filter:topic.getFields', { tids: tids, topics: topics, fields: fields, diff --git a/src/topics/delete.js b/src/topics/delete.js index fce87776c2..5c3ec308be 100644 --- a/src/topics/delete.js +++ b/src/topics/delete.js @@ -100,7 +100,7 @@ module.exports = function (Topics) { Topics.deleteTopicTags(tid), reduceCounters(tid), ]); - plugins.fireHook('action:topic.purge', { topic: deletedTopic, uid: uid }); + plugins.hooks.fire('action:topic.purge', { topic: deletedTopic, uid: uid }); await db.delete('topic:' + tid); }; diff --git a/src/topics/follow.js b/src/topics/follow.js index d576578bc4..3790b7ca8c 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -44,7 +44,7 @@ module.exports = function (Topics) { } await method1(tid, uid); await method2(tid, uid); - plugins.fireHook(hook, { uid: uid, tid: tid }); + plugins.hooks.fire(hook, { uid: uid, tid: tid }); } async function follow(tid, uid) { diff --git a/src/topics/fork.js b/src/topics/fork.js index 15c784a926..3f5648221b 100644 --- a/src/topics/fork.js +++ b/src/topics/fork.js @@ -60,7 +60,7 @@ module.exports = function (Topics) { db.sortedSetsAdd(['topics:votes', 'cid:' + cid + ':tids:votes'], postData.votes, tid), ]); - plugins.fireHook('action:topic.fork', { tid: tid, fromTid: fromTid, uid: uid }); + plugins.hooks.fire('action:topic.fork', { tid: tid, fromTid: fromTid, uid: uid }); return await Topics.getTopicData(tid); }; @@ -93,7 +93,7 @@ module.exports = function (Topics) { Topics.updateLastPostTimeFromLastPid(tid), Topics.updateLastPostTimeFromLastPid(postData.tid), ]); - plugins.fireHook('action:post.move', { uid: callerUid, post: postData, tid: tid }); + plugins.hooks.fire('action:post.move', { uid: callerUid, post: postData, tid: tid }); }; async function updateCategory(postData, toTid) { diff --git a/src/topics/index.js b/src/topics/index.js index 372141dda5..99adfc9df2 100644 --- a/src/topics/index.js +++ b/src/topics/index.js @@ -132,7 +132,7 @@ Topics.getTopicsByTids = async function (tids, options) { const filteredTopics = result.topics.filter(topic => topic && topic.category && !topic.category.disabled); - const hookResult = await plugins.fireHook('filter:topics.get', { topics: filteredTopics, uid: uid }); + const hookResult = await plugins.hooks.fire('filter:topics.get', { topics: filteredTopics, uid: uid }); return hookResult.topics; }; @@ -152,7 +152,7 @@ Topics.getTopicWithPosts = async function (topicData, set, uid, start, stop, rev getMainPostAndReplies(topicData, set, uid, start, stop, reverse), categories.getCategoryData(topicData.cid), categories.getTagWhitelist([topicData.cid]), - plugins.fireHook('filter:topic.thread_tools', { topic: topicData, uid: uid, tools: [] }), + plugins.hooks.fire('filter:topic.thread_tools', { topic: topicData, uid: uid, tools: [] }), Topics.getFollowData([topicData.tid], uid), Topics.getUserBookmark(topicData.tid, uid), social.getActivePostSharing(), @@ -184,7 +184,7 @@ Topics.getTopicWithPosts = async function (topicData, set, uid, start, stop, rev topicData.unreplied = topicData.postcount === 1; topicData.icons = []; - const result = await plugins.fireHook('filter:topic.get', { topic: topicData, uid: uid }); + const result = await plugins.hooks.fire('filter:topic.get', { topic: topicData, uid: uid }); return result.topic; }; @@ -282,7 +282,7 @@ Topics.isLocked = async function (tid) { }; Topics.search = async function (tid, term) { - const pids = await plugins.fireHook('filter:topic.search', { + const pids = await plugins.hooks.fire('filter:topic.search', { tid: tid, term: term, }); diff --git a/src/topics/merge.js b/src/topics/merge.js index dbcfebc5c2..b3f5718422 100644 --- a/src/topics/merge.js +++ b/src/topics/merge.js @@ -32,7 +32,7 @@ module.exports = function (Topics) { }); }); - plugins.fireHook('action:topic.merge', { uid: uid, tids: tids, mergeIntoTid: mergeIntoTid, otherTids: otherTids }); + plugins.hooks.fire('action:topic.merge', { uid: uid, tids: tids, mergeIntoTid: mergeIntoTid, otherTids: otherTids }); return mergeIntoTid; }; diff --git a/src/topics/posts.js b/src/topics/posts.js index a7a9189233..1268630474 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -72,7 +72,7 @@ module.exports = function (Topics) { } }); - const result = await plugins.fireHook('filter:topics.addPostData', { + const result = await plugins.hooks.fire('filter:topics.addPostData', { posts: postData, uid: uid, }); @@ -245,7 +245,7 @@ module.exports = function (Topics) { const uniquePids = _.uniq(_.flatten(arrayOfReplyPids)); let replyData = await posts.getPostsFields(uniquePids, ['pid', 'uid', 'timestamp']); - const result = await plugins.fireHook('filter:topics.getPostReplies', { + const result = await plugins.hooks.fire('filter:topics.getPostReplies', { uid: callerUid, replies: replyData, }); diff --git a/src/topics/recent.js b/src/topics/recent.js index 2a7f54fecd..0cc8ec3630 100644 --- a/src/topics/recent.js +++ b/src/topics/recent.js @@ -69,8 +69,8 @@ module.exports = function (Topics) { Topics.updateRecent = async function (tid, timestamp) { let data = { tid: tid, timestamp: timestamp }; - if (plugins.hasListeners('filter:topics.updateRecent')) { - data = await plugins.fireHook('filter:topics.updateRecent', { tid: tid, timestamp: timestamp }); + if (plugins.hooks.hasListeners('filter:topics.updateRecent')) { + data = await plugins.hooks.fire('filter:topics.updateRecent', { tid: tid, timestamp: timestamp }); } if (data && data.tid && data.timestamp) { await db.sortedSetAdd('topics:recent', data.timestamp, data.tid); diff --git a/src/topics/sorted.js b/src/topics/sorted.js index ea405247a3..a8d4ac53b7 100644 --- a/src/topics/sorted.js +++ b/src/topics/sorted.js @@ -34,8 +34,8 @@ module.exports = function (Topics) { }; async function getTids(params) { - if (plugins.hasListeners('filter:topics.getSortedTids')) { - const result = await plugins.fireHook('filter:topics.getSortedTids', { params: params, tids: [] }); + if (plugins.hooks.hasListeners('filter:topics.getSortedTids')) { + const result = await plugins.hooks.fire('filter:topics.getSortedTids', { params: params, tids: [] }); return result.tids; } let tids = []; @@ -153,7 +153,7 @@ module.exports = function (Topics) { const cids = params.cids && params.cids.map(String); tids = topicData.filter(t => t && t.cid && !isCidIgnored[t.cid] && (!cids || cids.includes(String(t.cid)))).map(t => t.tid); - const result = await plugins.fireHook('filter:topics.filterSortedTids', { tids: tids, params: params }); + const result = await plugins.hooks.fire('filter:topics.filterSortedTids', { tids: tids, params: params }); return result.tids; } diff --git a/src/topics/tags.js b/src/topics/tags.js index 4f544d09c5..967322da64 100644 --- a/src/topics/tags.js +++ b/src/topics/tags.js @@ -18,7 +18,7 @@ module.exports = function (Topics) { if (!Array.isArray(tags) || !tags.length) { return; } - const result = await plugins.fireHook('filter:tags.filter', { tags: tags, tid: tid }); + const result = await plugins.hooks.fire('filter:tags.filter', { tags: tags, tid: tid }); tags = _.uniq(result.tags) .map(tag => utils.cleanUpTag(tag, meta.config.maximumTagLength)) .filter(tag => tag && tag.length >= (meta.config.minimumTagLength || 3)); @@ -110,13 +110,13 @@ module.exports = function (Topics) { Topics.getTagTids = async function (tag, start, stop) { const tids = await db.getSortedSetRevRange('tag:' + tag + ':topics', start, stop); - const payload = await plugins.fireHook('filter:topics.getTagTids', { tag, start, stop, tids }); + const payload = await plugins.hooks.fire('filter:topics.getTagTids', { tag, start, stop, tids }); return payload.tids; }; Topics.getTagTopicCount = async function (tag) { const count = await db.sortedSetCard('tag:' + tag + ':topics'); - const payload = await plugins.fireHook('filter:topics.getTagTopicCount', { tag, count }); + const payload = await plugins.hooks.fire('filter:topics.getTagTopicCount', { tag, count }); return payload.count; }; @@ -149,7 +149,7 @@ module.exports = function (Topics) { Topics.getTags = async function (start, stop) { const tags = await db.getSortedSetRevRangeWithScores('tags:topic:count', start, stop); - const payload = await plugins.fireHook('filter:tags.getAll', { + const payload = await plugins.hooks.fire('filter:tags.getAll', { tags: tags, }); return await Topics.getTagData(payload.tags); @@ -256,12 +256,12 @@ module.exports = function (Topics) { return []; } let result; - if (plugins.hasListeners('filter:topics.searchTags')) { - result = await plugins.fireHook('filter:topics.searchTags', { data: data }); + if (plugins.hooks.hasListeners('filter:topics.searchTags')) { + result = await plugins.hooks.fire('filter:topics.searchTags', { data: data }); } else { result = await findMatches(data.query, 0); } - result = await plugins.fireHook('filter:tags.search', { data: data, matches: result.matches }); + result = await plugins.hooks.fire('filter:tags.search', { data: data, matches: result.matches }); return result.matches; }; @@ -270,8 +270,8 @@ module.exports = function (Topics) { return []; } let result; - if (plugins.hasListeners('filter:topics.autocompleteTags')) { - result = await plugins.fireHook('filter:topics.autocompleteTags', { data: data }); + if (plugins.hooks.hasListeners('filter:topics.autocompleteTags')) { + result = await plugins.hooks.fire('filter:topics.autocompleteTags', { data: data }); } else { result = await findMatches(data.query, data.cid); } @@ -342,8 +342,8 @@ module.exports = function (Topics) { }; Topics.getRelatedTopics = async function (topicData, uid) { - if (plugins.hasListeners('filter:topic.getRelatedTopics')) { - const result = await plugins.fireHook('filter:topic.getRelatedTopics', { topic: topicData, uid: uid, topics: [] }); + if (plugins.hooks.hasListeners('filter:topic.getRelatedTopics')) { + const result = await plugins.hooks.fire('filter:topic.getRelatedTopics', { topic: topicData, uid: uid, topics: [] }); return result.topics; } diff --git a/src/topics/teaser.js b/src/topics/teaser.js index a9127bcd0d..8bf4906907 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -67,7 +67,7 @@ module.exports = function (Topics) { }); await Promise.all(postData.map(p => posts.parsePost(p))); - const { tags } = await plugins.fireHook('filter:teasers.configureStripTags', { tags: utils.stripTags.concat(['img']) }); + const { tags } = await plugins.hooks.fire('filter:teasers.configureStripTags', { tags: utils.stripTags.concat(['img']) }); var teasers = topics.map(function (topic, index) { if (!topic) { @@ -82,7 +82,7 @@ module.exports = function (Topics) { return tidToPost[topic.tid]; }); - const result = await plugins.fireHook('filter:teasers.get', { teasers: teasers, uid: uid }); + const result = await plugins.hooks.fire('filter:teasers.get', { teasers: teasers, uid: uid }); return result.teasers; }; diff --git a/src/topics/thumb.js b/src/topics/thumb.js index 356be5b4a3..3988fd5440 100644 --- a/src/topics/thumb.js +++ b/src/topics/thumb.js @@ -53,12 +53,12 @@ module.exports = function (Topics) { height: meta.config.topicThumbSize, }); - if (!plugins.hasListeners('filter:uploadImage')) { + if (!plugins.hooks.hasListeners('filter:uploadImage')) { data.thumb = '/assets/uploads/' + folder + '/' + filename; return; } - const uploadedFile = await plugins.fireHook('filter:uploadImage', { + const uploadedFile = await plugins.hooks.fire('filter:uploadImage', { image: { path: pathToUpload, name: '' }, uid: data.uid, folder: folder, diff --git a/src/topics/tools.js b/src/topics/tools.js index 577614bd94..5ddad97c01 100644 --- a/src/topics/tools.js +++ b/src/topics/tools.js @@ -29,7 +29,7 @@ module.exports = function (Topics) { } const canDelete = await privileges.topics.canDelete(tid, uid); - const data = await plugins.fireHook(isDelete ? 'filter:topic.delete' : 'filter:topic.restore', { topicData: topicData, uid: uid, isDelete: isDelete, canDelete: canDelete, canRestore: canDelete }); + const data = await plugins.hooks.fire(isDelete ? 'filter:topic.delete' : 'filter:topic.restore', { topicData: topicData, uid: uid, isDelete: isDelete, canDelete: canDelete, canRestore: canDelete }); if ((!data.canDelete && data.isDelete) || (!data.canRestore && !data.isDelete)) { throw new Error('[[error:no-privileges]]'); @@ -48,9 +48,9 @@ module.exports = function (Topics) { data.topicData.deleted = data.isDelete ? 1 : 0; if (data.isDelete) { - plugins.fireHook('action:topic.delete', { topic: data.topicData, uid: data.uid }); + plugins.hooks.fire('action:topic.delete', { topic: data.topicData, uid: data.uid }); } else { - plugins.fireHook('action:topic.restore', { topic: data.topicData, uid: data.uid }); + plugins.hooks.fire('action:topic.restore', { topic: data.topicData, uid: data.uid }); } const userData = await user.getUserFields(data.uid, ['username', 'userslug']); return { @@ -97,7 +97,7 @@ module.exports = function (Topics) { topicData.isLocked = lock; // deprecate in v2.0 topicData.locked = lock; - plugins.fireHook('action:topic.lock', { topic: _.clone(topicData), uid: uid }); + plugins.hooks.fire('action:topic.lock', { topic: _.clone(topicData), uid: uid }); return topicData; } @@ -121,7 +121,7 @@ module.exports = function (Topics) { } await Topics.setTopicField(tid, 'pinExpiry', expiry); - plugins.fireHook('action:topic.setPinExpiry', { topic: _.clone(topicData), uid: uid }); + plugins.hooks.fire('action:topic.setPinExpiry', { topic: _.clone(topicData), uid: uid }); }; topicTools.checkPinExpiry = async (tids) => { @@ -175,7 +175,7 @@ module.exports = function (Topics) { topicData.isPinned = pin; // deprecate in v2.0 topicData.pinned = pin; - plugins.fireHook('action:topic.pin', { topic: _.clone(topicData), uid }); + plugins.hooks.fire('action:topic.pin', { topic: _.clone(topicData), uid }); return topicData; } @@ -255,6 +255,6 @@ module.exports = function (Topics) { hookData.toCid = cid; hookData.tid = tid; - plugins.fireHook('action:topic.move', hookData); + plugins.hooks.fire('action:topic.move', hookData); }; }; diff --git a/src/topics/unread.js b/src/topics/unread.js index 084eea8a74..b274c5287f 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -48,7 +48,7 @@ module.exports = function (Topics) { Topics.unreadCutoff = async function (uid) { const cutoff = Date.now() - (meta.config.unreadCutoff * 86400000); - const data = await plugins.fireHook('filter:topics.unreadCutoff', { uid: uid, cutoff: cutoff }); + const data = await plugins.hooks.fire('filter:topics.unreadCutoff', { uid: uid, cutoff: cutoff }); return parseInt(data.cutoff, 10); }; @@ -71,7 +71,7 @@ module.exports = function (Topics) { return data; } - const result = await plugins.fireHook('filter:topics.getUnreadTids', { + const result = await plugins.hooks.fire('filter:topics.getUnreadTids', { uid: uid, tids: data.tids, counts: data.counts, @@ -176,8 +176,8 @@ module.exports = function (Topics) { } async function getCategoryTids(params) { - if (plugins.hasListeners('filter:topics.unread.getCategoryTids')) { - const result = await plugins.fireHook('filter:topics.unread.getCategoryTids', { params: params, tids: [] }); + if (plugins.hooks.hasListeners('filter:topics.unread.getCategoryTids')) { + const result = await plugins.hooks.fire('filter:topics.unread.getCategoryTids', { params: params, tids: [] }); return result.tids; } if (params.filter === 'watched') { @@ -297,7 +297,7 @@ module.exports = function (Topics) { const cids = _.uniq(topicData.map(t => t && t.cid).filter(Boolean)); await categories.markAsRead(cids, uid); - plugins.fireHook('action:topics.markAsRead', { uid: uid, tids: tids }); + plugins.hooks.fire('action:topics.markAsRead', { uid: uid, tids: tids }); return true; }; diff --git a/src/user/admin.js b/src/user/admin.js index e48a86e676..981fd921b4 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -31,7 +31,7 @@ module.exports = function (User) { User.getUsersCSV = async function () { winston.verbose('[user/getUsersCSV] Compiling User CSV data'); - const data = await plugins.fireHook('filter:user.csvFields', { fields: ['uid', 'email', 'username'] }); + const data = await plugins.hooks.fire('filter:user.csvFields', { fields: ['uid', 'email', 'username'] }); let csvContent = data.fields.join(',') + '\n'; await batch.processSortedSet('users:joindate', async (uids) => { const usersData = await User.getUsersFields(uids, data.fields); diff --git a/src/user/approval.js b/src/user/approval.js index 0a2c200d7c..8ea5916610 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -28,7 +28,7 @@ module.exports = function (User) { ip: userData.ip, hashedPassword: hashedPassword, }; - const results = await plugins.fireHook('filter:user.addToApprovalQueue', { data: data, userData: userData }); + const results = await plugins.hooks.fire('filter:user.addToApprovalQueue', { data: data, userData: userData }); await db.setObject('registration:queue:name:' + userData.username, results.data); await db.sortedSetAdd('registration:queue', Date.now(), userData.username); await sendNotificationToAdmins(userData.username); @@ -69,7 +69,7 @@ module.exports = function (User) { await User.setUserField(uid, 'password', userData.hashedPassword); await removeFromQueue(username); await markNotificationRead(username); - await plugins.fireHook('filter:register.complete', { uid: uid }); + await plugins.hooks.fire('filter:register.complete', { uid: uid }); await emailer.send('registration_accepted', uid, { username: username, subject: '[[email:welcome-to, ' + (meta.config.title || meta.config.browserTitle || 'NodeBB') + ']]', @@ -140,7 +140,7 @@ module.exports = function (User) { */ })); - const results = await plugins.fireHook('filter:user.getRegistrationQueue', { users: users }); + const results = await plugins.hooks.fire('filter:user.getRegistrationQueue', { users: users }); return results.users; }; diff --git a/src/user/blocks.js b/src/user/blocks.js index 3384aa6b7b..494b440af7 100644 --- a/src/user/blocks.js +++ b/src/user/blocks.js @@ -64,7 +64,7 @@ module.exports = function (User) { await User.incrementUserFieldBy(uid, 'blocksCount', 1); User.blocks._cache.del(parseInt(uid, 10)); pubsub.publish('user:blocks:cache:del', parseInt(uid, 10)); - plugins.fireHook('action:user.blocks.add', { uid: uid, targetUid: targetUid }); + plugins.hooks.fire('action:user.blocks.add', { uid: uid, targetUid: targetUid }); }; User.blocks.remove = async function (targetUid, uid) { @@ -73,7 +73,7 @@ module.exports = function (User) { await User.decrementUserFieldBy(uid, 'blocksCount', 1); User.blocks._cache.del(parseInt(uid, 10)); pubsub.publish('user:blocks:cache:del', parseInt(uid, 10)); - plugins.fireHook('action:user.blocks.remove', { uid: uid, targetUid: targetUid }); + plugins.hooks.fire('action:user.blocks.remove', { uid: uid, targetUid: targetUid }); }; User.blocks.applyChecks = async function (type, targetUid, uid) { @@ -111,7 +111,7 @@ module.exports = function (User) { set = set.filter(function (item) { return !blockedSet.has(parseInt(isPlain ? item : (item && item[property]), 10)); }); - const data = await plugins.fireHook('filter:user.blocks.filter', { set: set, property: property, uid: uid, blockedSet: blockedSet }); + const data = await plugins.hooks.fire('filter:user.blocks.filter', { set: set, property: property, uid: uid, blockedSet: blockedSet }); return data.set; }; diff --git a/src/user/create.js b/src/user/create.js index 5fb1c56ad8..51e7970e1c 100644 --- a/src/user/create.js +++ b/src/user/create.js @@ -67,7 +67,7 @@ module.exports = function (User) { userData.userslug = slugify(renamedUsername); } - const results = await plugins.fireHook('filter:user.create', { user: userData, data: data }); + const results = await plugins.hooks.fire('filter:user.create', { user: userData, data: data }); userData = results.user; const uid = await db.incrObjectField('global', 'nextUid'); @@ -118,7 +118,7 @@ module.exports = function (User) { if (userNameChanged) { await User.notifications.sendNameChangeNotification(userData.uid, userData.username); } - plugins.fireHook('action:user.create', { user: userData, data: data }); + plugins.hooks.fire('action:user.create', { user: userData, data: data }); return userData.uid; } diff --git a/src/user/data.js b/src/user/data.js index 1b923bca39..1fd101a8a9 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -60,7 +60,7 @@ module.exports = function (User) { const uniqueUids = _.uniq(uids).filter(uid => uid > 0); - const results = await plugins.fireHook('filter:user.whitelistFields', { uids: uids, whitelist: fieldWhitelist.slice() }); + const results = await plugins.hooks.fire('filter:user.whitelistFields', { uids: uids, whitelist: fieldWhitelist.slice() }); if (!fields.length) { fields = results.whitelist; } else { @@ -69,7 +69,7 @@ module.exports = function (User) { } let users = await db.getObjectsFields(uniqueUids.map(uid => 'user:' + uid), fields); - const result = await plugins.fireHook('filter:user.getFields', { + const result = await plugins.hooks.fire('filter:user.getFields', { uids: uniqueUids, users: users, fields: fields, @@ -231,7 +231,7 @@ module.exports = function (User) { } })); - return await plugins.fireHook('filter:users.get', users); + return await plugins.hooks.fire('filter:users.get', users); } function parseDisplayName(user, uidToSettings) { @@ -289,7 +289,7 @@ module.exports = function (User) { await db.setObject('user:' + uid, data); for (const field in data) { if (data.hasOwnProperty(field)) { - plugins.fireHook('action:user.set', { uid: uid, field: field, value: data[field], type: 'set' }); + plugins.hooks.fire('action:user.set', { uid: uid, field: field, value: data[field], type: 'set' }); } } }; @@ -304,7 +304,7 @@ module.exports = function (User) { async function incrDecrUserFieldBy(uid, field, value, type) { const newValue = await db.incrObjectFieldBy('user:' + uid, field, value); - plugins.fireHook('action:user.set', { uid: uid, field: field, value: newValue, type: type }); + plugins.hooks.fire('action:user.set', { uid: uid, field: field, value: newValue, type: type }); return newValue; } }; diff --git a/src/user/delete.js b/src/user/delete.js index ee58a72026..a12c424d7c 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -102,7 +102,7 @@ module.exports = function (User) { throw new Error('[[error:no-user]]'); } - await plugins.fireHook('static:user.delete', { uid: uid }); + await plugins.hooks.fire('static:user.delete', { uid: uid }); await deleteVotes(uid); await deleteChats(uid); await User.auth.revokeAllSessions(uid); diff --git a/src/user/digest.js b/src/user/digest.js index f931a183de..689d0ff771 100644 --- a/src/user/digest.js +++ b/src/user/digest.js @@ -87,7 +87,7 @@ Digest.getSubscribers = async function (interval) { batch: 500, }); - const results = await plugins.fireHook('filter:digest.subscribers', { + const results = await plugins.hooks.fire('filter:digest.subscribers', { interval: interval, subscribers: subscribers, }); diff --git a/src/user/email.js b/src/user/email.js index 9fab6c9ca2..92e05aa873 100644 --- a/src/user/email.js +++ b/src/user/email.js @@ -60,7 +60,7 @@ UserEmail.sendValidationEmail = async function (uid, options) { } await db.set('uid:' + uid + ':confirm:email:sent', 1); await db.pexpireAt('uid:' + uid + ':confirm:email:sent', Date.now() + (emailInterval * 60 * 1000)); - confirm_code = await plugins.fireHook('filter:user.verify.code', confirm_code); + confirm_code = await plugins.hooks.fire('filter:user.verify.code', confirm_code); await db.setObject('confirm:' + confirm_code, { email: options.email.toLowerCase(), @@ -79,8 +79,8 @@ UserEmail.sendValidationEmail = async function (uid, options) { uid: uid, }; - if (plugins.hasListeners('action:user.verify')) { - plugins.fireHook('action:user.verify', { uid: uid, data: data }); + if (plugins.hooks.hasListeners('action:user.verify')) { + plugins.hooks.fire('action:user.verify', { uid: uid, data: data }); } else { await emailer.send(data.template, uid, data); } @@ -101,5 +101,5 @@ UserEmail.confirm = async function (code) { await groups.leave('unverified-users', confirmObj.uid); await db.delete('confirm:' + code); await db.delete('uid:' + confirmObj.uid + ':confirm:email:sent'); - await plugins.fireHook('action:user.email.confirmed', { uid: confirmObj.uid, email: confirmObj.email }); + await plugins.hooks.fire('action:user.email.confirmed', { uid: confirmObj.uid, email: confirmObj.email }); }; diff --git a/src/user/follow.js b/src/user/follow.js index c8c281f927..8231f8300d 100644 --- a/src/user/follow.js +++ b/src/user/follow.js @@ -72,7 +72,7 @@ module.exports = function (User) { return []; } const uids = await db.getSortedSetRevRange(type + ':' + uid, start, stop); - const data = await plugins.fireHook('filter:user.' + type, { + const data = await plugins.hooks.fire('filter:user.' + type, { uids: uids, uid: uid, start: start, diff --git a/src/user/index.js b/src/user/index.js index 81366a9b11..9ff484905f 100644 --- a/src/user/index.js +++ b/src/user/index.js @@ -64,10 +64,10 @@ User.getUsersFromSet = async function (set, uid, start, stop) { }; User.getUsersWithFields = async function (uids, fields, uid) { - let results = await plugins.fireHook('filter:users.addFields', { fields: fields }); + let results = await plugins.hooks.fire('filter:users.addFields', { fields: fields }); results.fields = _.uniq(results.fields); const userData = await User.getUsersFields(uids, results.fields); - results = await plugins.fireHook('filter:userlist.get', { users: userData, uid: uid }); + results = await plugins.hooks.fire('filter:userlist.get', { users: userData, uid: uid }); return results.users; }; @@ -219,7 +219,7 @@ User.getModeratedCids = async function (uid) { }; User.addInterstitials = function (callback) { - plugins.registerHook('core', { + plugins.hooks.register('core', { hook: 'filter:register.interstitial', method: [ // GDPR information collection/processing consent + email consent @@ -272,7 +272,7 @@ User.addInterstitials = function (callback) { } } - const termsOfUse = await plugins.fireHook('filter:parse.post', { + const termsOfUse = await plugins.hooks.fire('filter:parse.post', { postData: { content: meta.config.termsOfUse || '', }, diff --git a/src/user/notifications.js b/src/user/notifications.js index fe22127c5a..74dc2f7e95 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -96,7 +96,7 @@ UserNotifications.getNotifications = async function (nids, uid) { await deleteUserNids(deletedNids, uid); notificationData = await notifications.merge(notificationData); - const result = await plugins.fireHook('filter:user.notifications.getNotifications', { + const result = await plugins.hooks.fire('filter:user.notifications.getNotifications', { uid: uid, notifications: notificationData, }); diff --git a/src/user/online.js b/src/user/online.js index 05c40464f7..a4c2be313c 100644 --- a/src/user/online.js +++ b/src/user/online.js @@ -23,7 +23,7 @@ module.exports = function (User) { } await db.sortedSetAdd('users:online', now, uid); topics.pushUnreadCount(uid); - plugins.fireHook('action:user.online', { uid: uid, timestamp: now }); + plugins.hooks.fire('action:user.online', { uid: uid, timestamp: now }); }; User.isOnline = async function (uid) { diff --git a/src/user/picture.js b/src/user/picture.js index c7694a47d4..74642fe68b 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -16,7 +16,7 @@ module.exports = function (User) { User.getAllowedImageTypes = function () { const allowedTypes = ['image/png', 'image/jpeg', 'image/bmp']; - if (plugins.hasListeners('filter:image.isFileTypeAllowed')) { + if (plugins.hooks.hasListeners('filter:image.isFileTypeAllowed')) { allowedTypes.push('image/gif'); } return allowedTypes; diff --git a/src/user/profile.js b/src/user/profile.js index e2ca5f03a0..2a571d4cfc 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -22,7 +22,7 @@ module.exports = function (User) { } const updateUid = data.uid; - const result = await plugins.fireHook('filter:user.updateProfile', { + const result = await plugins.hooks.fire('filter:user.updateProfile', { uid: uid, data: data, fields: fields, @@ -52,7 +52,7 @@ module.exports = function (User) { await User.setUserField(updateUid, field, data[field]); }); - plugins.fireHook('action:user.updateProfile', { + plugins.hooks.fire('action:user.updateProfile', { uid: uid, data: data, fields: fields, @@ -332,6 +332,6 @@ module.exports = function (User) { User.auth.revokeAllSessions(data.uid), ]); - plugins.fireHook('action:password.change', { uid: uid, targetUid: data.uid }); + plugins.hooks.fire('action:password.change', { uid: uid, targetUid: data.uid }); }; }; diff --git a/src/user/search.js b/src/user/search.js index 32c9d6bd2f..c7f3c7897e 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -49,7 +49,7 @@ module.exports = function (User) { } uids = await filterAndSortUids(uids, data); - const result = await plugins.fireHook('filter:users.search', { uids: uids, uid: uid }); + const result = await plugins.hooks.fire('filter:users.search', { uids: uids, uid: uid }); uids = result.uids; const searchResult = { diff --git a/src/user/settings.js b/src/user/settings.js index ebb153852f..d486299625 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -36,7 +36,7 @@ module.exports = function (User) { }; async function onSettingsLoaded(uid, settings) { - const data = await plugins.fireHook('filter:user.getSettings', { uid: uid, settings: settings }); + const data = await plugins.hooks.fire('filter:user.getSettings', { uid: uid, settings: settings }); settings = data.settings; const defaultTopicsPerPage = meta.config.topicsPerPage; @@ -101,7 +101,7 @@ module.exports = function (User) { } data.userLang = data.userLang || meta.config.defaultLang; - plugins.fireHook('action:user.saveSettings', { uid: uid, settings: data }); + plugins.hooks.fire('action:user.saveSettings', { uid: uid, settings: data }); const settings = { showemail: data.showemail, @@ -132,7 +132,7 @@ module.exports = function (User) { settings[notificationType] = data[notificationType]; } }); - const result = await plugins.fireHook('filter:user.saveSettings', { settings: settings, data: data }); + const result = await plugins.hooks.fire('filter:user.saveSettings', { settings: settings, data: data }); await db.setObject('user:' + uid + ':settings', result.settings); await User.updateDigestSetting(uid, data.dailyDigestFreq); return await User.getSettings(uid); diff --git a/src/webserver.js b/src/webserver.js index 87f5cf654d..4a6898f9a0 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -89,7 +89,7 @@ exports.listen = async function () { hostname: os.hostname(), }); - plugins.fireHook('action:nodebb.ready'); + plugins.hooks.fire('action:nodebb.ready'); await util.promisify(listen)(); }; @@ -98,8 +98,8 @@ async function initializeNodeBB() { const middleware = require('./middleware'); await meta.themes.setupPaths(); await plugins.init(app, middleware); - await plugins.fireHook('static:assets.prepare', {}); - await plugins.fireHook('static:app.preload', { + await plugins.hooks.fire('static:assets.prepare', {}); + await plugins.hooks.fire('static:app.preload', { app: app, middleware: middleware, }); diff --git a/src/widgets/admin.js b/src/widgets/admin.js index c8c778a84a..cfc3e50a8c 100644 --- a/src/widgets/admin.js +++ b/src/widgets/admin.js @@ -30,7 +30,7 @@ admin.getAreas = async function () { { name: 'Group Page (Right)', template: 'groups/details.tpl', location: 'right' }, ]; - const areas = await plugins.fireHook('filter:widgets.getAreas', defaultAreas); + const areas = await plugins.hooks.fire('filter:widgets.getAreas', defaultAreas); areas.push({ name: 'Draft Zone', template: 'global', location: 'drafts' }); const areaData = await Promise.all(areas.map(area => index.getArea(area.template, area.location))); @@ -42,7 +42,7 @@ admin.getAreas = async function () { async function getAvailableWidgets() { const [availableWidgets, adminTemplate] = await Promise.all([ - plugins.fireHook('filter:widgets.getWidgets', []), + plugins.hooks.fire('filter:widgets.getWidgets', []), renderAdminTemplate(), ]); availableWidgets.forEach(function (w) { diff --git a/src/widgets/index.js b/src/widgets/index.js index cbbd45c54b..9d0ddbd856 100644 --- a/src/widgets/index.js +++ b/src/widgets/index.js @@ -62,7 +62,7 @@ async function renderWidget(widget, uid, options) { const userLang = config.userLang || meta.config.defaultLang || 'en-GB'; const templateData = _.assign({ }, options.templateData, { config: config }); - const data = await plugins.fireHook('filter:widget.render:' + widget.widget, { + const data = await plugins.hooks.fire('filter:widget.render:' + widget.widget, { uid: uid, area: options, templateData: templateData, @@ -175,7 +175,7 @@ widgets.reset = async function () { ]; const [areas, drafts] = await Promise.all([ - plugins.fireHook('filter:widgets.getAreas', defaultAreas), + plugins.hooks.fire('filter:widgets.getAreas', defaultAreas), widgets.getArea('global', 'drafts'), ]);