Skip to content
Snippets Groups Projects
view_manager.py 2.61 KiB
Newer Older
  • Learn to ignore specific revisions
  • import json
    import uuid
    
    import discord
    
    from views.dialog_view import DialogView
    
    
    class ViewManager:
    
        def __init__(self, bot):
            self.bot = bot
            self.views = {}
            self.functions = {}
            self.load()
    
        def on_ready(self):
            for view_id in self.views:
                try:
                    view = self.build_view(view_id)
                    self.bot.add_view(view)
                except:
                    pass
    
        def save(self):
            with open("data/views.json", "w") as file:
                json.dump(self.views, file)
    
        def load(self):
            try:
                with open("data/views.json", "r") as file:
                    self.views = json.load(file)
            except FileNotFoundError:
                self.views = {}
    
        def register(self, key, func):
            self.functions[key] = func
    
        async def confirm(self, channel, title, description, custom_prefix, message="", fields=[], callback_key: str = None):
            return await self.dialog(
                channel=channel,
                title=title,
                description=description,
                message=message,
                fields=fields,
                callback_key=callback_key,
                buttons=[
                    {"emoji": "👍", "custom_id": f"{custom_prefix}_confirm_yes", "value": True},
                    {"emoji": "👎", "custom_id": f"{custom_prefix}_confirm_no", "value": False}
                ]
            )
    
        async def dialog(self, channel, title, description, message="", fields=[], buttons=None, callback_key: str = None):
            embed = discord.Embed(title=title,
                                  description=description,
                                  color=19607)
            for field in fields:
                embed.add_field(**field)
            return await channel.send(message, embed=embed, view=self.view(buttons, callback_key))
    
        def view(self, buttons=None, callback_key: str = None):
            if buttons is None:
                buttons = []
            view_id = str(uuid.uuid4())
            self.prepare_buttons(buttons, view_id)
            view_config = {"buttons": buttons, "callback_key": callback_key}
            self.views[view_id] = view_config
            self.save()
            return self.build_view(view_id)
    
        def build_view(self, view_id):
            view_config = self.views[view_id]
            callback_key = view_config["callback_key"]
            func = self.functions[callback_key]
            return DialogView(self.views[view_id]["buttons"], func)
    
        def add_button(self, config):
            pass
    
        def prepare_buttons(self, buttons, view_id=None):
            for config in buttons:
                config["custom_id"] = config.get("custom_id", "") + ("" if not view_id else "_" + str(view_id))