Files
QuizBot/cogs/cog_config.py

118 lines
4.1 KiB
Python

from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
from discord import (
ApplicationContext,
CategoryChannel,
SlashCommandGroup,
TextChannel,
option,
)
from discord.ext.commands import Cog
from discord.utils import basic_autocomplete
from libbot.i18n import _, in_every_locale
from classes import PycordGuild
from classes.pycord_bot import PycordBot
from modules.utils import autocomplete_timezones, is_operation_confirmed
class CogConfig(Cog):
"""Cog with guild configuration commands."""
def __init__(self, bot: PycordBot):
self.bot: PycordBot = bot
command_group: SlashCommandGroup = SlashCommandGroup(
name="config",
description=_("description", "commands", "config"),
description_localizations=in_every_locale("description", "commands", "config"),
)
@command_group.command(
name="set",
description=_("description", "commands", "config_set"),
description_localizations=in_every_locale("description", "commands", "config_set"),
)
@option(
"category",
description=_("description", "commands", "config_set", "options", "category"),
description_localizations=in_every_locale("description", "commands", "config_set", "options", "category"),
required=True,
)
@option("channel", description="Text channel for admin notifications", required=True)
@option(
"timezone",
description=_("description", "commands", "config_set", "options", "timezone"),
description_localizations=in_every_locale("description", "commands", "config_set", "options", "timezone"),
autocomplete=basic_autocomplete(autocomplete_timezones),
required=True,
)
async def command_config_set(
self,
ctx: ApplicationContext,
category: CategoryChannel,
channel: TextChannel,
timezone: str,
) -> None:
guild: PycordGuild = await self.bot.find_guild(ctx.guild.id)
try:
timezone_parsed: ZoneInfo = ZoneInfo(timezone)
except ZoneInfoNotFoundError:
await ctx.respond(self.bot._("timezone_invalid", "messages", locale=ctx.locale).format(timezone=timezone))
return
await guild.update(
self.bot.cache,
channel_id=channel.id,
category_id=category.id,
timezone=str(timezone_parsed),
)
await ctx.respond(self.bot._("config_set", "messages", locale=ctx.locale))
@command_group.command(
name="reset",
description=_("description", "commands", "config_reset"),
description_localizations=in_every_locale("description", "commands", "config_reset"),
)
@option(
"confirm",
description=_("description", "commands", "config_reset", "options", "confirm"),
description_localizations=in_every_locale("description", "commands", "config_reset", "options", "confirm"),
required=False,
)
async def command_config_reset(self, ctx: ApplicationContext, confirm: bool = False) -> None:
if not (await is_operation_confirmed(ctx, confirm)):
return
guild: PycordGuild = await self.bot.find_guild(ctx.guild.id)
await guild.purge(self.bot.cache)
await ctx.respond(self.bot._("config_reset", "messages", locale=ctx.locale))
@command_group.command(
name="show",
description=_("description", "commands", "config_show"),
description_localizations=in_every_locale("description", "commands", "config_show"),
)
async def command_config_show(self, ctx: ApplicationContext) -> None:
guild: PycordGuild = await self.bot.find_guild(ctx.guild.id)
if not guild.is_configured():
await ctx.respond(self.bot._("guild_unconfigured_admin", "messages", locale=ctx.locale))
return
await ctx.respond(
self.bot._("config_show", "messages", locale=ctx.locale).format(
channel_id=guild.channel_id,
category_id=guild.category_id,
timezone=guild.timezone,
)
)
def setup(bot: PycordBot) -> None:
bot.add_cog(CogConfig(bot))