diff options
Diffstat (limited to 'arthur')
| -rw-r--r-- | arthur/bot.py | 8 | ||||
| -rw-r--r-- | arthur/exts/cloudflare/zones.py | 70 | 
2 files changed, 38 insertions, 40 deletions
diff --git a/arthur/bot.py b/arthur/bot.py index 249ada7..ffcb476 100644 --- a/arthur/bot.py +++ b/arthur/bot.py @@ -1,7 +1,8 @@  """Module containing the core bot base for King Arthur."""  from pathlib import Path -from typing import Any +from typing import Any, Union +from discord import Interaction  from discord.ext import commands  from discord.ext.commands import Bot  from kubernetes_asyncio import config @@ -27,8 +28,11 @@ class KingArthur(Bot):          self.add_check(self._is_devops)      @staticmethod -    async def _is_devops(ctx: commands.Context) -> bool: +    def _is_devops(ctx: Union[commands.Context, Interaction]) -> bool:          """Check all commands are executed by authorised personnel.""" +        if isinstance(ctx, Interaction): +            return CONFIG.devops_role in [r.id for r in ctx.author.roles] +          if ctx.command.name == "ed":              return True diff --git a/arthur/exts/cloudflare/zones.py b/arthur/exts/cloudflare/zones.py index 969c340..aefa760 100644 --- a/arthur/exts/cloudflare/zones.py +++ b/arthur/exts/cloudflare/zones.py @@ -9,47 +9,41 @@ from arthur.bot import KingArthur  from arthur.utils import generate_error_message -class ZonesDropdown(discord.ui.Select): - -    def __init__(self): -        options = [ -            discord.SelectOption(label="pythondiscord.com", emoji="🌐", default=True), -            discord.SelectOption(label="pythondiscord.org", emoji="🌐"), -            discord.SelectOption(label="pydis.com", emoji="🌐"), -            discord.SelectOption(label="pydis.org", emoji="🌐") -        ] - -        super().__init__( -            placeholder="Select the zone which should be purged...", -            min_values=1, -            max_values=1, -            options=options -        ) - -    async def callback(self, interaction: discord.Interaction): -        zone_name = self.values[0] -        pydis_zones = await zones.list_zones(zone_name) -        required_id = pydis_zones[zone_name] -        purge_attempt_response = await zones.purge_zone(required_id) - -        if purge_attempt_response["success"]: -            message = ":white_check_mark:" -            message += f" **Cache cleared!** The Cloudflare cache for `{zone_name}` was cleared." -        else: -            description_content = f"The cache for `{zone_name}` couldn't be cleared.\n" -            if errors := purge_attempt_response["errors"]: -                for error in errors: -                    description_content += f"`{error['code']}`: {error['message']}\n" -            message = generate_error_message(description=description_content, emote=":x:") - -        await interaction.response.send(message) - -  class ZonesView(discord.ui.View): +    OPTIONS = [ +        discord.SelectOption(label="pythondiscord.com", emoji="🌐"), +        discord.SelectOption(label="pythondiscord.org", emoji="🌐"), +        discord.SelectOption(label="pydis.com", emoji="🌐"), +        discord.SelectOption(label="pydis.org", emoji="🌐") +    ] +      def __init__(self):          super().__init__() -        self.add_item(ZonesDropdown()) + +    async def interaction_check(self, interaction: discord.Interaction) -> bool: +        return KingArthur._is_devops(interaction) + +    @discord.ui.select(placeholder="The zone(s) which should be purged...", min_values=1, max_values=4, options=OPTIONS, custom_id="select") +    async def select_zones(self, dropdown: discord.ui.Select, interaction: discord.Interaction) -> None: +        pass + +    @discord.ui.button(label="Purge zones!", style=discord.ButtonStyle.primary) +    async def purge_zones(self, button: discord.ui.Button, interaction: discord.Interaction) -> None: +        for zone_name in [child for child in self.children if child._provided_custom_id][0].values: +            pydis_zones = await zones.list_zones(zone_name) +            required_id = pydis_zones[zone_name] +            purge_attempt_response = await zones.purge_zone(required_id) +            if purge_attempt_response["success"]: +                message = ":white_check_mark:" +                message += f" **Cache cleared!** The Cloudflare cache for `{zone_name}` was cleared." +            else: +                description_content = f"The cache for `{zone_name}` couldn't be cleared.\n" +                if errors := purge_attempt_response["errors"]: +                    for error in errors: +                        description_content += f"`{error['code']}`: {error['message']}\n" +                message = generate_error_message(description=description_content, emote=":x:") +            await interaction.response.send(message)  class Zones(commands.Cog): @@ -67,7 +61,7 @@ class Zones(commands.Cog):      async def purge(self, ctx: commands.Context) -> None:          """Command to clear the Cloudflare cache of the specified zone."""          view = ZonesView() -        await ctx.send("Pick which zone's cache to purge:", view=view) +        await ctx.send("Pick which zone(s) that should have their cache purged :cloud_lightning:", view=view)  def setup(bot: KingArthur) -> None:  |