diff --git a/discord/guild.py b/discord/guild.py index 8f890c81c..00f746749 100644 --- a/discord/guild.py +++ b/discord/guild.py @@ -112,7 +112,7 @@ if TYPE_CHECKING: from .types.threads import ( Thread as ThreadPayload, ) - from .types.voice import GuildVoiceState + from .types.voice import BaseVoiceState as VoiceStatePayload from .permissions import Permissions from .channel import VoiceChannel, StageChannel, TextChannel, ForumChannel, CategoryChannel from .template import Template @@ -572,7 +572,7 @@ class Guild(Hashable): return f'' def _update_voice_state( - self, data: GuildVoiceState, channel_id: Optional[int] + self, data: VoiceStatePayload, channel_id: Optional[int] ) -> Tuple[Optional[Member], VoiceState, VoiceState]: cache_flags = self._state.member_cache_flags user_id = int(data['user_id']) diff --git a/discord/member.py b/discord/member.py index cc875390f..daa63c174 100644 --- a/discord/member.py +++ b/discord/member.py @@ -73,10 +73,7 @@ if TYPE_CHECKING: from .state import ConnectionState, Presence from .message import Message from .role import Role - from .types.voice import ( - GuildVoiceState as GuildVoiceStatePayload, - VoiceState as VoiceStatePayload, - ) + from .types.voice import BaseVoiceState as VoiceStatePayload from .user import Note from .relationship import Relationship from .calls import PrivateCall @@ -147,12 +144,12 @@ class VoiceState: ) def __init__( - self, *, data: Union[VoiceStatePayload, GuildVoiceStatePayload], channel: Optional[ConnectableChannel] = None + self, *, data: VoiceStatePayload, channel: Optional[ConnectableChannel] = None ): self.session_id: Optional[str] = data.get('session_id') self._update(data, channel) - def _update(self, data: Union[VoiceStatePayload, GuildVoiceStatePayload], channel: Optional[ConnectableChannel]): + def _update(self, data: VoiceStatePayload, channel: Optional[ConnectableChannel]): self.self_mute: bool = data.get('self_mute', False) self.self_deaf: bool = data.get('self_deaf', False) self.self_stream: bool = data.get('self_stream', False) diff --git a/discord/state.py b/discord/state.py index 109436ac2..c9381394d 100644 --- a/discord/state.py +++ b/discord/state.py @@ -128,7 +128,7 @@ if TYPE_CHECKING: PartialMessage as PartialMessagePayload, ) from .types import gateway as gw - from .types.voice import VoiceState as VoiceStatePayload + from .types.voice import BaseVoiceState as VoiceStatePayload from .types.activity import ClientStatus as ClientStatusPayload T = TypeVar('T') @@ -2797,11 +2797,16 @@ class ConnectionState: self.dispatch('call_delete', call) def parse_voice_state_update(self, data: gw.VoiceStateUpdateEvent) -> None: - guild = self._get_guild(utils._get_as_snowflake(data, 'guild_id')) + guild_id = utils._get_as_snowflake(data, 'guild_id') + guild = self._get_guild(guild_id) channel_id = utils._get_as_snowflake(data, 'channel_id') flags = self.member_cache_flags self_id = self.self_id + if guild_id is not None and guild is None: + _log.debug('VOICE_STATE_UPDATE referencing unknown guild ID: %s. Discarding.', guild_id) + return + if int(data['user_id']) == self_id: voice = self._get_voice_client(guild.id if guild else self_id) if voice is not None: diff --git a/discord/types/gateway.py b/discord/types/gateway.py index 70c9ad99b..0afe96362 100644 --- a/discord/types/gateway.py +++ b/discord/types/gateway.py @@ -61,7 +61,7 @@ from .user import ( User, UserGuildSettings, ) -from .voice import GuildVoiceState, VoiceState +from .voice import GuildVoiceState, PrivateVoiceState, VoiceState T = TypeVar('T') @@ -428,7 +428,7 @@ class _GuildScheduledEventUsersEvent(TypedDict): GuildScheduledEventUserAdd = GuildScheduledEventUserRemove = _GuildScheduledEventUsersEvent -VoiceStateUpdateEvent = GuildVoiceState +VoiceStateUpdateEvent = Union[GuildVoiceState, PrivateVoiceState] class VoiceServerUpdateEvent(TypedDict): @@ -559,7 +559,7 @@ class PartialUpdateChannel(TypedDict): class PassiveUpdateEvent(TypedDict): guild_id: Snowflake channels: List[PartialUpdateChannel] - voice_states: NotRequired[List[GuildVoiceState]] + voice_states: NotRequired[List[VoiceState]] members: NotRequired[List[MemberWithUser]] diff --git a/discord/types/guild.py b/discord/types/guild.py index 30b699c63..ad8a7f150 100644 --- a/discord/types/guild.py +++ b/discord/types/guild.py @@ -29,7 +29,7 @@ from .scheduled_event import GuildScheduledEvent from .sticker import GuildSticker from .snowflake import Snowflake from .channel import GuildChannel, StageInstance -from .voice import GuildVoiceState +from .voice import VoiceState from .welcome_screen import WelcomeScreen from .activity import PartialPresenceUpdate from .role import Role @@ -116,7 +116,7 @@ class Guild(UnavailableGuild, _GuildMedia): joined_at: NotRequired[Optional[str]] large: NotRequired[bool] member_count: NotRequired[int] - voice_states: NotRequired[List[GuildVoiceState]] + voice_states: NotRequired[List[VoiceState]] members: NotRequired[List[MemberWithUser]] channels: NotRequired[List[GuildChannel]] presences: NotRequired[List[PartialPresenceUpdate]] @@ -189,4 +189,4 @@ class CommandScopeMigration(TypedDict): class SupplementalGuild(UnavailableGuild): embedded_activities: list - voice_states: List[GuildVoiceState] + voice_states: List[VoiceState] diff --git a/discord/types/voice.py b/discord/types/voice.py index cb9e412cc..393dc863a 100644 --- a/discord/types/voice.py +++ b/discord/types/voice.py @@ -32,7 +32,7 @@ from .member import MemberWithUser SupportedModes = Literal['xsalsa20_poly1305_lite', 'xsalsa20_poly1305_suffix', 'xsalsa20_poly1305'] -class _VoiceState(TypedDict): +class BaseVoiceState(TypedDict): user_id: Snowflake session_id: str deaf: bool @@ -45,13 +45,16 @@ class _VoiceState(TypedDict): self_stream: NotRequired[bool] -class GuildVoiceState(_VoiceState): +class VoiceState(BaseVoiceState): channel_id: Snowflake -class VoiceState(_VoiceState, total=False): - channel_id: NotRequired[Optional[Snowflake]] - guild_id: NotRequired[Optional[Snowflake]] +class PrivateVoiceState(BaseVoiceState): + channel_id: Optional[Snowflake] + + +class GuildVoiceState(PrivateVoiceState): + guild_id: Snowflake class VoiceRegion(TypedDict): diff --git a/discord/voice_client.py b/discord/voice_client.py index 1aa6c1e51..91b5824a8 100644 --- a/discord/voice_client.py +++ b/discord/voice_client.py @@ -61,8 +61,8 @@ if TYPE_CHECKING: from .opus import Encoder from . import abc + from .types.gateway import VoiceStateUpdateEvent as VoiceStateUpdatePayload from .types.voice import ( - GuildVoiceState as GuildVoiceStatePayload, VoiceServerUpdate as VoiceServerUpdatePayload, SupportedModes, ) @@ -114,7 +114,7 @@ class VoiceProtocol: self.client: Client = client self.channel: VocalChannel = channel - async def on_voice_state_update(self, data: GuildVoiceStatePayload, /) -> None: + async def on_voice_state_update(self, data: VoiceStateUpdatePayload, /) -> None: """|coro| An abstract method that is called when the client's voice state @@ -288,7 +288,7 @@ class VoiceClient(VoiceProtocol): # connection related - async def on_voice_state_update(self, data: GuildVoiceStatePayload) -> None: + async def on_voice_state_update(self, data: VoiceStateUpdatePayload) -> None: self.session_id: str = data['session_id'] channel_id = data['channel_id']