Migrated settings cog

This commit is contained in:
2022-11-12 22:43:03 +01:00
parent c80d17ca6f
commit 89c2e12489
9 changed files with 201 additions and 188 deletions
+5 -151
View File
@@ -1,163 +1,17 @@
from typing import Any
from discord.ext import commands
from discord.message import Message
from bot import TuneBot
from context import CustomContext
from utils.classes import BaseCog
from utils.decorators import source_manager_only
from utils.EmbedGenerator import EmbedGenerator
from cogs.settings.interactions import SettingCommands
from cogs.settings.interactions import SourceCommands
class SettingsCog(BaseCog, name="Settings"):
@commands.group(aliases=["aj"], invoke_without_command=True)
@commands.cooldown(rate=1, per=5, type=commands.BucketType.user)
async def autojoin(self, ctx: CustomContext):
"""Enable/Disable the bot automatically joining"""
await EmbedGenerator.Message(
ctx,
"Autojoin",
f"Usage:\n\n`{ctx.prefix}autojoin enable`\n`{ctx.prefix}autojoin disable`",
)
@autojoin.command(name="enable", aliases=["set"])
@commands.has_permissions(manage_channels=True)
@commands.cooldown(rate=1, per=5, type=commands.BucketType.user)
async def autojoin_set(self, ctx: CustomContext):
"""Enable the bot automatically joining"""
voice_state = ctx.author.voice
if not voice_state:
embed = ctx.create_embed()
embed.title = "Please join a voice channel before running this command."
await ctx.send(embed=embed)
return
await ctx.autojoin.update(voice_state.channel.id, ctx.message.channel.id)
embed = ctx.create_embed()
embed.title = f"AutoJoin enabled for #{voice_state.channel.name}"
await ctx.send(embed=embed)
@autojoin.command(name="disable", aliases=["unset"])
@commands.has_permissions(manage_channels=True)
@commands.cooldown(rate=1, per=5, type=commands.BucketType.user)
async def autojoin_del(self, ctx: CustomContext):
"""Disable the bot automatically joining"""
await ctx.autojoin.disable()
embed = ctx.create_embed()
embed.title = f"AutoJoin disabled"
await ctx.send(embed=embed)
@source_manager_only()
@commands.group(
name="source",
aliases=["src"],
invoke_without_command=True,
hidden=True,
)
async def source(self, ctx: CustomContext):
"""Displays all possible options for the `source` command"""
prefix = self.bot.config["prefixes"][0]
embed = ctx.create_embed()
embed.title = "All options:"
embed.description = f"```{prefix}source list\n{prefix}source add <url>\n{prefix}source remove <url>\n{prefix}source sync```"
await ctx.send(embed=embed)
@source_manager_only()
@source.command(name="remove")
async def source_remove(self, ctx: CustomContext, source_url: str):
"""Removes a source from the bot"""
if await ctx.playlist_source.remove(source_url):
prefix = self.bot.config["prefixes"][0]
embed = ctx.create_embed()
embed.title = "Removed source succesfully"
embed.description = (
f"Please use `{prefix}source sync` to persist these changes."
)
await ctx.send(embed=embed)
return
embed = ctx.create_embed()
embed.title = "Could not remove source, the specified source might not exist"
await ctx.send(embed=embed)
@source_manager_only()
@source.command(name="add")
async def source_add(self, ctx: CustomContext, source_url: str):
"""
Add's a source to the bot
Supported sources: YouTube, SoundCloud, Bandcamp, Vimeo, Twitch and HTTP(S) URL's
"""
embed = ctx.create_embed()
embed.title = "Started processing source"
message = await ctx.send(embed=embed)
query_result: Any = await self.bot.lavalink.get_tracks(source_url)
if query_result["loadType"] == "LOAD_FAILED":
embed = ctx.create_embed()
embed.title = "The specified URL is not a valid source"
embed.description = f"Supported sources: YouTube, SoundCloud, Bandcamp, Vimeo, Twitch and HTTP(S) URL's"
if isinstance(message, Message):
await message.edit(embed=embed)
else:
await ctx.send(embed=embed)
return
await ctx.playlist_source.add(source_url)
track_urls = [str(track["info"]["uri"]) for track in query_result["tracks"]]
await self.bot.global_playlist.add_tracks(track_urls)
embed = ctx.create_embed()
embed.title = "Finished processing source"
embed.description = f"Added {len(track_urls)} tracks"
if isinstance(message, Message):
await message.edit(embed=embed)
else:
await ctx.send(embed=embed)
@source_manager_only()
@source.command(name="list", aliases=["ls"])
async def source_list(self, ctx: CustomContext):
"""Display a list of sources"""
# TODO: Implement pagination for sources
sources = await self.bot.global_playlist_source.fetch_sources()
if len(sources) > 0:
description = "\n".join([f"[{source}]({source})" for source in sources])
else:
description = "This bot has no sources yet"
embed = ctx.create_embed()
embed.title = "All sources:"
embed.description = description
await ctx.send(embed=embed)
@source_manager_only()
@source.command(name="sync")
async def source_sync(self, ctx: CustomContext):
"""Forcefully resyncs all sources"""
failed_sources: list[str] = []
await self.bot.global_playlist.clear()
sources = await self.bot.global_playlist_source.fetch_sources()
for source_url in sources:
query_result: Any = await self.bot.lavalink.get_tracks(source_url)
if query_result["loadType"] == "LOAD_FAILED":
failed_sources.append(source_url)
continue
track_urls = [str(track["info"]["uri"]) for track in query_result["tracks"]]
await self.bot.global_playlist.add_tracks(track_urls)
embed = ctx.create_embed()
embed.title = f"Finished sync ({len(failed_sources)} issues)"
if len(failed_sources) > 0:
embed.description = "\n".join(
[f"[{source_url}]({source_url})" for source_url in failed_sources]
)
await ctx.send(embed=embed)
pass
async def setup(bot: TuneBot):
await bot.add_cog(SettingsCog(bot))
bot.tree.add_command(SettingCommands(bot), override=True)
bot.tree.add_command(SourceCommands(bot), override=True)
+145
View File
@@ -0,0 +1,145 @@
import typing
from discord import app_commands
from discord import Interaction
from tunebot.context import ContextLike
from utils.embed import create_embed
if typing.TYPE_CHECKING:
from discord import VoiceState
from bot import TuneBot
async def is_source_owner(ctx: Interaction) -> bool:
is_manager = ctx.user.id in ctx.client.config["manager_ids"]
is_owner: bool = await ctx.client.is_owner(ctx.user)
return is_manager or is_owner
class SourceCommands(app_commands.Group):
def __init__(self, bot: "TuneBot"):
super().__init__(name="source", description="Manage the radio sources")
self.bot: "TuneBot" = bot
@app_commands.command(name="list", description="List all radio sources")
@app_commands.check(is_source_owner)
async def list(self, ctx: Interaction):
sources = await self.bot.global_playlist_source.fetch_sources()
if len(sources) > 0:
description = "\n".join([f"[{source}]({source})" for source in sources])
else:
description = "This bot has no sources yet"
embed = create_embed(ctx.user)
embed.title = "All sources:"
embed.description = description
await ctx.response.send_message(embed=embed)
@app_commands.command(name="add", description="Add a new radio source")
@app_commands.describe(url="The URL of the to be added source")
@app_commands.check(is_source_owner)
async def add(self, ctx: Interaction, url: str):
embed = create_embed(ctx.user)
clike = ContextLike.from_discord_interaction(ctx)
playlist_source = self.bot.playlist_source_context(clike)
query_result: typing.Any = await self.bot.lavalink.get_tracks(url)
if query_result["loadType"] == "LOAD_FAILED":
embed = create_embed(ctx.user)
embed.title = "The specified URL is not a valid source"
embed.description = "Supported sources: YouTube, SoundCloud, Bandcamp, Vimeo, Twitch and HTTP(S) URL's"
await ctx.response.send_message(embed=embed)
return
await playlist_source.add(url)
track_urls = [str(track["info"]["uri"]) for track in query_result["tracks"]]
await self.bot.global_playlist.add_tracks(track_urls)
embed.title = "Finished processing source"
embed.description = f"Added {len(track_urls)} tracks"
await ctx.response.send_message(embed=embed)
@app_commands.command(name="remove", description="Remove a radio source")
@app_commands.describe(url="The URL of the to be removed source")
@app_commands.check(is_source_owner)
async def remove(self, ctx: Interaction, url: str):
embed = create_embed(ctx.user)
clike = ContextLike.from_discord_interaction(ctx)
playlist_source = self.bot.playlist_source_context(clike)
if await playlist_source.remove(url):
prefix = self.bot.config["prefixes"][0]
embed.title = "Removed source succesfully"
embed.description = (
f"Please use `{prefix}source sync` to persist these changes."
)
await ctx.response.send_message(embed=embed)
return
embed.title = "Could not remove source, the specified source might not exist"
await ctx.response.send_message(embed=embed)
@app_commands.command(name="sync", description="Synchronize all sources")
@app_commands.check(is_source_owner)
async def sync(self, ctx: Interaction):
embed = create_embed(ctx.user)
failed_sources: list[str] = []
await self.bot.global_playlist.clear()
sources = await self.bot.global_playlist_source.fetch_sources()
for source_url in sources:
query_result: typing.Any = await self.bot.lavalink.get_tracks(source_url)
if query_result["loadType"] == "LOAD_FAILED":
failed_sources.append(source_url)
continue
track_urls = [str(track["info"]["uri"]) for track in query_result["tracks"]]
await self.bot.global_playlist.add_tracks(track_urls)
embed.title = f"Finished sync ({len(failed_sources)} issues)"
if len(failed_sources) > 0:
embed.description = "\n".join(
[f"[{source_url}]({source_url})" for source_url in failed_sources]
)
await ctx.response.send_message(embed=embed)
class SettingCommands(app_commands.Group):
def __init__(self, bot: "TuneBot"):
super().__init__(name="settings", description="Tweak and customize")
self.bot: "TuneBot" = bot
@app_commands.command(
name="autojoin",
description="Let the bot automatically join a channel after occassional maintenance",
)
@app_commands.describe(state="enabled or disabled")
@app_commands.choices(
state=[
app_commands.Choice(name="enable", value=0),
app_commands.Choice(name="disable", value=1),
]
)
@app_commands.check(is_source_owner)
async def autojoin(self, ctx: Interaction, state: app_commands.Choice[int]):
voice_state: "VoiceState" = ctx.user.voice
embed = create_embed(ctx.user)
if not voice_state:
embed.title = "Please join a voice channel before running this command."
await ctx.response.send_message(embed=embed)
return
clike = ContextLike.from_discord_interaction(ctx)
autojoin = self.bot.autojoin_context(clike)
enabled = state.value
if not enabled:
await autojoin.update(voice_state.channel.id, ctx.channel_id)
embed.title = f"AutoJoin enabled for #{voice_state.channel.name}"
await ctx.response.send_message(embed=embed)
return
await autojoin.disable()
embed.title = "AutoJoin disabled"
await ctx.response.send_message(embed=embed)