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))