diff --git a/src/client/Client.js b/src/client/Client.js index 907f3e033..47616d256 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -343,6 +343,29 @@ class Client extends EventEmitter { return this.rest.methods.getMyApplication(); } + /** + * Generate an invite link for your bot + * @param {Array|number} [permissions] An array of permissions to request + * @returns {Promise} The invite link + * @example + * client.generateInvite(['SEND_MESSAGES', 'MANAGE_GUILD', 'MENTION_EVERYONE']) + * .then(link => { + * console.log(link); + * }); + */ + generateInvite(permissions) { + if (permissions) { + if (permissions instanceof Array) { + permissions = this.resolver.resolvePermissions(permissions); + } + } else { + permissions = 0; + } + return this.fetchApplication().then(application => + `https://discordapp.com/oauth2/authorize?client_id=${application.id}&permissions=${permissions}&scope=bot` + ); + } + /** * Sets a timeout that will be automatically cancelled if the client is destroyed. * @param {Function} fn Function to execute diff --git a/src/client/ClientDataResolver.js b/src/client/ClientDataResolver.js index b99421d8f..9f550cc25 100644 --- a/src/client/ClientDataResolver.js +++ b/src/client/ClientDataResolver.js @@ -190,6 +190,19 @@ class ClientDataResolver { return permission; } + /** + * Turn an array of permissions into a valid discord permission bitfield + * @param {Array} permissions An array of permissions as strings or permissions numbers (see resolvePermission) + * @returns {number} + */ + resolvePermissions(permissions) { + let bitfield = 0; + for (const permission of permissions) { + bitfield |= this.resolvePermission(permission); + } + return bitfield; + } + /** * Data that can be resolved to give a string. This can be: * * A string