3030from .asset import Asset
3131from .emoji import PartialEmoji
3232from .mixins import Hashable
33+ from .types .channel import (
34+ VoiceChannelEffectSendEvent as VoiceChannelEffectSendEventPayload ,
35+ )
3336from .types .soundboard import PartialSoundboardSound as PartialSoundboardSoundPayload
3437from .types .soundboard import SoundboardSound as SoundboardSoundPayload
38+ from .utils import cached_slot_property
3539
3640if TYPE_CHECKING :
3741 from .guild import Guild
@@ -62,16 +66,13 @@ class PartialSoundboardSound(Hashable):
6266
6367 __slots__ = ("id" , "volume" , "emoji" , "_http" , "emoji" )
6468
65- def __init__ (self , data : PartialSoundboardSoundPayload , http : HTTPClient ):
69+ def __init__ (
70+ self ,
71+ data : PartialSoundboardSoundPayload | VoiceChannelEffectSendEvent ,
72+ http : HTTPClient ,
73+ ):
6674 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- )
75+ self ._from_data (data )
7576
7677 def __eq__ (self , other : PartialSoundboardSound ) -> bool :
7778 if isinstance (other , self , __class__ ):
@@ -86,12 +87,21 @@ def file(self) -> Asset:
8687 """:class:`Asset`: Returns the sound's file."""
8788 return Asset ._from_soundboard_sound (self )
8889
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- )
90+ def _from_data (
91+ self , data : PartialSoundboardSoundPayload | VoiceChannelEffectSendEventPayload
92+ ) -> None :
93+ self .id = int (data ["sound_id" ])
94+ self .volume = float (data .get ("volume" , 0 )) or data .get ("sound_volume" )
95+
96+ if raw_emoji := data .get (
97+ "emoji"
98+ ): # From gateway event (VoiceChannelEffectSendEvent)
99+ self .emoji = PartialEmoji .from_dict (raw_emoji )
100+ else : # From HTTP response (PartialSoundboardSoundPayload)
101+ self .emoji = PartialEmoji (
102+ name = data .get ("emoji_name" ),
103+ id = int (data .get ("emoji_id" )) if data .get ("emoji_id" ) else None ,
104+ )
95105
96106
97107class SoundboardSound (PartialSoundboardSound ):
@@ -121,8 +131,9 @@ class SoundboardSound(PartialSoundboardSound):
121131 "name" ,
122132 "available" ,
123133 "emoji" ,
124- "guild" ,
125- "owner" ,
134+ "guild_id" ,
135+ "_cs_guild" ,
136+ "user" ,
126137 "_http" ,
127138 "_state" ,
128139 "emoji" ,
@@ -134,16 +145,27 @@ def __init__(
134145 state : ConnectionState ,
135146 http : HTTPClient ,
136147 data : SoundboardSoundPayload ,
137- guild_id : int = None ,
138- owner_id : Member = None ,
139- guild : Guild = None ,
140148 ) -> None :
141149 self ._state = state
142150 super ().__init__ (data , http )
151+
152+ def _from_data (self , data : SoundboardSoundPayload ) -> None :
153+ super ()._from_data (data )
143154 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 )
155+ self .available : bool = data ["available" ]
156+ self .guild_id = int (data ["guild_id" ])
157+ user = data .get ("user" )
158+
159+ self .user = self ._state .store_user (user ) if user else None
160+
161+ @cached_slot_property ("_cs_guild" )
162+ def guild (self ) -> Guild :
163+ """:class:`Guild`: The guild the sound belongs to.
164+
165+ The :class:`Guild` object representing the guild the sound belongs to.
166+ .. versionadded:: 2.7
167+ """
168+ return self ._state ._get_guild (self .guild_id )
147169
148170 def __eq__ (self , other : SoundboardSound ) -> bool :
149171 return isinstance (other , SoundboardSound ) and self .__dict__ == other .__dict__
0 commit comments