diff --git a/config.example.js b/config.example.js index 03e846e..75bcbd0 100644 --- a/config.example.js +++ b/config.example.js @@ -1,3 +1,5 @@ +const { PermissionsBitField } = require('discord.js'); + const config = { // Array of Intents your bot needs // https://discord.com/developers/docs/topics/gateway#gateway-intents @@ -16,6 +18,14 @@ const config = { ] }, + // Additional permissions that are considered required when generating + // the bot invite link with /invite + permissionsBase: [ + PermissionsBitField.Flags.ViewChannel, + PermissionsBitField.Flags.SendMessages, + PermissionsBitField.Flags.SendMessagesInThreads + ], + // Permission config permissions: { // Bot Owner, highest permission level (5) diff --git a/src/util.js b/src/util.js index 207e541..0fc1432 100755 --- a/src/util.js +++ b/src/util.js @@ -26,6 +26,7 @@ const { MS_IN_ONE_MINUTE, MS_IN_ONE_SECOND } = require('./constants'); +const { validPermValues } = require('./handlers/permissions'); // Resolve client configuration const modeArg = process.argv.find((arg) => arg.startsWith('mode=')); @@ -143,10 +144,12 @@ const parseSnakeCaseArray = (arr) => { const getBotInviteLink = (client) => { const { commands } = client.container; const uniqueCombinedPermissions = [ ...new Set([].concat(...commands.map(((cmd) => cmd.clientPerms)))) ]; + uniqueCombinedPermissions.push(...client.container.config.permissionsBase); return client.generateInvite({ scopes: [ OAuth2Scopes.ApplicationsCommands, OAuth2Scopes.Bot ], - permissions: uniqueCombinedPermissions.map((rawPerm) => PermissionFlagsBits[rawPerm]) + permissions: uniqueCombinedPermissions + .map((rawPerm) => PermissionFlagsBits[rawPerm] ?? validPermValues.find((e) => e === rawPerm)) }); };