mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
refactor: move plugin hook methods to plugin.hooks.*
This commit is contained in:
@@ -41,7 +41,7 @@ Analytics.init = async function () {
|
|||||||
Analytics.increment = function (keys, callback) {
|
Analytics.increment = function (keys, callback) {
|
||||||
keys = Array.isArray(keys) ? keys : [keys];
|
keys = Array.isArray(keys) ? keys : [keys];
|
||||||
|
|
||||||
plugins.fireHook('action:analytics.increment', { keys: keys });
|
plugins.hooks.fire('action:analytics.increment', { keys: keys });
|
||||||
|
|
||||||
keys.forEach(function (key) {
|
keys.forEach(function (key) {
|
||||||
counters[key] = counters[key] || 0;
|
counters[key] = counters[key] || 0;
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ exports.postCommand = async function (caller, command, eventName, notification,
|
|||||||
filter:post.bookmark
|
filter:post.bookmark
|
||||||
filter:post.unbookmark
|
filter:post.unbookmark
|
||||||
*/
|
*/
|
||||||
const filteredData = await plugins.fireHook('filter:post.' + command, {
|
const filteredData = await plugins.hooks.fire('filter:post.' + command, {
|
||||||
data: data,
|
data: data,
|
||||||
uid: caller.uid,
|
uid: caller.uid,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ usersAPI.changePassword = async function (caller, data) {
|
|||||||
|
|
||||||
usersAPI.follow = async function (caller, data) {
|
usersAPI.follow = async function (caller, data) {
|
||||||
await user.follow(caller.uid, data.uid);
|
await user.follow(caller.uid, data.uid);
|
||||||
plugins.fireHook('action:user.follow', {
|
plugins.hooks.fire('action:user.follow', {
|
||||||
fromUid: caller.uid,
|
fromUid: caller.uid,
|
||||||
toUid: data.uid,
|
toUid: data.uid,
|
||||||
});
|
});
|
||||||
@@ -151,7 +151,7 @@ usersAPI.follow = async function (caller, data) {
|
|||||||
|
|
||||||
usersAPI.unfollow = async function (caller, data) {
|
usersAPI.unfollow = async function (caller, data) {
|
||||||
await user.unfollow(caller.uid, data.uid);
|
await user.unfollow(caller.uid, data.uid);
|
||||||
plugins.fireHook('action:user.unfollow', {
|
plugins.hooks.fire('action:user.unfollow', {
|
||||||
fromUid: caller.uid,
|
fromUid: caller.uid,
|
||||||
toUid: data.uid,
|
toUid: data.uid,
|
||||||
});
|
});
|
||||||
@@ -185,7 +185,7 @@ usersAPI.ban = async function (caller, data) {
|
|||||||
ip: caller.ip,
|
ip: caller.ip,
|
||||||
reason: data.reason || undefined,
|
reason: data.reason || undefined,
|
||||||
});
|
});
|
||||||
plugins.fireHook('action:user.banned', {
|
plugins.hooks.fire('action:user.banned', {
|
||||||
callerUid: caller.uid,
|
callerUid: caller.uid,
|
||||||
ip: caller.ip,
|
ip: caller.ip,
|
||||||
uid: data.uid,
|
uid: data.uid,
|
||||||
@@ -207,7 +207,7 @@ usersAPI.unban = async function (caller, data) {
|
|||||||
targetUid: data.uid,
|
targetUid: data.uid,
|
||||||
ip: caller.ip,
|
ip: caller.ip,
|
||||||
});
|
});
|
||||||
plugins.fireHook('action:user.unbanned', {
|
plugins.hooks.fire('action:user.unbanned', {
|
||||||
callerUid: caller.uid,
|
callerUid: caller.uid,
|
||||||
ip: caller.ip,
|
ip: caller.ip,
|
||||||
uid: data.uid,
|
uid: data.uid,
|
||||||
@@ -278,7 +278,7 @@ async function processDeletion({ uid, method, password, caller }) {
|
|||||||
|
|
||||||
sockets.server.sockets.emit('event:user_status_change', { uid: caller.uid, status: 'offline' });
|
sockets.server.sockets.emit('event:user_status_change', { uid: caller.uid, status: 'offline' });
|
||||||
|
|
||||||
plugins.fireHook('action:user.delete', {
|
plugins.hooks.fire('action:user.delete', {
|
||||||
callerUid: caller.uid,
|
callerUid: caller.uid,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
ip: caller.ip,
|
ip: caller.ip,
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ module.exports = function (Categories) {
|
|||||||
category.backgroundImage = data.backgroundImage;
|
category.backgroundImage = data.backgroundImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await plugins.fireHook('filter:category.create', { category: category, data: data });
|
const result = await plugins.hooks.fire('filter:category.create', { category: category, data: data });
|
||||||
category = result.category;
|
category = result.category;
|
||||||
|
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ module.exports = function (Categories) {
|
|||||||
await duplicateCategoriesChildren(category.cid, data.cloneFromCid, data.uid);
|
await duplicateCategoriesChildren(category.cid, data.cloneFromCid, data.uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins.fireHook('action:category.create', { category: category });
|
plugins.hooks.fire('action:category.create', { category: category });
|
||||||
return category;
|
return category;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -170,7 +170,7 @@ module.exports = function (Categories) {
|
|||||||
Categories.copyPrivilegesFrom = async function (fromCid, toCid, group) {
|
Categories.copyPrivilegesFrom = async function (fromCid, toCid, group) {
|
||||||
group = group || '';
|
group = group || '';
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:categories.copyPrivilegesFrom', {
|
const data = await plugins.hooks.fire('filter:categories.copyPrivilegesFrom', {
|
||||||
privileges: group ? privileges.groupPrivilegeList.slice() : privileges.privilegeList.slice(),
|
privileges: group ? privileges.groupPrivilegeList.slice() : privileges.privilegeList.slice(),
|
||||||
fromCid: fromCid,
|
fromCid: fromCid,
|
||||||
toCid: toCid,
|
toCid: toCid,
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ module.exports = function (Categories) {
|
|||||||
|
|
||||||
const keys = cids.map(cid => 'category:' + cid);
|
const keys = cids.map(cid => 'category:' + cid);
|
||||||
const categories = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
const categories = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
||||||
const result = await plugins.fireHook('filter:category.getFields', {
|
const result = await plugins.hooks.fire('filter:category.getFields', {
|
||||||
cids: cids,
|
cids: cids,
|
||||||
categories: categories,
|
categories: categories,
|
||||||
fields: fields,
|
fields: fields,
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ module.exports = function (Categories) {
|
|||||||
await topics.purgePostsAndTopic(tid, uid);
|
await topics.purgePostsAndTopic(tid, uid);
|
||||||
});
|
});
|
||||||
await purgeCategory(cid);
|
await purgeCategory(cid);
|
||||||
plugins.fireHook('action:category.delete', { cid: cid, uid: uid });
|
plugins.hooks.fire('action:category.delete', { cid: cid, uid: uid });
|
||||||
};
|
};
|
||||||
|
|
||||||
async function purgeCategory(cid) {
|
async function purgeCategory(cid) {
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ Categories.getCategoryById = async function (data) {
|
|||||||
|
|
||||||
|
|
||||||
calculateTopicPostCount(category);
|
calculateTopicPostCount(category);
|
||||||
const result = await plugins.fireHook('filter:category.get', { category: category, uid: data.uid });
|
const result = await plugins.hooks.fire('filter:category.get', { category: category, uid: data.uid });
|
||||||
return result.category;
|
return result.category;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ module.exports = function (Categories) {
|
|||||||
if (numRecentReplies > 0) {
|
if (numRecentReplies > 0) {
|
||||||
await db.sortedSetAdd('cid:' + cid + ':recent_tids', Date.now(), tid);
|
await db.sortedSetAdd('cid:' + cid + ':recent_tids', Date.now(), tid);
|
||||||
}
|
}
|
||||||
await plugins.fireHook('action:categories.updateRecentTid', { cid: cid, tid: tid });
|
await plugins.hooks.fire('action:categories.updateRecentTid', { cid: cid, tid: tid });
|
||||||
};
|
};
|
||||||
|
|
||||||
Categories.updateRecentTidForCid = async function (cid) {
|
Categories.updateRecentTidForCid = async function (cid) {
|
||||||
@@ -68,8 +68,8 @@ module.exports = function (Categories) {
|
|||||||
}
|
}
|
||||||
const categoriesToLoad = categoryData.filter(c => c && c.numRecentReplies && parseInt(c.numRecentReplies, 10) > 0);
|
const categoriesToLoad = categoryData.filter(c => c && c.numRecentReplies && parseInt(c.numRecentReplies, 10) > 0);
|
||||||
let keys = [];
|
let keys = [];
|
||||||
if (plugins.hasListeners('filter:categories.getRecentTopicReplies')) {
|
if (plugins.hooks.hasListeners('filter:categories.getRecentTopicReplies')) {
|
||||||
const result = await plugins.fireHook('filter:categories.getRecentTopicReplies', {
|
const result = await plugins.hooks.fire('filter:categories.getRecentTopicReplies', {
|
||||||
categories: categoriesToLoad,
|
categories: categoriesToLoad,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
query: query,
|
query: query,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const user = require('../user');
|
|||||||
|
|
||||||
module.exports = function (Categories) {
|
module.exports = function (Categories) {
|
||||||
Categories.getCategoryTopics = async function (data) {
|
Categories.getCategoryTopics = async function (data) {
|
||||||
let results = await plugins.fireHook('filter:category.topics.prepare', data);
|
let results = await plugins.hooks.fire('filter:category.topics.prepare', data);
|
||||||
const tids = await Categories.getTopicIds(results);
|
const tids = await Categories.getTopicIds(results);
|
||||||
let topicsData = await topics.getTopicsByTids(tids, data.uid);
|
let topicsData = await topics.getTopicsByTids(tids, data.uid);
|
||||||
topicsData = await user.blocks.filter(data.uid, topicsData);
|
topicsData = await user.blocks.filter(data.uid, topicsData);
|
||||||
@@ -18,7 +18,7 @@ module.exports = function (Categories) {
|
|||||||
}
|
}
|
||||||
topics.calculateTopicIndices(topicsData, data.start);
|
topics.calculateTopicIndices(topicsData, data.start);
|
||||||
|
|
||||||
results = await plugins.fireHook('filter:category.topics.get', { cid: data.cid, topics: topicsData, uid: data.uid });
|
results = await plugins.hooks.fire('filter:category.topics.get', { cid: data.cid, topics: topicsData, uid: data.uid });
|
||||||
return { topics: results.topics, nextStart: data.stop + 1 };
|
return { topics: results.topics, nextStart: data.stop + 1 };
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -43,8 +43,8 @@ module.exports = function (Categories) {
|
|||||||
return pinnedTidsOnPage;
|
return pinnedTidsOnPage;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plugins.hasListeners('filter:categories.getTopicIds')) {
|
if (plugins.hooks.hasListeners('filter:categories.getTopicIds')) {
|
||||||
const result = await plugins.fireHook('filter:categories.getTopicIds', {
|
const result = await plugins.hooks.fire('filter:categories.getTopicIds', {
|
||||||
tids: [],
|
tids: [],
|
||||||
data: data,
|
data: data,
|
||||||
pinnedTids: pinnedTidsOnPage,
|
pinnedTids: pinnedTidsOnPage,
|
||||||
@@ -74,8 +74,8 @@ module.exports = function (Categories) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Categories.getTopicCount = async function (data) {
|
Categories.getTopicCount = async function (data) {
|
||||||
if (plugins.hasListeners('filter:categories.getTopicCount')) {
|
if (plugins.hooks.hasListeners('filter:categories.getTopicCount')) {
|
||||||
const result = await plugins.fireHook('filter:categories.getTopicCount', {
|
const result = await plugins.hooks.fire('filter:categories.getTopicCount', {
|
||||||
topicCount: data.category.topic_count,
|
topicCount: data.category.topic_count,
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
@@ -112,7 +112,7 @@ module.exports = function (Categories) {
|
|||||||
set = [set, 'tag:' + data.tag + ':topics'];
|
set = [set, 'tag:' + data.tag + ':topics'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const result = await plugins.fireHook('filter:categories.buildTopicsSortedSet', {
|
const result = await plugins.hooks.fire('filter:categories.buildTopicsSortedSet', {
|
||||||
set: set,
|
set: set,
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
@@ -122,7 +122,7 @@ module.exports = function (Categories) {
|
|||||||
Categories.getSortedSetRangeDirection = async function (sort) {
|
Categories.getSortedSetRangeDirection = async function (sort) {
|
||||||
sort = sort || 'newest_to_oldest';
|
sort = sort || 'newest_to_oldest';
|
||||||
const direction = sort === 'newest_to_oldest' || sort === 'most_posts' || sort === 'most_votes' ? 'highest-to-lowest' : 'lowest-to-highest';
|
const direction = sort === 'newest_to_oldest' || sort === 'most_posts' || sort === 'most_votes' ? 'highest-to-lowest' : 'lowest-to-highest';
|
||||||
const result = await plugins.fireHook('filter:categories.getSortedSetRangeDirection', {
|
const result = await plugins.hooks.fire('filter:categories.getSortedSetRangeDirection', {
|
||||||
sort: sort,
|
sort: sort,
|
||||||
direction: direction,
|
direction: direction,
|
||||||
});
|
});
|
||||||
@@ -134,8 +134,8 @@ module.exports = function (Categories) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Categories.getPinnedTids = async function (data) {
|
Categories.getPinnedTids = async function (data) {
|
||||||
if (plugins.hasListeners('filter:categories.getPinnedTids')) {
|
if (plugins.hooks.hasListeners('filter:categories.getPinnedTids')) {
|
||||||
const result = await plugins.fireHook('filter:categories.getPinnedTids', {
|
const result = await plugins.hooks.fire('filter:categories.getPinnedTids', {
|
||||||
pinnedTids: [],
|
pinnedTids: [],
|
||||||
data: data,
|
data: data,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ module.exports = function (Categories) {
|
|||||||
const translated = await translator.translate(modifiedFields.name);
|
const translated = await translator.translate(modifiedFields.name);
|
||||||
modifiedFields.slug = cid + '/' + slugify(translated);
|
modifiedFields.slug = cid + '/' + slugify(translated);
|
||||||
}
|
}
|
||||||
const result = await plugins.fireHook('filter:category.update', { cid: cid, category: modifiedFields });
|
const result = await plugins.hooks.fire('filter:category.update', { cid: cid, category: modifiedFields });
|
||||||
|
|
||||||
const category = result.category;
|
const category = result.category;
|
||||||
var fields = Object.keys(category);
|
var fields = Object.keys(category);
|
||||||
@@ -40,7 +40,7 @@ module.exports = function (Categories) {
|
|||||||
await async.eachSeries(fields, async function (key) {
|
await async.eachSeries(fields, async function (key) {
|
||||||
await updateCategoryField(cid, key, category[key]);
|
await updateCategoryField(cid, key, category[key]);
|
||||||
});
|
});
|
||||||
plugins.fireHook('action:category.update', { cid: cid, modified: category });
|
plugins.hooks.fire('action:category.update', { cid: cid, modified: category });
|
||||||
}
|
}
|
||||||
|
|
||||||
async function updateCategoryField(cid, key, value) {
|
async function updateCategoryField(cid, key, value) {
|
||||||
@@ -92,7 +92,7 @@ module.exports = function (Categories) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Categories.parseDescription = async function (cid, description) {
|
Categories.parseDescription = async function (cid, description) {
|
||||||
const parsedDescription = await plugins.fireHook('filter:parse.raw', description);
|
const parsedDescription = await plugins.hooks.fire('filter:parse.raw', description);
|
||||||
await Categories.setCategoryField(cid, 'descriptionParsed', parsedDescription);
|
await Categories.setCategoryField(cid, 'descriptionParsed', parsedDescription);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ exports.handle404 = function handle404(req, res) {
|
|||||||
const relativePath = nconf.get('relative_path');
|
const relativePath = nconf.get('relative_path');
|
||||||
const isClientScript = new RegExp('^' + relativePath + '\\/assets\\/src\\/.+\\.js(\\?v=\\w+)?$');
|
const isClientScript = new RegExp('^' + relativePath + '\\/assets\\/src\\/.+\\.js(\\?v=\\w+)?$');
|
||||||
|
|
||||||
if (plugins.hasListeners('action:meta.override404')) {
|
if (plugins.hooks.hasListeners('action:meta.override404')) {
|
||||||
return plugins.fireHook('action:meta.override404', {
|
return plugins.hooks.fire('action:meta.override404', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
error: {},
|
error: {},
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ blocksController.getBlocks = async function (req, res, next) {
|
|||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
const uids = await user.blocks.list(userData.uid);
|
const uids = await user.blocks.list(userData.uid);
|
||||||
const data = await plugins.fireHook('filter:user.getBlocks', {
|
const data = await plugins.hooks.fire('filter:user.getBlocks', {
|
||||||
uids: uids,
|
uids: uids,
|
||||||
uid: userData.uid,
|
uid: userData.uid,
|
||||||
start: start,
|
start: start,
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID) {
|
|||||||
userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%'));
|
userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%'));
|
||||||
userData['username:disableEdit'] = !userData.isAdmin && meta.config['username:disableEdit'];
|
userData['username:disableEdit'] = !userData.isAdmin && meta.config['username:disableEdit'];
|
||||||
userData['email:disableEdit'] = !userData.isAdmin && meta.config['email:disableEdit'];
|
userData['email:disableEdit'] = !userData.isAdmin && meta.config['email:disableEdit'];
|
||||||
const hookData = await plugins.fireHook('filter:helpers.getUserDataByUserSlug', { userData: userData, callerUID: callerUID });
|
const hookData = await plugins.hooks.fire('filter:helpers.getUserDataByUserSlug', { userData: userData, callerUID: callerUID });
|
||||||
return hookData.userData;
|
return hookData.userData;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ async function getAllData(uid, callerUID) {
|
|||||||
ips: user.getIPs(uid, 4),
|
ips: user.getIPs(uid, 4),
|
||||||
profile_menu: getProfileMenu(uid, callerUID),
|
profile_menu: getProfileMenu(uid, callerUID),
|
||||||
groups: groups.getUserGroups([uid]),
|
groups: groups.getUserGroups([uid]),
|
||||||
sso: plugins.fireHook('filter:auth.list', { uid: uid, associations: [] }),
|
sso: plugins.hooks.fire('filter:auth.list', { uid: uid, associations: [] }),
|
||||||
canEdit: privileges.users.canEdit(callerUID, uid),
|
canEdit: privileges.users.canEdit(callerUID, uid),
|
||||||
canBanUser: privileges.users.canBanUser(callerUID, uid),
|
canBanUser: privileges.users.canBanUser(callerUID, uid),
|
||||||
isBlocked: user.blocks.is(uid, callerUID),
|
isBlocked: user.blocks.is(uid, callerUID),
|
||||||
@@ -183,7 +183,7 @@ async function getProfileMenu(uid, callerUID) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return await plugins.fireHook('filter:user.profileMenu', {
|
return await plugins.hooks.fire('filter:user.profileMenu', {
|
||||||
uid: uid,
|
uid: uid,
|
||||||
callerUID: callerUID,
|
callerUID: callerUID,
|
||||||
links: links,
|
links: links,
|
||||||
@@ -197,7 +197,7 @@ async function parseAboutMe(userData) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
userData.aboutme = validator.escape(String(userData.aboutme || ''));
|
userData.aboutme = validator.escape(String(userData.aboutme || ''));
|
||||||
const parsed = await plugins.fireHook('filter:parse.aboutme', userData.aboutme);
|
const parsed = await plugins.hooks.fire('filter:parse.aboutme', userData.aboutme);
|
||||||
userData.aboutmeParsed = translator.escape(parsed);
|
userData.aboutmeParsed = translator.escape(parsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ notificationsController.get = async function (req, res, next) {
|
|||||||
const stop = start + itemsPerPage - 1;
|
const stop = start + itemsPerPage - 1;
|
||||||
|
|
||||||
const [filters, isPrivileged] = await Promise.all([
|
const [filters, isPrivileged] = await Promise.all([
|
||||||
plugins.fireHook('filter:notifications.addFilters', {
|
plugins.hooks.fire('filter:notifications.addFilters', {
|
||||||
regularFilters: regularFilters,
|
regularFilters: regularFilters,
|
||||||
moderatorFilters: moderatorFilters,
|
moderatorFilters: moderatorFilters,
|
||||||
uid: req.uid,
|
uid: req.uid,
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ settingsController.get = async function (req, res, next) {
|
|||||||
userData.acpLanguages = _.cloneDeep(languagesData);
|
userData.acpLanguages = _.cloneDeep(languagesData);
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:user.customSettings', {
|
const data = await plugins.hooks.fire('filter:user.customSettings', {
|
||||||
settings: settings,
|
settings: settings,
|
||||||
customSettings: [],
|
customSettings: [],
|
||||||
uid: req.uid,
|
uid: req.uid,
|
||||||
@@ -110,7 +110,7 @@ settingsController.get = async function (req, res, next) {
|
|||||||
userData.hideFullname = meta.config.hideFullname || 0;
|
userData.hideFullname = meta.config.hideFullname || 0;
|
||||||
userData.hideEmail = meta.config.hideEmail || 0;
|
userData.hideEmail = meta.config.hideEmail || 0;
|
||||||
|
|
||||||
userData.inTopicSearchAvailable = plugins.hasListeners('filter:topic.search');
|
userData.inTopicSearchAvailable = plugins.hooks.hasListeners('filter:topic.search');
|
||||||
|
|
||||||
userData.maxTopicsPerPage = meta.config.maxTopicsPerPage;
|
userData.maxTopicsPerPage = meta.config.maxTopicsPerPage;
|
||||||
userData.maxPostsPerPage = meta.config.maxPostsPerPage;
|
userData.maxPostsPerPage = meta.config.maxPostsPerPage;
|
||||||
@@ -191,7 +191,7 @@ async function getNotificationSettings(userData) {
|
|||||||
if (privileges.isAdmin || privileges.isGlobalMod) {
|
if (privileges.isAdmin || privileges.isGlobalMod) {
|
||||||
privilegedTypes.push('notificationType_new-user-flag');
|
privilegedTypes.push('notificationType_new-user-flag');
|
||||||
}
|
}
|
||||||
const results = await plugins.fireHook('filter:user.notificationTypes', {
|
const results = await plugins.hooks.fire('filter:user.notificationTypes', {
|
||||||
types: notifications.baseTypes.slice(),
|
types: notifications.baseTypes.slice(),
|
||||||
privilegedTypes: privilegedTypes,
|
privilegedTypes: privilegedTypes,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ categoriesController.get = async function (req, res, next) {
|
|||||||
});
|
});
|
||||||
const selectedCategory = allCategories.find(c => c.selected);
|
const selectedCategory = allCategories.find(c => c.selected);
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:admin.category.get', {
|
const data = await plugins.hooks.fire('filter:admin.category.get', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
category: category,
|
category: category,
|
||||||
@@ -53,7 +53,7 @@ categoriesController.getAll = async function (req, res) {
|
|||||||
'color', 'bgColor', 'backgroundImage', 'imageClass',
|
'color', 'bgColor', 'backgroundImage', 'imageClass',
|
||||||
];
|
];
|
||||||
const categoriesData = await categories.getCategoriesFields(cids, fields);
|
const categoriesData = await categories.getCategoriesFields(cids, fields);
|
||||||
const result = await plugins.fireHook('filter:admin.categories.get', { categories: categoriesData, fields: fields });
|
const result = await plugins.hooks.fire('filter:admin.categories.get', { categories: categoriesData, fields: fields });
|
||||||
const tree = categories.getTree(result.categories, 0);
|
const tree = categories.getTree(result.categories, 0);
|
||||||
res.render('admin/manage/categories', {
|
res.render('admin/manage/categories', {
|
||||||
categories: tree,
|
categories: tree,
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ async function getNotices() {
|
|||||||
notDoneText: '[[admin/dashboard:restart-required]]',
|
notDoneText: '[[admin/dashboard:restart-required]]',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
done: plugins.hasListeners('filter:search.query'),
|
done: plugins.hooks.hasListeners('filter:search.query'),
|
||||||
doneText: '[[admin/dashboard:search-plugin-installed]]',
|
doneText: '[[admin/dashboard:search-plugin-installed]]',
|
||||||
notDoneText: '[[admin/dashboard:search-plugin-not-installed]]',
|
notDoneText: '[[admin/dashboard:search-plugin-not-installed]]',
|
||||||
tooltip: '[[admin/dashboard:search-plugin-tooltip]]',
|
tooltip: '[[admin/dashboard:search-plugin-tooltip]]',
|
||||||
@@ -62,7 +62,7 @@ async function getNotices() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return await plugins.fireHook('filter:admin.notices', notices);
|
return await plugins.hooks.fire('filter:admin.notices', notices);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getLatestVersion() {
|
async function getLatestVersion() {
|
||||||
|
|||||||
@@ -237,8 +237,8 @@ function validateUpload(res, uploadedFile, allowedTypes) {
|
|||||||
async function uploadImage(filename, folder, uploadedFile, req, res, next) {
|
async function uploadImage(filename, folder, uploadedFile, req, res, next) {
|
||||||
let imageData;
|
let imageData;
|
||||||
try {
|
try {
|
||||||
if (plugins.hasListeners('filter:uploadImage')) {
|
if (plugins.hooks.hasListeners('filter:uploadImage')) {
|
||||||
imageData = await plugins.fireHook('filter:uploadImage', { image: uploadedFile, uid: req.uid, folder: folder });
|
imageData = await plugins.hooks.fire('filter:uploadImage', { image: uploadedFile, uid: req.uid, folder: folder });
|
||||||
} else {
|
} else {
|
||||||
imageData = await file.saveFileToLocal(filename, folder, uploadedFile.path);
|
imageData = await file.saveFileToLocal(filename, folder, uploadedFile.path);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ usersController.registrationQueue = async function (req, res) {
|
|||||||
const data = await utils.promiseParallel({
|
const data = await utils.promiseParallel({
|
||||||
registrationQueueCount: db.sortedSetCard('registration:queue'),
|
registrationQueueCount: db.sortedSetCard('registration:queue'),
|
||||||
users: user.getRegistrationQueue(start, stop),
|
users: user.getRegistrationQueue(start, stop),
|
||||||
customHeaders: plugins.fireHook('filter:admin.registrationQueue.customHeaders', { headers: [] }),
|
customHeaders: plugins.hooks.fire('filter:admin.registrationQueue.customHeaders', { headers: [] }),
|
||||||
invites: getInvites(),
|
invites: getInvites(),
|
||||||
});
|
});
|
||||||
var pageCount = Math.max(1, Math.ceil(data.registrationQueueCount / itemsPerPage));
|
var pageCount = Math.max(1, Math.ceil(data.registrationQueueCount / itemsPerPage));
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ apiController.loadConfig = async function (req) {
|
|||||||
topicPostSort: meta.config.topicPostSort || 'oldest_to_newest',
|
topicPostSort: meta.config.topicPostSort || 'oldest_to_newest',
|
||||||
categoryTopicSort: meta.config.categoryTopicSort || 'newest_to_oldest',
|
categoryTopicSort: meta.config.categoryTopicSort || 'newest_to_oldest',
|
||||||
csrf_token: req.uid >= 0 && req.csrfToken && req.csrfToken(),
|
csrf_token: req.uid >= 0 && req.csrfToken && req.csrfToken(),
|
||||||
searchEnabled: plugins.hasListeners('filter:search.query'),
|
searchEnabled: plugins.hooks.hasListeners('filter:search.query'),
|
||||||
bootswatchSkin: meta.config.bootswatchSkin || '',
|
bootswatchSkin: meta.config.bootswatchSkin || '',
|
||||||
enablePostHistory: meta.config.enablePostHistory === 1,
|
enablePostHistory: meta.config.enablePostHistory === 1,
|
||||||
timeagoCutoff: meta.config.timeagoCutoff !== '' ? Math.max(0, parseInt(meta.config.timeagoCutoff, 10)) : meta.config.timeagoCutoff,
|
timeagoCutoff: meta.config.timeagoCutoff !== '' ? Math.max(0, parseInt(meta.config.timeagoCutoff, 10)) : meta.config.timeagoCutoff,
|
||||||
@@ -98,7 +98,7 @@ apiController.loadConfig = async function (req) {
|
|||||||
config.categoryTopicSort = settings.categoryTopicSort || config.categoryTopicSort;
|
config.categoryTopicSort = settings.categoryTopicSort || config.categoryTopicSort;
|
||||||
config.topicSearchEnabled = settings.topicSearchEnabled || false;
|
config.topicSearchEnabled = settings.topicSearchEnabled || false;
|
||||||
config.bootswatchSkin = (meta.config.disableCustomUserSkins !== 1 && settings.bootswatchSkin && settings.bootswatchSkin !== '') ? settings.bootswatchSkin : '';
|
config.bootswatchSkin = (meta.config.disableCustomUserSkins !== 1 && settings.bootswatchSkin && settings.bootswatchSkin !== '') ? settings.bootswatchSkin : '';
|
||||||
config = await plugins.fireHook('filter:config.get', config);
|
config = await plugins.hooks.fire('filter:config.get', config);
|
||||||
return config;
|
return config;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ const sockets = require('../socket.io');
|
|||||||
const authenticationController = module.exports;
|
const authenticationController = module.exports;
|
||||||
|
|
||||||
async function registerAndLoginUser(req, res, userData) {
|
async function registerAndLoginUser(req, res, userData) {
|
||||||
const data = await plugins.fireHook('filter:register.interstitial', {
|
const data = await plugins.hooks.fire('filter:register.interstitial', {
|
||||||
userData: userData,
|
userData: userData,
|
||||||
interstitials: [],
|
interstitials: [],
|
||||||
});
|
});
|
||||||
@@ -45,7 +45,7 @@ async function registerAndLoginUser(req, res, userData) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const queue = await user.shouldQueueUser(req.ip);
|
const queue = await user.shouldQueueUser(req.ip);
|
||||||
const result = await plugins.fireHook('filter:register.shouldQueue', { req: req, res: res, userData: userData, queue: queue });
|
const result = await plugins.hooks.fire('filter:register.shouldQueue', { req: req, res: res, userData: userData, queue: queue });
|
||||||
if (result.queue) {
|
if (result.queue) {
|
||||||
return await addToApprovalQueue(req, userData);
|
return await addToApprovalQueue(req, userData);
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ async function registerAndLoginUser(req, res, userData) {
|
|||||||
}
|
}
|
||||||
await user.deleteInvitationKey(userData.email);
|
await user.deleteInvitationKey(userData.email);
|
||||||
const referrer = req.body.referrer || req.session.referrer || nconf.get('relative_path') + '/';
|
const referrer = req.body.referrer || req.session.referrer || nconf.get('relative_path') + '/';
|
||||||
const complete = await plugins.fireHook('filter:register.complete', { uid: uid, referrer: referrer });
|
const complete = await plugins.hooks.fire('filter:register.complete', { uid: uid, referrer: referrer });
|
||||||
req.session.returnTo = complete.referrer;
|
req.session.returnTo = complete.referrer;
|
||||||
return complete;
|
return complete;
|
||||||
}
|
}
|
||||||
@@ -105,7 +105,7 @@ authenticationController.register = async function (req, res) {
|
|||||||
user.isPasswordValid(userData.password);
|
user.isPasswordValid(userData.password);
|
||||||
|
|
||||||
res.locals.processLogin = true; // set it to false in plugin if you wish to just register only
|
res.locals.processLogin = true; // set it to false in plugin if you wish to just register only
|
||||||
await plugins.fireHook('filter:register.check', { req: req, res: res, userData: userData });
|
await plugins.hooks.fire('filter:register.check', { req: req, res: res, userData: userData });
|
||||||
|
|
||||||
const data = await registerAndLoginUser(req, res, userData);
|
const data = await registerAndLoginUser(req, res, userData);
|
||||||
if (data) {
|
if (data) {
|
||||||
@@ -137,7 +137,7 @@ async function addToApprovalQueue(req, userData) {
|
|||||||
|
|
||||||
authenticationController.registerComplete = function (req, res, next) {
|
authenticationController.registerComplete = function (req, res, next) {
|
||||||
// For the interstitials that respond, execute the callback with the form body
|
// For the interstitials that respond, execute the callback with the form body
|
||||||
plugins.fireHook('filter:register.interstitial', {
|
plugins.hooks.fire('filter:register.interstitial', {
|
||||||
userData: req.session.registration,
|
userData: req.session.registration,
|
||||||
interstitials: [],
|
interstitials: [],
|
||||||
}, function (err, data) {
|
}, function (err, data) {
|
||||||
@@ -217,14 +217,14 @@ authenticationController.registerAbort = function (req, res) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
authenticationController.login = function (req, res, next) {
|
authenticationController.login = function (req, res, next) {
|
||||||
if (plugins.hasListeners('action:auth.overrideLogin')) {
|
if (plugins.hooks.hasListeners('action:auth.overrideLogin')) {
|
||||||
return continueLogin(req, res, next);
|
return continueLogin(req, res, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
var loginWith = meta.config.allowLoginWith || 'username-email';
|
var loginWith = meta.config.allowLoginWith || 'username-email';
|
||||||
req.body.username = req.body.username.trim();
|
req.body.username = req.body.username.trim();
|
||||||
|
|
||||||
plugins.fireHook('filter:login.check', { req: req, res: res, userData: req.body }, (err) => {
|
plugins.hooks.fire('filter:login.check', { req: req, res: res, userData: req.body }, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
return helpers.noScriptErrors(req, res, err.message, 403);
|
return helpers.noScriptErrors(req, res, err.message, 403);
|
||||||
}
|
}
|
||||||
@@ -355,7 +355,7 @@ authenticationController.onSuccessfulLogin = async function (req, uid) {
|
|||||||
// Force session check for all connected socket.io clients with the same session id
|
// Force session check for all connected socket.io clients with the same session id
|
||||||
sockets.in('sess_' + req.sessionID).emit('checkSession', uid);
|
sockets.in('sess_' + req.sessionID).emit('checkSession', uid);
|
||||||
|
|
||||||
plugins.fireHook('action:user.loggedIn', { uid: uid, req: req });
|
plugins.hooks.fire('action:user.loggedIn', { uid: uid, req: req });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
req.session.destroy();
|
req.session.destroy();
|
||||||
throw err;
|
throw err;
|
||||||
@@ -428,14 +428,14 @@ authenticationController.logout = async function (req, res, next) {
|
|||||||
|
|
||||||
await user.setUserField(uid, 'lastonline', Date.now() - (meta.config.onlineCutoff * 60000));
|
await user.setUserField(uid, 'lastonline', Date.now() - (meta.config.onlineCutoff * 60000));
|
||||||
await db.sortedSetAdd('users:online', Date.now() - (meta.config.onlineCutoff * 60000), uid);
|
await db.sortedSetAdd('users:online', Date.now() - (meta.config.onlineCutoff * 60000), uid);
|
||||||
await plugins.fireHook('static:user.loggedOut', { req: req, res: res, uid: uid, sessionID: sessionID });
|
await plugins.hooks.fire('static:user.loggedOut', { req: req, res: res, uid: uid, sessionID: sessionID });
|
||||||
|
|
||||||
// Force session check for all connected socket.io clients with the same session id
|
// Force session check for all connected socket.io clients with the same session id
|
||||||
sockets.in('sess_' + sessionID).emit('checkSession', 0);
|
sockets.in('sess_' + sessionID).emit('checkSession', 0);
|
||||||
const payload = {
|
const payload = {
|
||||||
next: nconf.get('relative_path') + '/',
|
next: nconf.get('relative_path') + '/',
|
||||||
};
|
};
|
||||||
plugins.fireHook('filter:user.logout', payload);
|
plugins.hooks.fire('filter:user.logout', payload);
|
||||||
|
|
||||||
if (req.body.noscript === 'true') {
|
if (req.body.noscript === 'true') {
|
||||||
return res.redirect(payload.next);
|
return res.redirect(payload.next);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ exports.get = async function (req, res, callback) {
|
|||||||
content: 'noindex',
|
content: 'noindex',
|
||||||
};
|
};
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:composer.build', {
|
const data = await plugins.hooks.fire('filter:composer.build', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
next: callback,
|
next: callback,
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ exports.handleErrors = function handleErrors(err, req, res, next) { // eslint-di
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
plugins.fireHook('filter:error.handle', {
|
plugins.hooks.fire('filter:error.handle', {
|
||||||
cases: cases,
|
cases: cases,
|
||||||
}, function (_err, data) {
|
}, function (_err, data) {
|
||||||
if (_err) {
|
if (_err) {
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ helpers.buildTerms = function (url, term, query) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
helpers.notAllowed = async function (req, res, error) {
|
helpers.notAllowed = async function (req, res, error) {
|
||||||
const data = await plugins.fireHook('filter:helpers.notAllowed', {
|
const data = await plugins.hooks.fire('filter:helpers.notAllowed', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
error: error,
|
error: error,
|
||||||
@@ -336,7 +336,7 @@ helpers.getHomePageRoutes = async function (uid) {
|
|||||||
name: 'Custom',
|
name: 'Custom',
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
const data = await plugins.fireHook('filter:homepage.get', { routes: routes });
|
const data = await plugins.hooks.fire('filter:homepage.get', { routes: routes });
|
||||||
return data.routes;
|
return data.routes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ async function rewrite(req, res, next) {
|
|||||||
|
|
||||||
const pathname = parsedUrl.pathname;
|
const pathname = parsedUrl.pathname;
|
||||||
const hook = 'action:homepage.get:' + pathname;
|
const hook = 'action:homepage.get:' + pathname;
|
||||||
if (!plugins.hasListeners(hook)) {
|
if (!plugins.hooks.hasListeners(hook)) {
|
||||||
req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + pathname;
|
req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + pathname;
|
||||||
} else {
|
} else {
|
||||||
res.locals.homePageRoute = pathname;
|
res.locals.homePageRoute = pathname;
|
||||||
@@ -54,7 +54,7 @@ exports.rewrite = rewrite;
|
|||||||
function pluginHook(req, res, next) {
|
function pluginHook(req, res, next) {
|
||||||
var hook = 'action:homepage.get:' + res.locals.homePageRoute;
|
var hook = 'action:homepage.get:' + res.locals.homePageRoute;
|
||||||
|
|
||||||
plugins.fireHook(hook, {
|
plugins.hooks.fire(hook, {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
next: next,
|
next: next,
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ Controllers.registerInterstitial = async function (req, res, next) {
|
|||||||
return res.redirect(nconf.get('relative_path') + '/register');
|
return res.redirect(nconf.get('relative_path') + '/register');
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const data = await plugins.fireHook('filter:register.interstitial', {
|
const data = await plugins.hooks.fire('filter:register.interstitial', {
|
||||||
userData: req.session.registration,
|
userData: req.session.registration,
|
||||||
interstitials: [],
|
interstitials: [],
|
||||||
});
|
});
|
||||||
@@ -298,7 +298,7 @@ Controllers.manifest = async function (req, res) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:manifest.build', {
|
const data = await plugins.hooks.fire('filter:manifest.build', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
manifest: manifest,
|
manifest: manifest,
|
||||||
@@ -331,7 +331,7 @@ Controllers.termsOfUse = async function (req, res, next) {
|
|||||||
if (!meta.config.termsOfUse) {
|
if (!meta.config.termsOfUse) {
|
||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
const termsOfUse = await plugins.fireHook('filter:parse.post', {
|
const termsOfUse = await plugins.hooks.fire('filter:parse.post', {
|
||||||
postData: {
|
postData: {
|
||||||
content: meta.config.termsOfUse || '',
|
content: meta.config.termsOfUse || '',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ modsController.flags.list = async function (req, res, next) {
|
|||||||
const results = await Promise.all([
|
const results = await Promise.all([
|
||||||
user.isAdminOrGlobalMod(req.uid),
|
user.isAdminOrGlobalMod(req.uid),
|
||||||
user.getModeratedCids(req.uid),
|
user.getModeratedCids(req.uid),
|
||||||
plugins.fireHook('filter:flags.validateFilters', { filters: validFilters }),
|
plugins.hooks.fire('filter:flags.validateFilters', { filters: validFilters }),
|
||||||
plugins.fireHook('filter:flags.validateSort', { sorts: validSorts }),
|
plugins.hooks.fire('filter:flags.validateSort', { sorts: validSorts }),
|
||||||
]);
|
]);
|
||||||
const [isAdminOrGlobalMod, moderatedCids,, { sorts }] = results;
|
const [isAdminOrGlobalMod, moderatedCids,, { sorts }] = results;
|
||||||
let [,, { filters }] = results;
|
let [,, { filters }] = results;
|
||||||
@@ -226,7 +226,7 @@ modsController.postQueue = async function (req, res, next) {
|
|||||||
(!categoriesData.selectedCids.length || categoriesData.selectedCids.includes(p.category.cid)) &&
|
(!categoriesData.selectedCids.length || categoriesData.selectedCids.includes(p.category.cid)) &&
|
||||||
(isAdminOrGlobalMod || moderatedCids.includes(String(p.category.cid))));
|
(isAdminOrGlobalMod || moderatedCids.includes(String(p.category.cid))));
|
||||||
|
|
||||||
({ posts: postData } = await plugins.fireHook('filter:post-queue.get', {
|
({ posts: postData } = await plugins.hooks.fire('filter:post-queue.get', {
|
||||||
posts: postData,
|
posts: postData,
|
||||||
req: req,
|
req: req,
|
||||||
}));
|
}));
|
||||||
@@ -281,6 +281,6 @@ async function addMetaData(postData) {
|
|||||||
postData.topic = await topics.getTopicFields(postData.data.tid, ['title', 'cid']);
|
postData.topic = await topics.getTopicFields(postData.data.tid, ['title', 'cid']);
|
||||||
}
|
}
|
||||||
postData.category = await categories.getCategoryData(postData.topic.cid);
|
postData.category = await categories.getCategoryData(postData.topic.cid);
|
||||||
const result = await plugins.fireHook('filter:parse.post', { postData: postData.data });
|
const result = await plugins.hooks.fire('filter:parse.post', { postData: postData.data });
|
||||||
postData.data.content = result.postData.content;
|
postData.data.content = result.postData.content;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ const plugins = require('../plugins');
|
|||||||
const meta = require('../meta');
|
const meta = require('../meta');
|
||||||
|
|
||||||
module.exports.handle = function (req, res, next) {
|
module.exports.handle = function (req, res, next) {
|
||||||
if (plugins.hasListeners('filter:search.query')) {
|
if (plugins.hooks.hasListeners('filter:search.query')) {
|
||||||
res.type('application/opensearchdescription+xml').send(generateXML());
|
res.type('application/opensearchdescription+xml').send(generateXML());
|
||||||
} else {
|
} else {
|
||||||
next();
|
next();
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ const helpers = require('./helpers');
|
|||||||
const searchController = module.exports;
|
const searchController = module.exports;
|
||||||
|
|
||||||
searchController.search = async function (req, res, next) {
|
searchController.search = async function (req, res, next) {
|
||||||
if (!plugins.hasListeners('filter:search.query')) {
|
if (!plugins.hooks.hasListeners('filter:search.query')) {
|
||||||
return next();
|
return next();
|
||||||
}
|
}
|
||||||
const page = Math.max(1, parseInt(req.query.page, 10)) || 1;
|
const page = Math.max(1, parseInt(req.query.page, 10)) || 1;
|
||||||
|
|||||||
@@ -64,8 +64,8 @@ unreadController.get = async function (req, res) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async function getWatchedCategories(uid, cid, filter) {
|
async function getWatchedCategories(uid, cid, filter) {
|
||||||
if (plugins.hasListeners('filter:unread.categories')) {
|
if (plugins.hooks.hasListeners('filter:unread.categories')) {
|
||||||
return await plugins.fireHook('filter:unread.categories', { uid: uid, cid: cid });
|
return await plugins.hooks.fire('filter:unread.categories', { uid: uid, cid: cid });
|
||||||
}
|
}
|
||||||
const states = [categories.watchStates.watching];
|
const states = [categories.watchStates.watching];
|
||||||
if (filter === 'watched') {
|
if (filter === 'watched') {
|
||||||
|
|||||||
@@ -56,8 +56,8 @@ async function uploadAsImage(req, uploadedFile) {
|
|||||||
await image.checkDimensions(uploadedFile.path);
|
await image.checkDimensions(uploadedFile.path);
|
||||||
await image.stripEXIF(uploadedFile.path);
|
await image.stripEXIF(uploadedFile.path);
|
||||||
|
|
||||||
if (plugins.hasListeners('filter:uploadImage')) {
|
if (plugins.hooks.hasListeners('filter:uploadImage')) {
|
||||||
return await plugins.fireHook('filter:uploadImage', {
|
return await plugins.hooks.fire('filter:uploadImage', {
|
||||||
image: uploadedFile,
|
image: uploadedFile,
|
||||||
uid: req.uid,
|
uid: req.uid,
|
||||||
folder: 'files',
|
folder: 'files',
|
||||||
@@ -122,8 +122,8 @@ uploadsController.uploadThumb = async function (req, res, next) {
|
|||||||
width: meta.config.topicThumbSize,
|
width: meta.config.topicThumbSize,
|
||||||
height: meta.config.topicThumbSize,
|
height: meta.config.topicThumbSize,
|
||||||
});
|
});
|
||||||
if (plugins.hasListeners('filter:uploadImage')) {
|
if (plugins.hooks.hasListeners('filter:uploadImage')) {
|
||||||
return await plugins.fireHook('filter:uploadImage', {
|
return await plugins.hooks.fire('filter:uploadImage', {
|
||||||
image: uploadedFile,
|
image: uploadedFile,
|
||||||
uid: req.uid,
|
uid: req.uid,
|
||||||
folder: 'files',
|
folder: 'files',
|
||||||
@@ -135,8 +135,8 @@ uploadsController.uploadThumb = async function (req, res, next) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
uploadsController.uploadFile = async function (uid, uploadedFile) {
|
uploadsController.uploadFile = async function (uid, uploadedFile) {
|
||||||
if (plugins.hasListeners('filter:uploadFile')) {
|
if (plugins.hooks.hasListeners('filter:uploadFile')) {
|
||||||
return await plugins.fireHook('filter:uploadFile', {
|
return await plugins.hooks.fire('filter:uploadFile', {
|
||||||
file: uploadedFile,
|
file: uploadedFile,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
folder: 'files',
|
folder: 'files',
|
||||||
@@ -175,7 +175,7 @@ async function saveFileToLocal(uid, folder, uploadedFile) {
|
|||||||
};
|
};
|
||||||
const fileKey = upload.url.replace(nconf.get('upload_url'), '');
|
const fileKey = upload.url.replace(nconf.get('upload_url'), '');
|
||||||
await db.sortedSetAdd('uid:' + uid + ':uploads', Date.now(), fileKey);
|
await db.sortedSetAdd('uid:' + uid + ':uploads', Date.now(), fileKey);
|
||||||
const data = await plugins.fireHook('filter:uploadStored', { uid: uid, uploadedFile: uploadedFile, storedFile: storedFile });
|
const data = await plugins.hooks.fire('filter:uploadStored', { uid: uid, uploadedFile: uploadedFile, storedFile: storedFile });
|
||||||
return data.storedFile;
|
return data.storedFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ Emailer.sendToEmail = async (template, email, language, params) => {
|
|||||||
params.unsubUrl = unsubUrl;
|
params.unsubUrl = unsubUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await Plugins.fireHook('filter:email.params', {
|
const result = await Plugins.hooks.fire('filter:email.params', {
|
||||||
template: template,
|
template: template,
|
||||||
email: email,
|
email: email,
|
||||||
language: lang,
|
language: lang,
|
||||||
@@ -280,7 +280,7 @@ Emailer.sendToEmail = async (template, email, language, params) => {
|
|||||||
translator.translate(params.subject, result.language),
|
translator.translate(params.subject, result.language),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const data = await Plugins.fireHook('filter:email.modify', {
|
const data = await Plugins.hooks.fire('filter:email.modify', {
|
||||||
_raw: params,
|
_raw: params,
|
||||||
to: email,
|
to: email,
|
||||||
from: meta.config['email:from'] || 'no-reply@' + getHostname(),
|
from: meta.config['email:from'] || 'no-reply@' + getHostname(),
|
||||||
@@ -299,8 +299,8 @@ Emailer.sendToEmail = async (template, email, language, params) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (Plugins.hasListeners('filter:email.send')) {
|
if (Plugins.hooks.hasListeners('filter:email.send')) {
|
||||||
await Plugins.fireHook('filter:email.send', data);
|
await Plugins.hooks.fire('filter:email.send', data);
|
||||||
} else {
|
} else {
|
||||||
await Emailer.sendViaFallback(data);
|
await Emailer.sendViaFallback(data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ events.log = async function (data) {
|
|||||||
], data.timestamp, eid),
|
], data.timestamp, eid),
|
||||||
db.setObject('event:' + eid, data),
|
db.setObject('event:' + eid, data),
|
||||||
]);
|
]);
|
||||||
plugins.fireHook('action:events.log', { data: data });
|
plugins.hooks.fire('action:events.log', { data: data });
|
||||||
};
|
};
|
||||||
|
|
||||||
events.getEvents = async function (filter, start, stop, from, to) {
|
events.getEvents = async function (filter, start, stop, from, to) {
|
||||||
|
|||||||
10
src/flags.js
10
src/flags.js
@@ -76,7 +76,7 @@ Flags.init = async function () {
|
|||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const data = await plugins.fireHook('filter:flags.getFilters', hookData);
|
const data = await plugins.hooks.fire('filter:flags.getFilters', hookData);
|
||||||
Flags._filters = data.filters;
|
Flags._filters = data.filters;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
winston.error('[flags/init] Could not retrieve filters', err.stack);
|
winston.error('[flags/init] Could not retrieve filters', err.stack);
|
||||||
@@ -107,7 +107,7 @@ Flags.get = async function (flagId) {
|
|||||||
reports: reports,
|
reports: reports,
|
||||||
};
|
};
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:flags.get', {
|
const data = await plugins.hooks.fire('filter:flags.get', {
|
||||||
flag: flagObj,
|
flag: flagObj,
|
||||||
});
|
});
|
||||||
return data.flag;
|
return data.flag;
|
||||||
@@ -177,7 +177,7 @@ Flags.list = async function (data) {
|
|||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const payload = await plugins.fireHook('filter:flags.list', {
|
const payload = await plugins.hooks.fire('filter:flags.list', {
|
||||||
flags: flags,
|
flags: flags,
|
||||||
page: filters.page,
|
page: filters.page,
|
||||||
uid: data.uid,
|
uid: data.uid,
|
||||||
@@ -587,7 +587,7 @@ Flags.update = async function (flagId, uid, changeset) {
|
|||||||
tasks.push(Flags.appendHistory(flagId, uid, changeset));
|
tasks.push(Flags.appendHistory(flagId, uid, changeset));
|
||||||
await Promise.all(tasks);
|
await Promise.all(tasks);
|
||||||
|
|
||||||
plugins.fireHook('action:flags.update', { flagId: flagId, changeset: changeset, uid: uid });
|
plugins.hooks.fire('action:flags.update', { flagId: flagId, changeset: changeset, uid: uid });
|
||||||
};
|
};
|
||||||
|
|
||||||
Flags.resolveFlag = async function (type, id, uid) {
|
Flags.resolveFlag = async function (type, id, uid) {
|
||||||
@@ -712,7 +712,7 @@ Flags.notify = async function (flagObj, uid) {
|
|||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins.fireHook('action:flags.create', {
|
plugins.hooks.fire('action:flags.create', {
|
||||||
flag: flagObj,
|
flag: flagObj,
|
||||||
});
|
});
|
||||||
uids = uids.filter(_uid => parseInt(_uid, 10) !== parseInt(uid, 10));
|
uids = uids.filter(_uid => parseInt(_uid, 10) !== parseInt(uid, 10));
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ module.exports = function (Groups) {
|
|||||||
disableLeave: disableLeave,
|
disableLeave: disableLeave,
|
||||||
};
|
};
|
||||||
|
|
||||||
await plugins.fireHook('filter:group.create', { group: groupData, data: data });
|
await plugins.hooks.fire('filter:group.create', { group: groupData, data: data });
|
||||||
|
|
||||||
await db.sortedSetAdd('groups:createtime', groupData.createtime, groupData.name);
|
await db.sortedSetAdd('groups:createtime', groupData.createtime, groupData.name);
|
||||||
await db.setObject('group:' + groupData.name, groupData);
|
await db.setObject('group:' + groupData.name, groupData);
|
||||||
@@ -61,7 +61,7 @@ module.exports = function (Groups) {
|
|||||||
await db.setObjectField('groupslug:groupname', groupData.slug, groupData.name);
|
await db.setObjectField('groupslug:groupname', groupData.slug, groupData.name);
|
||||||
|
|
||||||
groupData = await Groups.getGroupData(groupData.name);
|
groupData = await Groups.getGroupData(groupData.name);
|
||||||
plugins.fireHook('action:group.create', { group: groupData });
|
plugins.hooks.fire('action:group.create', { group: groupData });
|
||||||
return groupData;
|
return groupData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ module.exports = function (Groups) {
|
|||||||
|
|
||||||
groupData.forEach(group => modifyGroup(group, fields));
|
groupData.forEach(group => modifyGroup(group, fields));
|
||||||
|
|
||||||
const results = await plugins.fireHook('filter:groups.get', { groups: groupData });
|
const results = await plugins.hooks.fire('filter:groups.get', { groups: groupData });
|
||||||
return results.groups;
|
return results.groups;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ module.exports = function (Groups) {
|
|||||||
|
|
||||||
Groups.setGroupField = async function (groupName, field, value) {
|
Groups.setGroupField = async function (groupName, field, value) {
|
||||||
await db.setObjectField('group:' + groupName, field, value);
|
await db.setObjectField('group:' + groupName, field, value);
|
||||||
plugins.fireHook('action:group.set', { field: field, value: value, type: 'set' });
|
plugins.hooks.fire('action:group.set', { field: field, value: value, type: 'set' });
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ module.exports = function (Groups) {
|
|||||||
removeGroupsFromPrivilegeGroups(groupNames),
|
removeGroupsFromPrivilegeGroups(groupNames),
|
||||||
]);
|
]);
|
||||||
Groups.cache.reset();
|
Groups.cache.reset();
|
||||||
plugins.fireHook('action:groups.destroy', { groups: groupsData });
|
plugins.hooks.fire('action:groups.destroy', { groups: groupsData });
|
||||||
};
|
};
|
||||||
|
|
||||||
async function removeGroupsFromPrivilegeGroups(groupNames) {
|
async function removeGroupsFromPrivilegeGroups(groupNames) {
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ Groups.get = async function (groupName, options) {
|
|||||||
if (!groupData) {
|
if (!groupData) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const descriptionParsed = await plugins.fireHook('filter:parse.raw', groupData.description);
|
const descriptionParsed = await plugins.hooks.fire('filter:parse.raw', groupData.description);
|
||||||
groupData.descriptionParsed = descriptionParsed;
|
groupData.descriptionParsed = descriptionParsed;
|
||||||
groupData.categories = selectCategories.map((category) => {
|
groupData.categories = selectCategories.map((category) => {
|
||||||
category.selected = groupData.memberPostCids.includes(category.cid);
|
category.selected = groupData.memberPostCids.includes(category.cid);
|
||||||
@@ -149,7 +149,7 @@ Groups.get = async function (groupName, options) {
|
|||||||
groupData.isPending = isPending;
|
groupData.isPending = isPending;
|
||||||
groupData.isInvited = isInvited;
|
groupData.isInvited = isInvited;
|
||||||
groupData.isOwner = isOwner;
|
groupData.isOwner = isOwner;
|
||||||
const results = await plugins.fireHook('filter:group.get', { group: groupData });
|
const results = await plugins.hooks.fire('filter:group.get', { group: groupData });
|
||||||
return results.group;
|
return results.group;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ Groups.getOwnersAndMembers = async function (groupName, uid, start, stop) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
returnUsers = countToReturn > 0 ? returnUsers.slice(0, countToReturn) : returnUsers;
|
returnUsers = countToReturn > 0 ? returnUsers.slice(0, countToReturn) : returnUsers;
|
||||||
const result = await plugins.fireHook('filter:group.getOwnersAndMembers', {
|
const result = await plugins.hooks.fire('filter:group.getOwnersAndMembers', {
|
||||||
users: returnUsers,
|
users: returnUsers,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
start: start,
|
start: start,
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ module.exports = function (Groups) {
|
|||||||
const set = type === 'invite' ? 'group:' + groupName + ':invited' : 'group:' + groupName + ':pending';
|
const set = type === 'invite' ? 'group:' + groupName + ':invited' : 'group:' + groupName + ':pending';
|
||||||
await db.setAdd(set, uids);
|
await db.setAdd(set, uids);
|
||||||
const hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership';
|
const hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership';
|
||||||
plugins.fireHook(hookName, {
|
plugins.hooks.fire(hookName, {
|
||||||
groupName: groupName,
|
groupName: groupName,
|
||||||
uids: uids,
|
uids: uids,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ module.exports = function (Groups) {
|
|||||||
|
|
||||||
await setGroupTitleIfNotSet(groupsToJoin, uid);
|
await setGroupTitleIfNotSet(groupsToJoin, uid);
|
||||||
|
|
||||||
plugins.fireHook('action:group.join', {
|
plugins.hooks.fire('action:group.join', {
|
||||||
groupNames: groupsToJoin,
|
groupNames: groupsToJoin,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ module.exports = function (Groups) {
|
|||||||
|
|
||||||
await clearGroupTitleIfSet(groupsToLeave, uid);
|
await clearGroupTitleIfSet(groupsToLeave, uid);
|
||||||
|
|
||||||
plugins.fireHook('action:group.leave', {
|
plugins.hooks.fire('action:group.leave', {
|
||||||
groupNames: groupsToLeave,
|
groupNames: groupsToLeave,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ module.exports = function (Groups) {
|
|||||||
Groups.ownership.grant = async function (toUid, groupName) {
|
Groups.ownership.grant = async function (toUid, groupName) {
|
||||||
// Note: No ownership checking is done here on purpose!
|
// Note: No ownership checking is done here on purpose!
|
||||||
await db.setAdd('group:' + groupName + ':owners', toUid);
|
await db.setAdd('group:' + groupName + ':owners', toUid);
|
||||||
plugins.fireHook('action:group.grantOwnership', { uid: toUid, groupName: groupName });
|
plugins.hooks.fire('action:group.grantOwnership', { uid: toUid, groupName: groupName });
|
||||||
};
|
};
|
||||||
|
|
||||||
Groups.ownership.rescind = async function (toUid, groupName) {
|
Groups.ownership.rescind = async function (toUid, groupName) {
|
||||||
@@ -35,6 +35,6 @@ module.exports = function (Groups) {
|
|||||||
throw new Error('[[error:group-needs-owner]]');
|
throw new Error('[[error:group-needs-owner]]');
|
||||||
}
|
}
|
||||||
await db.setRemove('group:' + groupName + ':owners', toUid);
|
await db.setRemove('group:' + groupName + ':owners', toUid);
|
||||||
plugins.fireHook('action:group.rescindOwnership', { uid: toUid, groupName: groupName });
|
plugins.hooks.fire('action:group.rescindOwnership', { uid: toUid, groupName: groupName });
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ module.exports = function (Groups) {
|
|||||||
throw new Error('[[error:no-group]]');
|
throw new Error('[[error:no-group]]');
|
||||||
}
|
}
|
||||||
|
|
||||||
({ values } = await plugins.fireHook('filter:group.update', {
|
({ values } = await plugins.hooks.fire('filter:group.update', {
|
||||||
groupName: groupName,
|
groupName: groupName,
|
||||||
values: values,
|
values: values,
|
||||||
}));
|
}));
|
||||||
@@ -75,7 +75,7 @@ module.exports = function (Groups) {
|
|||||||
await db.setObject('group:' + groupName, payload);
|
await db.setObject('group:' + groupName, payload);
|
||||||
await Groups.renameGroup(groupName, values.name);
|
await Groups.renameGroup(groupName, values.name);
|
||||||
|
|
||||||
plugins.fireHook('action:group.update', {
|
plugins.hooks.fire('action:group.update', {
|
||||||
name: groupName,
|
name: groupName,
|
||||||
values: values,
|
values: values,
|
||||||
});
|
});
|
||||||
@@ -199,7 +199,7 @@ module.exports = function (Groups) {
|
|||||||
await renameGroupsMember(['groups:createtime', 'groups:visible:createtime', 'groups:visible:memberCount'], oldName, newName);
|
await renameGroupsMember(['groups:createtime', 'groups:visible:createtime', 'groups:visible:memberCount'], oldName, newName);
|
||||||
await renameGroupsMember(['groups:visible:name'], oldName.toLowerCase() + ':' + oldName, newName.toLowerCase() + ':' + newName);
|
await renameGroupsMember(['groups:visible:name'], oldName.toLowerCase() + ':' + oldName, newName.toLowerCase() + ':' + newName);
|
||||||
|
|
||||||
plugins.fireHook('action:group.rename', {
|
plugins.hooks.fire('action:group.rename', {
|
||||||
old: oldName,
|
old: oldName,
|
||||||
new: newName,
|
new: newName,
|
||||||
});
|
});
|
||||||
|
|||||||
20
src/image.js
20
src/image.js
@@ -23,8 +23,8 @@ function requireSharp() {
|
|||||||
|
|
||||||
image.isFileTypeAllowed = async function (path) {
|
image.isFileTypeAllowed = async function (path) {
|
||||||
const plugins = require('./plugins');
|
const plugins = require('./plugins');
|
||||||
if (plugins.hasListeners('filter:image.isFileTypeAllowed')) {
|
if (plugins.hooks.hasListeners('filter:image.isFileTypeAllowed')) {
|
||||||
return await plugins.fireHook('filter:image.isFileTypeAllowed', path);
|
return await plugins.hooks.fire('filter:image.isFileTypeAllowed', path);
|
||||||
}
|
}
|
||||||
const sharp = require('sharp');
|
const sharp = require('sharp');
|
||||||
await sharp(path, {
|
await sharp(path, {
|
||||||
@@ -33,8 +33,8 @@ image.isFileTypeAllowed = async function (path) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
image.resizeImage = async function (data) {
|
image.resizeImage = async function (data) {
|
||||||
if (plugins.hasListeners('filter:image.resize')) {
|
if (plugins.hooks.hasListeners('filter:image.resize')) {
|
||||||
await plugins.fireHook('filter:image.resize', {
|
await plugins.hooks.fire('filter:image.resize', {
|
||||||
path: data.path,
|
path: data.path,
|
||||||
target: data.target,
|
target: data.target,
|
||||||
width: data.width,
|
width: data.width,
|
||||||
@@ -61,8 +61,8 @@ image.resizeImage = async function (data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
image.normalise = async function (path) {
|
image.normalise = async function (path) {
|
||||||
if (plugins.hasListeners('filter:image.normalise')) {
|
if (plugins.hooks.hasListeners('filter:image.normalise')) {
|
||||||
await plugins.fireHook('filter:image.normalise', {
|
await plugins.hooks.fire('filter:image.normalise', {
|
||||||
path: path,
|
path: path,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -74,8 +74,8 @@ image.normalise = async function (path) {
|
|||||||
|
|
||||||
image.size = async function (path) {
|
image.size = async function (path) {
|
||||||
let imageData;
|
let imageData;
|
||||||
if (plugins.hasListeners('filter:image.size')) {
|
if (plugins.hooks.hasListeners('filter:image.size')) {
|
||||||
imageData = await plugins.fireHook('filter:image.size', {
|
imageData = await plugins.hooks.fire('filter:image.size', {
|
||||||
path: path,
|
path: path,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -138,8 +138,8 @@ image.sizeFromBase64 = function (imageData) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
image.uploadImage = async function (filename, folder, imageData) {
|
image.uploadImage = async function (filename, folder, imageData) {
|
||||||
if (plugins.hasListeners('filter:uploadImage')) {
|
if (plugins.hooks.hasListeners('filter:uploadImage')) {
|
||||||
return await plugins.fireHook('filter:uploadImage', {
|
return await plugins.hooks.fire('filter:uploadImage', {
|
||||||
image: imageData,
|
image: imageData,
|
||||||
uid: imageData.uid,
|
uid: imageData.uid,
|
||||||
folder: folder,
|
folder: folder,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ module.exports = function (Messaging) {
|
|||||||
const maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000;
|
const maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000;
|
||||||
content = String(content).trim();
|
content = String(content).trim();
|
||||||
let length = String(content.length).trim();
|
let length = String(content.length).trim();
|
||||||
({ content, length } = await plugins.fireHook('filter:messaging.checkContent', { content, length }));
|
({ content, length } = await plugins.hooks.fire('filter:messaging.checkContent', { content, length }));
|
||||||
if (!content) {
|
if (!content) {
|
||||||
throw new Error('[[error:invalid-chat-message]]');
|
throw new Error('[[error:invalid-chat-message]]');
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ module.exports = function (Messaging) {
|
|||||||
message.ip = data.ip;
|
message.ip = data.ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
message = await plugins.fireHook('filter:messaging.save', message);
|
message = await plugins.hooks.fire('filter:messaging.save', message);
|
||||||
await db.setObject('message:' + mid, message);
|
await db.setObject('message:' + mid, message);
|
||||||
const isNewSet = await Messaging.isNewSet(data.uid, data.roomId, timestamp);
|
const isNewSet = await Messaging.isNewSet(data.uid, data.roomId, timestamp);
|
||||||
let uids = await db.getSortedSetRange('chat:room:' + data.roomId + ':uids', 0, -1);
|
let uids = await db.getSortedSetRange('chat:room:' + data.roomId + ':uids', 0, -1);
|
||||||
@@ -69,7 +69,7 @@ module.exports = function (Messaging) {
|
|||||||
messages[0].newSet = isNewSet;
|
messages[0].newSet = isNewSet;
|
||||||
messages[0].mid = mid;
|
messages[0].mid = mid;
|
||||||
messages[0].roomId = data.roomId;
|
messages[0].roomId = data.roomId;
|
||||||
plugins.fireHook('action:messaging.save', { message: messages[0], data: data });
|
plugins.hooks.fire('action:messaging.save', { message: messages[0], data: data });
|
||||||
return messages[0];
|
return messages[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ module.exports = function (Messaging) {
|
|||||||
messages = [];
|
messages = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:messaging.getMessages', {
|
const data = await plugins.hooks.fire('filter:messaging.getMessages', {
|
||||||
messages: messages,
|
messages: messages,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
roomId: roomId,
|
roomId: roomId,
|
||||||
@@ -144,7 +144,7 @@ async function modifyMessage(message, fields, mid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = await plugins.fireHook('filter:messaging.getFields', {
|
const payload = await plugins.hooks.fire('filter:messaging.getFields', {
|
||||||
mid: mid,
|
mid: mid,
|
||||||
message: message,
|
message: message,
|
||||||
fields: fields,
|
fields: fields,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ module.exports = function (Messaging) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = await plugins.fireHook('filter:messaging.edit', {
|
const payload = await plugins.hooks.fire('filter:messaging.edit', {
|
||||||
content: content,
|
content: content,
|
||||||
edited: Date.now(),
|
edited: Date.now(),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ Messaging.getMessages = async (params) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async function canGet(hook, callerUid, uid) {
|
async function canGet(hook, callerUid, uid) {
|
||||||
const data = await plugins.fireHook(hook, {
|
const data = await plugins.hooks.fire(hook, {
|
||||||
callerUid: callerUid,
|
callerUid: callerUid,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
canGet: parseInt(callerUid, 10) === parseInt(uid, 10),
|
canGet: parseInt(callerUid, 10) === parseInt(uid, 10),
|
||||||
@@ -64,7 +64,7 @@ async function canGet(hook, callerUid, uid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Messaging.parse = async (message, fromuid, uid, roomId, isNew) => {
|
Messaging.parse = async (message, fromuid, uid, roomId, isNew) => {
|
||||||
const parsed = await plugins.fireHook('filter:parse.raw', message);
|
const parsed = await plugins.hooks.fire('filter:parse.raw', message);
|
||||||
let messageData = {
|
let messageData = {
|
||||||
message: message,
|
message: message,
|
||||||
parsed: parsed,
|
parsed: parsed,
|
||||||
@@ -75,7 +75,7 @@ Messaging.parse = async (message, fromuid, uid, roomId, isNew) => {
|
|||||||
parsedMessage: parsed,
|
parsedMessage: parsed,
|
||||||
};
|
};
|
||||||
|
|
||||||
messageData = await plugins.fireHook('filter:messaging.parse', messageData);
|
messageData = await plugins.hooks.fire('filter:messaging.parse', messageData);
|
||||||
return messageData ? messageData.parsedMessage : '';
|
return messageData ? messageData.parsedMessage : '';
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ Messaging.getRecentChats = async (callerUid, uid, start, stop) => {
|
|||||||
|
|
||||||
results.roomData = results.roomData.filter(Boolean);
|
results.roomData = results.roomData.filter(Boolean);
|
||||||
const ref = { rooms: results.roomData, nextStart: stop + 1 };
|
const ref = { rooms: results.roomData, nextStart: stop + 1 };
|
||||||
return await plugins.fireHook('filter:messaging.getRecentChats', {
|
return await plugins.hooks.fire('filter:messaging.getRecentChats', {
|
||||||
rooms: ref.rooms,
|
rooms: ref.rooms,
|
||||||
nextStart: ref.nextStart,
|
nextStart: ref.nextStart,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
@@ -160,7 +160,7 @@ Messaging.getTeaser = async (uid, roomId) => {
|
|||||||
teaser.content = validator.escape(String(teaser.content));
|
teaser.content = validator.escape(String(teaser.content));
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = await plugins.fireHook('filter:messaging.getTeaser', { teaser: teaser });
|
const payload = await plugins.hooks.fire('filter:messaging.getTeaser', { teaser: teaser });
|
||||||
return payload.teaser;
|
return payload.teaser;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -222,7 +222,7 @@ Messaging.canMessageUser = async (uid, toUid) => {
|
|||||||
throw new Error('[[error:chat-restricted]]');
|
throw new Error('[[error:chat-restricted]]');
|
||||||
}
|
}
|
||||||
|
|
||||||
await plugins.fireHook('static:messaging.canMessageUser', {
|
await plugins.hooks.fire('static:messaging.canMessageUser', {
|
||||||
uid: uid,
|
uid: uid,
|
||||||
toUid: toUid,
|
toUid: toUid,
|
||||||
});
|
});
|
||||||
@@ -247,7 +247,7 @@ Messaging.canMessageRoom = async (uid, roomId) => {
|
|||||||
throw new Error('[[error:no-privileges]]');
|
throw new Error('[[error:no-privileges]]');
|
||||||
}
|
}
|
||||||
|
|
||||||
await plugins.fireHook('static:messaging.canMessageRoom', {
|
await plugins.hooks.fire('static:messaging.canMessageRoom', {
|
||||||
uid: uid,
|
uid: uid,
|
||||||
roomId: roomId,
|
roomId: roomId,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ module.exports = function (Messaging) {
|
|||||||
message: messageObj,
|
message: messageObj,
|
||||||
uids: uids,
|
uids: uids,
|
||||||
};
|
};
|
||||||
data = await plugins.fireHook('filter:messaging.notify', data);
|
data = await plugins.hooks.fire('filter:messaging.notify', data);
|
||||||
if (!data || !data.uids || !data.uids.length) {
|
if (!data || !data.uids || !data.uids.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ module.exports = function (Messaging) {
|
|||||||
|
|
||||||
Messaging.isUserInRoom = async (uid, roomId) => {
|
Messaging.isUserInRoom = async (uid, roomId) => {
|
||||||
const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid);
|
const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid);
|
||||||
const data = await plugins.fireHook('filter:messaging.isUserInRoom', { uid: uid, roomId: roomId, inRoom: inRoom });
|
const data = await plugins.hooks.fire('filter:messaging.isUserInRoom', { uid: uid, roomId: roomId, inRoom: inRoom });
|
||||||
return data.inRoom;
|
return data.inRoom;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -185,7 +185,7 @@ module.exports = function (Messaging) {
|
|||||||
throw new Error('[[error:chat-room-name-too-long]]');
|
throw new Error('[[error:chat-room-name-too-long]]');
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = await plugins.fireHook('filter:chat.renameRoom', {
|
const payload = await plugins.hooks.fire('filter:chat.renameRoom', {
|
||||||
uid: uid,
|
uid: uid,
|
||||||
roomId: roomId,
|
roomId: roomId,
|
||||||
newName: newName,
|
newName: newName,
|
||||||
@@ -198,7 +198,7 @@ module.exports = function (Messaging) {
|
|||||||
await db.setObjectField('chat:room:' + payload.roomId, 'roomName', payload.newName);
|
await db.setObjectField('chat:room:' + payload.roomId, 'roomName', payload.newName);
|
||||||
await Messaging.addSystemMessage('room-rename, ' + payload.newName.replace(',', ','), payload.uid, payload.roomId);
|
await Messaging.addSystemMessage('room-rename, ' + payload.newName.replace(',', ','), payload.uid, payload.roomId);
|
||||||
|
|
||||||
plugins.fireHook('action:chat.renameRoom', {
|
plugins.hooks.fire('action:chat.renameRoom', {
|
||||||
roomId: payload.roomId,
|
roomId: payload.roomId,
|
||||||
newName: payload.newName,
|
newName: payload.newName,
|
||||||
});
|
});
|
||||||
@@ -206,7 +206,7 @@ module.exports = function (Messaging) {
|
|||||||
|
|
||||||
Messaging.canReply = async (roomId, uid) => {
|
Messaging.canReply = async (roomId, uid) => {
|
||||||
const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid);
|
const inRoom = await db.isSortedSetMember('chat:room:' + roomId + ':uids', uid);
|
||||||
const data = await plugins.fireHook('filter:messaging.canReply', { uid: uid, roomId: roomId, inRoom: inRoom, canReply: inRoom });
|
const data = await plugins.hooks.fire('filter:messaging.canReply', { uid: uid, roomId: roomId, inRoom: inRoom, canReply: inRoom });
|
||||||
return data.canReply;
|
return data.canReply;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ Blacklist.test = async function (clientIp) {
|
|||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
// To return test failure, pass back an error in callback
|
// To return test failure, pass back an error in callback
|
||||||
await plugins.fireHook('filter:blacklist.test', { ip: clientIp });
|
await plugins.hooks.fire('filter:blacklist.test', { ip: clientIp });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
analytics.increment('blacklist');
|
analytics.increment('blacklist');
|
||||||
throw err;
|
throw err;
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ Configs.remove = async function (field) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Configs.registerHooks = () => {
|
Configs.registerHooks = () => {
|
||||||
plugins.registerHook('core', {
|
plugins.hooks.register('core', {
|
||||||
hook: 'filter:settings.set',
|
hook: 'filter:settings.set',
|
||||||
method: async ({ plugin, settings, quiet }) => {
|
method: async ({ plugin, settings, quiet }) => {
|
||||||
if (plugin === 'core.api' && Array.isArray(settings.tokens)) {
|
if (plugin === 'core.api' && Array.isArray(settings.tokens)) {
|
||||||
@@ -170,7 +170,7 @@ Configs.registerHooks = () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
plugins.registerHook('core', {
|
plugins.hooks.register('core', {
|
||||||
hook: 'filter:settings.get',
|
hook: 'filter:settings.get',
|
||||||
method: async ({ plugin, values }) => {
|
method: async ({ plugin, values }) => {
|
||||||
if (plugin === 'core.api' && Array.isArray(values.tokens)) {
|
if (plugin === 'core.api' && Array.isArray(values.tokens)) {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ Settings.get = async function (hash) {
|
|||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
({ values: data } = await plugins.fireHook('filter:settings.get', { plugin: hash, values: data }));
|
({ values: data } = await plugins.hooks.fire('filter:settings.get', { plugin: hash, values: data }));
|
||||||
cache.set('settings:' + hash, data);
|
cache.set('settings:' + hash, data);
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
@@ -54,7 +54,7 @@ Settings.set = async function (hash, values, quiet) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
({ plugin: hash, settings: values, quiet } = await plugins.fireHook('filter:settings.set', { plugin: hash, settings: values, quiet }));
|
({ plugin: hash, settings: values, quiet } = await plugins.hooks.fire('filter:settings.set', { plugin: hash, settings: values, quiet }));
|
||||||
|
|
||||||
if (sortedLists.length) {
|
if (sortedLists.length) {
|
||||||
await db.delete('settings:' + hash + ':sorted-lists');
|
await db.delete('settings:' + hash + ':sorted-lists');
|
||||||
@@ -87,7 +87,7 @@ Settings.set = async function (hash, values, quiet) {
|
|||||||
|
|
||||||
cache.del('settings:' + hash);
|
cache.del('settings:' + hash);
|
||||||
|
|
||||||
plugins.fireHook('action:settings.set', {
|
plugins.hooks.fire('action:settings.set', {
|
||||||
plugin: hash,
|
plugin: hash,
|
||||||
settings: values,
|
settings: values,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ Tags.parse = async (req, data, meta, link) => {
|
|||||||
href: relative_path + '/manifest.webmanifest',
|
href: relative_path + '/manifest.webmanifest',
|
||||||
}];
|
}];
|
||||||
|
|
||||||
if (plugins.hasListeners('filter:search.query')) {
|
if (plugins.hooks.hasListeners('filter:search.query')) {
|
||||||
defaultLinks.push({
|
defaultLinks.push({
|
||||||
rel: 'search',
|
rel: 'search',
|
||||||
type: 'application/opensearchdescription+xml',
|
type: 'application/opensearchdescription+xml',
|
||||||
@@ -140,8 +140,8 @@ Tags.parse = async (req, data, meta, link) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const results = await utils.promiseParallel({
|
const results = await utils.promiseParallel({
|
||||||
tags: plugins.fireHook('filter:meta.getMetaTags', { req: req, data: data, tags: defaultTags }),
|
tags: plugins.hooks.fire('filter:meta.getMetaTags', { req: req, data: data, tags: defaultTags }),
|
||||||
links: plugins.fireHook('filter:meta.getLinkTags', { req: req, data: data, links: defaultLinks }),
|
links: plugins.hooks.fire('filter:meta.getLinkTags', { req: req, data: data, links: defaultLinks }),
|
||||||
});
|
});
|
||||||
|
|
||||||
meta = results.tags.tags.concat(meta || []).map(function (tag) {
|
meta = results.tags.tags.concat(meta || []).map(function (tag) {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ middleware.renderHeader = async (req, res, data) => {
|
|||||||
const results = await utils.promiseParallel({
|
const results = await utils.promiseParallel({
|
||||||
userData: user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed']),
|
userData: user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed']),
|
||||||
scripts: getAdminScripts(),
|
scripts: getAdminScripts(),
|
||||||
custom_header: plugins.fireHook('filter:admin.header.build', custom_header),
|
custom_header: plugins.hooks.fire('filter:admin.header.build', custom_header),
|
||||||
configs: meta.configs.list(),
|
configs: meta.configs.list(),
|
||||||
latestVersion: getLatestVersion(),
|
latestVersion: getLatestVersion(),
|
||||||
privileges: privileges.admin.get(req.uid),
|
privileges: privileges.admin.get(req.uid),
|
||||||
@@ -83,7 +83,7 @@ middleware.renderHeader = async (req, res, data) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async function getAdminScripts() {
|
async function getAdminScripts() {
|
||||||
const scripts = await plugins.fireHook('filter:admin.scripts.get', []);
|
const scripts = await plugins.hooks.fire('filter:admin.scripts.get', []);
|
||||||
return scripts.map(function (script) {
|
return scripts.map(function (script) {
|
||||||
return { src: script };
|
return { src: script };
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ middleware.buildHeader = helpers.try(async function buildHeader(req, res, next)
|
|||||||
const [config, isBanned] = await Promise.all([
|
const [config, isBanned] = await Promise.all([
|
||||||
controllers.api.loadConfig(req),
|
controllers.api.loadConfig(req),
|
||||||
user.bans.isBanned(req.uid),
|
user.bans.isBanned(req.uid),
|
||||||
plugins.fireHook('filter:middleware.buildHeader', { req: req, locals: res.locals }),
|
plugins.hooks.fire('filter:middleware.buildHeader', { req: req, locals: res.locals }),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (isBanned) {
|
if (isBanned) {
|
||||||
@@ -60,7 +60,7 @@ middleware.renderHeader = async function renderHeader(req, res, data) {
|
|||||||
'brand:logo:alt': meta.config['brand:logo:alt'] || '',
|
'brand:logo:alt': meta.config['brand:logo:alt'] || '',
|
||||||
'brand:logo:display': meta.config['brand:logo'] ? '' : 'hide',
|
'brand:logo:display': meta.config['brand:logo'] ? '' : 'hide',
|
||||||
allowRegistration: registrationType === 'normal',
|
allowRegistration: registrationType === 'normal',
|
||||||
searchEnabled: plugins.hasListeners('filter:search.query'),
|
searchEnabled: plugins.hooks.hasListeners('filter:search.query'),
|
||||||
config: res.locals.config,
|
config: res.locals.config,
|
||||||
relative_path,
|
relative_path,
|
||||||
bodyClass: data.bodyClass,
|
bodyClass: data.bodyClass,
|
||||||
@@ -173,7 +173,7 @@ middleware.renderHeader = async function renderHeader(req, res, data) {
|
|||||||
modifyTitle(templateValues);
|
modifyTitle(templateValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
const hookReturn = await plugins.fireHook('filter:middleware.renderHeader', {
|
const hookReturn = await plugins.hooks.fire('filter:middleware.renderHeader', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
templateValues: templateValues,
|
templateValues: templateValues,
|
||||||
@@ -184,13 +184,13 @@ middleware.renderHeader = async function renderHeader(req, res, data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
middleware.renderFooter = async function renderFooter(req, res, templateValues) {
|
middleware.renderFooter = async function renderFooter(req, res, templateValues) {
|
||||||
const data = await plugins.fireHook('filter:middleware.renderFooter', {
|
const data = await plugins.hooks.fire('filter:middleware.renderFooter', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
templateValues: templateValues,
|
templateValues: templateValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
const scripts = await plugins.fireHook('filter:scripts.get', []);
|
const scripts = await plugins.hooks.fire('filter:scripts.get', []);
|
||||||
|
|
||||||
data.templateValues.scripts = scripts.map(function (script) {
|
data.templateValues.scripts = scripts.map(function (script) {
|
||||||
return { src: script };
|
return { src: script };
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ middleware.pageView = helpers.try(async function pageView(req, res, next) {
|
|||||||
}
|
}
|
||||||
next();
|
next();
|
||||||
await analytics.pageView({ ip: req.ip, uid: req.uid });
|
await analytics.pageView({ ip: req.ip, uid: req.uid });
|
||||||
plugins.fireHook('action:middleware.pageView', { req: req });
|
plugins.hooks.fire('action:middleware.pageView', { req: req });
|
||||||
});
|
});
|
||||||
|
|
||||||
middleware.pluginHooks = helpers.try(async function pluginHooks(req, res, next) {
|
middleware.pluginHooks = helpers.try(async function pluginHooks(req, res, next) {
|
||||||
@@ -91,7 +91,7 @@ middleware.pluginHooks = helpers.try(async function pluginHooks(req, res, next)
|
|||||||
hookObj.method(req, res, next);
|
hookObj.method(req, res, next);
|
||||||
});
|
});
|
||||||
|
|
||||||
await plugins.fireHook('response:router.page', {
|
await plugins.hooks.fire('response:router.page', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
});
|
});
|
||||||
@@ -227,7 +227,7 @@ middleware.trimUploadTimestamps = function trimUploadTimestamps(req, res, next)
|
|||||||
|
|
||||||
middleware.validateAuth = helpers.try(async function validateAuth(req, res, next) {
|
middleware.validateAuth = helpers.try(async function validateAuth(req, res, next) {
|
||||||
try {
|
try {
|
||||||
await plugins.fireHook('static:auth.validate', {
|
await plugins.hooks.fire('static:auth.validate', {
|
||||||
user: res.locals.user,
|
user: res.locals.user,
|
||||||
strategy: res.locals.strategy,
|
strategy: res.locals.strategy,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -33,10 +33,10 @@ module.exports = function (middleware) {
|
|||||||
options.url = (req.baseUrl + req.path.replace(/^\/api/, ''));
|
options.url = (req.baseUrl + req.path.replace(/^\/api/, ''));
|
||||||
options.bodyClass = buildBodyClass(req, res, options);
|
options.bodyClass = buildBodyClass(req, res, options);
|
||||||
|
|
||||||
const buildResult = await plugins.fireHook('filter:' + template + '.build', { req: req, res: res, templateData: options });
|
const buildResult = await plugins.hooks.fire('filter:' + template + '.build', { req: req, res: res, templateData: options });
|
||||||
const templateToRender = buildResult.templateData.templateToRender || template;
|
const templateToRender = buildResult.templateData.templateToRender || template;
|
||||||
|
|
||||||
const renderResult = await plugins.fireHook('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData });
|
const renderResult = await plugins.hooks.fire('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData });
|
||||||
options = renderResult.templateData;
|
options = renderResult.templateData;
|
||||||
options._header = {
|
options._header = {
|
||||||
tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags),
|
tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags),
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ module.exports = function (middleware) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await plugins.fireHook('response:middleware.authenticate', {
|
await plugins.hooks.fire('response:middleware.authenticate', {
|
||||||
req: req,
|
req: req,
|
||||||
res: res,
|
res: res,
|
||||||
next: function () {}, // no-op for backwards compatibility
|
next: function () {}, // no-op for backwards compatibility
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ async function getAvailable() {
|
|||||||
return item;
|
return item;
|
||||||
});
|
});
|
||||||
|
|
||||||
return await plugins.fireHook('filter:navigation.available', core);
|
return await plugins.hooks.fire('filter:navigation.available', core);
|
||||||
}
|
}
|
||||||
|
|
||||||
require('../promisify')(admin);
|
require('../promisify')(admin);
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Notifications.privilegedTypes = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
Notifications.getAllNotificationTypes = async function () {
|
Notifications.getAllNotificationTypes = async function () {
|
||||||
const results = await plugins.fireHook('filter:user.notificationTypes', {
|
const results = await plugins.hooks.fire('filter:user.notificationTypes', {
|
||||||
types: Notifications.baseTypes.slice(),
|
types: Notifications.baseTypes.slice(),
|
||||||
privilegedTypes: Notifications.privilegedTypes.slice(),
|
privilegedTypes: Notifications.privilegedTypes.slice(),
|
||||||
});
|
});
|
||||||
@@ -213,7 +213,7 @@ async function pushToUids(uids, notification) {
|
|||||||
|
|
||||||
// Remove uid from recipients list if they have blocked the user triggering the notification
|
// Remove uid from recipients list if they have blocked the user triggering the notification
|
||||||
uids = await User.blocks.filterUids(notification.from, uids);
|
uids = await User.blocks.filterUids(notification.from, uids);
|
||||||
const data = await plugins.fireHook('filter:notification.push', { notification: notification, uids: uids });
|
const data = await plugins.hooks.fire('filter:notification.push', { notification: notification, uids: uids });
|
||||||
if (!data || !data.notification || !data.uids || !data.uids.length) {
|
if (!data || !data.notification || !data.uids || !data.uids.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -227,7 +227,7 @@ async function pushToUids(uids, notification) {
|
|||||||
sendNotification(results.uidsToNotify),
|
sendNotification(results.uidsToNotify),
|
||||||
sendEmail(results.uidsToEmail),
|
sendEmail(results.uidsToEmail),
|
||||||
]);
|
]);
|
||||||
plugins.fireHook('action:notification.pushed', {
|
plugins.hooks.fire('action:notification.pushed', {
|
||||||
notification: notification,
|
notification: notification,
|
||||||
uids: results.uidsToNotify,
|
uids: results.uidsToNotify,
|
||||||
uidsNotified: results.uidsToNotify,
|
uidsNotified: results.uidsToNotify,
|
||||||
@@ -419,7 +419,7 @@ Notifications.merge = async function (notifications) {
|
|||||||
return notifications;
|
return notifications;
|
||||||
}, notifications);
|
}, notifications);
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:notifications.merge', {
|
const data = await plugins.hooks.fire('filter:notifications.merge', {
|
||||||
notifications: notifications,
|
notifications: notifications,
|
||||||
});
|
});
|
||||||
return data && data.notifications;
|
return data && data.notifications;
|
||||||
|
|||||||
@@ -3,211 +3,213 @@
|
|||||||
const winston = require('winston');
|
const winston = require('winston');
|
||||||
const async = require('async');
|
const async = require('async');
|
||||||
const utils = require('../utils');
|
const utils = require('../utils');
|
||||||
|
const plugins = require('.');
|
||||||
|
|
||||||
module.exports = function (Plugins) {
|
const Hooks = {};
|
||||||
Plugins.deprecatedHooks = {
|
module.exports = Hooks;
|
||||||
'filter:privileges:isUserAllowedTo': 'filter:privileges:isAllowedTo', // 👋 @ 1.16.0
|
|
||||||
'filter:router.page': 'response:router.page', // 👋 @ 2.0.0
|
|
||||||
};
|
|
||||||
|
|
||||||
Plugins.internals = {
|
Hooks.deprecatedHooks = {
|
||||||
_register: function (data) {
|
'filter:privileges:isUserAllowedTo': 'filter:privileges:isAllowedTo', // 👋 @ 1.16.0
|
||||||
Plugins.loadedHooks[data.hook] = Plugins.loadedHooks[data.hook] || [];
|
'filter:router.page': 'response:router.page', // 👋 @ 2.0.0
|
||||||
Plugins.loadedHooks[data.hook].push(data);
|
};
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const hookTypeToMethod = {
|
Hooks.internals = {
|
||||||
filter: fireFilterHook,
|
_register: function (data) {
|
||||||
action: fireActionHook,
|
plugins.loadedHooks[data.hook] = plugins.loadedHooks[data.hook] || [];
|
||||||
static: fireStaticHook,
|
plugins.loadedHooks[data.hook].push(data);
|
||||||
response: fireResponseHook,
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
const hookTypeToMethod = {
|
||||||
`data` is an object consisting of (* is required):
|
filter: fireFilterHook,
|
||||||
`data.hook`*, the name of the NodeBB hook
|
action: fireActionHook,
|
||||||
`data.method`*, the method called in that plugin (can be an array of functions)
|
static: fireStaticHook,
|
||||||
`data.priority`, the relative priority of the method when it is eventually called (default: 10)
|
response: fireResponseHook,
|
||||||
*/
|
};
|
||||||
Plugins.registerHook = 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 (Plugins.deprecatedHooks.hasOwnProperty(data.hook)) {
|
`data` is an object consisting of (* is required):
|
||||||
const deprecated = Plugins.deprecatedHooks[data.hook];
|
`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;
|
||||||
|
}
|
||||||
|
|
||||||
if (deprecated) {
|
// `hasOwnProperty` needed for hooks with no alternative (set to null)
|
||||||
winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, please use "${deprecated}" instead.`);
|
if (Hooks.deprecatedHooks.hasOwnProperty(data.hook)) {
|
||||||
} else {
|
const deprecated = Hooks.deprecatedHooks[data.hook];
|
||||||
winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, there is no alternative.`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data.id = id;
|
if (deprecated) {
|
||||||
if (!data.priority) {
|
winston.warn(`[plugins/${id}] Hook "${data.hook}" is deprecated, please use "${deprecated}" instead.`);
|
||||||
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 };
|
|
||||||
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);
|
|
||||||
} else {
|
} 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) {
|
data.id = id;
|
||||||
var hooks = Plugins.loadedHooks[hook] || [];
|
if (!data.priority) {
|
||||||
Plugins.loadedHooks[hook] = hooks.filter(function (hookData) {
|
data.priority = 10;
|
||||||
return hookData && hookData.id !== id && hookData.method !== method;
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
Plugins.fireHook = async function (hook, params) {
|
if (memo && memo[prop]) {
|
||||||
const hookList = Plugins.loadedHooks[hook];
|
return memo[prop];
|
||||||
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') {
|
|
||||||
Plugins.fireHook('action:plugins.firehook', { hook: hook, params: params });
|
|
||||||
}
|
|
||||||
if (result !== undefined) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
async function fireFilterHook(hook, hookList, params) {
|
|
||||||
if (!Array.isArray(hookList) || !hookList.length) {
|
|
||||||
return 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);
|
// 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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
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 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
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)) {
|
if (utils.isPromise(returned)) {
|
||||||
returned.then(
|
returned.then(
|
||||||
payload => setImmediate(next, null, payload),
|
payload => setImmediate(callback, null, payload),
|
||||||
err => setImmediate(next, err)
|
err => setImmediate(callback, err)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
} catch (err) {
|
||||||
}
|
callback(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async function fireActionHook(hook, hookList, params) {
|
async function fireResponseHook(hook, hookList, params) {
|
||||||
if (!Array.isArray(hookList) || !hookList.length) {
|
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;
|
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 fireStaticHook(hook, hookList, params) {
|
// Skip remaining hooks if headers have been sent
|
||||||
if (!Array.isArray(hookList) || !hookList.length) {
|
if (params.res.headersSent) {
|
||||||
return;
|
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;
|
await hookObj.method(params);
|
||||||
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) {
|
|
||||||
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);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -21,9 +21,16 @@ const Plugins = module.exports;
|
|||||||
|
|
||||||
require('./install')(Plugins);
|
require('./install')(Plugins);
|
||||||
require('./load')(Plugins);
|
require('./load')(Plugins);
|
||||||
require('./hooks')(Plugins);
|
|
||||||
require('./usage')(Plugins);
|
require('./usage')(Plugins);
|
||||||
Plugins.data = require('./data');
|
Plugins.data = require('./data');
|
||||||
|
Plugins.hooks = require('./hooks');
|
||||||
|
|
||||||
|
// Backwards compatibility for hooks, remove in v1.16.0
|
||||||
|
Plugins.registerHook = Plugins.hooks.register;
|
||||||
|
Plugins.unregisterHook = Plugins.hooks.unregister;
|
||||||
|
Plugins.fireHook = Plugins.hooks.fire;
|
||||||
|
Plugins.hasListeners = Plugins.hooks.hasListeners;
|
||||||
|
// end
|
||||||
|
|
||||||
Plugins.getPluginPaths = Plugins.data.getPluginPaths;
|
Plugins.getPluginPaths = Plugins.data.getPluginPaths;
|
||||||
Plugins.loadPluginInfo = Plugins.data.loadPluginInfo;
|
Plugins.loadPluginInfo = Plugins.data.loadPluginInfo;
|
||||||
@@ -138,7 +145,7 @@ Plugins.reload = async function () {
|
|||||||
|
|
||||||
Plugins.reloadRoutes = async function (params) {
|
Plugins.reloadRoutes = async function (params) {
|
||||||
var controllers = require('../controllers');
|
var controllers = require('../controllers');
|
||||||
await Plugins.fireHook('static:app.load', { app: app, router: params.router, middleware: middleware, controllers: controllers });
|
await Plugins.hooks.fire('static:app.load', { app: app, router: params.router, middleware: middleware, controllers: controllers });
|
||||||
winston.verbose('[plugins] All plugins reloaded and rerouted');
|
winston.verbose('[plugins] All plugins reloaded and rerouted');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ module.exports = function (Plugins) {
|
|||||||
await db.sortedSetAdd('plugins:active', count, id);
|
await db.sortedSetAdd('plugins:active', count, id);
|
||||||
}
|
}
|
||||||
meta.reloadRequired = true;
|
meta.reloadRequired = true;
|
||||||
Plugins.fireHook(isActive ? 'action:plugin.deactivate' : 'action:plugin.activate', { id: id });
|
Plugins.hooks.fire(isActive ? 'action:plugin.deactivate' : 'action:plugin.activate', { id: id });
|
||||||
return { id: id, active: !isActive };
|
return { id: id, active: !isActive };
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ module.exports = function (Plugins) {
|
|||||||
}
|
}
|
||||||
await runPackageManagerCommandAsync(type, id, version || 'latest');
|
await runPackageManagerCommandAsync(type, id, version || 'latest');
|
||||||
const pluginData = await Plugins.get(id);
|
const pluginData = await Plugins.get(id);
|
||||||
Plugins.fireHook('action:plugin.' + type, { id: id, version: version });
|
Plugins.hooks.fire('action:plugin.' + type, { id: id, version: version });
|
||||||
return pluginData;
|
return pluginData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ module.exports = function (Plugins) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Array.isArray(pluginData.hooks)) {
|
if (Array.isArray(pluginData.hooks)) {
|
||||||
pluginData.hooks.forEach(hook => Plugins.registerHook(pluginData.id, hook));
|
pluginData.hooks.forEach(hook => Plugins.hooks.register(pluginData.id, hook));
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
winston.warn('[plugins] Unable to load library for: ' + pluginData.id);
|
winston.warn('[plugins] Unable to load library for: ' + pluginData.id);
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ module.exports = function (Posts) {
|
|||||||
postData.bookmarks = await db.setCount('pid:' + pid + ':users_bookmarked');
|
postData.bookmarks = await db.setCount('pid:' + pid + ':users_bookmarked');
|
||||||
await Posts.setPostField(pid, 'bookmarks', postData.bookmarks);
|
await Posts.setPostField(pid, 'bookmarks', postData.bookmarks);
|
||||||
|
|
||||||
plugins.fireHook('action:post.' + type, {
|
plugins.hooks.fire('action:post.' + type, {
|
||||||
pid: pid,
|
pid: pid,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
owner: postData.uid,
|
owner: postData.uid,
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ module.exports = function (Posts) {
|
|||||||
postData.handle = data.handle;
|
postData.handle = data.handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
let result = await plugins.fireHook('filter:post.create', { post: postData, data: data });
|
let result = await plugins.hooks.fire('filter:post.create', { post: postData, data: data });
|
||||||
postData = result.post;
|
postData = result.post;
|
||||||
await db.setObject('post:' + postData.pid, postData);
|
await db.setObject('post:' + postData.pid, postData);
|
||||||
|
|
||||||
@@ -65,9 +65,9 @@ module.exports = function (Posts) {
|
|||||||
Posts.uploads.sync(postData.pid),
|
Posts.uploads.sync(postData.pid),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
result = await plugins.fireHook('filter:post.get', { post: postData, uid: data.uid });
|
result = await plugins.hooks.fire('filter:post.get', { post: postData, uid: data.uid });
|
||||||
result.post.isMain = isMain;
|
result.post.isMain = isMain;
|
||||||
plugins.fireHook('action:post.save', { post: _.clone(result.post) });
|
plugins.hooks.fire('action:post.save', { post: _.clone(result.post) });
|
||||||
return result.post;
|
return result.post;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ module.exports = function (Posts) {
|
|||||||
}
|
}
|
||||||
const keys = pids.map(pid => 'post:' + pid);
|
const keys = pids.map(pid => 'post:' + pid);
|
||||||
const postData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
const postData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
|
||||||
const result = await plugins.fireHook('filter:post.getFields', {
|
const result = await plugins.hooks.fire('filter:post.getFields', {
|
||||||
pids: pids,
|
pids: pids,
|
||||||
posts: postData,
|
posts: postData,
|
||||||
fields: fields,
|
fields: fields,
|
||||||
@@ -51,7 +51,7 @@ module.exports = function (Posts) {
|
|||||||
|
|
||||||
Posts.setPostFields = async function (pid, data) {
|
Posts.setPostFields = async function (pid, data) {
|
||||||
await db.setObject('post:' + pid, data);
|
await db.setObject('post:' + pid, data);
|
||||||
plugins.fireHook('action:post.setFields', { data: { ...data, pid } });
|
plugins.hooks.fire('action:post.setFields', { data: { ...data, pid } });
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ module.exports = function (Posts) {
|
|||||||
|
|
||||||
async function deleteOrRestore(type, pid, uid) {
|
async function deleteOrRestore(type, pid, uid) {
|
||||||
const isDeleting = type === 'delete';
|
const isDeleting = type === 'delete';
|
||||||
await plugins.fireHook('filter:post.' + type, { pid: pid, uid: uid });
|
await plugins.hooks.fire('filter:post.' + type, { pid: pid, uid: uid });
|
||||||
await Posts.setPostFields(pid, {
|
await Posts.setPostFields(pid, {
|
||||||
deleted: isDeleting ? 1 : 0,
|
deleted: isDeleting ? 1 : 0,
|
||||||
deleterUid: isDeleting ? uid : 0,
|
deleterUid: isDeleting ? uid : 0,
|
||||||
@@ -38,7 +38,7 @@ module.exports = function (Posts) {
|
|||||||
db.sortedSetAdd('cid:' + topicData.cid + ':pids', postData.timestamp, pid),
|
db.sortedSetAdd('cid:' + topicData.cid + ':pids', postData.timestamp, pid),
|
||||||
]);
|
]);
|
||||||
await categories.updateRecentTidForCid(postData.cid);
|
await categories.updateRecentTidForCid(postData.cid);
|
||||||
plugins.fireHook('action:post.' + type, { post: _.clone(postData), uid: uid });
|
plugins.hooks.fire('action:post.' + type, { post: _.clone(postData), uid: uid });
|
||||||
if (type === 'delete') {
|
if (type === 'delete') {
|
||||||
await flags.resolveFlag('post', pid, uid);
|
await flags.resolveFlag('post', pid, uid);
|
||||||
}
|
}
|
||||||
@@ -52,7 +52,7 @@ module.exports = function (Posts) {
|
|||||||
}
|
}
|
||||||
const topicData = await topics.getTopicFields(postData.tid, ['tid', 'cid', 'pinned']);
|
const topicData = await topics.getTopicFields(postData.tid, ['tid', 'cid', 'pinned']);
|
||||||
postData.cid = topicData.cid;
|
postData.cid = topicData.cid;
|
||||||
await plugins.fireHook('filter:post.purge', { post: postData, pid: pid, uid: uid });
|
await plugins.hooks.fire('filter:post.purge', { post: postData, pid: pid, uid: uid });
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
deletePostFromTopicUserNotification(postData, topicData),
|
deletePostFromTopicUserNotification(postData, topicData),
|
||||||
deletePostFromCategoryRecentPosts(postData),
|
deletePostFromCategoryRecentPosts(postData),
|
||||||
@@ -64,7 +64,7 @@ module.exports = function (Posts) {
|
|||||||
Posts.uploads.dissociateAll(pid),
|
Posts.uploads.dissociateAll(pid),
|
||||||
]);
|
]);
|
||||||
await flags.resolveFlag('post', pid, uid);
|
await flags.resolveFlag('post', pid, uid);
|
||||||
plugins.fireHook('action:post.purge', { post: postData, uid: uid });
|
plugins.hooks.fire('action:post.purge', { post: postData, uid: uid });
|
||||||
await db.delete('post:' + pid);
|
await db.delete('post:' + pid);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ module.exports = function (Posts) {
|
|||||||
const post = await postDiffLoad(pid, since, uid);
|
const post = await postDiffLoad(pid, since, uid);
|
||||||
post.content = String(post.content || '');
|
post.content = String(post.content || '');
|
||||||
|
|
||||||
const result = await plugins.fireHook('filter:parse.post', { postData: post });
|
const result = await plugins.hooks.fire('filter:parse.post', { postData: post });
|
||||||
result.postData.content = translator.escape(result.postData.content);
|
result.postData.content = translator.escape(result.postData.content);
|
||||||
return result.postData;
|
return result.postData;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ module.exports = function (Posts) {
|
|||||||
editPostData.handle = data.handle;
|
editPostData.handle = data.handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await plugins.fireHook('filter:post.edit', {
|
const result = await plugins.hooks.fire('filter:post.edit', {
|
||||||
req: data.req,
|
req: data.req,
|
||||||
post: editPostData,
|
post: editPostData,
|
||||||
data: data,
|
data: data,
|
||||||
@@ -79,7 +79,7 @@ module.exports = function (Posts) {
|
|||||||
nid: 'edit_post:' + data.pid + ':uid:' + data.uid,
|
nid: 'edit_post:' + data.pid + ':uid:' + data.uid,
|
||||||
});
|
});
|
||||||
|
|
||||||
plugins.fireHook('action:post.edit', { post: _.clone(returnPostData), data: data, uid: data.uid });
|
plugins.hooks.fire('action:post.edit', { post: _.clone(returnPostData), data: data, uid: data.uid });
|
||||||
|
|
||||||
require('./cache').del(String(postData.pid));
|
require('./cache').del(String(postData.pid));
|
||||||
pubsub.publish('post:edit', String(postData.pid));
|
pubsub.publish('post:edit', String(postData.pid));
|
||||||
@@ -134,7 +134,7 @@ module.exports = function (Posts) {
|
|||||||
}
|
}
|
||||||
await topics.validateTags(data.tags, topicData.cid);
|
await topics.validateTags(data.tags, topicData.cid);
|
||||||
|
|
||||||
const results = await plugins.fireHook('filter:topic.edit', {
|
const results = await plugins.hooks.fire('filter:topic.edit', {
|
||||||
req: data.req,
|
req: data.req,
|
||||||
topic: newTopicData,
|
topic: newTopicData,
|
||||||
data: data,
|
data: data,
|
||||||
@@ -147,7 +147,7 @@ module.exports = function (Posts) {
|
|||||||
newTopicData.oldTitle = topicData.title;
|
newTopicData.oldTitle = topicData.title;
|
||||||
newTopicData.timestamp = topicData.timestamp;
|
newTopicData.timestamp = topicData.timestamp;
|
||||||
const renamed = translator.escape(validator.escape(String(title))) !== topicData.title;
|
const renamed = translator.escape(validator.escape(String(title))) !== topicData.title;
|
||||||
plugins.fireHook('action:topic.edit', { topic: newTopicData, uid: data.uid });
|
plugins.hooks.fire('action:topic.edit', { topic: newTopicData, uid: data.uid });
|
||||||
return {
|
return {
|
||||||
tid: tid,
|
tid: tid,
|
||||||
cid: newTopicData.cid,
|
cid: newTopicData.cid,
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ Posts.getPostsByPids = async function (pids, uid) {
|
|||||||
let posts = await Posts.getPostsData(pids);
|
let posts = await Posts.getPostsData(pids);
|
||||||
posts = await Promise.all(posts.map(p => Posts.parsePost(p)));
|
posts = await Promise.all(posts.map(p => Posts.parsePost(p)));
|
||||||
posts = await user.blocks.filter(uid, posts);
|
posts = await user.blocks.filter(uid, posts);
|
||||||
const data = await plugins.fireHook('filter:post.getPosts', { posts: posts, uid: uid });
|
const data = await plugins.hooks.fire('filter:post.getPosts', { posts: posts, uid: uid });
|
||||||
if (!data || !Array.isArray(data.posts)) {
|
if (!data || !Array.isArray(data.posts)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ module.exports = function (Posts) {
|
|||||||
return postData;
|
return postData;
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:parse.post', { postData: postData });
|
const data = await plugins.hooks.fire('filter:parse.post', { postData: postData });
|
||||||
data.postData.content = translator.escape(data.postData.content);
|
data.postData.content = translator.escape(data.postData.content);
|
||||||
if (data.postData.pid) {
|
if (data.postData.pid) {
|
||||||
cache.set(pid, data.postData.content);
|
cache.set(pid, data.postData.content);
|
||||||
@@ -70,7 +70,7 @@ module.exports = function (Posts) {
|
|||||||
|
|
||||||
Posts.parseSignature = async function (userData, uid) {
|
Posts.parseSignature = async function (userData, uid) {
|
||||||
userData.signature = sanitizeSignature(userData.signature || '');
|
userData.signature = sanitizeSignature(userData.signature || '');
|
||||||
return await plugins.fireHook('filter:parse.signature', { userData: userData, uid: uid });
|
return await plugins.hooks.fire('filter:parse.signature', { userData: userData, uid: uid });
|
||||||
};
|
};
|
||||||
|
|
||||||
Posts.relativeToAbsolute = function (content, regex) {
|
Posts.relativeToAbsolute = function (content, regex) {
|
||||||
@@ -121,11 +121,11 @@ module.exports = function (Posts) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Some plugins might need to adjust or whitelist their own tags...
|
// Some plugins might need to adjust or whitelist their own tags...
|
||||||
sanitizeConfig = await plugins.fireHook('filter:sanitize.config', sanitizeConfig);
|
sanitizeConfig = await plugins.hooks.fire('filter:sanitize.config', sanitizeConfig);
|
||||||
};
|
};
|
||||||
|
|
||||||
Posts.registerHooks = () => {
|
Posts.registerHooks = () => {
|
||||||
plugins.registerHook('core', {
|
plugins.hooks.register('core', {
|
||||||
hook: 'filter:parse.post',
|
hook: 'filter:parse.post',
|
||||||
method: async (data) => {
|
method: async (data) => {
|
||||||
data.postData.content = Posts.sanitize(data.postData.content);
|
data.postData.content = Posts.sanitize(data.postData.content);
|
||||||
@@ -133,17 +133,17 @@ module.exports = function (Posts) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
plugins.registerHook('core', {
|
plugins.hooks.register('core', {
|
||||||
hook: 'filter:parse.raw',
|
hook: 'filter:parse.raw',
|
||||||
method: async content => Posts.sanitize(content),
|
method: async content => Posts.sanitize(content),
|
||||||
});
|
});
|
||||||
|
|
||||||
plugins.registerHook('core', {
|
plugins.hooks.register('core', {
|
||||||
hook: 'filter:parse.aboutme',
|
hook: 'filter:parse.aboutme',
|
||||||
method: async content => Posts.sanitize(content),
|
method: async content => Posts.sanitize(content),
|
||||||
});
|
});
|
||||||
|
|
||||||
plugins.registerHook('core', {
|
plugins.hooks.register('core', {
|
||||||
hook: 'filter:parse.signature',
|
hook: 'filter:parse.signature',
|
||||||
method: async (data) => {
|
method: async (data) => {
|
||||||
data.userData.signature = Posts.sanitize(data.userData.signature);
|
data.userData.signature = Posts.sanitize(data.userData.signature);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ module.exports = function (Posts) {
|
|||||||
const userData = await user.getUserFields(uid, ['uid', 'reputation', 'postcount']);
|
const userData = await user.getUserFields(uid, ['uid', 'reputation', 'postcount']);
|
||||||
const isMemberOfExempt = await groups.isMemberOfAny(userData.uid, meta.config.groupsExemptFromPostQueue);
|
const isMemberOfExempt = await groups.isMemberOfAny(userData.uid, meta.config.groupsExemptFromPostQueue);
|
||||||
const shouldQueue = meta.config.postQueue && !isMemberOfExempt && (!userData.uid || userData.reputation < meta.config.postQueueReputationThreshold || userData.postcount <= 0);
|
const shouldQueue = meta.config.postQueue && !isMemberOfExempt && (!userData.uid || userData.reputation < meta.config.postQueueReputationThreshold || userData.postcount <= 0);
|
||||||
const result = await plugins.fireHook('filter:post.shouldQueue', {
|
const result = await plugins.hooks.fire('filter:post.shouldQueue', {
|
||||||
shouldQueue: !!shouldQueue,
|
shouldQueue: !!shouldQueue,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
data: data,
|
data: data,
|
||||||
@@ -57,7 +57,7 @@ module.exports = function (Posts) {
|
|||||||
type: type,
|
type: type,
|
||||||
data: data,
|
data: data,
|
||||||
};
|
};
|
||||||
payload = await plugins.fireHook('filter:post-queue.save', payload);
|
payload = await plugins.hooks.fire('filter:post-queue.save', payload);
|
||||||
payload.data = JSON.stringify(data);
|
payload.data = JSON.stringify(data);
|
||||||
|
|
||||||
await db.sortedSetAdd('post:queue', now, id);
|
await db.sortedSetAdd('post:queue', now, id);
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ module.exports = function (Posts) {
|
|||||||
posts = posts.filter(post => tidToTopic[post.tid]);
|
posts = posts.filter(post => tidToTopic[post.tid]);
|
||||||
|
|
||||||
posts = await parsePosts(posts, options);
|
posts = await parsePosts(posts, options);
|
||||||
const result = await plugins.fireHook('filter:post.getPostSummaryByPids', { posts: posts, uid: uid });
|
const result = await plugins.hooks.fire('filter:post.getPostSummaryByPids', { posts: posts, uid: uid });
|
||||||
return result.posts;
|
return result.posts;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ module.exports = function (Posts) {
|
|||||||
const [isMemberOfGroups, signature, customProfileInfo] = await Promise.all([
|
const [isMemberOfGroups, signature, customProfileInfo] = await Promise.all([
|
||||||
checkGroupMembership(userData.uid, userData.groupTitleArray),
|
checkGroupMembership(userData.uid, userData.groupTitleArray),
|
||||||
parseSignature(userData, uid, canUseSignature),
|
parseSignature(userData, uid, canUseSignature),
|
||||||
plugins.fireHook('filter:posts.custom_profile_info', { profile: [], uid: userData.uid }),
|
plugins.hooks.fire('filter:posts.custom_profile_info', { profile: [], uid: userData.uid }),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (isMemberOfGroups && userData.groupTitleArray) {
|
if (isMemberOfGroups && userData.groupTitleArray) {
|
||||||
@@ -49,7 +49,7 @@ module.exports = function (Posts) {
|
|||||||
userData.signature = signature;
|
userData.signature = signature;
|
||||||
userData.custom_profile_info = customProfileInfo.profile;
|
userData.custom_profile_info = customProfileInfo.profile;
|
||||||
|
|
||||||
return await plugins.fireHook('filter:posts.modifyUserInfo', userData);
|
return await plugins.hooks.fire('filter:posts.modifyUserInfo', userData);
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -94,7 +94,7 @@ module.exports = function (Posts) {
|
|||||||
'signature', 'banned', 'banned:expire', 'status',
|
'signature', 'banned', 'banned:expire', 'status',
|
||||||
'lastonline', 'groupTitle',
|
'lastonline', 'groupTitle',
|
||||||
];
|
];
|
||||||
const result = await plugins.fireHook('filter:posts.addUserFields', {
|
const result = await plugins.hooks.fire('filter:posts.addUserFields', {
|
||||||
fields: fields,
|
fields: fields,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
uids: uids,
|
uids: uids,
|
||||||
@@ -166,7 +166,7 @@ module.exports = function (Posts) {
|
|||||||
updateTopicPosters(postData, toUid),
|
updateTopicPosters(postData, toUid),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
plugins.fireHook('action:post.changeOwner', {
|
plugins.hooks.fire('action:post.changeOwner', {
|
||||||
posts: _.cloneDeep(postData),
|
posts: _.cloneDeep(postData),
|
||||||
toUid: toUid,
|
toUid: toUid,
|
||||||
});
|
});
|
||||||
@@ -228,7 +228,7 @@ module.exports = function (Posts) {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
const changedTopics = mainPosts.map(p => tidToTopic[p.tid]);
|
const changedTopics = mainPosts.map(p => tidToTopic[p.tid]);
|
||||||
plugins.fireHook('action:topic.changeOwner', {
|
plugins.hooks.fire('action:topic.changeOwner', {
|
||||||
topics: _.cloneDeep(changedTopics),
|
topics: _.cloneDeep(changedTopics),
|
||||||
toUid: toUid,
|
toUid: toUid,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ module.exports = function (Posts) {
|
|||||||
current = 'unvote';
|
current = 'unvote';
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins.fireHook('action:post.' + hook, {
|
plugins.hooks.fire('action:post.' + hook, {
|
||||||
pid: pid,
|
pid: pid,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
owner: owner,
|
owner: owner,
|
||||||
@@ -251,7 +251,7 @@ module.exports = function (Posts) {
|
|||||||
downvotes: postData.downvotes,
|
downvotes: postData.downvotes,
|
||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
plugins.fireHook('action:post.updatePostVoteCount', { post: postData });
|
plugins.hooks.fire('action:post.updatePostVoteCount', { post: postData });
|
||||||
};
|
};
|
||||||
|
|
||||||
async function updateTopicVoteCount(postData) {
|
async function updateTopicVoteCount(postData) {
|
||||||
|
|||||||
@@ -120,14 +120,14 @@ module.exports = function (privileges) {
|
|||||||
|
|
||||||
async function getLabels() {
|
async function getLabels() {
|
||||||
return await utils.promiseParallel({
|
return await utils.promiseParallel({
|
||||||
users: plugins.fireHook('filter:privileges.admin.list_human', privilegeLabels.slice()),
|
users: plugins.hooks.fire('filter:privileges.admin.list_human', privilegeLabels.slice()),
|
||||||
groups: plugins.fireHook('filter:privileges.admin.groups.list_human', privilegeLabels.slice()),
|
groups: plugins.hooks.fire('filter:privileges.admin.groups.list_human', privilegeLabels.slice()),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const keys = await utils.promiseParallel({
|
const keys = await utils.promiseParallel({
|
||||||
users: plugins.fireHook('filter:privileges.admin.list', userPrivilegeList.slice()),
|
users: plugins.hooks.fire('filter:privileges.admin.list', userPrivilegeList.slice()),
|
||||||
groups: plugins.fireHook('filter:privileges.admin.groups.list', groupPrivilegeList.slice()),
|
groups: plugins.hooks.fire('filter:privileges.admin.groups.list', groupPrivilegeList.slice()),
|
||||||
});
|
});
|
||||||
|
|
||||||
const payload = await utils.promiseParallel({
|
const payload = await utils.promiseParallel({
|
||||||
@@ -152,7 +152,7 @@ module.exports = function (privileges) {
|
|||||||
const privData = _.zipObject(privileges.admin.userPrivilegeList, combined);
|
const privData = _.zipObject(privileges.admin.userPrivilegeList, combined);
|
||||||
|
|
||||||
privData.superadmin = isAdministrator;
|
privData.superadmin = isAdministrator;
|
||||||
return await plugins.fireHook('filter:privileges.admin.get', privData);
|
return await plugins.hooks.fire('filter:privileges.admin.get', privData);
|
||||||
};
|
};
|
||||||
|
|
||||||
privileges.admin.can = async function (privilege, uid) {
|
privileges.admin.can = async function (privilege, uid) {
|
||||||
@@ -169,7 +169,7 @@ module.exports = function (privileges) {
|
|||||||
|
|
||||||
privileges.admin.give = async function (privileges, groupName) {
|
privileges.admin.give = async function (privileges, groupName) {
|
||||||
await helpers.giveOrRescind(groups.join, privileges, 'admin', groupName);
|
await helpers.giveOrRescind(groups.join, privileges, 'admin', groupName);
|
||||||
plugins.fireHook('action:privileges.admin.give', {
|
plugins.hooks.fire('action:privileges.admin.give', {
|
||||||
privileges: privileges,
|
privileges: privileges,
|
||||||
groupNames: Array.isArray(groupName) ? groupName : [groupName],
|
groupNames: Array.isArray(groupName) ? groupName : [groupName],
|
||||||
});
|
});
|
||||||
@@ -177,7 +177,7 @@ module.exports = function (privileges) {
|
|||||||
|
|
||||||
privileges.admin.rescind = async function (privileges, groupName) {
|
privileges.admin.rescind = async function (privileges, groupName) {
|
||||||
await helpers.giveOrRescind(groups.leave, privileges, 'admin', groupName);
|
await helpers.giveOrRescind(groups.leave, privileges, 'admin', groupName);
|
||||||
plugins.fireHook('action:privileges.admin.rescind', {
|
plugins.hooks.fire('action:privileges.admin.rescind', {
|
||||||
privileges: privileges,
|
privileges: privileges,
|
||||||
groupNames: Array.isArray(groupName) ? groupName : [groupName],
|
groupNames: Array.isArray(groupName) ? groupName : [groupName],
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ module.exports = function (privileges) {
|
|||||||
privileges.categories.list = async function (cid) {
|
privileges.categories.list = async function (cid) {
|
||||||
async function getLabels() {
|
async function getLabels() {
|
||||||
return await utils.promiseParallel({
|
return await utils.promiseParallel({
|
||||||
users: plugins.fireHook('filter:privileges.list_human', privileges.privilegeLabels.slice()),
|
users: plugins.hooks.fire('filter:privileges.list_human', privileges.privilegeLabels.slice()),
|
||||||
groups: plugins.fireHook('filter:privileges.groups.list_human', privileges.privilegeLabels.slice()),
|
groups: plugins.hooks.fire('filter:privileges.groups.list_human', privileges.privilegeLabels.slice()),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const keys = await utils.promiseParallel({
|
const keys = await utils.promiseParallel({
|
||||||
users: plugins.fireHook('filter:privileges.list', privileges.userPrivilegeList.slice()),
|
users: plugins.hooks.fire('filter:privileges.list', privileges.userPrivilegeList.slice()),
|
||||||
groups: plugins.fireHook('filter:privileges.groups.list', privileges.groupPrivilegeList.slice()),
|
groups: plugins.hooks.fire('filter:privileges.groups.list', privileges.groupPrivilegeList.slice()),
|
||||||
});
|
});
|
||||||
|
|
||||||
const payload = await utils.promiseParallel({
|
const payload = await utils.promiseParallel({
|
||||||
@@ -55,7 +55,7 @@ module.exports = function (privileges) {
|
|||||||
const privData = _.zipObject(privs, combined);
|
const privData = _.zipObject(privs, combined);
|
||||||
const isAdminOrMod = isAdministrator || isModerator;
|
const isAdminOrMod = isAdministrator || isModerator;
|
||||||
|
|
||||||
return await plugins.fireHook('filter:privileges.categories.get', {
|
return await plugins.hooks.fire('filter:privileges.categories.get', {
|
||||||
...privData,
|
...privData,
|
||||||
cid: cid,
|
cid: cid,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
@@ -135,7 +135,7 @@ module.exports = function (privileges) {
|
|||||||
|
|
||||||
privileges.categories.give = async function (privileges, cid, members) {
|
privileges.categories.give = async function (privileges, cid, members) {
|
||||||
await helpers.giveOrRescind(groups.join, privileges, cid, members);
|
await helpers.giveOrRescind(groups.join, privileges, cid, members);
|
||||||
plugins.fireHook('action:privileges.categories.give', {
|
plugins.hooks.fire('action:privileges.categories.give', {
|
||||||
privileges: privileges,
|
privileges: privileges,
|
||||||
cids: Array.isArray(cid) ? cid : [cid],
|
cids: Array.isArray(cid) ? cid : [cid],
|
||||||
members: Array.isArray(members) ? members : [members],
|
members: Array.isArray(members) ? members : [members],
|
||||||
@@ -144,7 +144,7 @@ module.exports = function (privileges) {
|
|||||||
|
|
||||||
privileges.categories.rescind = async function (privileges, cid, members) {
|
privileges.categories.rescind = async function (privileges, cid, members) {
|
||||||
await helpers.giveOrRescind(groups.leave, privileges, cid, members);
|
await helpers.giveOrRescind(groups.leave, privileges, cid, members);
|
||||||
plugins.fireHook('action:privileges.categories.rescind', {
|
plugins.hooks.fire('action:privileges.categories.rescind', {
|
||||||
privileges: privileges,
|
privileges: privileges,
|
||||||
cids: Array.isArray(cid) ? cid : [cid],
|
cids: Array.isArray(cid) ? cid : [cid],
|
||||||
members: Array.isArray(members) ? members : [members],
|
members: Array.isArray(members) ? members : [members],
|
||||||
|
|||||||
@@ -53,14 +53,14 @@ module.exports = function (privileges) {
|
|||||||
privileges.global.list = async function () {
|
privileges.global.list = async function () {
|
||||||
async function getLabels() {
|
async function getLabels() {
|
||||||
return await utils.promiseParallel({
|
return await utils.promiseParallel({
|
||||||
users: plugins.fireHook('filter:privileges.global.list_human', privileges.global.privilegeLabels.slice()),
|
users: plugins.hooks.fire('filter:privileges.global.list_human', privileges.global.privilegeLabels.slice()),
|
||||||
groups: plugins.fireHook('filter:privileges.global.groups.list_human', privileges.global.privilegeLabels.slice()),
|
groups: plugins.hooks.fire('filter:privileges.global.groups.list_human', privileges.global.privilegeLabels.slice()),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const keys = await utils.promiseParallel({
|
const keys = await utils.promiseParallel({
|
||||||
users: plugins.fireHook('filter:privileges.global.list', privileges.global.userPrivilegeList.slice()),
|
users: plugins.hooks.fire('filter:privileges.global.list', privileges.global.userPrivilegeList.slice()),
|
||||||
groups: plugins.fireHook('filter:privileges.global.groups.list', privileges.global.groupPrivilegeList.slice()),
|
groups: plugins.hooks.fire('filter:privileges.global.groups.list', privileges.global.groupPrivilegeList.slice()),
|
||||||
});
|
});
|
||||||
|
|
||||||
const payload = await utils.promiseParallel({
|
const payload = await utils.promiseParallel({
|
||||||
@@ -84,7 +84,7 @@ module.exports = function (privileges) {
|
|||||||
const combined = userPrivileges.map(allowed => allowed || isAdministrator);
|
const combined = userPrivileges.map(allowed => allowed || isAdministrator);
|
||||||
const privData = _.zipObject(privileges.global.userPrivilegeList, combined);
|
const privData = _.zipObject(privileges.global.userPrivilegeList, combined);
|
||||||
|
|
||||||
return await plugins.fireHook('filter:privileges.global.get', privData);
|
return await plugins.hooks.fire('filter:privileges.global.get', privData);
|
||||||
};
|
};
|
||||||
|
|
||||||
privileges.global.can = async function (privilege, uid) {
|
privileges.global.can = async function (privilege, uid) {
|
||||||
@@ -101,7 +101,7 @@ module.exports = function (privileges) {
|
|||||||
|
|
||||||
privileges.global.give = async function (privileges, groupName) {
|
privileges.global.give = async function (privileges, groupName) {
|
||||||
await helpers.giveOrRescind(groups.join, privileges, 0, groupName);
|
await helpers.giveOrRescind(groups.join, privileges, 0, groupName);
|
||||||
plugins.fireHook('action:privileges.global.give', {
|
plugins.hooks.fire('action:privileges.global.give', {
|
||||||
privileges: privileges,
|
privileges: privileges,
|
||||||
groupNames: Array.isArray(groupName) ? groupName : [groupName],
|
groupNames: Array.isArray(groupName) ? groupName : [groupName],
|
||||||
});
|
});
|
||||||
@@ -109,7 +109,7 @@ module.exports = function (privileges) {
|
|||||||
|
|
||||||
privileges.global.rescind = async function (privileges, groupName) {
|
privileges.global.rescind = async function (privileges, groupName) {
|
||||||
await helpers.giveOrRescind(groups.leave, privileges, 0, groupName);
|
await helpers.giveOrRescind(groups.leave, privileges, 0, groupName);
|
||||||
plugins.fireHook('action:privileges.global.rescind', {
|
plugins.hooks.fire('action:privileges.global.rescind', {
|
||||||
privileges: privileges,
|
privileges: privileges,
|
||||||
groupNames: Array.isArray(groupName) ? groupName : [groupName],
|
groupNames: Array.isArray(groupName) ? groupName : [groupName],
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ helpers.isUsersAllowedTo = async function (privilege, uids, cid) {
|
|||||||
groups.isMembersOfGroupList(uids, 'cid:' + cid + ':privileges:groups:' + privilege),
|
groups.isMembersOfGroupList(uids, 'cid:' + cid + ':privileges:groups:' + privilege),
|
||||||
]);
|
]);
|
||||||
const allowed = uids.map((uid, index) => hasUserPrivilege[index] || hasGroupPrivilege[index]);
|
const allowed = uids.map((uid, index) => hasUserPrivilege[index] || hasGroupPrivilege[index]);
|
||||||
const result = await plugins.fireHook('filter:privileges:isUsersAllowedTo', { allowed: allowed, privilege: privilege, uids: uids, cid: cid });
|
const result = await plugins.hooks.fire('filter:privileges:isUsersAllowedTo', { allowed: allowed, privilege: privilege, uids: uids, cid: cid });
|
||||||
return result.allowed;
|
return result.allowed;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -34,8 +34,8 @@ helpers.isAllowedTo = async function (privilege, uidOrGroupName, cid) {
|
|||||||
allowed = await isAllowedToCids(privilege, uidOrGroupName, cid);
|
allowed = await isAllowedToCids(privilege, uidOrGroupName, cid);
|
||||||
}
|
}
|
||||||
if (allowed) {
|
if (allowed) {
|
||||||
({ allowed } = await plugins.fireHook('filter:privileges:isUserAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid }));
|
({ allowed } = await plugins.hooks.fire('filter:privileges:isUserAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid }));
|
||||||
({ allowed } = await plugins.fireHook('filter:privileges:isAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid }));
|
({ allowed } = await plugins.hooks.fire('filter:privileges:isAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid }));
|
||||||
return allowed;
|
return allowed;
|
||||||
}
|
}
|
||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ module.exports = function (privileges) {
|
|||||||
((!post.topic.deleted && !post.deleted) || canViewDeleted[post.topic.cid] || results.isAdmin);
|
((!post.topic.deleted && !post.deleted) || canViewDeleted[post.topic.cid] || results.isAdmin);
|
||||||
}).map(post => post.pid);
|
}).map(post => post.pid);
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:privileges.posts.filter', {
|
const data = await plugins.hooks.fire('filter:privileges.posts.filter', {
|
||||||
privilege: privilege,
|
privilege: privilege,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
pids: pids,
|
pids: pids,
|
||||||
@@ -144,7 +144,7 @@ module.exports = function (privileges) {
|
|||||||
results.pid = parseInt(pid, 10);
|
results.pid = parseInt(pid, 10);
|
||||||
results.uid = uid;
|
results.uid = uid;
|
||||||
|
|
||||||
const result = await plugins.fireHook('filter:privileges.posts.edit', results);
|
const result = await plugins.hooks.fire('filter:privileges.posts.edit', results);
|
||||||
return { flag: result.edit && (result.owner || result.isMod), message: '[[error:no-privileges]]' };
|
return { flag: result.edit && (result.owner || result.isMod), message: '[[error:no-privileges]]' };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ module.exports = function (privileges) {
|
|||||||
const editable = isAdminOrMod;
|
const editable = isAdminOrMod;
|
||||||
const deletable = (privData['topics:delete'] && (isOwner || isModerator)) || isAdministrator;
|
const deletable = (privData['topics:delete'] && (isOwner || isModerator)) || isAdministrator;
|
||||||
|
|
||||||
return await plugins.fireHook('filter:privileges.topics.get', {
|
return await plugins.hooks.fire('filter:privileges.topics.get', {
|
||||||
'topics:reply': (privData['topics:reply'] && ((!topicData.locked && !topicData.deleted) || isModerator)) || isAdministrator,
|
'topics:reply': (privData['topics:reply'] && ((!topicData.locked && !topicData.deleted) || isModerator)) || isAdministrator,
|
||||||
'topics:read': privData['topics:read'] || isAdministrator,
|
'topics:read': privData['topics:read'] || isAdministrator,
|
||||||
'topics:tag': privData['topics:tag'] || isAdministrator,
|
'topics:tag': privData['topics:tag'] || isAdministrator,
|
||||||
@@ -78,7 +78,7 @@ module.exports = function (privileges) {
|
|||||||
|
|
||||||
tids = topicsData.filter(t => cidsSet.has(t.cid) && (!t.deleted || canViewDeleted[t.cid] || results.isAdmin)).map(t => t.tid);
|
tids = topicsData.filter(t => cidsSet.has(t.cid) && (!t.deleted || canViewDeleted[t.cid] || results.isAdmin)).map(t => t.tid);
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:privileges.topics.filter', {
|
const data = await plugins.hooks.fire('filter:privileges.topics.filter', {
|
||||||
privilege: privilege,
|
privilege: privilege,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
tids: tids,
|
tids: tids,
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ module.exports = function (privileges) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function filterIsModerator(cid, uid, isModerator) {
|
async function filterIsModerator(cid, uid, isModerator) {
|
||||||
const data = await plugins.fireHook('filter:user.isModerator', { uid: uid, cid: cid, isModerator: isModerator });
|
const data = await plugins.hooks.fire('filter:user.isModerator', { uid: uid, cid: cid, isModerator: isModerator });
|
||||||
if ((Array.isArray(uid) || Array.isArray(cid)) && !Array.isArray(data.isModerator)) {
|
if ((Array.isArray(uid) || Array.isArray(cid)) && !Array.isArray(data.isModerator)) {
|
||||||
throw new Error('filter:user.isModerator - i/o mismatch');
|
throw new Error('filter:user.isModerator - i/o mismatch');
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,7 @@ module.exports = function (privileges) {
|
|||||||
privileges.users.isAdministrator(uid),
|
privileges.users.isAdministrator(uid),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:user.canEdit', {
|
const data = await plugins.hooks.fire('filter:user.canEdit', {
|
||||||
isAdmin: isAdmin,
|
isAdmin: isAdmin,
|
||||||
isGlobalMod: isGlobalMod,
|
isGlobalMod: isGlobalMod,
|
||||||
isTargetAdmin: isTargetAdmin,
|
isTargetAdmin: isTargetAdmin,
|
||||||
@@ -99,7 +99,7 @@ module.exports = function (privileges) {
|
|||||||
privileges.users.isAdministrator(uid),
|
privileges.users.isAdministrator(uid),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:user.canBanUser', {
|
const data = await plugins.hooks.fire('filter:user.canBanUser', {
|
||||||
canBan: canBan && !isTargetAdmin,
|
canBan: canBan && !isTargetAdmin,
|
||||||
callerUid: callerUid,
|
callerUid: callerUid,
|
||||||
uid: uid,
|
uid: uid,
|
||||||
@@ -114,7 +114,7 @@ module.exports = function (privileges) {
|
|||||||
const privilegeName = privilege.split('-').map(word => word.slice(0, 1).toUpperCase() + word.slice(1)).join('');
|
const privilegeName = privilege.split('-').map(word => word.slice(0, 1).toUpperCase() + word.slice(1)).join('');
|
||||||
let payload = { uid };
|
let payload = { uid };
|
||||||
payload[`can${privilegeName}`] = await privileges.global.can(privilege, uid);
|
payload[`can${privilegeName}`] = await privileges.global.can(privilege, uid);
|
||||||
payload = await plugins.fireHook(`filter:user.has${privilegeName}Privilege`, payload);
|
payload = await plugins.hooks.fire(`filter:user.has${privilegeName}Privilege`, payload);
|
||||||
return payload[`can${privilegeName}`];
|
return payload[`can${privilegeName}`];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -37,9 +37,9 @@ rewards.delete = async function (data) {
|
|||||||
rewards.get = async function () {
|
rewards.get = async function () {
|
||||||
return await utils.promiseParallel({
|
return await utils.promiseParallel({
|
||||||
active: getActiveRewards(),
|
active: getActiveRewards(),
|
||||||
conditions: plugins.fireHook('filter:rewards.conditions', []),
|
conditions: plugins.hooks.fire('filter:rewards.conditions', []),
|
||||||
conditionals: plugins.fireHook('filter:rewards.conditionals', []),
|
conditionals: plugins.hooks.fire('filter:rewards.conditionals', []),
|
||||||
rewards: plugins.fireHook('filter:rewards.rewards', []),
|
rewards: plugins.hooks.fire('filter:rewards.rewards', []),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ async function checkCondition(reward, method) {
|
|||||||
method = util.promisify(method);
|
method = util.promisify(method);
|
||||||
}
|
}
|
||||||
const value = await method();
|
const value = await method();
|
||||||
const bool = await plugins.fireHook('filter:rewards.checkConditional:' + reward.conditional, { left: value, right: reward.value });
|
const bool = await plugins.hooks.fire('filter:rewards.checkConditional:' + reward.conditional, { left: value, right: reward.value });
|
||||||
return bool;
|
return bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ async function giveRewards(uid, rewards) {
|
|||||||
const rewardData = await getRewardsByRewardData(rewards);
|
const rewardData = await getRewardsByRewardData(rewards);
|
||||||
for (let i = 0; i < rewards.length; i++) {
|
for (let i = 0; i < rewards.length; i++) {
|
||||||
/* eslint-disable no-await-in-loop */
|
/* eslint-disable no-await-in-loop */
|
||||||
await plugins.fireHook('action:rewards.award:' + rewards[i].rid, { uid: uid, reward: rewardData[i] });
|
await plugins.hooks.fire('action:rewards.award:' + rewards[i].rid, { uid: uid, reward: rewardData[i] });
|
||||||
await db.sortedSetIncrBy('uid:' + uid + ':rewards', 1, rewards[i].id);
|
await db.sortedSetIncrBy('uid:' + uid + ':rewards', 1, rewards[i].id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,9 +79,9 @@ Auth.reloadRoutes = async function (params) {
|
|||||||
const router = params.router;
|
const router = params.router;
|
||||||
|
|
||||||
// Local Logins
|
// Local Logins
|
||||||
if (plugins.hasListeners('action:auth.overrideLogin')) {
|
if (plugins.hooks.hasListeners('action:auth.overrideLogin')) {
|
||||||
winston.warn('[authentication] Login override detected, skipping local login strategy.');
|
winston.warn('[authentication] Login override detected, skipping local login strategy.');
|
||||||
plugins.fireHook('action:auth.overrideLogin');
|
plugins.hooks.fire('action:auth.overrideLogin');
|
||||||
} else {
|
} else {
|
||||||
passport.use(new passportLocal({ passReqToCallback: true }, controllers.authentication.localLogin));
|
passport.use(new passportLocal({ passReqToCallback: true }, controllers.authentication.localLogin));
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ Auth.reloadRoutes = async function (params) {
|
|||||||
|
|
||||||
// Additional logins via SSO plugins
|
// Additional logins via SSO plugins
|
||||||
try {
|
try {
|
||||||
loginStrategies = await plugins.fireHook('filter:auth.init', loginStrategies);
|
loginStrategies = await plugins.hooks.fire('filter:auth.init', loginStrategies);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
winston.error('[authentication] ' + err.stack);
|
winston.error('[authentication] ' + err.stack);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ Write.reload = async (params) => {
|
|||||||
* `/api/v3/plugins`.
|
* `/api/v3/plugins`.
|
||||||
*/
|
*/
|
||||||
const pluginRouter = require('express').Router();
|
const pluginRouter = require('express').Router();
|
||||||
await plugins.fireHook('static:api.routes', {
|
await plugins.hooks.fire('static:api.routes', {
|
||||||
router: pluginRouter,
|
router: pluginRouter,
|
||||||
middleware,
|
middleware,
|
||||||
helpers,
|
helpers,
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ async function searchInContent(data) {
|
|||||||
|
|
||||||
async function doSearch(type, searchIn) {
|
async function doSearch(type, searchIn) {
|
||||||
if (searchIn.includes(data.searchIn)) {
|
if (searchIn.includes(data.searchIn)) {
|
||||||
return await plugins.fireHook('filter:search.query', {
|
return await plugins.hooks.fire('filter:search.query', {
|
||||||
index: type,
|
index: type,
|
||||||
content: data.query,
|
content: data.query,
|
||||||
matchWords: data.matchWords || 'all',
|
matchWords: data.matchWords || 'all',
|
||||||
@@ -70,7 +70,7 @@ async function searchInContent(data) {
|
|||||||
allPids = await privileges.posts.filter('topics:read', allPids, data.uid);
|
allPids = await privileges.posts.filter('topics:read', allPids, data.uid);
|
||||||
allPids = await filterAndSort(allPids, data);
|
allPids = await filterAndSort(allPids, data);
|
||||||
|
|
||||||
const metadata = await plugins.fireHook('filter:search.inContent', {
|
const metadata = await plugins.hooks.fire('filter:search.inContent', {
|
||||||
pids: allPids,
|
pids: allPids,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -87,13 +87,13 @@ async function searchInContent(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
returnData.posts = await posts.getPostSummaryByPids(metadata.pids, data.uid, {});
|
returnData.posts = await posts.getPostSummaryByPids(metadata.pids, data.uid, {});
|
||||||
await plugins.fireHook('filter:search.contentGetResult', { result: returnData, data: data });
|
await plugins.hooks.fire('filter:search.contentGetResult', { result: returnData, data: data });
|
||||||
delete metadata.pids;
|
delete metadata.pids;
|
||||||
return Object.assign(returnData, metadata);
|
return Object.assign(returnData, metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function filterAndSort(pids, data) {
|
async function filterAndSort(pids, data) {
|
||||||
if (data.sortBy === 'relevance' && !data.replies && !data.timeRange && !data.hasTags && !plugins.hasListeners('filter:search.filterAndSort')) {
|
if (data.sortBy === 'relevance' && !data.replies && !data.timeRange && !data.hasTags && !plugins.hooks.hasListeners('filter:search.filterAndSort')) {
|
||||||
return pids;
|
return pids;
|
||||||
}
|
}
|
||||||
let postsData = await getMatchedPosts(pids, data);
|
let postsData = await getMatchedPosts(pids, data);
|
||||||
@@ -108,7 +108,7 @@ async function filterAndSort(pids, data) {
|
|||||||
|
|
||||||
sortPosts(postsData, data);
|
sortPosts(postsData, data);
|
||||||
|
|
||||||
const result = await plugins.fireHook('filter:search.filterAndSort', { pids: pids, posts: postsData, data: data });
|
const result = await plugins.hooks.fire('filter:search.filterAndSort', { pids: pids, posts: postsData, data: data });
|
||||||
return result.posts.map(post => post && post.pid);
|
return result.posts.map(post => post && post.pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ sitemap.getPages = async function () {
|
|||||||
priority: 0.4,
|
priority: 0.4,
|
||||||
}];
|
}];
|
||||||
|
|
||||||
const data = await plugins.fireHook('filter:sitemap.getPages', { urls: urls });
|
const data = await plugins.hooks.fire('filter:sitemap.getPages', { urls: urls });
|
||||||
|
|
||||||
const smStream = new SitemapStream({ hostname: nconf.get('url') });
|
const smStream = new SitemapStream({ hostname: nconf.get('url') });
|
||||||
data.urls.forEach(url => smStream.write(url));
|
data.urls.forEach(url => smStream.write(url));
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ social.getPostSharing = async function () {
|
|||||||
class: 'fa-twitter',
|
class: 'fa-twitter',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
networks = await plugins.fireHook('filter:social.posts', networks);
|
networks = await plugins.hooks.fire('filter:social.posts', networks);
|
||||||
const activated = await db.getSetMembers('social:posts.activated');
|
const activated = await db.getSetMembers('social:posts.activated');
|
||||||
networks.forEach(function (network) {
|
networks.forEach(function (network) {
|
||||||
network.activated = activated.includes(network.id);
|
network.activated = activated.includes(network.id);
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ Categories.getAll = async function () {
|
|||||||
'color', 'bgColor', 'backgroundImage', 'imageClass',
|
'color', 'bgColor', 'backgroundImage', 'imageClass',
|
||||||
];
|
];
|
||||||
const categoriesData = await categories.getCategoriesFields(cids, fields);
|
const categoriesData = await categories.getCategoriesFields(cids, fields);
|
||||||
const result = await plugins.fireHook('filter:admin.categories.get', { categories: categoriesData, fields: fields });
|
const result = await plugins.hooks.fire('filter:admin.categories.get', { categories: categoriesData, fields: fields });
|
||||||
return categories.getTree(result.categories, 0);
|
return categories.getTree(result.categories, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Config.setMultiple = async function (socket, data) {
|
|||||||
key: field,
|
key: field,
|
||||||
value: data[field],
|
value: data[field],
|
||||||
};
|
};
|
||||||
plugins.fireHook('action:config.set', setting);
|
plugins.hooks.fire('action:config.set', setting);
|
||||||
logger.monitorConfig({ io: index.server }, setting);
|
logger.monitorConfig({ io: index.server }, setting);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ async function notifyUids(uid, uids, type, result) {
|
|||||||
uids = filterTidCidIgnorers(watchStateUids, watchStates);
|
uids = filterTidCidIgnorers(watchStateUids, watchStates);
|
||||||
uids = await user.blocks.filterUids(uid, uids);
|
uids = await user.blocks.filterUids(uid, uids);
|
||||||
uids = await user.blocks.filterUids(post.topic.uid, uids);
|
uids = await user.blocks.filterUids(post.topic.uid, uids);
|
||||||
const data = await plugins.fireHook('filter:sockets.sendNewPostToUids', { uidsTo: uids, uidFrom: uid, type: type });
|
const data = await plugins.hooks.fire('filter:sockets.sendNewPostToUids', { uidsTo: uids, uidFrom: uid, type: type });
|
||||||
|
|
||||||
post.ip = undefined;
|
post.ip = undefined;
|
||||||
|
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ async function validateSession(socket) {
|
|||||||
if (!sessionData) {
|
if (!sessionData) {
|
||||||
throw new Error('[[error:invalid-session]]');
|
throw new Error('[[error:invalid-session]]');
|
||||||
}
|
}
|
||||||
const result = await plugins.fireHook('static:sockets.validateSession', {
|
const result = await plugins.hooks.fire('static:sockets.validateSession', {
|
||||||
req: req,
|
req: req,
|
||||||
socket: socket,
|
socket: socket,
|
||||||
session: sessionData,
|
session: sessionData,
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ SocketModules.chats.send = async function (socket, data) {
|
|||||||
if (!canChat) {
|
if (!canChat) {
|
||||||
throw new Error('[[error:no-privileges]]');
|
throw new Error('[[error:no-privileges]]');
|
||||||
}
|
}
|
||||||
const results = await plugins.fireHook('filter:messaging.send', {
|
const results = await plugins.hooks.fire('filter:messaging.send', {
|
||||||
data: data,
|
data: data,
|
||||||
uid: socket.uid,
|
uid: socket.uid,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ SocketPosts.getRawPost = async function (socket, pid) {
|
|||||||
throw new Error('[[error:no-post]]');
|
throw new Error('[[error:no-post]]');
|
||||||
}
|
}
|
||||||
postData.pid = pid;
|
postData.pid = pid;
|
||||||
const result = await plugins.fireHook('filter:post.getRawPost', { uid: socket.uid, postData: postData });
|
const result = await plugins.hooks.fire('filter:post.getRawPost', { uid: socket.uid, postData: postData });
|
||||||
return result.postData.content;
|
return result.postData.content;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -182,7 +182,7 @@ SocketPosts.editQueuedContent = async function (socket, data) {
|
|||||||
}
|
}
|
||||||
await posts.editQueuedContent(socket.uid, data);
|
await posts.editQueuedContent(socket.uid, data);
|
||||||
if (data.content) {
|
if (data.content) {
|
||||||
return await plugins.fireHook('filter:parse.post', { postData: data });
|
return await plugins.hooks.fire('filter:parse.post', { postData: data });
|
||||||
}
|
}
|
||||||
return { postData: data };
|
return { postData: data };
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ module.exports = function (SocketPosts) {
|
|||||||
canFlag: privileges.posts.canFlag(data.pid, socket.uid),
|
canFlag: privileges.posts.canFlag(data.pid, socket.uid),
|
||||||
flagged: flags.exists('post', data.pid, socket.uid), // specifically, whether THIS calling user flagged
|
flagged: flags.exists('post', data.pid, socket.uid), // specifically, whether THIS calling user flagged
|
||||||
bookmarked: posts.hasBookmarked(data.pid, socket.uid),
|
bookmarked: posts.hasBookmarked(data.pid, socket.uid),
|
||||||
tools: plugins.fireHook('filter:post.tools', { pid: data.pid, uid: socket.uid, tools: [] }),
|
tools: plugins.hooks.fire('filter:post.tools', { pid: data.pid, uid: socket.uid, tools: [] }),
|
||||||
postSharing: social.getActivePostSharing(),
|
postSharing: social.getActivePostSharing(),
|
||||||
history: posts.diffs.exists(data.pid),
|
history: posts.diffs.exists(data.pid),
|
||||||
canViewInfo: privileges.global.can('view:users:info', socket.uid),
|
canViewInfo: privileges.global.can('view:users:info', socket.uid),
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ module.exports = function (SocketTopics) {
|
|||||||
throw new Error('[[error:no-privileges]]');
|
throw new Error('[[error:no-privileges]]');
|
||||||
}
|
}
|
||||||
topicData.privileges = userPrivileges;
|
topicData.privileges = userPrivileges;
|
||||||
const result = await plugins.fireHook('filter:topic.thread_tools', { topic: topicData, uid: socket.uid, tools: [] });
|
const result = await plugins.hooks.fire('filter:topic.thread_tools', { topic: topicData, uid: socket.uid, tools: [] });
|
||||||
result.topic.thread_tools = result.tools;
|
result.topic.thread_tools = result.tools;
|
||||||
return result.topic;
|
return result.topic;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ SocketUser.reset.commit = async function (socket, data) {
|
|||||||
const [uid] = await Promise.all([
|
const [uid] = await Promise.all([
|
||||||
db.getObjectField('reset:uid', data.code),
|
db.getObjectField('reset:uid', data.code),
|
||||||
user.reset.commit(data.code, data.password),
|
user.reset.commit(data.code, data.password),
|
||||||
plugins.fireHook('action:password.reset', { uid: socket.uid }),
|
plugins.hooks.fire('action:password.reset', { uid: socket.uid }),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await events.log({
|
await events.log({
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user