Skip to content

Commit 5f852aa

Browse files
committed
🐛 Fixes & add soundboard
1 parent 762db8b commit 5f852aa

File tree

10 files changed

+171
-11
lines changed

10 files changed

+171
-11
lines changed

discord/channel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,7 +1560,7 @@ def _get_voice_client_key(self) -> tuple[int, str]:
15601560
def _get_voice_state_pair(self) -> tuple[int, int]:
15611561
return self.guild.id, self.id
15621562

1563-
async def _update(self, data: VoiceChannelPayload | StageChannelPayload) -> None:
1563+
def _update(self, data: VoiceChannelPayload | StageChannelPayload) -> None:
15641564
# This data will always exist
15651565
self.name: str = data["name"]
15661566
self.category_id: int | None = get_as_snowflake(data, "parent_id")
@@ -2798,7 +2798,7 @@ def __init__(self, *, state: ConnectionState, guild: Guild, data: CategoryChanne
27982798
def __repr__(self) -> str:
27992799
return f"<CategoryChannel id={self.id} name={self.name!r} position={self.position}>"
28002800

2801-
async def _update(self, data: CategoryChannelPayload) -> None:
2801+
def _update(self, data: CategoryChannelPayload) -> None:
28022802
# This data will always exist
28032803
self.name: str = data["name"]
28042804
self.category_id: int | None = get_as_snowflake(data, "parent_id")

discord/events/__init__.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@
7272
GuildScheduledEventUserAdd,
7373
GuildScheduledEventUserRemove,
7474
)
75+
from .soundboard import (
76+
GuildSoundboardSoundCreate,
77+
GuildSoundboardSoundDelete,
78+
GuildSoundboardSoundsUpdate,
79+
GuildSoundboardSoundUpdate,
80+
SoundboardSounds,
81+
)
7582
from .stage_instance import StageInstanceCreate, StageInstanceDelete, StageInstanceUpdate
7683
from .subscription import SubscriptionCreate, SubscriptionDelete, SubscriptionUpdate
7784
from .thread import (
@@ -165,6 +172,12 @@
165172
"GuildScheduledEventUpdate",
166173
"GuildScheduledEventUserAdd",
167174
"GuildScheduledEventUserRemove",
175+
# Soundboard
176+
"GuildSoundboardSoundCreate",
177+
"GuildSoundboardSoundDelete",
178+
"GuildSoundboardSoundsUpdate",
179+
"GuildSoundboardSoundUpdate",
180+
"SoundboardSounds",
168181
# Stage Instance
169182
"StageInstanceCreate",
170183
"StageInstanceDelete",
@@ -268,6 +281,12 @@
268281
GuildScheduledEventUpdate,
269282
GuildScheduledEventUserAdd,
270283
GuildScheduledEventUserRemove,
284+
# Soundboard
285+
GuildSoundboardSoundCreate,
286+
GuildSoundboardSoundDelete,
287+
GuildSoundboardSoundsUpdate,
288+
GuildSoundboardSoundUpdate,
289+
SoundboardSounds,
271290
# Stage Instance
272291
StageInstanceCreate,
273292
StageInstanceDelete,

discord/events/soundboard.py

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
"""
2+
The MIT License (MIT)
3+
4+
Copyright (c) 2021-present Pycord Development
5+
6+
Permission is hereby granted, free of charge, to any person obtaining a
7+
copy of this software and associated documentation files (the "Software"),
8+
to deal in the Software without restriction, including without limitation
9+
the rights to use, copy, modify, merge, publish, distribute, sublicense,
10+
and/or sell copies of the Software, and to permit persons to whom the
11+
Software is furnished to do so, subject to the following conditions:
12+
13+
The above copyright notice and this permission notice shall be included in
14+
all copies or substantial portions of the Software.
15+
16+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22+
DEALINGS IN THE SOFTWARE.
23+
"""
24+
25+
from typing import TYPE_CHECKING, Any
26+
27+
from typing_extensions import Self, override
28+
29+
from ..app.event_emitter import Event
30+
from ..raw_models import RawSoundboardSoundDeleteEvent
31+
from ..soundboard import SoundboardSound
32+
33+
if TYPE_CHECKING:
34+
from ..app.state import ConnectionState
35+
36+
__all__ = (
37+
"SoundboardSounds",
38+
"GuildSoundboardSoundsUpdate",
39+
"GuildSoundboardSoundUpdate",
40+
"GuildSoundboardSoundCreate",
41+
"GuildSoundboardSoundDelete",
42+
)
43+
44+
45+
class SoundboardSounds(Event):
46+
__event_name__: str = "SOUNDBOARD_SOUNDS"
47+
48+
def __init__(self, guild_id: int, sounds: list[SoundboardSound]) -> None:
49+
self.guild_id: int = guild_id
50+
self.sounds: list[SoundboardSound] = sounds
51+
52+
@classmethod
53+
@override
54+
async def __load__(cls, data: Any, state: "ConnectionState") -> Self | None:
55+
guild_id = int(data["guild_id"])
56+
sounds: list[SoundboardSound] = []
57+
for sound_data in data["soundboard_sounds"]:
58+
sound = SoundboardSound(state=state, http=state.http, data=sound_data)
59+
await state.cache.store_sound(sound)
60+
sounds.append(sound)
61+
return cls(guild_id, sounds)
62+
63+
64+
class GuildSoundboardSoundsUpdate(Event):
65+
__event_name__: str = "GUILD_SOUNDBOARD_SOUNDS_UPDATE"
66+
67+
def __init__(
68+
self,
69+
before_sounds: list[SoundboardSound],
70+
after_sounds: list[SoundboardSound],
71+
) -> None:
72+
self.before: list[SoundboardSound] = before_sounds
73+
self.after: list[SoundboardSound] = after_sounds
74+
75+
@classmethod
76+
@override
77+
async def __load__(cls, data: Any, state: "ConnectionState") -> Self | None:
78+
before_sounds: list[SoundboardSound] = []
79+
after_sounds: list[SoundboardSound] = []
80+
for sound_data in data["soundboard_sounds"]:
81+
after = SoundboardSound(state=state, http=state.http, data=sound_data)
82+
if before := await state.cache.get_sound(after.id):
83+
before_sounds.append(before)
84+
await state.cache.store_sound(after)
85+
after_sounds.append(after)
86+
87+
if len(before_sounds) == len(after_sounds):
88+
return cls(before_sounds, after_sounds)
89+
return None
90+
91+
92+
class GuildSoundboardSoundUpdate(Event):
93+
__event_name__: str = "GUILD_SOUNDBOARD_SOUND_UPDATE"
94+
95+
def __init__(self, before: SoundboardSound, after: SoundboardSound) -> None:
96+
self.before: SoundboardSound = before
97+
self.after: SoundboardSound = after
98+
99+
@classmethod
100+
@override
101+
async def __load__(cls, data: Any, state: "ConnectionState") -> Self | None:
102+
after = SoundboardSound(state=state, http=state.http, data=data)
103+
before = await state.cache.get_sound(after.id)
104+
await state.cache.store_sound(after)
105+
if before:
106+
return cls(before, after)
107+
return None
108+
109+
110+
class GuildSoundboardSoundCreate(Event):
111+
__event_name__: str = "GUILD_SOUNDBOARD_SOUND_CREATE"
112+
113+
def __init__(self, sound: SoundboardSound) -> None:
114+
self.sound: SoundboardSound = sound
115+
116+
@classmethod
117+
@override
118+
async def __load__(cls, data: Any, state: "ConnectionState") -> Self | None:
119+
sound = SoundboardSound(state=state, http=state.http, data=data)
120+
await state.cache.store_sound(sound)
121+
return cls(sound)
122+
123+
124+
class GuildSoundboardSoundDelete(Event):
125+
__event_name__: str = "GUILD_SOUNDBOARD_SOUND_DELETE"
126+
127+
def __init__(
128+
self, sound: SoundboardSound | None, raw: RawSoundboardSoundDeleteEvent
129+
) -> None:
130+
self.sound: SoundboardSound | None = sound
131+
self.raw: RawSoundboardSoundDeleteEvent = raw
132+
133+
@classmethod
134+
@override
135+
async def __load__(cls, data: Any, state: "ConnectionState") -> Self | None:
136+
sound_id = int(data["sound_id"])
137+
sound = await state.cache.get_sound(sound_id)
138+
if sound is not None:
139+
await state.cache.delete_sound(sound_id)
140+
raw = RawSoundboardSoundDeleteEvent(data)
141+
return cls(sound, raw)

discord/guild.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,15 +539,15 @@ async def _from_data(cls, guild: GuildPayload, state: ConnectionState) -> Self:
539539

540540
for sound in guild.get("soundboard_sounds", []):
541541
sound = SoundboardSound(state=state, http=state.http, data=sound)
542-
self._add_sound(sound)
542+
await self._add_sound(sound)
543543

544544
incidents_payload = guild.get("incidents_data")
545545
self.incidents_data: IncidentsData | None = (
546546
IncidentsData(data=incidents_payload) if incidents_payload is not None else None
547547
)
548548
return self
549549

550-
def _add_sound(self, sound: SoundboardSound) -> None:
550+
async def _add_sound(self, sound: SoundboardSound) -> None:
551551
self._sounds[sound.id] = sound
552552
await self._state._add_sound(sound)
553553

discord/member.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ def __init__(
140140
self.session_id: str = data.get("session_id")
141141
self._update(data, channel)
142142

143-
async def _update(
143+
def _update(
144144
self,
145145
data: VoiceStatePayload | GuildVoiceStatePayload,
146146
channel: VocalGuildChannel | None,
@@ -422,7 +422,7 @@ async def _get_channel(self):
422422
ch = await self.create_dm()
423423
return ch
424424

425-
async def _update(self, data: MemberPayload) -> None:
425+
def _update(self, data: MemberPayload) -> None:
426426
# the nickname change is optional,
427427
# if it isn't in the payload then it didn't change
428428
try:

discord/onboarding.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ def __init__(self, data: OnboardingPayload, guild: Guild):
243243
def __repr__(self):
244244
return f"<Onboarding guild={self.guild!r} enabled={self.enabled} mode={self.mode} prompts={self.prompts}>"
245245

246-
async def _update(self, data: OnboardingPayload):
246+
def _update(self, data: OnboardingPayload):
247247
self.guild_id: Snowflake = data["guild_id"]
248248
self.prompts: list[OnboardingPrompt] = [
249249
OnboardingPrompt._from_dict(prompt, self.guild) for prompt in data.get("prompts", [])

discord/role.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ def __ge__(self: R, other: R) -> bool:
376376
return NotImplemented
377377
return not r
378378

379-
async def _update(self, data: RolePayload):
379+
def _update(self, data: RolePayload):
380380
self.name: str = data["name"]
381381
self._permissions: int = int(data.get("permissions", 0))
382382
self.position: int = data.get("position", 0)

discord/stage_instance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def __init__(self, *, state: ConnectionState, guild: Guild, data: StageInstanceP
9595
self.guild = guild
9696
self._update(data)
9797

98-
async def _update(self, data: StageInstancePayload):
98+
def _update(self, data: StageInstancePayload):
9999
self.id: int = int(data["id"])
100100
self.channel_id: int = int(data["channel_id"])
101101
self.topic: str = data["topic"]

discord/webhook/async_.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ def __init__(
10281028
self._state: ConnectionState | _WebhookState = state or _WebhookState(self, parent=state)
10291029
self._update(data)
10301030

1031-
async def _update(self, data: WebhookPayload | FollowerWebhookPayload):
1031+
def _update(self, data: WebhookPayload | FollowerWebhookPayload):
10321032
self.id = int(data["id"])
10331033
self.type = try_enum(WebhookType, int(data["type"]))
10341034
self.channel_id = get_as_snowflake(data, "channel_id")

discord/welcome_screen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def __init__(self, data: WelcomeScreenPayload, guild: Guild):
128128
def __repr__(self):
129129
return f"<WelcomeScreen description={self.description} welcome_channels={self.welcome_channels}"
130130

131-
async def _update(self, data: WelcomeScreenPayload):
131+
def _update(self, data: WelcomeScreenPayload):
132132
self.description: str = data.get("description")
133133
self.welcome_channels: list[WelcomeScreenChannel] = [
134134
WelcomeScreenChannel._from_dict(channel, self._guild) for channel in data.get("welcome_channels", [])

0 commit comments

Comments
 (0)