mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-21 18:27:59 -05:00
[Audio] New stuff from RLL 0.7.0 (#4529)
* New stuff from RLL 0.7.0 * discard here * formatting * do this properly * make it more unique * bump RLL * nuke `[p]llset restport`, only `[p]llset wsport` matters * Update setup.cfg * properly deprecate Rest port and Ensure Nodes are properly closed upon running LLSET commands * restore player on a attempt reconnect * restore player as a task * ensure we send the signal only if not playing. * register events a little earlier * hmmm * ffs * update application.yml * fix permissions edge case
This commit is contained in:
@@ -4,6 +4,7 @@ from pathlib import Path
|
||||
|
||||
import lavalink
|
||||
|
||||
from redbot.core import data_manager
|
||||
from redbot.core.i18n import Translator
|
||||
from ...errors import LavalinkDownloadFailed
|
||||
from ...manager import ServerManager
|
||||
@@ -16,9 +17,16 @@ _ = Translator("Audio", Path(__file__))
|
||||
|
||||
class LavalinkTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
def lavalink_restart_connect(self) -> None:
|
||||
lavalink.unregister_event_listener(self.lavalink_event_handler)
|
||||
lavalink.unregister_update_listener(self.lavalink_update_handler)
|
||||
if self.lavalink_connect_task:
|
||||
self.lavalink_connect_task.cancel()
|
||||
if self._restore_task:
|
||||
self._restore_task.cancel()
|
||||
|
||||
self._restore_task = None
|
||||
lavalink.register_event_listener(self.lavalink_event_handler)
|
||||
lavalink.register_update_listener(self.lavalink_update_handler)
|
||||
self.lavalink_connect_task = self.bot.loop.create_task(self.lavalink_attempt_connect())
|
||||
|
||||
async def lavalink_attempt_connect(self, timeout: int = 50) -> None:
|
||||
@@ -33,7 +41,6 @@ class LavalinkTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
settings = self._default_lavalink_settings
|
||||
host = settings["host"]
|
||||
password = settings["password"]
|
||||
rest_port = settings["rest_port"]
|
||||
ws_port = settings["ws_port"]
|
||||
if self.player_manager is not None:
|
||||
await self.player_manager.shutdown()
|
||||
@@ -73,7 +80,6 @@ class LavalinkTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
else:
|
||||
host = configs["host"]
|
||||
password = configs["password"]
|
||||
rest_port = configs["rest_port"]
|
||||
ws_port = configs["ws_port"]
|
||||
break
|
||||
else:
|
||||
@@ -86,14 +92,17 @@ class LavalinkTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
|
||||
retry_count = 0
|
||||
while retry_count < max_retries:
|
||||
if lavalink.node._nodes:
|
||||
await lavalink.node.disconnect()
|
||||
try:
|
||||
await lavalink.initialize(
|
||||
bot=self.bot,
|
||||
host=host,
|
||||
password=password,
|
||||
rest_port=rest_port,
|
||||
rest_port=ws_port,
|
||||
ws_port=ws_port,
|
||||
timeout=timeout,
|
||||
resume_key=f"Red-Core-Audio-{self.bot.user.id}-{data_manager.instance_name}",
|
||||
)
|
||||
except asyncio.TimeoutError:
|
||||
log.error("Connecting to Lavalink server timed out, retrying...")
|
||||
@@ -115,3 +124,5 @@ class LavalinkTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
"Connecting to the Lavalink server failed after multiple attempts. "
|
||||
"See above tracebacks for details."
|
||||
)
|
||||
return
|
||||
self._restore_task = asyncio.create_task(self.restore_players())
|
||||
|
||||
@@ -57,8 +57,6 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
self.player_automated_timer()
|
||||
)
|
||||
self.player_automated_timer_task.add_done_callback(task_callback)
|
||||
lavalink.register_event_listener(self.lavalink_event_handler)
|
||||
await self.restore_players()
|
||||
except Exception as err:
|
||||
log.exception("Audio failed to start up, please report this issue.", exc_info=err)
|
||||
raise err
|
||||
@@ -68,6 +66,7 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
async def restore_players(self):
|
||||
tries = 0
|
||||
tracks_to_restore = await self.api_interface.persistent_queue_api.fetch_all()
|
||||
await asyncio.sleep(10)
|
||||
for guild_id, track_data in itertools.groupby(tracks_to_restore, key=lambda x: x.guild_id):
|
||||
await asyncio.sleep(0)
|
||||
try:
|
||||
@@ -95,6 +94,12 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
while tries < 25 and vc is not None:
|
||||
try:
|
||||
vc = guild.get_channel(track_data[-1].room_id)
|
||||
if not vc:
|
||||
break
|
||||
perms = vc.permissions_for(guild.me)
|
||||
if not (perms.connect and perms.speak):
|
||||
vc = None
|
||||
break
|
||||
await lavalink.connect(vc)
|
||||
player = lavalink.get_player(guild.id)
|
||||
player.store("connect", datetime.datetime.utcnow())
|
||||
@@ -126,8 +131,8 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass):
|
||||
track = track.track_object
|
||||
player.add(guild.get_member(track.extras.get("requester")) or guild.me, track)
|
||||
player.maybe_shuffle()
|
||||
|
||||
await player.play()
|
||||
if not player.is_playing:
|
||||
await player.play()
|
||||
except Exception as err:
|
||||
debug_exc_log(log, err, f"Error restoring player in {guild_id}")
|
||||
await self.api_interface.persistent_queue_api.drop(guild_id)
|
||||
|
||||
Reference in New Issue
Block a user