From 2d597e310bae7081b827eab8e7597045291454b4 Mon Sep 17 00:00:00 2001 From: Nadir Chowdhury Date: Thu, 1 Jul 2021 12:49:44 +0100 Subject: [PATCH] Fix Interaction.channel being None in threads --- discord/guild.py | 6 ++++++ discord/interactions.py | 11 +++++++---- discord/state.py | 6 +++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/discord/guild.py b/discord/guild.py index 8ec73543b..54b86b29b 100644 --- a/discord/guild.py +++ b/discord/guild.py @@ -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. diff --git a/discord/interactions.py b/discord/interactions.py index 525f6d455..54f3056da 100644 --- a/discord/interactions.py +++ b/discord/interactions.py @@ -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: diff --git a/discord/state.py b/discord/state.py index 3afee4730..5daa583e3 100644 --- a/discord/state.py +++ b/discord/state.py @@ -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):