Skip to content

Commit

Permalink
feat(GuildMember): add flags
Browse files Browse the repository at this point in the history
  • Loading branch information
almeidx committed Jan 23, 2023
1 parent 8b70f49 commit a8f2e94
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/discord.js/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ exports.Colors = require('./util/Colors');
exports.DataResolver = require('./util/DataResolver');
exports.Events = require('./util/Events');
exports.Formatters = require('./util/Formatters');
exports.GuildMemberFlagsBitField = require('./util/GuildMemberFlagsBitField').GuildMemberFlagsBitField;
exports.IntentsBitField = require('./util/IntentsBitField');
exports.LimitedCollection = require('./util/LimitedCollection');
exports.MessageFlagsBitField = require('./util/MessageFlagsBitField');
Expand Down
6 changes: 6 additions & 0 deletions packages/discord.js/src/managers/GuildMemberManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const BaseGuildVoiceChannel = require('../structures/BaseGuildVoiceChannel');
const { GuildMember } = require('../structures/GuildMember');
const { Role } = require('../structures/Role');
const Events = require('../util/Events');
const { GuildMemberFlagsBitField } = require('../util/GuildMemberFlagsBitField.js');
const Partials = require('../util/Partials');

/**
Expand Down Expand Up @@ -279,6 +280,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
* @property {string} [reason] Reason for editing this user
*/

Expand Down Expand Up @@ -314,6 +316,10 @@ class GuildMemberManager extends CachedManager {
: options.communicationDisabledUntil;
}

if (typeof options.flags !== 'undefined') {
options.flags = GuildMemberFlagsBitField.resolve(options.flags);
}

let endpoint;
if (id === this.client.user.id) {
const keys = Object.keys(options);
Expand Down
21 changes: 21 additions & 0 deletions packages/discord.js/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 { DiscordjsError, ErrorCodes } = require('../errors');
const GuildMemberRoleManager = require('../managers/GuildMemberRoleManager');
const { GuildMemberFlagsBitField } = require('../util/GuildMemberFlagsBitField');
const PermissionsBitField = require('../util/PermissionsBitField');

/**
Expand Down Expand Up @@ -93,6 +94,16 @@ 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<GuildMemberFlagsBitField>}
*/
this.flags = new GuildMemberFlagsBitField(data.flags).freeze();
} else {
this.flags ??= new GuildMemberFlagsBitField().freeze();
}
}

_clone() {
Expand Down Expand Up @@ -314,6 +325,16 @@ class GuildMember extends Base {
return this.guild.members.edit(this, options);
}

/**
* 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 });
}

/**
* Sets the nickname for this member.
* @param {?string} nick The nickname for the guild member, or `null` if you want to reset their nickname
Expand Down
41 changes: 41 additions & 0 deletions packages/discord.js/src/util/GuildMemberFlagsBitField.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
'use strict';

const { GuildMemberFlags } = require('discord-api-types/v10');
const BitField = require('./BitField');

/**
* Data structure that makes it easy to interact with a {@link GuildMember#flags} bitfield.
* @extends {BitField}
*/
class GuildMemberFlagsBitField extends BitField {
/**
* Numeric guild guild member flags.
* @type {GuildMemberFlags}
* @memberof GuildMemberFlagsBitField
*/
static Flags = GuildMemberFlags;
}

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

/**
* Bitfield of the packed bits
* @type {number}
* @name GuildMemberFlagsBitField#bitfield
*/

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

exports.GuildMemberFlagsBitField = GuildMemberFlagsBitField;
15 changes: 15 additions & 0 deletions packages/discord.js/typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1472,6 +1472,18 @@ export class GuildEmoji extends BaseGuildEmoji {
public setName(name: string, reason?: string): Promise<GuildEmoji>;
}

// TODO(@almeidx): discord-api-types
export type GuildMemberFlagsString = 'DidRejoin';

export type GuildMemberFlagsResolvable = BitFieldResolvable<GuildMemberFlagsString, number>;

export class GuildMemberFlagsBitField extends BitField<GuildMemberFlagsString> {
// TODO(@almeidx): discord-api-types
public static Flags: any;
// TODO(@almeidx): discord-api-types
public static resolve(bit?: BitFieldResolvable<GuildMemberFlagsString, any>): number;
}

export class GuildMember extends PartialTextBasedChannel(Base) {
private constructor(client: Client<true>, data: RawGuildMemberData, guild: Guild);
public avatar: string | null;
Expand All @@ -1485,6 +1497,7 @@ export class GuildMember extends PartialTextBasedChannel(Base) {
public pending: boolean;
public get communicationDisabledUntil(): Date | null;
public communicationDisabledUntilTimestamp: number | null;
public flags: Readonly<GuildMemberFlagsBitField>;
public get joinedAt(): Date | null;
public joinedTimestamp: number | null;
public get kickable(): boolean;
Expand Down Expand Up @@ -1514,6 +1527,7 @@ export class GuildMember extends PartialTextBasedChannel(Base) {
};
public kick(reason?: string): Promise<GuildMember>;
public permissionsIn(channel: GuildChannelResolvable): Readonly<PermissionsBitField>;
public setFlags(flags: GuildMemberFlagsResolvable, reason?: string): Promise<GuildMember>;
public setNickname(nickname: string | null, reason?: string): Promise<GuildMember>;
public toJSON(): unknown;
public toString(): UserMention;
Expand Down Expand Up @@ -5476,6 +5490,7 @@ export interface GuildMemberEditOptions {
deaf?: boolean;
channel?: GuildVoiceChannelResolvable | null;
communicationDisabledUntil?: DateResolvable | null;
flags?: GuildMemberFlagsResolvable;
reason?: string;
}

Expand Down
24 changes: 24 additions & 0 deletions test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Client } from './packages/discord.js/src/index.js';

const client = new Client({
intents: ['Guilds', 'GuildBans'],
});

client.on('ready', async () => {
console.info('ready');

console.log('PRE CACHED? ', client.users.cache.has('456199387295645697'));

const guild = client.guilds.cache.get('505181778718228480');
const logs = await guild.fetchAuditLogs({ limit: 1 });

console.log(logs);
});

client.on('raw', console.debug);

client.on('guildAuditLogEntryCreate', async (auditLogEntry, guild) => {
console.log('Guild: %d:', guild.id, auditLogEntry);
});

await client.login();

0 comments on commit a8f2e94

Please sign in to comment.