diff --git a/discord/ext/commands/converter.py b/discord/ext/commands/converter.py index 2db267ecf..339e10730 100644 --- a/discord/ext/commands/converter.py +++ b/discord/ext/commands/converter.py @@ -326,22 +326,42 @@ class PartialMessageConverter(Converter[discord.PartialMessage]): """ @staticmethod - def _get_id_matches(argument): + def _get_id_matches(ctx, argument): id_regex = re.compile(r'(?:(?P[0-9]{15,20})-)?(?P[0-9]{15,20})$') link_regex = re.compile( r'https?://(?:(ptb|canary|www)\.)?discord(?:app)?\.com/channels/' - r'(?:[0-9]{15,20}|@me)' + r'(?P[0-9]{15,20}|@me)' r'/(?P[0-9]{15,20})/(?P[0-9]{15,20})/?$' ) match = id_regex.match(argument) or link_regex.match(argument) if not match: raise MessageNotFound(argument) - channel_id = match.group('channel_id') - return int(match.group('message_id')), int(channel_id) if channel_id else None + data = match.groupdict() + channel_id = discord.utils._get_as_snowflake(data, 'channel_id') + message_id = int(data['message_id']) + guild_id = data.get('guild_id') + if guild_id is None: + guild_id = ctx.guild and ctx.guild.id + elif guild_id == '@me': + guild_id = None + else: + guild_id = int(guild_id) + return guild_id, message_id, channel_id + + @staticmethod + def _resolve_channel(ctx, guild_id, channel_id): + if guild_id is not None: + guild = ctx.bot.get_guild(guild_id) + if guild is not None and channel_id is not None: + return guild.get_channel(channel_id) + else: + return None + else: + return ctx.bot.get_channel(channel_id) if channel_id else ctx.channel async def convert(self, ctx: Context, argument: str) -> discord.PartialMessage: - message_id, channel_id = self._get_id_matches(argument) - channel = ctx.bot.get_channel(channel_id) if channel_id else ctx.channel + guild_id, message_id, channel_id = self._get_id_matches(ctx, argument) + channel = self._resolve_channel(ctx, guild_id, channel_id) if not channel: raise ChannelNotFound(channel_id) return discord.PartialMessage(channel=channel, id=message_id) @@ -363,11 +383,11 @@ class MessageConverter(IDConverter[discord.Message]): """ async def convert(self, ctx: Context, argument: str) -> discord.Message: - message_id, channel_id = PartialMessageConverter._get_id_matches(argument) + guild_id, message_id, channel_id = PartialMessageConverter._get_id_matches(ctx, argument) message = ctx.bot._connection._get_message(message_id) if message: return message - channel = ctx.bot.get_channel(channel_id) if channel_id else ctx.channel + channel = PartialMessageConverter._resolve_channel(ctx, guild_id, channel_id) if not channel: raise ChannelNotFound(channel_id) try: