Fix Interaction.channel being None in threads

This commit is contained in:
Nadir Chowdhury 2021-07-01 12:49:44 +01:00 committed by GitHub
parent d001b9d0ee
commit 2d597e310b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 7 deletions

View File

@ -586,6 +586,12 @@ class Guild(Hashable):
channels.sort(key=lambda c: (c._sorting_bucket, c.position, c.id))
return as_list
def _resolve_channel(self, id: Optional[int], /) -> Optional[Union[GuildChannel, Thread]]:
if id is None:
return
return self._channels.get(id) or self._threads.get(id)
def get_channel(self, channel_id: int, /) -> Optional[GuildChannel]:
"""Returns a channel with the given ID.

View File

@ -47,11 +47,14 @@ if TYPE_CHECKING:
Interaction as InteractionPayload,
)
from .guild import Guild
from .abc import GuildChannel
from .state import ConnectionState
from aiohttp import ClientSession
from .embeds import Embed
from .ui.view import View
from .channel import VoiceChannel, StageChannel, TextChannel, CategoryChannel, StoreChannel
from .threads import Thread
InteractionChannel = Union[VoiceChannel, StageChannel, TextChannel, CategoryChannel, StoreChannel, Thread]
MISSING: Any = utils.MISSING
@ -145,14 +148,14 @@ class Interaction:
return self._state and self._state._get_guild(self.guild_id)
@property
def channel(self) -> Optional[GuildChannel]:
"""Optional[:class:`abc.GuildChannel`]: The channel the interaction was sent from.
def channel(self) -> Optional[InteractionChannel]:
"""Optional[Union[:class:`abc.GuildChannel`, :class:`Thread`]]: The channel the interaction was sent from.
Note that due to a Discord limitation, DM channels are not resolved since there is
no data to complete them.
"""
guild = self.guild
return guild and guild.get_channel(self.channel_id)
return guild and guild._resolve_channel(self.channel_id)
@utils.cached_slot_property('_cs_response')
def response(self) -> InteractionResponse:

View File

@ -383,7 +383,7 @@ class ConnectionState:
channel = DMChannel._from_message(self, channel_id)
guild = None
else:
channel = guild and (guild.get_channel(channel_id) or guild.get_thread(channel_id))
channel = guild and guild._resolve_channel(channel_id)
return channel or Object(id=channel_id), guild
@ -1254,7 +1254,7 @@ class ConnectionState:
return pm
for guild in self.guilds:
channel = guild.get_channel(id) or guild.get_thread(id)
channel = guild._resolve_channel(id)
if channel is not None:
return channel
@ -1276,7 +1276,7 @@ class AutoShardedConnectionState(ConnectionState):
new_guild = self._get_guild(msg.guild.id)
if new_guild is not None and new_guild is not msg.guild:
channel_id = msg.channel.id
channel = new_guild.get_channel(channel_id) or new_guild.get_thread(channel_id) or Object(id=channel_id)
channel = new_guild._resolve_channel(channel_id) or Object(id=channel_id)
msg._rebind_cached_references(new_guild, channel)
async def chunker(self, guild_id, query='', limit=0, presences=False, *, shard_id=None, nonce=None):