Browse Source

[commands] Add PartialMessageConverter

pull/6316/head
Josh 4 years ago
committed by GitHub
parent
commit
eeafc9363f
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 48
      discord/ext/commands/converter.py

48
discord/ext/commands/converter.py

@ -37,6 +37,7 @@ __all__ = (
'MemberConverter', 'MemberConverter',
'UserConverter', 'UserConverter',
'MessageConverter', 'MessageConverter',
'PartialMessageConverter',
'TextChannelConverter', 'TextChannelConverter',
'InviteConverter', 'InviteConverter',
'RoleConverter', 'RoleConverter',
@ -251,21 +252,18 @@ class UserConverter(IDConverter):
return result return result
class MessageConverter(Converter): class PartialMessageConverter(Converter):
"""Converts to a :class:`discord.Message`. """Converts to a :class:`discord.PartialMessage`.
.. versionadded:: 1.1
The lookup strategy is as follows (in order): .. versionadded:: 1.7
1. Lookup by "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID") The creation strategy is as follows (in order):
2. Lookup by message ID (the message **must** be in the context channel)
3. Lookup by message URL
.. versionchanged:: 1.5 1. By "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID")
Raise :exc:`.ChannelNotFound`, :exc:`.MessageNotFound` or :exc:`.ChannelNotReadable` instead of generic :exc:`.BadArgument` 2. By message ID (The message is assumed to be in the context channel.)
3. By message URL
""" """
async def convert(self, ctx, argument): def _get_id_matches(self, argument):
id_regex = re.compile(r'(?:(?P<channel_id>[0-9]{15,21})-)?(?P<message_id>[0-9]{15,21})$') id_regex = re.compile(r'(?:(?P<channel_id>[0-9]{15,21})-)?(?P<message_id>[0-9]{15,21})$')
link_regex = re.compile( link_regex = re.compile(
r'https?://(?:(ptb|canary|www)\.)?discord(?:app)?\.com/channels/' r'https?://(?:(ptb|canary|www)\.)?discord(?:app)?\.com/channels/'
@ -275,12 +273,36 @@ class MessageConverter(Converter):
match = id_regex.match(argument) or link_regex.match(argument) match = id_regex.match(argument) or link_regex.match(argument)
if not match: if not match:
raise MessageNotFound(argument) raise MessageNotFound(argument)
message_id = int(match.group("message_id"))
channel_id = match.group("channel_id") channel_id = match.group("channel_id")
return int(match.group("message_id")), int(channel_id) if channel_id else None
async def convert(self, ctx, argument):
message_id, channel_id = self._get_id_matches(argument)
channel = ctx.bot.get_channel(channel_id) if channel_id else ctx.channel
if not channel:
raise ChannelNotFound(channel_id)
return discord.PartialMessage(channel=channel, id=message_id)
class MessageConverter(PartialMessageConverter):
"""Converts to a :class:`discord.Message`.
.. versionadded:: 1.1
The lookup strategy is as follows (in order):
1. Lookup by "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID")
2. Lookup by message ID (the message **must** be in the context channel)
3. Lookup by message URL
.. versionchanged:: 1.5
Raise :exc:`.ChannelNotFound`, :exc:`.MessageNotFound` or :exc:`.ChannelNotReadable` instead of generic :exc:`.BadArgument`
"""
async def convert(self, ctx, argument):
message_id, channel_id = self._get_id_matches(argument)
message = ctx.bot._connection._get_message(message_id) message = ctx.bot._connection._get_message(message_id)
if message: if message:
return message return message
channel = ctx.bot.get_channel(int(channel_id)) if channel_id else ctx.channel channel = ctx.bot.get_channel(channel_id) if channel_id else ctx.channel
if not channel: if not channel:
raise ChannelNotFound(channel_id) raise ChannelNotFound(channel_id)
try: try:

Loading…
Cancel
Save