Skip to content

Commit

Permalink
fix: improve message permission checks
Browse files Browse the repository at this point in the history
  • Loading branch information
SuperchupuDev committed Jul 12, 2023
1 parent 3debfb9 commit 0e88cd3
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 13 deletions.
7 changes: 4 additions & 3 deletions src/classes/Detector.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { setTimeout } from 'node:timers/promises';
import type { Application } from '#classes';
import { env } from '#env';
import { isSendable } from '#util';
import {
type APIEmbedField,
type GuildMember,
Expand Down Expand Up @@ -64,8 +65,8 @@ export class Detector {
}

async reply(message: Message<true>, edited: boolean) {
const permissions = message.channel.permissionsFor(this.client.user);
if (edited || (permissions && !permissions.has(PermissionFlagsBits.SendMessages))) {
const sendable = await isSendable(message.channel);
if (edited || !sendable) {
return;
}

Expand Down Expand Up @@ -226,7 +227,7 @@ export class Detector {
}
}

if (channel?.permissionsFor(this.client.user)?.has(PermissionFlagsBits.SendMessages) && channel.viewable) {
if (channel && (await isSendable(channel))) {
await channel.send({
embeds: [
{
Expand Down
11 changes: 5 additions & 6 deletions src/events/messageCreate.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
import type { Application } from '#classes';
import { type Message, MessageType, PermissionFlagsBits } from 'discord.js';
import { isSendable } from '#util';
import { type Message, MessageType } from 'discord.js';

export async function run(client: Application<true>, message: Message<true>) {
const permissions = message.channel.permissionsFor(client.user);
if (
message.author.bot ||
message.author.system ||
(message.type !== MessageType.Default && message.type !== MessageType.Reply) ||
!message.content ||
(permissions && !permissions.has(PermissionFlagsBits.SendMessages))
!message.content
) {
return;
}

if (message.content === `<@${client.user.id}>`) {
if (message.content === `<@${client.user.id}>` && (await isSendable(message.channel))) {
return message.channel.send('Hi! Type `/` to see my commands');
}

const [commandName] = message.content.slice(2).split(' ');
const command = client.chatInputCommands.get(commandName);

if (message.content.startsWith('h!') && command && !command.dev) {
if (message.content.startsWith('h!') && command && !command.dev && (await isSendable(message.channel))) {
const commands = client.application.commands.cache.size
? client.application.commands.cache
: await client.application.commands.fetch();
Expand Down
6 changes: 2 additions & 4 deletions src/events/messageUpdate.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Application } from '#classes';
import { type Message, MessageType, PermissionFlagsBits } from 'discord.js';
import { type Message, MessageType } from 'discord.js';

export async function run(client: Application<true>, oldMessage: Message, message: Message<true>) {
if (message.partial) {
Expand All @@ -10,13 +10,11 @@ export async function run(client: Application<true>, oldMessage: Message, messag
}
}

const permissions = message.channel.permissionsFor(client.user);
if (
message.author.bot ||
message.author.system ||
(message.type !== MessageType.Default && message.type !== MessageType.Reply) ||
!message.content ||
(permissions && !permissions.has(PermissionFlagsBits.SendMessages))
!message.content
) {
return;
}
Expand Down
1 change: 1 addition & 0 deletions src/util/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export { default as changelog } from './changelog.json' assert { type: 'json' };
export * from './fetchTags.js';
export * from './files.js';
export * from './sendable.js';
export * from './types.js';
20 changes: 20 additions & 0 deletions src/util/sendable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { type GuildTextBasedChannel, PermissionFlagsBits } from 'discord.js';

export async function isSendable(channel: GuildTextBasedChannel) {
if (channel.isThread()) {
return channel.sendable;
}

const permissions = channel.permissionsFor(channel.client.user);

if (!permissions || !channel.viewable) {
return false;
}

if (permissions.has(PermissionFlagsBits.Administrator, false)) {
return true;
}

const clientMember = await channel.guild.members.fetchMe();
return permissions.has(PermissionFlagsBits.SendMessages, false) && !clientMember.isCommunicationDisabled();
}

0 comments on commit 0e88cd3

Please sign in to comment.