30
30
from .asset import Asset
31
31
from .emoji import PartialEmoji
32
32
from .mixins import Hashable
33
+ from .types .channel import (
34
+ VoiceChannelEffectSendEvent as VoiceChannelEffectSendEventPayload ,
35
+ )
33
36
from .types .soundboard import PartialSoundboardSound as PartialSoundboardSoundPayload
34
37
from .types .soundboard import SoundboardSound as SoundboardSoundPayload
38
+ from .utils import cached_slot_property
35
39
36
40
if TYPE_CHECKING :
37
41
from .guild import Guild
@@ -62,16 +66,13 @@ class PartialSoundboardSound(Hashable):
62
66
63
67
__slots__ = ("id" , "volume" , "emoji" , "_http" , "emoji" )
64
68
65
- def __init__ (self , data : PartialSoundboardSoundPayload , http : HTTPClient ):
69
+ def __init__ (
70
+ self ,
71
+ data : PartialSoundboardSoundPayload | VoiceChannelEffectSendEvent ,
72
+ http : HTTPClient ,
73
+ ):
66
74
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 )
75
76
76
77
def __eq__ (self , other : PartialSoundboardSound ) -> bool :
77
78
if isinstance (other , self , __class__ ):
@@ -86,12 +87,21 @@ def file(self) -> Asset:
86
87
""":class:`Asset`: Returns the sound's file."""
87
88
return Asset ._from_soundboard_sound (self )
88
89
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
+ )
95
105
96
106
97
107
class SoundboardSound (PartialSoundboardSound ):
@@ -121,8 +131,9 @@ class SoundboardSound(PartialSoundboardSound):
121
131
"name" ,
122
132
"available" ,
123
133
"emoji" ,
124
- "guild" ,
125
- "owner" ,
134
+ "guild_id" ,
135
+ "_cs_guild" ,
136
+ "user" ,
126
137
"_http" ,
127
138
"_state" ,
128
139
"emoji" ,
@@ -134,16 +145,27 @@ def __init__(
134
145
state : ConnectionState ,
135
146
http : HTTPClient ,
136
147
data : SoundboardSoundPayload ,
137
- guild_id : int = None ,
138
- owner_id : Member = None ,
139
- guild : Guild = None ,
140
148
) -> None :
141
149
self ._state = state
142
150
super ().__init__ (data , http )
151
+
152
+ def _from_data (self , data : SoundboardSoundPayload ) -> None :
153
+ super ()._from_data (data )
143
154
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 )
147
169
148
170
def __eq__ (self , other : SoundboardSound ) -> bool :
149
171
return isinstance (other , SoundboardSound ) and self .__dict__ == other .__dict__
0 commit comments