Skip to content

Commit 135550f

Browse files
committed
errors yay
1 parent d44f192 commit 135550f

File tree

6 files changed

+81
-23
lines changed

6 files changed

+81
-23
lines changed

discord/_voice_aliases.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
from typing import TYPE_CHECKING
2828

29-
from .utils import warn_deprecated
29+
from .utils import deprecated
3030

3131
"""
3232
since discord.voice raises an error when importing it without having the
@@ -60,12 +60,12 @@ def VoiceClient(client, channel) -> VoiceClientC:
6060
def VoiceProtocol(client, channel) -> VoiceProtocolC:
6161
...
6262
else:
63-
@warn_deprecated("discord.VoiceClient", "discord.voice.VoiceClient", "2.7", "3.0")
63+
@deprecated("discord.VoiceClient", "discord.voice.VoiceClient", "2.7", "3.0")
6464
def VoiceClient(client, channel):
6565
from discord.voice import VoiceClient
6666
return VoiceClient(client, channel)
6767

68-
@warn_deprecated("discord.VoiceProtocol", "discord.voice.VoiceProtocol", "2.7", "3.0")
68+
@deprecated("discord.VoiceProtocol", "discord.voice.VoiceProtocol", "2.7", "3.0")
6969
def VoiceProtocol(client, channel):
7070
from discord.voice import VoiceProtocol
7171
return VoiceProtocol(client, channel)

discord/opus.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import array
2929
import ctypes
3030
import ctypes.util
31-
import gc
3231
import logging
3332
import math
3433
import os.path
@@ -37,13 +36,12 @@
3736
from typing import TYPE_CHECKING, Any, Callable, Literal, TypedDict, TypeVar
3837

3938
from discord.voice.packets.rtp import FakePacket
40-
from discord.voice.utils.wrapped import gap_wrapped, add_wrapped
39+
from discord.voice.utils.wrapped import add_wrapped
4140
from discord.voice.utils.buffer import JitterBuffer
4241

4342
import davey
4443

4544
from .errors import DiscordException
46-
from .sinks import RawData
4745

4846
if TYPE_CHECKING:
4947
from discord.user import User

discord/sinks/core.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,9 @@
7171
_log = logging.getLogger(__name__)
7272

7373

74-
class SinkBase:
75-
"""Represents an audio sink in which user's audios are stored.
76-
"""
77-
78-
__sink_listeners__: list[tuple[str, str]]
7974

80-
_client: VoiceClient | None
81-
82-
def __new__(cls) -> Self:
75+
class SinkMeta(type):
76+
def __new__(cls, *args, **kwargs):
8377
listeners = {}
8478

8579
for base in reversed(cls.__mro__):
@@ -102,7 +96,15 @@ def __new__(cls) -> Self:
10296
listeners_list.append((listener_name, listener.__name__))
10397

10498
cls.__sink_listeners__ = listeners_list
105-
return super().__new__(cls)
99+
return super().__new__(cls, *args, **kwargs)
100+
101+
102+
class SinkBase(metaclass=SinkMeta):
103+
"""Represents an audio sink in which user's audios are stored.
104+
"""
105+
106+
__sink_listeners__: list[tuple[str, str]]
107+
_client: VoiceClient | None
106108

107109
@property
108110
def root(self) -> Sink:
@@ -381,7 +383,7 @@ def __init__(
381383
options: str | None = None,
382384
error_hook: Callable[[Self, Exception, VoiceData | None], Any] | None = None,
383385
) -> None:
384-
super().__init__()
386+
super().__init__(dest=None)
385387

386388
if filename is not MISSING and buffer is not MISSING:
387389
raise TypeError("can't mix filename and buffer parameters")

discord/sinks/mp3.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,4 @@ def __init__(
116116
options=options,
117117
error_hook=error_hook,
118118
) # type: ignore
119+

discord/voice/client.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import warnings
3434

3535
from discord import opus
36+
from discord.enums import SpeakingState, try_enum
3637
from discord.errors import ClientException
3738
from discord.player import AudioPlayer, AudioSource
3839
from discord.sinks.core import Sink
@@ -42,6 +43,7 @@
4243
from ._types import VoiceProtocol
4344
from .receive import AudioReader
4445
from .state import VoiceConnectionState
46+
from .enums import OpCodes
4547

4648
if TYPE_CHECKING:
4749
from typing_extensions import ParamSpec
@@ -202,6 +204,68 @@ def checked_add(self, attr: str, value: int, limit: int) -> None:
202204
def create_connection_state(self) -> VoiceConnectionState:
203205
return VoiceConnectionState(self, hook=self._recv_hook)
204206

207+
async def _recv_hook(self, ws: VoiceWebSocket, msg: dict[str, Any]) -> None:
208+
op = msg["op"]
209+
data = msg.get("d", {})
210+
211+
if op == OpCodes.ready:
212+
self._add_ssrc(self.guild.me.id, data["ssrc"])
213+
elif op == OpCodes.speaking:
214+
uid = int(data["user_id"])
215+
ssrc = data["ssrc"]
216+
217+
self._add_ssrc(uid, ssrc)
218+
219+
member = self.guild.get_member(uid)
220+
state = try_enum(SpeakingState, data["speaking"])
221+
self.dispatch("member_speaking_state_update", member, ssrc, state)
222+
elif op == OpCodes.clients_connect:
223+
uids = list(map(int, data["user_ids"]))
224+
225+
for uid in uids:
226+
member = self.guild.get_member(uid)
227+
if not member:
228+
_log.warning("Skipping member referencing ID %d on member_connect", uid)
229+
continue
230+
self.dispatch("member_connect", member)
231+
elif op == OpCodes.client_disconnect:
232+
uid = int(data["user_id"])
233+
ssrc = self._id_to_ssrc.get(uid)
234+
235+
if self._reader and ssrc is not None:
236+
_log.debug("Destroying decoder for user %d, ssrc=%d", uid, ssrc)
237+
self._reader.packet_router.destroy_decoder(ssrc)
238+
239+
self._remove_ssrc(user_id=uid)
240+
member = self.guild.get_member(uid)
241+
self.dispatch("member_disconnect", member, ssrc)
242+
243+
# maybe handle video and such things?
244+
245+
async def _run_event(self, coro, event_name: str, *args: Any, **kwargs: Any) -> None:
246+
try:
247+
await coro(*args, **kwargs)
248+
except asyncio.CancelledError:
249+
pass
250+
except Exception:
251+
_log.exception("Error calling %s", event_name)
252+
253+
def _schedule_event(self, coro, event_name: str, *args: Any, **kwargs: Any) -> asyncio.Task:
254+
wrapped = self._run_event(coro, event_name, *args, **kwargs)
255+
return self.client.loop.create_task(wrapped, name=f"voice-receiver-event-dispatch: {event_name}")
256+
257+
def dispatch(self, event: str, /, *args: Any, **kwargs: Any) -> None:
258+
_log.debug("Dispatching voice_client event %s", event)
259+
260+
event_name = f"on_{event}"
261+
for coro in self._event_listeners.get(event_name, []):
262+
task = self._schedule_event(coro, event_name, *args, **kwargs)
263+
self._connection._dispatch_task_set.add(task)
264+
task.add_done_callback(self._connection._dispatch_task_set.discard)
265+
266+
self._dispatch_sink(event, *args, **kwargs)
267+
self.client.dispatch(event, *args, **kwargs)
268+
205269
async def on_voice_state_update(self, data: RawVoiceStateUpdateEvent) -> None:
206270
old_channel_id = self.channel.id if self.channel else None
207271
await self._connection.voice_state_update(data)

discord/voice/packets/core.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,9 @@
2525
from __future__ import annotations
2626
from typing import TYPE_CHECKING
2727

28-
from discord.opus import Decoder, _lib
29-
3028
if TYPE_CHECKING:
3129
from typing_extensions import Final
3230

33-
if _lib is None:
34-
DECODER = None
35-
else:
36-
DECODER = Decoder()
37-
3831
OPUS_SILENCE: Final = b'\xf8\xff\xfe'
3932

4033

0 commit comments

Comments
 (0)