mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 11:18:54 -05:00
[Core] Add Red.message_eligible_as_command (#4077)
* [Core] Add `Red.message_eligible_as_command` - This is a small utility function which makes it easy for cog creators to treat non-command messages as commands correctly. - This also modifies `Red.ignored_channel_or_guild`'s signature to explicitly add support for passing a message object (the only needed attributes are entirely shared with context) * Update redbot/core/bot.py Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com> * address review * Rename * remove webhhok check, the issue wasn't possible under normal operation * Ah yes, ctx.bot in a method of the bot... Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
This commit is contained in:
parent
c9ce4a78e6
commit
1852420b98
@ -3,7 +3,6 @@ import inspect
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
import re
|
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
import contextlib
|
import contextlib
|
||||||
@ -19,7 +18,6 @@ from typing import (
|
|||||||
Dict,
|
Dict,
|
||||||
NoReturn,
|
NoReturn,
|
||||||
Set,
|
Set,
|
||||||
Coroutine,
|
|
||||||
TypeVar,
|
TypeVar,
|
||||||
Callable,
|
Callable,
|
||||||
Awaitable,
|
Awaitable,
|
||||||
@ -30,7 +28,6 @@ from types import MappingProxyType
|
|||||||
import discord
|
import discord
|
||||||
from discord.ext import commands as dpy_commands
|
from discord.ext import commands as dpy_commands
|
||||||
from discord.ext.commands import when_mentioned_or
|
from discord.ext.commands import when_mentioned_or
|
||||||
from discord.ext.commands.bot import BotBase
|
|
||||||
|
|
||||||
from . import Config, i18n, commands, errors, drivers, modlog, bank
|
from . import Config, i18n, commands, errors, drivers, modlog, bank
|
||||||
from .cog_manager import CogManager, CogManagerUI
|
from .cog_manager import CogManager, CogManagerUI
|
||||||
@ -406,14 +403,60 @@ class RedBase(
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def ignored_channel_or_guild(self, ctx: commands.Context) -> bool:
|
async def message_eligible_as_command(self, message: discord.Message) -> bool:
|
||||||
|
"""
|
||||||
|
Runs through the things which apply globally about commands
|
||||||
|
to determine if a message may be responded to as a command.
|
||||||
|
|
||||||
|
This can't interact with permissions as permissions is hyper-local
|
||||||
|
with respect to command objects, create command objects for this
|
||||||
|
if that's needed.
|
||||||
|
|
||||||
|
This also does not check for prefix or command conflicts,
|
||||||
|
as it is primarily designed for non-prefix based response handling
|
||||||
|
via on_message_without_command
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
message
|
||||||
|
The message object to check
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
bool
|
||||||
|
Whether or not the message is eligible to be treated as a command.
|
||||||
|
"""
|
||||||
|
|
||||||
|
channel = message.channel
|
||||||
|
guild = message.guild
|
||||||
|
|
||||||
|
if message.author.bot:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if guild:
|
||||||
|
assert isinstance(channel, discord.abc.GuildChannel) # nosec
|
||||||
|
if not channel.permissions_for(guild.me).send_messages:
|
||||||
|
return False
|
||||||
|
if not (await self.ignored_channel_or_guild(message)):
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not (await self.allowed_by_whitelist_blacklist(message.author)):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
async def ignored_channel_or_guild(
|
||||||
|
self, ctx: Union[commands.Context, discord.Message]
|
||||||
|
) -> 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,
|
||||||
as considered by Red's whitelist and blacklist.
|
as considered by Red's whitelist and blacklist.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
ctx : Context of where the command is being run.
|
ctx :
|
||||||
|
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.
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@ -424,8 +467,8 @@ class RedBase(
|
|||||||
surpass_ignore = (
|
surpass_ignore = (
|
||||||
isinstance(ctx.channel, discord.abc.PrivateChannel)
|
isinstance(ctx.channel, discord.abc.PrivateChannel)
|
||||||
or perms.manage_guild
|
or perms.manage_guild
|
||||||
or await ctx.bot.is_owner(ctx.author)
|
or await self.is_owner(ctx.author)
|
||||||
or await ctx.bot.is_admin(ctx.author)
|
or await self.is_admin(ctx.author)
|
||||||
)
|
)
|
||||||
if surpass_ignore:
|
if surpass_ignore:
|
||||||
return True
|
return True
|
||||||
|
|||||||
@ -4,25 +4,5 @@ from . import commands
|
|||||||
|
|
||||||
def init_global_checks(bot):
|
def init_global_checks(bot):
|
||||||
@bot.check_once
|
@bot.check_once
|
||||||
def minimum_bot_perms(ctx) -> bool:
|
async def check_message_is_eligible_as_command(ctx: commands.Context) -> bool:
|
||||||
"""
|
return await ctx.bot.message_eligible_as_command(ctx.message)
|
||||||
Too many 403, 401, and 429 Errors can cause bots to get global'd
|
|
||||||
|
|
||||||
It's reasonable to assume the below as a minimum amount of perms for
|
|
||||||
commands.
|
|
||||||
"""
|
|
||||||
return ctx.channel.permissions_for(ctx.me).send_messages
|
|
||||||
|
|
||||||
@bot.check_once
|
|
||||||
async def whiteblacklist_checks(ctx) -> bool:
|
|
||||||
return await ctx.bot.allowed_by_whitelist_blacklist(ctx.author)
|
|
||||||
|
|
||||||
@bot.check_once
|
|
||||||
async def ignore_checks(ctx) -> bool:
|
|
||||||
"""Check the channel or server is not ignored"""
|
|
||||||
return await ctx.bot.ignored_channel_or_guild(ctx)
|
|
||||||
|
|
||||||
@bot.check_once
|
|
||||||
def bots(ctx) -> bool:
|
|
||||||
"""Check the user is not another bot."""
|
|
||||||
return not ctx.author.bot
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user