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

refactor!: return void on bans/kick/addRole/removeRole methods #10714

Merged
merged 5 commits into from
Jan 24, 2025
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 5 additions & 19 deletions packages/discord.js/src/managers/GuildBanManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ const { Routes } = require('discord-api-types/v10');
const { CachedManager } = require('./CachedManager.js');
const { DiscordjsTypeError, DiscordjsError, ErrorCodes } = require('../errors/index.js');
const { GuildBan } = require('../structures/GuildBan.js');
const { GuildMember } = require('../structures/GuildMember.js');

/**
* Manages API methods for guild bans and stores their cache.
Expand Down Expand Up @@ -136,15 +135,11 @@ class GuildBanManager extends CachedManager {
/**
* Bans a user from the guild.
* @param {UserResolvable} user The user to ban
* @param {BanOptions} [options] Options for the ban
* @returns {Promise<GuildMember|User|Snowflake>} Result object will be resolved as specifically as possible.
* If the GuildMember cannot be resolved, the User will instead be attempted to be resolved. If that also cannot
* be resolved, the user id will be the result.
* @param {BanOptions} [options={}] Options for the ban
* @returns {Promise<void>}
* @example
* // Ban a user by id (or with a user/guild member object)
* guild.bans.create('84484653687267328')
* .then(banInfo => console.log(`Banned ${banInfo.user?.tag ?? banInfo.tag ?? banInfo}`))
* .catch(console.error);
* await guild.bans.create('84484653687267328');
*/
async create(user, options = {}) {
if (typeof options !== 'object') throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'options', 'object', true);
Expand All @@ -157,30 +152,21 @@ class GuildBanManager extends CachedManager {
},
reason: options.reason,
});
if (user instanceof GuildMember) return user;
const _user = this.client.users.cache.get(id);
if (_user) {
return this.guild.members.resolve(_user) ?? _user;
}
return id;
}

/**
* Unbans a user from the guild.
* @param {UserResolvable} user The user to unban
* @param {string} [reason] Reason for unbanning user
* @returns {Promise<?User>}
* @returns {Promise<void>}
* @example
* // Unban a user by id (or with a user/guild member object)
* guild.bans.remove('84484653687267328')
* .then(user => console.log(`Unbanned ${user.username} from ${guild.name}`))
* .catch(console.error);
* await guild.bans.remove('84484653687267328');
*/
async remove(user, reason) {
const id = this.client.users.resolveId(user);
if (!id) throw new DiscordjsError(ErrorCodes.BanResolveId);
await this.client.rest.delete(Routes.guildBan(this.guild.id, id), { reason });
return this.client.users.resolve(user);
}

/**
Expand Down
45 changes: 15 additions & 30 deletions packages/discord.js/src/managers/GuildMemberManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -445,60 +445,49 @@ class GuildMemberManager extends CachedManager {
return pruned;
}

/* eslint-disable consistent-return */
/**
* Kicks a user from the guild.
* <info>The user must be a member of the guild</info>
* @param {UserResolvable} user The member to kick
* @param {string} [reason] Reason for kicking
* @returns {Promise<GuildMember|User|Snowflake>} Result object will be resolved as specifically as possible.
* If the GuildMember cannot be resolved, the User will instead be attempted to be resolved. If that also cannot
* be resolved, the user's id will be the result.
* @returns {Promise<void>}
* @example
* // Kick a user by id (or with a user/guild member object)
* guild.members.kick('84484653687267328')
* .then(kickInfo => console.log(`Kicked ${kickInfo.user?.tag ?? kickInfo.tag ?? kickInfo}`))
* .catch(console.error);
* await guild.members.kick('84484653687267328');
*/
async kick(user, reason) {
const id = this.client.users.resolveId(user);
if (!id) throw new DiscordjsTypeError(ErrorCodes.InvalidType, 'user', 'UserResolvable');

await this.client.rest.delete(Routes.guildMember(this.guild.id, id), { reason });

return this.resolve(user) ?? this.client.users.resolve(user) ?? id;
}
/* eslint-enable consistent-return */

