Skip to content

Commit 06db106

Browse files
authored
Merge pull request #501 from uwcsc/Issue466
Allow bot to ban users outside server
2 parents a07018d + 1491363 commit 06db106

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

src/commandDetails/admin/ban.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
} from '../../codeyCommand';
99
import { banUser } from '../../components/admin';
1010
import { vars } from '../../config';
11+
import { pluralize } from '../../utils/pluralize';
1112

1213
// Ban a user
1314
const banExecuteCommand: SapphireMessageExecuteType = async (client, messageFromUser, args) => {
@@ -31,13 +32,11 @@ const banExecuteCommand: SapphireMessageExecuteType = async (client, messageFrom
3132
);
3233
}
3334
const days = <number>args['days'];
34-
// Get the GuildMember object corresponding to the user in the guild
35-
// This is needed because we can only ban GuildMembers, not Users
35+
// get Guild object corresponding to server
3636
const guild = await client.guilds.fetch(vars.TARGET_GUILD_ID);
37-
const memberInGuild = await guild.members.fetch({ user });
38-
if (await banUser(memberInGuild, reason, days)) {
37+
if (await banUser(guild, user, reason, days)) {
3938
return `Successfully banned user ${user.tag} (id: ${user.id}) ${
40-
days ? `and deleted their messages in the past ${days} days ` : ``
39+
days ? `and deleted their messages in the past ${days} ${pluralize('day', days)} ` : ``
4140
}for the following reason: ${reason}`;
4241
} else {
4342
throw new CodeyUserError(

src/components/admin.ts

+17-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { GuildMember } from 'discord.js';
1+
import { Guild, User } from 'discord.js';
22
import { vars } from '../config';
33
import { logger } from '../logger/default';
44
import { pluralize } from '../utils/pluralize';
@@ -19,16 +19,28 @@ a reason why you think you should be unbanned.
1919
`;
2020

2121
/* Ban a user, returns whether ban was successful */
22+
// Bans user from guild even if they are not in server
23+
// makeBanMessage is only sent to User if they are in server (in Discord, you cannot send direct messages to users who are not in any mutual servers)
2224
export const banUser = async (
23-
member: GuildMember,
25+
guild: Guild,
26+
user: User,
2427
reason: string,
2528
days?: number,
2629
): Promise<boolean> => {
2730
let isSuccessful = false;
2831
try {
29-
const user = member.user;
30-
await user.send(makeBanMessage(reason, days));
31-
await member.ban({ reason, deleteMessageDays: days });
32+
try {
33+
await user.send(makeBanMessage(reason, days));
34+
} catch (err) {
35+
logger.error({
36+
event: "Can't send message to user not in server",
37+
error: (err as Error).toString(),
38+
});
39+
}
40+
await guild.members.ban(user, {
41+
reason: reason,
42+
deleteMessageSeconds: days == null ? 0 : days * 86400,
43+
});
3244
isSuccessful = true;
3345
} catch (err) {
3446
logger.error({

0 commit comments

Comments
 (0)