41 lines
1.7 KiB
Python
41 lines
1.7 KiB
Python
import wavelink
|
|
import logging
|
|
from discord.ext import commands
|
|
from ..shared.constants import MODE_RADIO
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
class RadioEvents:
|
|
"""Mixin: wavelink failure events that only apply to radio mode."""
|
|
|
|
# ── track exception → radio stream failure ────────────────────────────────
|
|
@commands.Cog.listener()
|
|
async def on_wavelink_track_exception(self, payload: wavelink.TrackExceptionEventPayload):
|
|
player: wavelink.Player = payload.player
|
|
if player is None:
|
|
return
|
|
st = self.state(player.guild.id)
|
|
if st.mode == MODE_RADIO:
|
|
if not self._is_current_track(st, payload.track):
|
|
return
|
|
log.warning(f"Radio stream exception in guild {player.guild.id}: {payload.exception}")
|
|
await self._notify_radio_drop(player.guild.id)
|
|
st.mode = None
|
|
await self._set_channel_status(player)
|
|
|
|
# ── track stuck → radio stream failure ────────────────────────────────────
|
|
@commands.Cog.listener()
|
|
async def on_wavelink_track_stuck(self, payload: wavelink.TrackStuckEventPayload):
|
|
player: wavelink.Player = payload.player
|
|
if player is None:
|
|
return
|
|
st = self.state(player.guild.id)
|
|
if st.mode == MODE_RADIO:
|
|
if not self._is_current_track(st, payload.track):
|
|
return
|
|
log.warning(f"Radio stream stuck in guild {player.guild.id}, threshold {payload.threshold_ms}ms")
|
|
await self._notify_radio_drop(player.guild.id)
|
|
st.mode = None
|
|
await self._set_channel_status(player)
|