Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(GuildMember): v13 add flags #9098

Merged
merged 3 commits into from
Feb 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ exports.Constants = require('./util/Constants');
exports.DataResolver = require('./util/DataResolver');
exports.DiscordAPIError = require('./rest/DiscordAPIError');
exports.Formatters = require('./util/Formatters');
exports.GuildMemberFlags = require('./util/GuildMemberFlags');
exports.HTTPError = require('./rest/HTTPError');
exports.Intents = require('./util/Intents');
exports.LimitedCollection = require('./util/LimitedCollection');
Expand Down
4 changes: 4 additions & 0 deletions src/managers/GuildMemberManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const { GuildMember } = require('../structures/GuildMember');
const { Role } = require('../structures/Role');
const { Events, Opcodes } = require('../util/Constants');
const { PartialTypes } = require('../util/Constants');
const GuildMemberFlags = require('../util/GuildMemberFlags');
const SnowflakeUtil = require('../util/SnowflakeUtil');

/**
Expand Down Expand Up @@ -260,6 +261,7 @@ class GuildMemberManager extends CachedManager {
* (if they are connected to voice), or `null` if you want to disconnect them from voice
* @property {DateResolvable|null} [communicationDisabledUntil] The date or timestamp
* for the member's communication to be disabled until. Provide `null` to enable communication again.
* @property {GuildMemberFlagsResolvable} [flags] The flags to set for the member
*/

/**
Expand Down Expand Up @@ -292,6 +294,8 @@ class GuildMemberManager extends CachedManager {
_data.communication_disabled_until =
_data.communicationDisabledUntil && new Date(_data.communicationDisabledUntil).toISOString();

_data.flags = _data.flags && GuildMemberFlags.resolve(_data.flags);

let endpoint = this.client.api.guilds(this.guild.id);
if (id === this.client.user.id) {
const keys = Object.keys(data);
Expand Down
21 changes: 21 additions & 0 deletions src/structures/GuildMember.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const VoiceState = require('./VoiceState');
const TextBasedChannel = require('./interfaces/TextBasedChannel');
const { Error } = require('../errors');
const GuildMemberRoleManager = require('../managers/GuildMemberRoleManager');
const GuildMemberFlags = require('../util/GuildMemberFlags');
const Permissions = require('../util/Permissions');

/**
Expand Down Expand Up @@ -95,6 +96,15 @@ class GuildMember extends Base {
this.communicationDisabledUntilTimestamp =
data.communication_disabled_until && Date.parse(data.communication_disabled_until);
}
if ('flags' in data) {
/**
* The flags of this member
* @type {Readonly<GuildMemberFlags>}
*/
this.flags = new GuildMemberFlags(data.flags).freeze();
} else {
this.flags ??= new GuildMemberFlags().freeze();
}
}

_clone() {
Expand Down Expand Up @@ -347,6 +357,16 @@ class GuildMember extends Base {
return this.edit({ nick }, reason);
}

/**
* Sets the flags for this member.
* @param {GuildMemberFlagsResolvable} flags The flags to set
* @param {string} [reason] Reason for setting the flags
* @returns {Promise<GuildMember>}
*/
setFlags(flags, reason) {
return this.edit({ flags, reason });
}

/**
* Creates a DM channel between the client and this member.
* @param {boolean} [force=false] Whether to skip the cache check and request the API
Expand Down Expand Up @@ -446,6 +466,7 @@ class GuildMember extends Base {
this.avatar === member.avatar &&
this.pending === member.pending &&
this.communicationDisabledUntilTimestamp === member.communicationDisabledUntilTimestamp &&
this.flags.equals(member.flags) &&
(this._roles === member._roles ||
(this._roles.length === member._roles.length && this._roles.every((role, i) => role === member._roles[i])))
);
Expand Down
43 changes: 43 additions & 0 deletions src/util/GuildMemberFlags.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
'use strict';

const BitField = require('./BitField');

/**
* Data structure that makes it easy to interact with an {@link GuildMember#flags} bitfield.
* @extends {BitField}
*/
class GuildMemberFlags extends BitField {}

/**
* @name GuildMemberFlags
* @kind constructor
* @memberof GuildMemberFlags
* @param {BitFieldResolvable} [bits=0] Bit(s) to read from
*/

/**
* Numeric guild member flags. All available properties:
* * `DID_REJOIN`
* * `COMPLETED_ONBOARDING`
* * `BYPASSES_VERIFICATION`
* * `STARTED_ONBOARDING`
* @type {Object}
* @see {@link https://discord.com/developers/docs/resources/guild#guild-member-object-guild-member-flags}
*/
GuildMemberFlags.FLAGS = {
DID_REJOIN: 1 << 0,
COMPLETED_ONBOARDING: 1 << 1,
BYPASSES_VERIFICATION: 1 << 2,
STARTED_ONBOARDING: 1 << 3,
};

/**
* Data that can be resolved to give a guild member flag bitfield. This can be:
* * A string (see {@link GuildMemberFlags.FLAGS})
* * A guild member flag
* * An instance of GuildMemberFlags
* * An Array of GuildMemberFlagsResolvable
* @typedef {string|number|GuildMemberFlags|GuildMemberFlagsResolvable[]} GuildMemberFlagsResolvable
*/

module.exports = GuildMemberFlags;
12 changes: 12 additions & 0 deletions typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1176,6 +1176,7 @@ export class GuildMember extends PartialTextBasedChannel(Base) {
public readonly displayColor: number;
public readonly displayHexColor: HexColorString;
public readonly displayName: string;
public flags: Readonly<GuildMemberFlags>;
public guild: Guild;
public readonly id: Snowflake;
public pending: boolean;
Expand Down Expand Up @@ -1211,11 +1212,17 @@ export class GuildMember extends PartialTextBasedChannel(Base) {
public kick(reason?: string): Promise<GuildMember>;
public permissionsIn(channel: GuildChannelResolvable): Readonly<Permissions>;
public setNickname(nickname: string | null, reason?: string): Promise<GuildMember>;
public setFlags(flags: GuildMemberFlagsResolvable): Promise<GuildMember>;
public toJSON(): unknown;
public toString(): MemberMention;
public valueOf(): string;
}

export class GuildMemberFlags extends BitField<GuildMemberFlagsString> {
public static FLAGS: Record<GuildMemberFlagsString, number>;
public static resolve(bit?: BitFieldResolvable<GuildMemberFlagsString, number>): number;
}

export class GuildPreview extends Base {
private constructor(client: Client, data: RawGuildPreviewData);
public approximateMemberCount: number;
Expand Down Expand Up @@ -5341,8 +5348,13 @@ export interface GuildMemberEditData {
deaf?: boolean;
channel?: GuildVoiceChannelResolvable | null;
communicationDisabledUntil?: DateResolvable | null;
flags?: GuildMemberFlagsResolvable;
}

export type GuildMemberFlagsString = 'DID_REJOIN' | 'COMPLETED_ONBOARDING'| 'BYPASSES_VERIFICATION'| 'STARTED_ONBOARDING';

export type GuildMemberFlagsResolvable = BitFieldResolvable<GuildMemberFlagsString, number>;

export type GuildMemberResolvable = GuildMember | UserResolvable;

export type GuildResolvable = Guild | NonThreadGuildBasedChannel | GuildMember | GuildEmoji | Invite | Role | Snowflake;
Expand Down