/**
* Bans a user from the guild.
* Bans a user from the guild. Internally calls the {@link GuildBanManager#create} method.
* @param {UserResolvable} user The user to ban
* @param {BanOptions} [options] Options for the ban
* @returns {Promise<GuildMember|User|Snowflake>} Result object will be resolved as specifically as possible.
* If the GuildMember cannot be resolved, the User will instead be attempted to be resolved. If that also cannot
* be resolved, the user id will be the result.
* Internally calls the GuildBanManager#create method.
* @returns {Promise<void>}
* @example
* // Ban a user by id (or with a user/guild member object)
* guild.members.ban('84484653687267328')
* .then(banInfo => console.log(`Banned ${banInfo.user?.tag ?? banInfo.tag ?? banInfo}`))
* .catch(console.error);
* await guild.members.ban('84484653687267328');
*/
ban(user, options) {
return this.guild.bans.create(user, options);
async ban(user, options) {
await this.guild.bans.create(user, options);
}

/**
* Unbans a user from the guild. Internally calls the {@link GuildBanManager#remove} method.
* @param {UserResolvable} user The user to unban
* @param {string} [reason] Reason for unbanning user
* @returns {Promise<?User>} The user that was unbanned
* @returns {Promise<void>}
* @example
* // Unban a user by id (or with a user/guild member object)
* guild.members.unban('84484653687267328')
* .then(user => console.log(`Unbanned ${user.username} from ${guild.name}`))
* .catch(console.error);
* await guild.members.unban('84484653687267328');
*/
unban(user, reason) {
return this.guild.bans.remove(user, reason);
async unban(user, reason) {
await this.guild.bans.remove(user, reason);
}

/**
Expand Down Expand Up @@ -531,29 +520,25 @@ class GuildMemberManager extends CachedManager {
/**
* Adds a role to a member.
* @param {AddOrRemoveGuildMemberRoleOptions} options Options for adding the role
* @returns {Promise<GuildMember|User|Snowflake>}
* @returns {Promise<void>}
*/
async addRole(options) {
const { user, role, reason } = options;
const userId = this.resolveId(user);
const roleId = this.guild.roles.resolveId(role);
await this.client.rest.put(Routes.guildMemberRole(this.guild.id, userId, roleId), { reason });

return this.resolve(user) ?? this.client.users.resolve(user) ?? userId;
}

/**
* Removes a role from a member.
* @param {AddOrRemoveGuildMemberRoleOptions} options Options for removing the role
* @returns {Promise<GuildMember|User|Snowflake>}
* @returns {Promise<void>}
*/
async removeRole(options) {
const { user, role, reason } = options;
const userId = this.resolveId(user);
const roleId = this.guild.roles.resolveId(role);
await this.client.rest.delete(Routes.guildMemberRole(this.guild.id, userId, roleId), { reason });

return this.resolve(user) ?? this.client.users.resolve(user) ?? userId;
}
}

Expand Down
16 changes: 7 additions & 9 deletions packages/discord.js/src/structures/GuildMember.js
Original file line number Diff line number Diff line change
Expand Up @@ -412,24 +412,22 @@ class GuildMember extends Base {
/**
* Kicks this member from the guild.
* @param {string} [reason] Reason for kicking user
* @returns {Promise<GuildMember>}
* @returns {Promise<void>}
*/
kick(reason) {
return this.guild.members.kick(this, reason);
async kick(reason) {
await this.guild.members.kick(this, reason);
}

/**
* Bans this guild member.
* @param {BanOptions} [options] Options for the ban
* @returns {Promise<GuildMember>}
* @returns {Promise<void>}
* @example
* // Ban a guild member, deleting a week's worth of messages
* guildMember.ban({ deleteMessageSeconds: 60 * 60 * 24 * 7, reason: 'They deserved it' })
* .then(console.log)
* .catch(console.error);
* await guildMember.ban({ deleteMessageSeconds: 60 * 60 * 24 * 7, reason: 'They deserved it' });
*/
ban(options) {
return this.guild.bans.create(this, options);
async ban(options) {
await this.guild.bans.create(this, options);
}

/**
Expand Down
9 changes: 5 additions & 4 deletions packages/discord.js/test/random.js
Original file line number Diff line number Diff line change
Expand Up @@ -139,12 +139,13 @@ client.on(Events.MessageCreate, message => {
}

if (message.content.startsWith('kick')) {
const user = message.mentions.users.first();
message.guild.members
.resolve(message.mentions.users.first())
.resolve(user)
.kick()
.then(member => {
console.log(member);
message.channel.send(`Kicked!${member.user.username}`);
.then(() => {
console.log(user.id);
message.channel.send(`Kicked ${user.username}!`);
})
.catch(console.error);
}
Expand Down
18 changes: 9 additions & 9 deletions packages/discord.js/typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1631,7 +1631,7 @@ export class GuildMember extends Base {
public get voice(): VoiceState;
public avatarURL(options?: ImageURLOptions): string | null;
public bannerURL(options?: ImageURLOptions): string | null;
public ban(options?: BanOptions): Promise<GuildMember>;
public ban(options?: BanOptions): Promise<void>;
public disableCommunicationUntil(timeout: DateResolvable | null, reason?: string): Promise<GuildMember>;
public timeout(timeout: number | null, reason?: string): Promise<GuildMember>;
public fetch(force?: boolean): Promise<GuildMember>;
Expand All @@ -1644,7 +1644,7 @@ export class GuildMember extends Base {
communicationDisabledUntilTimestamp: number;
readonly communicationDisabledUntil: Date;
};
public kick(reason?: string): Promise<GuildMember>;
public kick(reason?: string): Promise<void>;
public permissionsIn(channel: GuildChannelResolvable): Readonly<PermissionsBitField>;
public setFlags(flags: GuildMemberFlagsResolvable, reason?: string): Promise<GuildMember>;
public setNickname(nickname: string | null, reason?: string): Promise<GuildMember>;
Expand Down Expand Up @@ -4191,7 +4191,7 @@ export class GuildMemberManager extends CachedManager<Snowflake, GuildMember, Gu
options: AddGuildMemberOptions & { fetchWhenExisting: false },
): Promise<GuildMember | null>;
public add(user: UserResolvable, options: AddGuildMemberOptions): Promise<GuildMember>;
public ban(user: UserResolvable, options?: BanOptions): Promise<GuildMember | User | Snowflake>;
public ban(user: UserResolvable, options?: BanOptions): Promise<void>;
public bulkBan(
users: ReadonlyCollection<Snowflake, UserResolvable> | readonly UserResolvable[],
options?: BanOptions,
Expand All @@ -4202,23 +4202,23 @@ export class GuildMemberManager extends CachedManager<Snowflake, GuildMember, Gu
): Promise<GuildMember>;
public fetch(options?: FetchMembersOptions): 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<void>;
public list(options?: GuildListMembersOptions): Promise<Collection<Snowflake, GuildMember>>;
public prune(options: GuildPruneMembersOptions & { dry?: false; count: false }): Promise<null>;
public prune(options?: GuildPruneMembersOptions): Promise<number>;
public search(options: GuildSearchMembersOptions): Promise<Collection<Snowflake, GuildMember>>;
public unban(user: UserResolvable, reason?: string): Promise<User | null>;
public addRole(options: AddOrRemoveGuildMemberRoleOptions): Promise<GuildMember | User | Snowflake>;
public removeRole(options: AddOrRemoveGuildMemberRoleOptions): Promise<GuildMember | User | Snowflake>;
public unban(user: UserResolvable, reason?: string): Promise<void>;
public addRole(options: AddOrRemoveGuildMemberRoleOptions): Promise<void>;
public removeRole(options: AddOrRemoveGuildMemberRoleOptions): Promise<void>;
}

export class GuildBanManager extends CachedManager<Snowflake, GuildBan, GuildBanResolvable> {
private constructor(guild: Guild, iterable?: Iterable<RawGuildBanData>);
public guild: Guild;
public create(user: UserResolvable, options?: BanOptions): Promise<GuildMember | User | Snowflake>;
public create(user: UserResolvable, options?: BanOptions): Promise<void>;
public fetch(options: UserResolvable | FetchBanOptions): Promise<GuildBan>;
public fetch(options?: FetchBansOptions): Promise<Collection<Snowflake, GuildBan>>;
public remove(user: UserResolvable, reason?: string): Promise<User | null>;
public remove(user: UserResolvable, reason?: string): Promise<void>;
public bulkCreate(
users: ReadonlyCollection<Snowflake, UserResolvable> | readonly UserResolvable[],
options?: BanOptions,
Expand Down
Loading