mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 03:08:55 -05:00
Add global checks to app commands (#6015)
This commit is contained in:
parent
030607fb04
commit
ccdd1ca892
@ -851,7 +851,7 @@ class Red(
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
async def ignored_channel_or_guild(
|
async def ignored_channel_or_guild(
|
||||||
self, ctx: Union[commands.Context, discord.Message]
|
self, ctx: Union[commands.Context, discord.Message, discord.Interaction]
|
||||||
) -> bool:
|
) -> bool:
|
||||||
"""
|
"""
|
||||||
This checks if the bot is meant to be ignoring commands in a channel or guild,
|
This checks if the bot is meant to be ignoring commands in a channel or guild,
|
||||||
@ -861,7 +861,8 @@ class Red(
|
|||||||
----------
|
----------
|
||||||
ctx :
|
ctx :
|
||||||
Context object of the command which needs to be checked prior to invoking
|
Context object of the command which needs to be checked prior to invoking
|
||||||
or a Message object which might be intended for use as a command.
|
or a Message object which might be intended for use as a command
|
||||||
|
or an Interaction object which might be intended for use with a command.
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@ -871,20 +872,30 @@ class Red(
|
|||||||
Raises
|
Raises
|
||||||
------
|
------
|
||||||
TypeError
|
TypeError
|
||||||
``ctx.channel`` is of `discord.PartialMessageable` type.
|
``ctx.channel`` is a `discord.PartialMessageable` with a ``type`` other
|
||||||
|
than ``discord.ChannelType.private``
|
||||||
"""
|
"""
|
||||||
|
if isinstance(ctx, discord.Interaction):
|
||||||
|
author = ctx.user
|
||||||
|
else:
|
||||||
|
author = ctx.author
|
||||||
|
|
||||||
|
is_private = isinstance(ctx.channel, discord.abc.PrivateChannel)
|
||||||
if isinstance(ctx.channel, discord.PartialMessageable):
|
if isinstance(ctx.channel, discord.PartialMessageable):
|
||||||
raise TypeError("Can't check permissions for PartialMessageable.")
|
if ctx.channel.type is not discord.ChannelType.private:
|
||||||
perms = ctx.channel.permissions_for(ctx.author)
|
raise TypeError("Can't check permissions for non-private PartialMessageable.")
|
||||||
|
is_private = True
|
||||||
|
perms = ctx.channel.permissions_for(author)
|
||||||
surpass_ignore = (
|
surpass_ignore = (
|
||||||
isinstance(ctx.channel, discord.abc.PrivateChannel)
|
is_private
|
||||||
or perms.manage_guild
|
or perms.manage_guild
|
||||||
or await self.is_owner(ctx.author)
|
or await self.is_owner(author)
|
||||||
or await self.is_admin(ctx.author)
|
or await self.is_admin(author)
|
||||||
)
|
)
|
||||||
# guild-wide checks
|
# guild-wide checks
|
||||||
if surpass_ignore:
|
if surpass_ignore:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
guild_ignored = await self._ignored_cache.get_ignored_guild(ctx.guild)
|
guild_ignored = await self._ignored_cache.get_ignored_guild(ctx.guild)
|
||||||
if guild_ignored:
|
if guild_ignored:
|
||||||
return False
|
return False
|
||||||
|
|||||||
@ -309,6 +309,27 @@ class RedTree(CommandTree):
|
|||||||
else:
|
else:
|
||||||
log.exception(type(error).__name__, exc_info=error)
|
log.exception(type(error).__name__, exc_info=error)
|
||||||
|
|
||||||
|
async def interaction_check(self, interaction: discord.Interaction):
|
||||||
|
"""Global checks for app commands."""
|
||||||
|
if interaction.user.bot:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if interaction.guild:
|
||||||
|
if not (await self.client.ignored_channel_or_guild(interaction)):
|
||||||
|
await interaction.response.send_message(
|
||||||
|
"This channel or server is ignored.", ephemeral=True
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not (await self.client.allowed_by_whitelist_blacklist(interaction.user)):
|
||||||
|
await interaction.response.send_message(
|
||||||
|
"You are not permitted to use commands because of an allowlist or blocklist.",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
# DEP-WARN
|
# DEP-WARN
|
||||||
def _remove_with_module(self, name: str, *args, **kwargs) -> None:
|
def _remove_with_module(self, name: str, *args, **kwargs) -> None:
|
||||||
"""Handles cases where a module raises an exception in the loading process, but added commands to the tree.
|
"""Handles cases where a module raises an exception in the loading process, but added commands to the tree.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user