From a2959aed7dcc4586b46c70cf8c109bdc1f807617 Mon Sep 17 00:00:00 2001 From: Kae Bartlett Date: Wed, 4 Oct 2023 03:21:17 +0100 Subject: [PATCH] Update the user object properly in voice state updates --- novus/api/gateway/gateway.py | 2 +- novus/models/voice_state.py | 41 ++++++++++++------------------------ 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/novus/api/gateway/gateway.py b/novus/api/gateway/gateway.py index aa718c56..62036877 100644 --- a/novus/api/gateway/gateway.py +++ b/novus/api/gateway/gateway.py @@ -704,7 +704,7 @@ async def handle_dispatch(self, event_name: str, message: dict) -> None: await self.dispatch.handle_dispatch(event_name, message) except Exception as e: log.error( - "Error in dispatch (%s) (%s)" % (event_name, dump(message)), + "Error in dispatch (%s) (%s)", event_name, dump(message), exc_info=e, ) diff --git a/novus/models/voice_state.py b/novus/models/voice_state.py index a216439f..d6623f53 100644 --- a/novus/models/voice_state.py +++ b/novus/models/voice_state.py @@ -21,7 +21,7 @@ from typing_extensions import Self -from ..utils import parse_timestamp, DiscordDatetime +from ..utils import DiscordDatetime, parse_timestamp from .abc import Hashable from .channel import Channel from .guild_member import GuildMember @@ -29,7 +29,7 @@ if TYPE_CHECKING: from .. import payloads from ..api import HTTPConnection - from .guild import BaseGuild + from .guild import Guild from .user import User __all__ = ( @@ -65,8 +65,6 @@ class VoiceState(Hashable): Whether the user is deafened. """ - guild: BaseGuild | None - user: GuildMember | User suppress: bool session_id: str self_video: bool @@ -82,36 +80,25 @@ def __init__( state: HTTPConnection, data: payloads.VoiceState) -> None: self.state = state - if "member" in data: - guild_id = data["guild_id"] # pyright: ignore - self.user = GuildMember( - state=self.state, - data=data["member"], - guild_id=guild_id, - ) - else: - self.user = self.state.cache.get_user(data["user_id"]) # pyright: ignore - self.guild = self.state.cache.get_guild(data.get("guild_id")) - from .guild import Guild - if isinstance(self.guild, Guild): - self.guild._add_voice_state(self) - self._channel_id = data.get("channel_id") - self.suppress = data.get("suppress", False) - self.session_id = data["session_id"] - self.self_video = data.get("self_video", False) - self.self_mute = data.get("self_mute", False) - self.self_deaf = data.get("self_deaf", False) - self.request_to_speak_timestamp = parse_timestamp(data.get("request_to_speak_timestamp")) - self.mute = data.get("mute", False) - self.deaf = data.get("deaf", False) + self._user_id = data["user_id"] + self._guild_id = data["guild_id"] + self._update(data) @property def channel(self) -> Channel: return self.state.cache.get_channel(self._channel_id) + @property + def guild(self) -> Guild: + return self.state.cache.get_guild(self._guild_id) + + @property + def user(self) -> GuildMember: + return self.guild.get_member(self._user_id) + def _update(self, data: payloads.VoiceState) -> Self: if "member" in data: - self.user = self.user._update(data["member"]) + self.user._update(data["member"]) self._channel_id = data["channel_id"] self.suppress = data.get("suppress", False) self.self_video = data.get("self_video", False)