diff --git a/bot/exts/info/pep.py b/bot/exts/info/pep.py index 4655b21ff0..5423da0805 100644 --- a/bot/exts/info/pep.py +++ b/bot/exts/info/pep.py @@ -6,6 +6,7 @@ from bot.bot import Bot from bot.log import get_logger +from bot.utils.messages import send_or_reply log = get_logger(__name__) @@ -93,8 +94,7 @@ async def pep_command(self, ctx: Context, pep_number: int) -> None: colour=Colour.red(), ) - await ctx.send(embed=embed) - + await send_or_reply(ctx, embed) async def setup(bot: Bot) -> None: """Load the PEP cog.""" diff --git a/bot/exts/info/resources.py b/bot/exts/info/resources.py index 99caa2ae0d..f732fb186e 100644 --- a/bot/exts/info/resources.py +++ b/bot/exts/info/resources.py @@ -5,6 +5,7 @@ from discord.ext import commands from bot.bot import Bot +from bot.utils.messages import send_or_reply REGEX_CONSECUTIVE_NON_LETTERS = r"[^A-Za-z0-9]+" RESOURCE_URL = "https://www.pythondiscord.com/resources/" @@ -61,7 +62,7 @@ async def resources_command(self, ctx: commands.Context, *, resource_topic: str f"of hand-selected learning resources that we " f"regularly recommend to both beginners and experts." ) - await ctx.send(embed=embed) + await send_or_reply(ctx, embed) async def setup(bot: Bot) -> None: diff --git a/bot/exts/info/source.py b/bot/exts/info/source.py index 9dd5c39bf5..195c1703a3 100644 --- a/bot/exts/info/source.py +++ b/bot/exts/info/source.py @@ -9,6 +9,7 @@ from bot.bot import Bot from bot.constants import URLs from bot.exts.info.tags import TagIdentifier +from bot.utils.messages import send_or_reply SourceObject = commands.HelpCommand | commands.Command | commands.Cog | TagIdentifier | commands.ExtensionNotLoaded @@ -40,12 +41,14 @@ async def source_command( embed = Embed(title="Bot's GitHub Repository") embed.add_field(name="Repository", value=f"[Go to GitHub]({URLs.github_bot_repo})") embed.set_thumbnail(url="https://avatars1.githubusercontent.com/u/9919") - await ctx.send(embed=embed) + + await send_or_reply(ctx, embed) return obj, source_type = await self.get_source_object(ctx, source_item) embed = await self.build_embed(obj, source_type) - await ctx.send(embed=embed) + + await send_or_reply(ctx, embed) @staticmethod async def get_source_object(ctx: commands.Context, argument: str) -> tuple[SourceObject, SourceType]: diff --git a/bot/exts/info/tags.py b/bot/exts/info/tags.py index 65b0c5c650..7029aaa940 100644 --- a/bot/exts/info/tags.py +++ b/bot/exts/info/tags.py @@ -13,7 +13,7 @@ from bot.bot import Bot from bot.log import get_logger from bot.pagination import LinePaginator -from bot.utils.messages import wait_for_deletion +from bot.utils.messages import send_or_reply, wait_for_deletion log = get_logger(__name__) @@ -305,7 +305,7 @@ async def get_command_ctx( if embed is not COOLDOWN.obj: await wait_for_deletion( - await ctx.send(embed=embed), + await send_or_reply(ctx, embed), (ctx.author.id,) ) # A valid tag was found and was either sent, or is on cooldown diff --git a/bot/utils/messages.py b/bot/utils/messages.py index 57bb2c8e31..34e6d90244 100644 --- a/bot/utils/messages.py +++ b/bot/utils/messages.py @@ -7,7 +7,7 @@ from itertools import zip_longest import discord -from discord import Message +from discord import Embed, Message from discord.ext.commands import Context from pydis_core.site_api import ResponseCodeError from pydis_core.utils import scheduling @@ -285,3 +285,27 @@ async def upload_log( raise return f"{URLs.site_logs_view}/{response['id']}" + +async def get_reference_message(ctx: Context) -> Message | None: + """Return a message reference if the reference exists and it does not refer to the author of the message.""" + if ctx.message.reference is None: + return None + try: + referenced_message = await ctx.fetch_message(ctx.message.reference.message_id) + except (discord.Forbidden, discord.NotFound): + referenced_message = None + if referenced_message is None: + return None + if referenced_message.author == ctx.author: + return None + return referenced_message + +async def send_or_reply(ctx: Context, embed: Embed) -> Message: + """ + Sends the bot message as a reply if the callers message has a reference. + + If the callers message does not have a reference, the bot messsage is sent without reply + """ + if message_reference := await get_reference_message(ctx): + return await message_reference.reply(embed=embed) + return await ctx.send(embed=embed)