fix(MessageMentions): ignoreRepliedUser option in has() (#8202)

This commit is contained in:
Almeida
2022-07-29 09:47:05 +01:00
committed by GitHub
parent 33113614e0
commit b4e2c0c4d5
2 changed files with 40 additions and 7 deletions

View File

@@ -133,6 +133,13 @@ class MessageMentions {
*/ */
this._channels = null; this._channels = null;
/**
* Cached users for {@link MessageMentions#parsedUsers}
* @type {?Collection<Snowflake, User>}
* @private
*/
this._parsedUsers = null;
/** /**
* Crossposted channel data. * Crossposted channel data.
* @typedef {Object} CrosspostedChannel * @typedef {Object} CrosspostedChannel
@@ -208,6 +215,23 @@ class MessageMentions {
return this._channels; return this._channels;
} }
/**
* Any user mentions that were included in the message content
* <info>Order as they appear first in the message content</info>
* @type {Collection<Snowflake, User>}
* @readonly
*/
get parsedUsers() {
if (this._parsedUsers) return this._parsedUsers;
this._parsedUsers = new Collection();
let matches;
while ((matches = this.constructor.UsersPattern.exec(this._content)) !== null) {
const user = this.client.users.cache.get(matches[1]);
if (user) this._parsedUsers.set(user.id, user);
}
return this._parsedUsers;
}
/** /**
* Options used to check for a mention. * Options used to check for a mention.
* @typedef {Object} MessageMentionsHasOptions * @typedef {Object} MessageMentionsHasOptions
@@ -227,16 +251,23 @@ class MessageMentions {
*/ */
has(data, { ignoreDirect = false, ignoreRoles = false, ignoreRepliedUser = false, ignoreEveryone = false } = {}) { has(data, { ignoreDirect = false, ignoreRoles = false, ignoreRepliedUser = false, ignoreEveryone = false } = {}) {
const user = this.client.users.resolve(data); const user = this.client.users.resolve(data);
const role = this.guild?.roles.resolve(data);
const channel = this.client.channels.resolve(data);
if (!ignoreRepliedUser && this.users.has(this.repliedUser?.id) && this.repliedUser?.id === user?.id) return true; if (!ignoreEveryone && user && this.everyone) return true;
const userWasRepliedTo = user && this.repliedUser?.id === user.id;
if (!ignoreRepliedUser && userWasRepliedTo && this.users.has(user.id)) return true;
if (!ignoreDirect) { if (!ignoreDirect) {
if (this.users.has(user?.id)) return true; if (user && (!ignoreRepliedUser || this.parsedUsers.has(user.id)) && this.users.has(user.id)) return true;
if (this.roles.has(role?.id)) return true;
if (this.channels.has(channel?.id)) return true; const role = this.guild?.roles.resolve(data);
if (role && this.roles.has(role.id)) return true;
const channel = this.client.channels.resolve(data);
if (channel && this.channels.has(channel.id)) return true;
} }
if (user && !ignoreEveryone && this.everyone) return true;
if (!ignoreRoles) { if (!ignoreRoles) {
const member = this.guild?.members.resolve(data); const member = this.guild?.members.resolve(data);
if (member) { if (member) {

View File

@@ -1865,6 +1865,7 @@ export class MessageMentions {
private _channels: Collection<Snowflake, Channel> | null; private _channels: Collection<Snowflake, Channel> | null;
private readonly _content: string; private readonly _content: string;
private _members: Collection<Snowflake, GuildMember> | null; private _members: Collection<Snowflake, GuildMember> | null;
private _parsedUsers: Collection<Snowflake, User> | null;
public get channels(): Collection<Snowflake, Channel>; public get channels(): Collection<Snowflake, Channel>;
public readonly client: Client; public readonly client: Client;
@@ -1872,6 +1873,7 @@ export class MessageMentions {
public readonly guild: Guild; public readonly guild: Guild;
public has(data: UserResolvable | RoleResolvable | ChannelResolvable, options?: MessageMentionsHasOptions): boolean; public has(data: UserResolvable | RoleResolvable | ChannelResolvable, options?: MessageMentionsHasOptions): boolean;
public get members(): Collection<Snowflake, GuildMember> | null; public get members(): Collection<Snowflake, GuildMember> | null;
public get parsedUsers(): Collection<Snowflake, User>;
public repliedUser: User | null; public repliedUser: User | null;
public roles: Collection<Snowflake, Role>; public roles: Collection<Snowflake, Role>;
public users: Collection<Snowflake, User>; public users: Collection<Snowflake, User>;