parent
579edfa8fe
commit
f53d329462
@ -443,10 +443,10 @@ class Player extends EventEmitter {
|
|||||||
10_000,
|
10_000,
|
||||||
);
|
);
|
||||||
connection.subscribe(this._player);
|
connection.subscribe(this._player);
|
||||||
await this.channel.guild.me.voice
|
await this.channel.guild.members.me.voice
|
||||||
.setSuppressed(false)
|
.setSuppressed(false)
|
||||||
.catch(async () => {
|
.catch(async () => {
|
||||||
return await this.channel.guild.me.voice
|
return await this.channel.guild.members.me.voice
|
||||||
.setRequestToSpeak(true);
|
.setRequestToSpeak(true);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -156,7 +156,7 @@ class GuildEmojiManager extends BaseGuildEmojiManager {
|
|||||||
throw new Error('EMOJI_MANAGED');
|
throw new Error('EMOJI_MANAGED');
|
||||||
}
|
}
|
||||||
|
|
||||||
const { me } = this.guild;
|
const { me } = this.guild.members;
|
||||||
if (!me) throw new Error('GUILD_UNCACHED_ME');
|
if (!me) throw new Error('GUILD_UNCACHED_ME');
|
||||||
if (!me.permissions.has(Permissions.FLAGS.MANAGE_EMOJIS_AND_STICKERS)) {
|
if (!me.permissions.has(Permissions.FLAGS.MANAGE_EMOJIS_AND_STICKERS)) {
|
||||||
throw new Error('MISSING_MANAGE_EMOJIS_AND_STICKERS_PERMISSION', this.guild);
|
throw new Error('MISSING_MANAGE_EMOJIS_AND_STICKERS_PERMISSION', this.guild);
|
||||||
|
@ -9,6 +9,7 @@ const BaseGuildVoiceChannel = require('../structures/BaseGuildVoiceChannel');
|
|||||||
const { GuildMember } = require('../structures/GuildMember');
|
const { GuildMember } = require('../structures/GuildMember');
|
||||||
const { Role } = require('../structures/Role');
|
const { Role } = require('../structures/Role');
|
||||||
const { Events, Opcodes } = require('../util/Constants');
|
const { Events, Opcodes } = require('../util/Constants');
|
||||||
|
const { PartialTypes } = require('../util/Constants');
|
||||||
const DataResolver = require('../util/DataResolver');
|
const DataResolver = require('../util/DataResolver');
|
||||||
const SnowflakeUtil = require('../util/SnowflakeUtil');
|
const SnowflakeUtil = require('../util/SnowflakeUtil');
|
||||||
|
|
||||||
@ -119,6 +120,20 @@ class GuildMemberManager extends CachedManager {
|
|||||||
return data instanceof Buffer ? (options.fetchWhenExisting === false ? null : this.fetch(userId)) : this._add(data);
|
return data instanceof Buffer ? (options.fetchWhenExisting === false ? null : this.fetch(userId)) : this._add(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The client user as a GuildMember of this guild
|
||||||
|
* @type {?GuildMember}
|
||||||
|
* @readonly
|
||||||
|
*/
|
||||||
|
get me() {
|
||||||
|
return (
|
||||||
|
this.resolve(this.client.user.id) ??
|
||||||
|
(this.client.options.partials.includes(PartialTypes.GUILD_MEMBER)
|
||||||
|
? this._add({ user: { id: this.client.user.id } }, true)
|
||||||
|
: null)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options used to fetch a single member from a guild.
|
* Options used to fetch a single member from a guild.
|
||||||
* @typedef {BaseFetchOptions} FetchMemberOptions
|
* @typedef {BaseFetchOptions} FetchMemberOptions
|
||||||
@ -179,9 +194,9 @@ class GuildMemberManager extends CachedManager {
|
|||||||
if (!options || (!options?.query && !options?.user)) {
|
if (!options || (!options?.query && !options?.user)) {
|
||||||
// Check Permissions
|
// Check Permissions
|
||||||
if (
|
if (
|
||||||
this.guild.me.permissions.has('KICK_MEMBERS') ||
|
this.guild.members.me.permissions.has('KICK_MEMBERS') ||
|
||||||
this.guild.me.permissions.has('BAN_MEMBERS') ||
|
this.guild.members.me.permissions.has('BAN_MEMBERS') ||
|
||||||
this.guild.me.permissions.has('MANAGE_ROLES')
|
this.guild.members.me.permissions.has('MANAGE_ROLES')
|
||||||
) {
|
) {
|
||||||
return this._fetchMany();
|
return this._fetchMany();
|
||||||
} else {
|
} else {
|
||||||
@ -205,6 +220,15 @@ class GuildMemberManager extends CachedManager {
|
|||||||
return this._fetchMany(options);
|
return this._fetchMany(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches the client user as a GuildMember of the guild.
|
||||||
|
* @param {BaseFetchOptions} [options] The options for fetching the member
|
||||||
|
* @returns {Promise<GuildMember>}
|
||||||
|
*/
|
||||||
|
fetchMe(options) {
|
||||||
|
return this.fetch({ ...options, user: this.client.user.id });
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options used for searching guild members.
|
* Options used for searching guild members.
|
||||||
* @typedef {Object} GuildSearchMembersOptions
|
* @typedef {Object} GuildSearchMembersOptions
|
||||||
|
@ -36,6 +36,24 @@ class ThreadMemberManager extends CachedManager {
|
|||||||
return member;
|
return member;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches the client user as a ThreadMember of the thread.
|
||||||
|
* @param {BaseFetchOptions} [options] The options for fetching the member
|
||||||
|
* @returns {Promise<ThreadMember>}
|
||||||
|
*/
|
||||||
|
fetchMe(options) {
|
||||||
|
return this.fetch(this.client.user.id, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The client user as a ThreadMember of this ThreadChannel
|
||||||
|
* @type {?ThreadMember}
|
||||||
|
* @readonly
|
||||||
|
*/
|
||||||
|
get me() {
|
||||||
|
return this.resolve(this.client.user.id);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Data that resolves to give a ThreadMember object. This can be:
|
* Data that resolves to give a ThreadMember object. This can be:
|
||||||
* * A ThreadMember object
|
* * A ThreadMember object
|
||||||
|
@ -75,7 +75,7 @@ class BaseGuildVoiceChannel extends GuildChannel {
|
|||||||
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
|
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
this.guild.me.communicationDisabledUntilTimestamp < Date.now() &&
|
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() &&
|
||||||
permissions.has(Permissions.FLAGS.CONNECT, false)
|
permissions.has(Permissions.FLAGS.CONNECT, false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@ const VoiceStateManager = require('../managers/VoiceStateManager');
|
|||||||
const {
|
const {
|
||||||
ChannelTypes,
|
ChannelTypes,
|
||||||
DefaultMessageNotificationLevels,
|
DefaultMessageNotificationLevels,
|
||||||
PartialTypes,
|
|
||||||
VerificationLevels,
|
VerificationLevels,
|
||||||
ExplicitContentFilterLevels,
|
ExplicitContentFilterLevels,
|
||||||
Status,
|
Status,
|
||||||
@ -41,6 +40,7 @@ const Util = require('../util/Util');
|
|||||||
let deprecationEmittedForSetChannelPositions = false;
|
let deprecationEmittedForSetChannelPositions = false;
|
||||||
let deprecationEmittedForSetRolePositions = false;
|
let deprecationEmittedForSetRolePositions = false;
|
||||||
let deprecationEmittedForDeleted = false;
|
let deprecationEmittedForDeleted = false;
|
||||||
|
let deprecationEmittedForMe = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {WeakSet<Guild>}
|
* @type {WeakSet<Guild>}
|
||||||
@ -608,15 +608,16 @@ class Guild extends AnonymousGuild {
|
|||||||
/**
|
/**
|
||||||
* The client user as a GuildMember of this guild.
|
* The client user as a GuildMember of this guild.
|
||||||
* @type {?GuildMember}
|
* @type {?GuildMember}
|
||||||
|
* @deprecated Use {@link GuildMemberManager#me} instead.
|
||||||
* @readonly
|
* @readonly
|
||||||
*/
|
*/
|
||||||
get me() {
|
get me() {
|
||||||
return (
|
if (!deprecationEmittedForMe) {
|
||||||
this.members.resolve(this.client.user.id) ??
|
process.emitWarning('Guild#me is deprecated. Use Guild#members#me instead.', 'DeprecationWarning');
|
||||||
(this.client.options.partials.includes(PartialTypes.GUILD_MEMBER)
|
deprecationEmittedForMe = true;
|
||||||
? this.members._add({ user: { id: this.client.user.id } }, true)
|
}
|
||||||
: null)
|
|
||||||
);
|
return this.members.me;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -415,7 +415,7 @@ class GuildChannel extends Channel {
|
|||||||
|
|
||||||
// This flag allows managing even if timed out
|
// This flag allows managing even if timed out
|
||||||
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
|
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
|
||||||
if (this.guild.me.communicationDisabledUntilTimestamp > Date.now()) return false;
|
if (this.guild.members.me.communicationDisabledUntilTimestamp > Date.now()) return false;
|
||||||
|
|
||||||
const bitfield = VoiceBasedChannelTypes.includes(this.type)
|
const bitfield = VoiceBasedChannelTypes.includes(this.type)
|
||||||
? Permissions.FLAGS.MANAGE_CHANNELS | Permissions.FLAGS.CONNECT
|
? Permissions.FLAGS.MANAGE_CHANNELS | Permissions.FLAGS.CONNECT
|
||||||
|
@ -56,7 +56,7 @@ class GuildEmoji extends BaseGuildEmoji {
|
|||||||
*/
|
*/
|
||||||
get deletable() {
|
get deletable() {
|
||||||
if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME');
|
if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME');
|
||||||
return !this.managed && this.guild.me.permissions.has(Permissions.FLAGS.MANAGE_EMOJIS_AND_STICKERS);
|
return !this.managed && this.guild.members.me.permissions.has(Permissions.FLAGS.MANAGE_EMOJIS_AND_STICKERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -334,7 +334,7 @@ class GuildMember extends Base {
|
|||||||
if (this.user.id === this.client.user.id) return false;
|
if (this.user.id === this.client.user.id) return false;
|
||||||
if (this.client.user.id === this.guild.ownerId) return true;
|
if (this.client.user.id === this.guild.ownerId) return true;
|
||||||
if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME');
|
if (!this.guild.me) throw new Error('GUILD_UNCACHED_ME');
|
||||||
return this.guild.me.roles.highest.comparePositionTo(this.roles.highest) > 0;
|
return this.guild.members.me.roles.highest.comparePositionTo(this.roles.highest) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -343,7 +343,7 @@ class GuildMember extends Base {
|
|||||||
* @readonly
|
* @readonly
|
||||||
*/
|
*/
|
||||||
get kickable() {
|
get kickable() {
|
||||||
return this.manageable && this.guild.me.permissions.has(Permissions.FLAGS.KICK_MEMBERS);
|
return this.manageable && this.guild.members.me.permissions.has(Permissions.FLAGS.KICK_MEMBERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -352,7 +352,7 @@ class GuildMember extends Base {
|
|||||||
* @readonly
|
* @readonly
|
||||||
*/
|
*/
|
||||||
get bannable() {
|
get bannable() {
|
||||||
return this.manageable && this.guild.me.permissions.has(Permissions.FLAGS.BAN_MEMBERS);
|
return this.manageable && this.guild.members.me.permissions.has(Permissions.FLAGS.BAN_MEMBERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -245,7 +245,7 @@ class Invite extends Base {
|
|||||||
if (!guild.me) throw new Error('GUILD_UNCACHED_ME');
|
if (!guild.me) throw new Error('GUILD_UNCACHED_ME');
|
||||||
return (
|
return (
|
||||||
this.channel.permissionsFor(this.client.user).has(Permissions.FLAGS.MANAGE_CHANNELS, false) ||
|
this.channel.permissionsFor(this.client.user).has(Permissions.FLAGS.MANAGE_CHANNELS, false) ||
|
||||||
guild.me.permissions.has(Permissions.FLAGS.MANAGE_GUILD)
|
guild.members.me.permissions.has(Permissions.FLAGS.MANAGE_GUILD)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -638,7 +638,7 @@ class Message extends Base {
|
|||||||
return Boolean(
|
return Boolean(
|
||||||
this.author.id === this.client.user.id ||
|
this.author.id === this.client.user.id ||
|
||||||
(permissions.has(Permissions.FLAGS.MANAGE_MESSAGES, false) &&
|
(permissions.has(Permissions.FLAGS.MANAGE_MESSAGES, false) &&
|
||||||
this.guild.me.communicationDisabledUntilTimestamp < Date.now()),
|
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1040,7 +1040,7 @@ class Message extends Base {
|
|||||||
this.mentions.everyone ||
|
this.mentions.everyone ||
|
||||||
this.mentions.repliedUser?.id === this.client.user.id ||
|
this.mentions.repliedUser?.id === this.client.user.id ||
|
||||||
this.mentions.users.has(this.client.user.id) ||
|
this.mentions.users.has(this.client.user.id) ||
|
||||||
(this.guildId && this.mentions.roles.some(r => this.guild.me._roles?.includes(r.id)))
|
(this.guildId && this.mentions.roles.some(r => this.guild.members.me._roles?.includes(r.id)))
|
||||||
? 1
|
? 1
|
||||||
: 0,
|
: 0,
|
||||||
},
|
},
|
||||||
|
@ -529,7 +529,7 @@ class ThreadChannel extends Channel {
|
|||||||
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
|
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
this.guild.me.communicationDisabledUntilTimestamp < Date.now() &&
|
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() &&
|
||||||
permissions.has(Permissions.FLAGS.MANAGE_THREADS, false)
|
permissions.has(Permissions.FLAGS.MANAGE_THREADS, false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -561,7 +561,7 @@ class ThreadChannel extends Channel {
|
|||||||
!(this.archived && this.locked && !this.manageable) &&
|
!(this.archived && this.locked && !this.manageable) &&
|
||||||
(this.type !== 'GUILD_PRIVATE_THREAD' || this.joined || this.manageable) &&
|
(this.type !== 'GUILD_PRIVATE_THREAD' || this.joined || this.manageable) &&
|
||||||
permissions.has(Permissions.FLAGS.SEND_MESSAGES_IN_THREADS, false) &&
|
permissions.has(Permissions.FLAGS.SEND_MESSAGES_IN_THREADS, false) &&
|
||||||
this.guild.me.communicationDisabledUntilTimestamp < Date.now()
|
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ class VoiceChannel extends BaseGuildVoiceChannel {
|
|||||||
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
|
if (permissions.has(Permissions.FLAGS.ADMINISTRATOR, false)) return true;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
this.guild.me.communicationDisabledUntilTimestamp < Date.now() && permissions.has(Permissions.FLAGS.SPEAK, false)
|
this.guild.members.me.communicationDisabledUntilTimestamp < Date.now() && permissions.has(Permissions.FLAGS.SPEAK, false)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,10 +220,10 @@ class VoiceState extends Base {
|
|||||||
* @param {boolean} [request=true] Whether or not the client is requesting to become a speaker.
|
* @param {boolean} [request=true] Whether or not the client is requesting to become a speaker.
|
||||||
* @example
|
* @example
|
||||||
* // Making the client request to speak in a stage channel (raise its hand)
|
* // Making the client request to speak in a stage channel (raise its hand)
|
||||||
* guild.me.voice.setRequestToSpeak(true);
|
* guild.members.me.voice.setRequestToSpeak(true);
|
||||||
* @example
|
* @example
|
||||||
* // Making the client cancel a request to speak
|
* // Making the client cancel a request to speak
|
||||||
* guild.me.voice.setRequestToSpeak(false);
|
* guild.members.me.voice.setRequestToSpeak(false);
|
||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async setRequestToSpeak(request = true) {
|
async setRequestToSpeak(request = true) {
|
||||||
@ -246,10 +246,10 @@ class VoiceState extends Base {
|
|||||||
* @param {boolean} [suppressed=true] Whether or not the user should be suppressed.
|
* @param {boolean} [suppressed=true] Whether or not the user should be suppressed.
|
||||||
* @example
|
* @example
|
||||||
* // Making the client a speaker
|
* // Making the client a speaker
|
||||||
* guild.me.voice.setSuppressed(false);
|
* guild.members.me.voice.setSuppressed(false);
|
||||||
* @example
|
* @example
|
||||||
* // Making the client an audience member
|
* // Making the client an audience member
|
||||||
* guild.me.voice.setSuppressed(true);
|
* guild.members.me.voice.setSuppressed(true);
|
||||||
* @example
|
* @example
|
||||||
* // Inviting another user to speak
|
* // Inviting another user to speak
|
||||||
* voiceState.setSuppressed(false);
|
* voiceState.setSuppressed(false);
|
||||||
|
5
typings/index.d.ts
vendored
5
typings/index.d.ts
vendored
@ -1322,6 +1322,7 @@ export class Guild extends AnonymousGuild {
|
|||||||
public maximumPresences: number | null;
|
public maximumPresences: number | null;
|
||||||
public maxStageVideoChannelUsers: number | null;
|
public maxStageVideoChannelUsers: number | null;
|
||||||
public maxVideoChannelUsers: number | null;
|
public maxVideoChannelUsers: number | null;
|
||||||
|
/** @deprecated Use {@link GuildMemberManager.me} instead. */
|
||||||
public readonly me: GuildMember | null;
|
public readonly me: GuildMember | null;
|
||||||
public memberCount: number;
|
public memberCount: number;
|
||||||
public members: GuildMemberManager;
|
public members: GuildMemberManager;
|
||||||
@ -3935,6 +3936,7 @@ export interface BruteforceOptions {
|
|||||||
export class GuildMemberManager extends CachedManager<Snowflake, GuildMember, GuildMemberResolvable> {
|
export class GuildMemberManager extends CachedManager<Snowflake, GuildMember, GuildMemberResolvable> {
|
||||||
private constructor(guild: Guild, iterable?: Iterable<RawGuildMemberData>);
|
private constructor(guild: Guild, iterable?: Iterable<RawGuildMemberData>);
|
||||||
public guild: Guild;
|
public guild: Guild;
|
||||||
|
public readonly me: GuildMember | null;
|
||||||
public add(
|
public add(
|
||||||
user: UserResolvable,
|
user: UserResolvable,
|
||||||
options: AddGuildMemberOptions & { fetchWhenExisting: false },
|
options: AddGuildMemberOptions & { fetchWhenExisting: false },
|
||||||
@ -3954,6 +3956,7 @@ export class GuildMemberManager extends CachedManager<Snowflake, GuildMember, Gu
|
|||||||
time?: number,
|
time?: number,
|
||||||
): Promise<Collection<Snowflake, GuildMember>>;
|
): Promise<Collection<Snowflake, GuildMember>>;
|
||||||
public fetchBruteforce(options?: BruteforceOptions): Promise<Collection<Snowflake, GuildMember>>;
|
public fetchBruteforce(options?: BruteforceOptions): Promise<Collection<Snowflake, GuildMember>>;
|
||||||
|
public fetchMe(options?: BaseFetchOptions): Promise<GuildMember>;
|
||||||
public kick(user: UserResolvable, reason?: string): Promise<GuildMember | User | Snowflake>;
|
public kick(user: UserResolvable, reason?: string): Promise<GuildMember | User | Snowflake>;
|
||||||
public list(options?: GuildListMembersOptions): Promise<Collection<Snowflake, GuildMember>>;
|
public list(options?: GuildListMembersOptions): Promise<Collection<Snowflake, GuildMember>>;
|
||||||
public prune(options: GuildPruneMembersOptions & { dry?: false; count: false }): Promise<null>;
|
public prune(options: GuildPruneMembersOptions & { dry?: false; count: false }): Promise<null>;
|
||||||
@ -4182,10 +4185,12 @@ export class ThreadManager extends CachedManager<Snowflake, ThreadChannel, Threa
|
|||||||
export class ThreadMemberManager extends CachedManager<Snowflake, ThreadMember, ThreadMemberResolvable> {
|
export class ThreadMemberManager extends CachedManager<Snowflake, ThreadMember, ThreadMemberResolvable> {
|
||||||
private constructor(thread: ThreadChannel, iterable?: Iterable<RawThreadMemberData>);
|
private constructor(thread: ThreadChannel, iterable?: Iterable<RawThreadMemberData>);
|
||||||
public thread: ThreadChannel;
|
public thread: ThreadChannel;
|
||||||
|
public readonly me: ThreadMember | null;
|
||||||
public add(member: UserResolvable | '@me', reason?: string): Promise<Snowflake>;
|
public add(member: UserResolvable | '@me', reason?: string): Promise<Snowflake>;
|
||||||
public fetch(member?: UserResolvable, options?: BaseFetchOptions): Promise<ThreadMember>;
|
public fetch(member?: UserResolvable, options?: BaseFetchOptions): Promise<ThreadMember>;
|
||||||
/** @deprecated Use `fetch(member, options)` instead. */
|
/** @deprecated Use `fetch(member, options)` instead. */
|
||||||
public fetch(cache?: boolean): Promise<Collection<Snowflake, ThreadMember>>;
|
public fetch(cache?: boolean): Promise<Collection<Snowflake, ThreadMember>>;
|
||||||
|
public fetchMe(options?: BaseFetchOptions): Promise<ThreadMember>;
|
||||||
public remove(id: Snowflake | '@me', reason?: string): Promise<Snowflake>;
|
public remove(id: Snowflake | '@me', reason?: string): Promise<Snowflake>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user