mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-19 13:03:31 +01:00
refactor(PermissionOverwrites)!: cache-independent resolve (#10528)
BREAKING CHANGE: `PermissionOverwrites#resolve`'s `overwrite` arg now requires `type` if the `id` is a Snowflake
This commit is contained in:
@@ -129,6 +129,9 @@
|
|||||||
* @property {'BulkBanUsersOptionEmpty'} BulkBanUsersOptionEmpty
|
* @property {'BulkBanUsersOptionEmpty'} BulkBanUsersOptionEmpty
|
||||||
|
|
||||||
* @property {'PollAlreadyExpired'} PollAlreadyExpired
|
* @property {'PollAlreadyExpired'} PollAlreadyExpired
|
||||||
|
|
||||||
|
* @property {'PermissionOverwritesTypeMandatory'} PermissionOverwritesTypeMandatory
|
||||||
|
* @property {'PermissionOverwritesTypeMismatch'} PermissionOverwritesTypeMismatch
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const keys = [
|
const keys = [
|
||||||
@@ -258,6 +261,9 @@ const keys = [
|
|||||||
'BulkBanUsersOptionEmpty',
|
'BulkBanUsersOptionEmpty',
|
||||||
|
|
||||||
'PollAlreadyExpired',
|
'PollAlreadyExpired',
|
||||||
|
|
||||||
|
'PermissionOverwritesTypeMandatory',
|
||||||
|
'PermissionOverwritesTypeMismatch',
|
||||||
];
|
];
|
||||||
|
|
||||||
// JSDoc for IntelliSense purposes
|
// JSDoc for IntelliSense purposes
|
||||||
|
|||||||
@@ -144,6 +144,11 @@ const Messages = {
|
|||||||
[DjsErrorCodes.BulkBanUsersOptionEmpty]: 'Option "users" array or collection is empty',
|
[DjsErrorCodes.BulkBanUsersOptionEmpty]: 'Option "users" array or collection is empty',
|
||||||
|
|
||||||
[DjsErrorCodes.PollAlreadyExpired]: 'This poll has already expired.',
|
[DjsErrorCodes.PollAlreadyExpired]: 'This poll has already expired.',
|
||||||
|
|
||||||
|
[DjsErrorCodes.PermissionOverwritesTypeMandatory]: '"overwrite.type" is mandatory if "overwrite.id" is a Snowflake',
|
||||||
|
[DjsErrorCodes.PermissionOverwritesTypeMismatch]: expected =>
|
||||||
|
`"overwrite.id" is a ${expected.toLowerCase()} object, ` +
|
||||||
|
`but "overwrite.type" is defined and not equal to OverwriteType.${expected}`,
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = Messages;
|
module.exports = Messages;
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ class PermissionOverwrites extends Base {
|
|||||||
* @property {GuildMemberResolvable|RoleResolvable} id Member or role this overwrite is for
|
* @property {GuildMemberResolvable|RoleResolvable} id Member or role this overwrite is for
|
||||||
* @property {PermissionResolvable} [allow] The permissions to allow
|
* @property {PermissionResolvable} [allow] The permissions to allow
|
||||||
* @property {PermissionResolvable} [deny] The permissions to deny
|
* @property {PermissionResolvable} [deny] The permissions to deny
|
||||||
* @property {OverwriteType} [type] The type of this OverwriteData
|
* @property {OverwriteType} [type] The type of this OverwriteData (mandatory if `id` is a Snowflake)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -171,21 +171,31 @@ class PermissionOverwrites extends Base {
|
|||||||
*/
|
*/
|
||||||
static resolve(overwrite, guild) {
|
static resolve(overwrite, guild) {
|
||||||
if (overwrite instanceof this) return overwrite.toJSON();
|
if (overwrite instanceof this) return overwrite.toJSON();
|
||||||
if (typeof overwrite.id === 'string' && overwrite.type in OverwriteType) {
|
|
||||||
return {
|
const id = guild.roles.resolveId(overwrite.id) ?? guild.client.users.resolveId(overwrite.id);
|
||||||
id: overwrite.id,
|
if (!id) {
|
||||||
type: overwrite.type,
|
throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'overwrite.id', 'GuildMemberResolvable or RoleResolvable');
|
||||||
allow: PermissionsBitField.resolve(overwrite.allow ?? PermissionsBitField.DefaultBit).toString(),
|
|
||||||
deny: PermissionsBitField.resolve(overwrite.deny ?? PermissionsBitField.DefaultBit).toString(),
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const userOrRole = guild.roles.cache.get(overwrite.id) ?? guild.client.users.cache.get(overwrite.id);
|
if (overwrite.type !== undefined && (typeof overwrite.type !== 'number' || !(overwrite.type in OverwriteType))) {
|
||||||
if (!userOrRole) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'parameter', 'User nor a Role');
|
throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'overwrite.type', 'OverwriteType', true);
|
||||||
const type = userOrRole instanceof Role ? OverwriteType.Role : OverwriteType.Member;
|
}
|
||||||
|
|
||||||
|
let type;
|
||||||
|
if (typeof overwrite.id === 'string') {
|
||||||
|
if (overwrite.type === undefined) {
|
||||||
|
throw new DiscordjsTypeError(ErrorCodes.PermissionOverwritesTypeMandatory);
|
||||||
|
}
|
||||||
|
type = overwrite.type;
|
||||||
|
} else {
|
||||||
|
type = overwrite.id instanceof Role ? OverwriteType.Role : OverwriteType.Member;
|
||||||
|
if (overwrite.type !== undefined && type !== overwrite.type) {
|
||||||
|
throw new DiscordjsTypeError(ErrorCodes.PermissionOverwritesTypeMismatch, OverwriteType[type]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: userOrRole.id,
|
id,
|
||||||
type,
|
type,
|
||||||
allow: PermissionsBitField.resolve(overwrite.allow ?? PermissionsBitField.DefaultBit).toString(),
|
allow: PermissionsBitField.resolve(overwrite.allow ?? PermissionsBitField.DefaultBit).toString(),
|
||||||
deny: PermissionsBitField.resolve(overwrite.deny ?? PermissionsBitField.DefaultBit).toString(),
|
deny: PermissionsBitField.resolve(overwrite.deny ?? PermissionsBitField.DefaultBit).toString(),
|
||||||
|
|||||||
12
packages/discord.js/typings/index.d.ts
vendored
12
packages/discord.js/typings/index.d.ts
vendored
@@ -6519,13 +6519,23 @@ export interface MultipleShardSpawnOptions {
|
|||||||
timeout?: number;
|
timeout?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface OverwriteData {
|
export interface BaseOverwriteData {
|
||||||
allow?: PermissionResolvable;
|
allow?: PermissionResolvable;
|
||||||
deny?: PermissionResolvable;
|
deny?: PermissionResolvable;
|
||||||
id: GuildMemberResolvable | RoleResolvable;
|
id: GuildMemberResolvable | RoleResolvable;
|
||||||
type?: OverwriteType;
|
type?: OverwriteType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface OverwriteDataWithMandatoryType extends BaseOverwriteData {
|
||||||
|
type: OverwriteType;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface OverwriteDataWithOptionalType extends BaseOverwriteData {
|
||||||
|
id: Exclude<GuildMemberResolvable | RoleResolvable, Snowflake>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type OverwriteData = OverwriteDataWithMandatoryType | OverwriteDataWithOptionalType;
|
||||||
|
|
||||||
export type OverwriteResolvable = PermissionOverwrites | OverwriteData;
|
export type OverwriteResolvable = PermissionOverwrites | OverwriteData;
|
||||||
|
|
||||||
export type PermissionFlags = Record<keyof typeof PermissionFlagsBits, bigint>;
|
export type PermissionFlags = Record<keyof typeof PermissionFlagsBits, bigint>;
|
||||||
|
|||||||
Reference in New Issue
Block a user