diff --git a/utils.py b/utils.py
index b41e8bbc9cebb1465421c5b5804a9036a2e7db95..df975cd3ab957276a6bfe8812f071c60f470bd74 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 0f2517cf3271cde80bdc19cfc2b6fe346ae4ae72..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..ca1fe49a0f3d244f1595ad03b825082d3583a51e
--- /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
+