2727
2828from typing import TYPE_CHECKING
2929
30+ from typing_extensions import reveal_type
31+
3032from .asset import Asset
3133from .emoji import PartialEmoji
3234from .mixins import Hashable
35+ from .types .channel import (
36+ VoiceChannelEffectSendEvent as VoiceChannelEffectSendEventPayload ,
37+ )
3338from .types .soundboard import PartialSoundboardSound as PartialSoundboardSoundPayload
3439from .types .soundboard import SoundboardSound as SoundboardSoundPayload
40+ from .utils import cached_slot_property
3541
3642if TYPE_CHECKING :
3743 from .guild import Guild
@@ -62,16 +68,13 @@ class PartialSoundboardSound(Hashable):
6268
6369 __slots__ = ("id" , "volume" , "emoji" , "_http" , "emoji" )
6470
65- def __init__ (self , data : PartialSoundboardSoundPayload , http : HTTPClient ):
71+ def __init__ (
72+ self ,
73+ data : PartialSoundboardSoundPayload | VoiceChannelEffectSendEventPayload ,
74+ http : HTTPClient ,
75+ ):
6676 self ._http = http
67- self .id = int (data ["sound_id" ])
68- self .volume = (
69- float (data ["volume" ]) if data .get ("volume" ) else data ["sound_volume" ]
70- )
71- self .emoji = PartialEmoji (
72- name = data .get ("emoji_name" ),
73- id = int (data ["emoji_id" ]) if data .get ("emoji_id" ) else None ,
74- )
77+ self ._from_data (data )
7578
7679 def __eq__ (self , other : PartialSoundboardSound ) -> bool :
7780 if isinstance (other , self , __class__ ):
@@ -84,14 +87,24 @@ def __ne__(self, other: PartialSoundboardSound) -> bool:
8487 @property
8588 def file (self ) -> Asset :
8689 """:class:`Asset`: Returns the sound's file."""
87- return Asset ._from_soundboard_sound (self )
90+ return Asset ._from_soundboard_sound (self , sound_id = self . id )
8891
89- def _update (self , data : PartialSoundboardSoundPayload ) -> None :
90- self .volume = float (data ["volume" ])
91- self .emoji = PartialEmoji (
92- name = data .get ("emoji_name" ),
93- id = int (data ["emoji_id" ]) if data .get ("emoji_id" ) else None ,
94- )
92+ def _from_data (
93+ self , data : PartialSoundboardSoundPayload | VoiceChannelEffectSendEventPayload
94+ ) -> None :
95+ self .id = int (data ["sound_id" ])
96+ self .volume = float (data .get ("volume" , 0 )) or data .get ("sound_volume" )
97+ if raw_emoji := data .get (
98+ "emoji"
99+ ): # From gateway event (VoiceChannelEffectSendEventPayload)
100+ self .emoji = PartialEmoji .from_dict (raw_emoji )
101+ elif emoji_id := data .get (
102+ "emoji_id" , 0
103+ ): # From HTTP response (PartialSoundboardSoundPayload)
104+ self .emoji = PartialEmoji (
105+ name = data .get ("emoji_name" ),
106+ id = int (emoji_id ) or None ,
107+ )
95108
96109
97110class SoundboardSound (PartialSoundboardSound ):
@@ -121,8 +134,9 @@ class SoundboardSound(PartialSoundboardSound):
121134 "name" ,
122135 "available" ,
123136 "emoji" ,
124- "guild" ,
125- "owner" ,
137+ "guild_id" ,
138+ "_cs_guild" ,
139+ "user" ,
126140 "_http" ,
127141 "_state" ,
128142 "emoji" ,
@@ -134,16 +148,27 @@ def __init__(
134148 state : ConnectionState ,
135149 http : HTTPClient ,
136150 data : SoundboardSoundPayload ,
137- guild_id : int = None ,
138- owner_id : Member = None ,
139- guild : Guild = None ,
140151 ) -> None :
141152 self ._state = state
142153 super ().__init__ (data , http )
154+
155+ def _from_data (self , data : SoundboardSoundPayload ) -> None :
156+ super ()._from_data (data )
143157 self .name = data ["name" ]
144- self .available = bool (data .get ("available" , True ))
145- self .guild : Guild = guild or state ._get_guild (guild_id )
146- self .owner : Member = self .guild .get_member (owner_id )
158+ self .available : bool = data ["available" ]
159+ self .guild_id = int (data ["guild_id" ])
160+ user = data .get ("user" )
161+
162+ self .user = self ._state .store_user (user ) if user else None
163+
164+ @cached_slot_property ("_cs_guild" )
165+ def guild (self ) -> Guild :
166+ """:class:`Guild`: The guild the sound belongs to.
167+
168+ The :class:`Guild` object representing the guild the sound belongs to.
169+ .. versionadded:: 2.7
170+ """
171+ return self ._state ._get_guild (self .guild_id )
147172
148173 def __eq__ (self , other : SoundboardSound ) -> bool :
149174 return isinstance (other , SoundboardSound ) and self .__dict__ == other .__dict__
0 commit comments