74 lines
2.0 KiB
JavaScript
74 lines
2.0 KiB
JavaScript
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,
|
|
};
|