27
27
28
28
from typing import TYPE_CHECKING
29
29
30
+ from typing_extensions import reveal_type
31
+
30
32
from .asset import Asset
31
33
from .emoji import PartialEmoji
32
34
from .mixins import Hashable
35
+ from .types .channel import (
36
+ VoiceChannelEffectSendEvent as VoiceChannelEffectSendEventPayload ,
37
+ )
33
38
from .types .soundboard import PartialSoundboardSound as PartialSoundboardSoundPayload
34
39
from .types .soundboard import SoundboardSound as SoundboardSoundPayload
40
+ from .utils import cached_slot_property
35
41
36
42
if TYPE_CHECKING :
37
43
from .guild import Guild
@@ -62,16 +68,13 @@ class PartialSoundboardSound(Hashable):
62
68
63
69
__slots__ = ("id" , "volume" , "emoji" , "_http" , "emoji" )
64
70
65
- def __init__ (self , data : PartialSoundboardSoundPayload , http : HTTPClient ):
71
+ def __init__ (
72
+ self ,
73
+ data : PartialSoundboardSoundPayload | VoiceChannelEffectSendEventPayload ,
74
+ http : HTTPClient ,
75
+ ):
66
76
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 )
75
78
76
79
def __eq__ (self , other : PartialSoundboardSound ) -> bool :
77
80
if isinstance (other , self , __class__ ):
@@ -84,14 +87,24 @@ def __ne__(self, other: PartialSoundboardSound) -> bool:
84
87
@property
85
88
def file (self ) -> Asset :
86
89
""":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 )
88
91
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
+ )
95
108
96
109
97
110
class SoundboardSound (PartialSoundboardSound ):
@@ -121,8 +134,9 @@ class SoundboardSound(PartialSoundboardSound):
121
134
"name" ,
122
135
"available" ,
123
136
"emoji" ,
124
- "guild" ,
125
- "owner" ,
137
+ "guild_id" ,
138
+ "_cs_guild" ,
139
+ "user" ,
126
140
"_http" ,
127
141
"_state" ,
128
142
"emoji" ,
@@ -134,16 +148,27 @@ def __init__(
134
148
state : ConnectionState ,
135
149
http : HTTPClient ,
136
150
data : SoundboardSoundPayload ,
137
- guild_id : int = None ,
138
- owner_id : Member = None ,
139
- guild : Guild = None ,
140
151
) -> None :
141
152
self ._state = state
142
153
super ().__init__ (data , http )
154
+
155
+ def _from_data (self , data : SoundboardSoundPayload ) -> None :
156
+ super ()._from_data (data )
143
157
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 )
147
172
148
173
def __eq__ (self , other : SoundboardSound ) -> bool :
149
174
return isinstance (other , SoundboardSound ) and self .__dict__ == other .__dict__
0 commit comments