mirror of
https://github.com/discordjs/discord.js.git
synced 2026-05-30 07:30:09 +00:00
143 lines
4.8 KiB
JavaScript
143 lines
4.8 KiB
JavaScript
'use strict';
|
|
|
|
const ApplicationCommandManager = require('./ApplicationCommandManager');
|
|
const { TypeError } = require('../errors');
|
|
const Collection = require('../util/Collection');
|
|
const { ApplicationCommandPermissionTypes } = require('../util/Constants');
|
|
|
|
/**
|
|
* An extension for guild-specific application commands.
|
|
* @extends {ApplicationCommandManager}
|
|
*/
|
|
class GuildApplicationCommandManager extends ApplicationCommandManager {
|
|
constructor(guild, iterable) {
|
|
super(guild.client, iterable);
|
|
|
|
/**
|
|
* The guild that this manager belongs to
|
|
* @type {Guild}
|
|
*/
|
|
this.guild = guild;
|
|
}
|
|
|
|
/**
|
|
* Fetches the permissions for one or multiple commands.
|
|
* @param {ApplicationCommandResolvable} [command] The command to get the permissions from
|
|
* @returns {Promise<ApplicationCommandPermissions[]|Collection<Snowflake, ApplicationCommandPermissions[]>>}
|
|
* @example
|
|
* // Fetch permissions for one command
|
|
* guild.commands.fetchPermissions('123456789012345678')
|
|
* .then(perms => console.log(`Fetched permissions for ${perms.length} users`))
|
|
* .catch(console.error);
|
|
* @example
|
|
* // Fetch permissions for all commands
|
|
* client.application.commands.fetchPermissions()
|
|
* .then(perms => console.log(`Fetched permissions for ${perms.size} commands`))
|
|
* .catch(console.error);
|
|
*/
|
|
async fetchPermissions(command) {
|
|
if (command) {
|
|
const id = this.resolveID(command);
|
|
if (!id) throw new TypeError('INVALID_TYPE', 'command', 'ApplicationCommandResolvable');
|
|
|
|
const data = await this.commandPath(id).permissions.get();
|
|
return data.permissions.map(perm => this.constructor.transformPermissions(perm, true));
|
|
}
|
|
|
|
const data = await this.commandPath.permissions.get();
|
|
return data.reduce(
|
|
(coll, perm) =>
|
|
coll.set(
|
|
perm.id,
|
|
perm.permissions.map(p => this.constructor.transformPermissions(p, true)),
|
|
),
|
|
new Collection(),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Data used for overwriting the permissions for all application commands in a guild.
|
|
* @typedef {Object} GuildApplicationCommandPermissionData
|
|
* @prop {Snowflake} command The ID of the command
|
|
* @prop {ApplicationCommandPermissionData[]} permissions The permissions for this command
|
|
*/
|
|
|
|
/**
|
|
* Sets the permissions for a command.
|
|
* @param {ApplicationCommandResolvable|GuildApplicationCommandPermissionData[]} command The command to edit the
|
|
* permissions for, or an array of guild application command permissions to set the permissions of all commands
|
|
* @param {ApplicationCommandPermissionData[]} permissions The new permissions for the command
|
|
* @returns {Promise<ApplicationCommandPermissions[]|Collection<Snowflake, ApplicationCommandPermissions[]>>}
|
|
* @example
|
|
* // Set the permissions for one command
|
|
* client.application.commands.setPermissions('123456789012345678', [
|
|
* {
|
|
* id: '876543210987654321',
|
|
* type: 'USER',
|
|
* permission: false,
|
|
* },
|
|
* ])
|
|
* .then(console.log)
|
|
* .catch(console.error);
|
|
* @example
|
|
* // Set the permissions for all commands
|
|
* guild.commands.setPermissions([
|
|
* {
|
|
* id: '123456789012345678',
|
|
* permissions: [{
|
|
* id: '876543210987654321',
|
|
* type: 'USER',
|
|
* permission: false,
|
|
* }],
|
|
* },
|
|
* ])
|
|
* .then(console.log)
|
|
* .catch(console.error);
|
|
*/
|
|
async setPermissions(command, permissions) {
|
|
const id = this.resolveID(command);
|
|
|
|
if (id) {
|
|
const data = await this.commandPath(id).permissions.put({
|
|
data: { permissions: permissions.map(perm => this.constructor.transformPermissions(perm)) },
|
|
});
|
|
return data.permissions.map(perm => this.constructor.transformPermissions(perm, true));
|
|
}
|
|
|
|
const data = await this.commandPath.permissions.put({
|
|
data: command.map(perm => ({
|
|
id: perm.id,
|
|
permissions: perm.permissions.map(p => this.constructor.transformPermissions(p)),
|
|
})),
|
|
});
|
|
return data.reduce(
|
|
(coll, perm) =>
|
|
coll.set(
|
|
perm.id,
|
|
perm.permissions.map(p => this.constructor.transformPermissions(p, true)),
|
|
),
|
|
new Collection(),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Transforms an {@link ApplicationCommandPermissionData} object into something that can be used with the API.
|
|
* @param {ApplicationCommandPermissionData} permissions The permissions to transform
|
|
* @param {boolean} [received] Whether these permissions have been received from Discord
|
|
* @returns {Object}
|
|
* @private
|
|
*/
|
|
static transformPermissions(permissions, received) {
|
|
return {
|
|
id: permissions.id,
|
|
permission: permissions.permission,
|
|
type:
|
|
typeof permissions.type === 'number' && !received
|
|
? permissions.type
|
|
: ApplicationCommandPermissionTypes[permissions.type],
|
|
};
|
|
}
|
|
}
|
|
|
|
module.exports = GuildApplicationCommandManager;
|