Add guild-configurable moderation permissions
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
const { connectToDatabase } = require('../db');
|
||||
|
||||
const DEFAULT_GUILD_PERMISSIONS = {
|
||||
adminRoleIds: [],
|
||||
adminUserIds: [],
|
||||
commandPermissions: {},
|
||||
};
|
||||
|
||||
const normalizePermissionConfig = (config = {}) => ({
|
||||
...DEFAULT_GUILD_PERMISSIONS,
|
||||
...config,
|
||||
adminRoleIds: Array.isArray(config.adminRoleIds) ? config.adminRoleIds : [],
|
||||
adminUserIds: Array.isArray(config.adminUserIds) ? config.adminUserIds : [],
|
||||
commandPermissions: config.commandPermissions ?? {},
|
||||
});
|
||||
|
||||
const memberHasRole = (member, roleIds) =>
|
||||
roleIds.some((roleId) => member.roles?.cache?.has(roleId));
|
||||
|
||||
const getGuildPermissions = async (guildId) => {
|
||||
const dbClient = await connectToDatabase();
|
||||
const db = dbClient.db('discord');
|
||||
const collection = db.collection('guild_permissions');
|
||||
const config = await collection.findOne({ guildId });
|
||||
|
||||
return normalizePermissionConfig(config);
|
||||
};
|
||||
|
||||
const isCommandAllowed = async ({
|
||||
guildId,
|
||||
userId,
|
||||
member,
|
||||
commandName,
|
||||
permissionGroup,
|
||||
}) => {
|
||||
if (!guildId) return true;
|
||||
|
||||
const permissions = await getGuildPermissions(guildId);
|
||||
const isAdmin =
|
||||
permissions.adminUserIds.includes(userId) ||
|
||||
(member && memberHasRole(member, permissions.adminRoleIds));
|
||||
|
||||
if (permissionGroup && isAdmin) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const commandPermissions = permissions.commandPermissions?.[commandName];
|
||||
if (!commandPermissions) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const allowedUserIds = Array.isArray(commandPermissions.allowedUserIds)
|
||||
? commandPermissions.allowedUserIds
|
||||
: [];
|
||||
const allowedRoleIds = Array.isArray(commandPermissions.allowedRoleIds)
|
||||
? commandPermissions.allowedRoleIds
|
||||
: [];
|
||||
|
||||
if (allowedUserIds.length === 0 && allowedRoleIds.length === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (allowedUserIds.includes(userId)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return member ? memberHasRole(member, allowedRoleIds) : false;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
getGuildPermissions,
|
||||
isCommandAllowed,
|
||||
};
|
||||
Reference in New Issue
Block a user