Create temporary DMChannels from message create events

This allows for DMChannels to work without falling back to the
Object error case since there is enough information to build a pseudo
DMChannel object.

This is a breaking change since it changes the type of
DMChannel.recipient to Optional[User] for when this faux object is
created.
This commit is contained in:
Rapptz
2021-04-11 22:00:28 -04:00
parent 0f3f2cbeea
commit 7bdaa793f6
2 changed files with 22 additions and 5 deletions

View File

@@ -1195,8 +1195,10 @@ class DMChannel(discord.abc.Messageable, Hashable):
Attributes
----------
recipient: :class:`User`
recipient: Optional[:class:`User`]
The user you are participating with in the direct message channel.
If this channel is received through the gateway, the recipient information
may not be always available.
me: :class:`ClientUser`
The user presenting yourself.
id: :class:`int`
@@ -1215,11 +1217,26 @@ class DMChannel(discord.abc.Messageable, Hashable):
return self
def __str__(self):
return f'Direct Message with {self.recipient}'
if self.recipient:
return f'Direct Message with {self.recipient}'
return 'Direct Message with Unknown User'
def __repr__(self):
return f'<DMChannel id={self.id} recipient={self.recipient!r}>'
@classmethod
def _from_message(cls, state, channel_id, payload):
# The MESSAGE_CREATE payload no longer gives bots
# an appropriate CHANNEL_CREATE.
# However, it has enough data for us to pretend since
# bots can no longer be in a group DM.
self = cls.__new__(cls)
self._state = state
self.id = channel_id
self.recipient = None
self.me = state.user
return self
@property
def type(self):
""":class:`ChannelType`: The channel's Discord type."""