From c54f54ef473f2a4bbbb438d3f7219e644f8ae99a Mon Sep 17 00:00:00 2001 From: strNophix Date: Thu, 4 Nov 2021 20:05:48 +0100 Subject: [PATCH] Migrated from keys to set datastructure in Redis --- bot.py | 7 +++---- cogs/information.py | 4 ++-- cogs/music.py | 13 ++++--------- config.json.sample | 3 ++- utils/database.py | 25 ++++++++++++++++++------- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/bot.py b/bot.py index d1fb23f..5b7520a 100644 --- a/bot.py +++ b/bot.py @@ -1,11 +1,9 @@ -import asyncio from aioredis.client import Redis import discord from discord import ActivityType from discord.colour import Color from discord.ext import commands, tasks import sys -from signal import SIGINT, SIGTERM import json from typing import Any, Dict, List, Sequence from discord import Message @@ -38,7 +36,6 @@ class ChristmasBot(commands.Bot): self.initial_cog_names: List[str] = self.config.get("cogs", []) self.colors: Dict[str, Color] = self.process_colours(config.get("colors", [])) - self._redis_client: Redis = aioredis.from_url( self.config["redis_url"], encoding="utf-8", decode_responses=True ) @@ -110,6 +107,9 @@ class ChristmasBot(commands.Bot): await self.change_presence(activity=activity) +config = json.load(open("config.json", "r", encoding="utf-8")) +redis_prefix = config["redis_prefix"] + if __name__ == "__main__": try: import uvloop @@ -119,6 +119,5 @@ if __name__ == "__main__": except ModuleNotFoundError: pass - config = json.load(open("config.json", "r", encoding="utf-8")) token = config.pop("token") ChristmasBot(config).run(token, reconnect=True) diff --git a/cogs/information.py b/cogs/information.py index 6ccca28..3cebf27 100644 --- a/cogs/information.py +++ b/cogs/information.py @@ -11,6 +11,7 @@ import lavalink from bot import ChristmasBot from utils.EmbedGenerator import EmbedGenerator from utils.paginator import HelpPaginator +from utils.database import AutoJoin class InformationCog(commands.Cog, name="Information"): @@ -78,8 +79,7 @@ class InformationCog(commands.Cog, name="Information"): ) await ctx.send(fmt) - from utils import database - database.AutoJoin.get_channels() + AutoJoin.get_channels() @commands.command(name="help", aliases=["about", "info"], slash_command=True) @commands.cooldown(1, 1, commands.BucketType.user) diff --git a/cogs/music.py b/cogs/music.py index 5a824d6..e577a34 100644 --- a/cogs/music.py +++ b/cogs/music.py @@ -2,8 +2,6 @@ import asyncio import re from typing import Optional -from aioredis.client import Redis - import discord from discord.channel import TextChannel from discord.ext.commands.context import Context @@ -17,6 +15,8 @@ from utils.database import AutoJoin from context import CustomContext from discord import Embed +from utils.database import Playlist + url_rx = re.compile(r"https?://(?:www\.)?.+") @@ -96,7 +96,7 @@ class Music(commands.Cog): 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) + 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: @@ -109,12 +109,7 @@ class Music(commands.Cog): 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) + queries = await Playlist.random(self.bot._redis_client, buffer) # Get the results for the query from Lavalink. for query in queries: result = await player.node.get_tracks(query) diff --git a/config.json.sample b/config.json.sample index 022f86f..e19e994 100644 --- a/config.json.sample +++ b/config.json.sample @@ -3,6 +3,7 @@ "owner_ids": [194545408960102400, 190875175460405249], "prefixes": ["ck!"], "redis_url": "", + "redis_prefix": "", "lavalink": { "host": "", "port": 2333, @@ -19,5 +20,5 @@ }, "cogs": ["cogs.owner", "cogs.settings", "cogs.information", "cogs.music"], "slash_command_guilds": [], - "queue_buffer_size": 5 + "queue_buffer_size": 5, } diff --git a/utils/database.py b/utils/database.py index 824020a..c57fd26 100644 --- a/utils/database.py +++ b/utils/database.py @@ -1,20 +1,31 @@ from aioredis import Redis -from typing import Sequence +from typing import Dict, List, Optional +from bot import redis_prefix class AutoJoin: @staticmethod - async def get_channels(redis: Redis) -> Sequence[tuple]: + async def get_channels(redis: Redis) -> Dict[str, str]: # return all channels - channels = await redis.hgetall(name="autojoin") + channels = await redis.hgetall(f"{redis_prefix}:autojoin") return {key: value.split("-") for key, value in channels.items()} @staticmethod - async def update_channel(redis: Redis, guild_id, voicechannel_id, textchannel_id): + async def update_channel( + redis: Redis, guild_id: int, voice_channel_id: int, text_channel_id: int + ): await redis.hset( - name="autojoin", key=guild_id, value=f"{voicechannel_id}-{textchannel_id}" + f"{redis_prefix}:autojoin", + guild_id, + f"{voice_channel_id}-{text_channel_id}", ) @staticmethod - async def del_channel(redis: Redis, guild_id): - await redis.hdel("autojoin", guild_id) + async def del_channel(redis: Redis, guild_id: int): + await redis.hdel(f"{redis_prefix}:autojoin", guild_id) + + +class Playlist: + @staticmethod + async def random(redis: Redis, amount: Optional[int] = 1) -> List[str]: + return await redis.srandmember(f"{redis_prefix}:playlist", amount)