Add autojoin feature

This commit is contained in:
2021-11-02 22:51:30 +01:00
parent eddc557f81
commit cdf848d87d
3 changed files with 78 additions and 28 deletions
+45 -26
View File
@@ -1,5 +1,7 @@
import asyncio
import re
from typing import Optional
from aioredis.client import Redis
import discord
@@ -11,6 +13,7 @@ from lavalink.models import AudioTrack, DefaultPlayer
from bot import ChristmasBot
from utils.EmbedGenerator import EmbedGenerator
from utils.database import AutoJoin
from context import CustomContext
from discord import Embed
@@ -83,6 +86,46 @@ class Music(commands.Cog):
)
self.bot.lavalink.add_event_hook(self.track_hook)
await self.async_init()
async def async_init(self):
redis_result = await AutoJoin.get_channels(self.bot._redis_client)
while len(self.bot.lavalink.node_manager.available_nodes) == 0:
await asyncio.sleep(1)
for guild_id, (voicechannel_id, textchannel_id) in redis_result.items():
player = self.bot.lavalink.player_manager.create(guild_id)
player.store('channel', textchannel_id)
voice_channel = await self.bot.fetch_channel(voicechannel_id)
await voice_channel.connect(cls=LavalinkVoiceClient)
if not player.is_playing:
await self.fill_player_queue(
player, self.bot.config["queue_buffer_size"]
)
await player.play()
textchannel = await self.bot.fetch_channel(textchannel_id)
await textchannel.send("Automatically joined the voice channel")
async def fill_player_queue(self, player: DefaultPlayer, buffer: Optional[int] = 1):
pipeline = self.bot._redis_client.pipeline()
for _ in range(buffer):
pipeline.randomkey()
queries = await pipeline.execute()
print(queries)
# Get the results for the query from Lavalink.
for query in queries:
result = await player.node.get_tracks(query)
print(result)
if not result or not result["tracks"]:
continue
track = lavalink.models.AudioTrack(
result["tracks"][0], self.bot.user.id, recommended=False
)
player.add(requester=self.bot.user.id, track=track)
def cog_unload(self):
"""Cog unload handler. This removes any event hooks that were registered."""
@@ -173,38 +216,14 @@ class Music(commands.Cog):
)
await channel.send(embed=embed)
elif isinstance(event, lavalink.events.TrackEndEvent):
query = await self.bot._redis_client.randomkey()
result = await event.player.node.get_tracks(query)
if not result or not result["tracks"]:
return
track = lavalink.models.AudioTrack(
result["tracks"][0], self.bot.user.id, recommended=False
)
event.player.add(requester=self.bot.user.id, track=track)
await self.fill_player_queue(event.player, 1)
@commands.command(name="connect", aliases=["p", "play", "join"])
async def play(self, ctx: CustomContext):
"""Starts playing Christmas bangers"""
# Get the player for this guild from cache.
player: DefaultPlayer = self.bot.lavalink.player_manager.get(ctx.guild.id)
redis_client: Redis = ctx.get_redis()
pipeline = redis_client.pipeline()
for _ in range(self.bot.config["queue_buffer_size"]):
pipeline.randomkey()
queries = await pipeline.execute()
# Get the results for the query from Lavalink.
for query in queries:
result = await player.node.get_tracks(query)
if not result or not result["tracks"]:
continue
track = lavalink.models.AudioTrack(
result["tracks"][0], ctx.author.id, recommended=False
)
player.add(requester=ctx.author.id, track=track)
await self.fill_player_queue(player, self.bot.config["queue_buffer_size"])
if not player.is_playing:
await player.play()