From c471ae1007cfb731221dab35defd7bed0e3331d9 Mon Sep 17 00:00:00 2001
From: Fabian <75286597+ffaadd@users.noreply.github.com>
Date: Sun, 17 Oct 2021 13:16:11 +0200
Subject: [PATCH] add dialog with custom buttons (#119)

---
 utils.py              | 21 ++++++++++++++++++---
 views/confirm_view.py | 19 -------------------
 views/dialog_view.py  | 31 +++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 22 deletions(-)
 delete mode 100644 views/confirm_view.py
 create mode 100644 views/dialog_view.py

diff --git a/utils.py b/utils.py
index b41e8bb..df975cd 100644
--- a/utils.py
+++ b/utils.py
@@ -2,7 +2,8 @@ import os
 
 import disnake
 import re
-from views.confirm_view import ConfirmView
+
+from views.dialog_view import DialogView
 
 
 async def send_dm(user, message, embed=None):
@@ -44,8 +45,22 @@ def to_minutes(time):
     return int(time)
 
 
-async def confirm(channel, title, description, message="", callback=None):
+async def dialog(channel, title, description, message="", buttons=None, callback=None):
     embed = disnake.Embed(title=title,
                           description=description,
                           color=19607)
-    return await channel.send(message, embed=embed, view=ConfirmView(callback))
+    return await channel.send(message, embed=embed, view=DialogView(buttons, callback))
+
+
+async def confirm(channel, title, description, message="", callback=None):
+    return await dialog(
+        channel=channel,
+        title=title,
+        description=description,
+        message=message,
+        callback=callback,
+        buttons=[
+            {"emoji": "👍", "value": True},
+            {"emoji": "👎", "value": False}
+        ]
+    )
diff --git a/views/confirm_view.py b/views/confirm_view.py
deleted file mode 100644
index 0f2517c..0000000
--- a/views/confirm_view.py
+++ /dev/null
@@ -1,19 +0,0 @@
-import disnake
-from disnake import MessageInteraction, ButtonStyle
-from disnake.ui import Button
-
-
-class ConfirmView(disnake.ui.View):
-    def __init__(self, callback=None):
-        super().__init__(timeout=None)
-        self.callback = callback
-
-    @disnake.ui.button(emoji="👍", style=ButtonStyle.grey)
-    async def btn_subscribe(self, button: Button, interaction: MessageInteraction):
-        if self.callback:
-            await self.callback(True, button, interaction)
-
-    @disnake.ui.button(emoji="👎", style=ButtonStyle.grey)
-    async def btn_unsubscribe(self, button: Button, interaction: MessageInteraction):
-        if self.callback:
-            await self.callback(False, button, interaction)
\ No newline at end of file
diff --git a/views/dialog_view.py b/views/dialog_view.py
new file mode 100644
index 0000000..ca1fe49
--- /dev/null
+++ b/views/dialog_view.py
@@ -0,0 +1,31 @@
+import disnake
+from disnake import MessageInteraction, ButtonStyle
+from disnake.ui import Button
+
+
+class DialogView(disnake.ui.View):
+    def __init__(self, buttons=None, callback=None):
+        super().__init__(timeout=None)
+        self.callback = callback
+        for button_config in buttons:
+            self.add_button(button_config)
+
+    def add_button(self, config):
+        button = disnake.ui.Button(
+            style=config.get("style", ButtonStyle.grey),
+            label=config.get("label", None),
+            disabled=config.get("disabled", False),
+            custom_id=config.get("custom_id", None),
+            url=config.get("url", None),
+            emoji=config.get("emoji", None),
+            row=config.get("row", None)
+        )
+        button.value = config.get("value")
+        button.callback = self.internal_callback(button)
+        self.add_item(button)
+
+    def internal_callback(self, button):
+        async def button_callback(interaction):
+            await self.callback(button, interaction, value=button.value)
+        return button_callback
+
-- 
GitLab