Implement a first bs implementation of actions db
Need to actually go through actions on acc/decmain
							parent
							
								
									ae6a9053e3
								
							
						
					
					
						commit
						784fd08f58
					
				
							
								
								
									
										14
									
								
								action.py
								
								
								
								
							
							
						
						
									
										14
									
								
								action.py
								
								
								
								
							|  | @ -2,11 +2,13 @@ from typing import Any, TypeVar, NewType | |||
| from enum import Enum | ||||
| import discord | ||||
| 
 | ||||
| AT = TypeVar("AT", bound="Action") | ||||
| actions = { | ||||
|     "Add Role": "add_role" | ||||
|             } | ||||
| 
 | ||||
| class ActionInteraction(Enum): | ||||
|     ACCEPT = "accept" | ||||
|     DECLINE = "decline" | ||||
|     ACCEPT = "Accept" | ||||
|     DECLINE = "Decline" | ||||
| 
 | ||||
| class Action(): | ||||
|     def __init__(self, action: ActionInteraction): | ||||
|  | @ -20,4 +22,10 @@ class Action(): | |||
|         else: | ||||
|             raise ValueError("Action object already set type") | ||||
| 
 | ||||
|     def get_data(self): | ||||
|         if self.set_type is not None: | ||||
|             return { | ||||
|                 "type": self.set_type | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										191
									
								
								bot.py
								
								
								
								
							
							
						
						
									
										191
									
								
								bot.py
								
								
								
								
							|  | @ -4,6 +4,7 @@ import asyncio | |||
| import discord | ||||
| import os | ||||
| import json | ||||
| import pickle | ||||
| from dotenv import load_dotenv | ||||
| from discord.ui import Modal, InputText | ||||
| from discord.utils import get | ||||
|  | @ -12,7 +13,9 @@ from dbutil import MessageDB | |||
| from dbutil import StartButtonDB | ||||
| from dbutil import GuildAppDB | ||||
| 
 | ||||
| from action import Action, ActionInteraction | ||||
| from action import Action, ActionInteraction, actions | ||||
| 
 | ||||
| usable_actions = actions | ||||
| 
 | ||||
| 
 | ||||
| load_dotenv() | ||||
|  | @ -105,6 +108,16 @@ async def editor(ctx): | |||
|     view.add_item(options) | ||||
|     await ctx.response.send_message(view=view, ephemeral=True) | ||||
| 
 | ||||
| @commands.has_permissions(administrator=True) | ||||
| @application.command(description="Opens Actions™ editor") | ||||
| async def actions(ctx): | ||||
|     view = discord.ui.View() | ||||
|     options = SelectActionOptionsEditor(max_values=1, placeholder="Select application") | ||||
|     for i in GuildAppDB.get_applications(str(ctx.guild.id)): | ||||
|         options.add_option(label=i, value=i) | ||||
|     view.add_item(options) | ||||
|     await ctx.response.send_message(view=view, ephemeral=True) | ||||
| 
 | ||||
| @commands.has_permissions(administrator=True) | ||||
| @application.command(description="Select response channel for application") | ||||
| async def response_channel(ctx): | ||||
|  | @ -323,6 +336,182 @@ class MoveQuestionSelectNum(discord.ui.Select): | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| def get_actions_embed(guild_id, application, action_type: ActionInteraction) -> discord.Embed: | ||||
|     embed = discord.Embed(title=f"Application: {application}", description=f"Actions happening on: {action_type.value}") | ||||
|     actions = GuildAppDB.get_actions(str(guild_id), application, action_type) | ||||
|     for i, que in enumerate(actions): | ||||
|         if que["action_type"] == "add_role": | ||||
|             role = bot.get_guild(int(guild_id)).get_role(que["data"]["role_id"]).name | ||||
|             embed.add_field(value=f"**{i+1}. {que['display_type']}: {role}**", name="", inline=False) | ||||
|         else: | ||||
|             embed.add_field(value=f"**{i+1}. {que['display_type']}**", name="", inline=False) | ||||
|     embed.set_footer(text="Made by @anorak01", icon_url="https://cdn.discordapp.com/avatars/269164865480949760/a1af9962da20d5ddaa136043cf45d015?size=1024") | ||||
|     return embed | ||||
| 
 | ||||
| class ActionAcceptEditorView(discord.ui.View): | ||||
|     def __init__(self, guild_id, application_name): | ||||
|         super().__init__(timeout=180) | ||||
|         self.guild_id = guild_id | ||||
|         self.application_name = application_name | ||||
| 
 | ||||
|     @discord.ui.button( | ||||
|         label="New", | ||||
|         style=discord.ButtonStyle.green, | ||||
|         custom_id="action_accept_editor:add", | ||||
|         row=0 | ||||
|     ) | ||||
|     async def add_action(self, button: discord.ui.Button, interaction: discord.Interaction): | ||||
|         view = ActionAcceptEditorView(str(interaction.guild.id), self.application_name) | ||||
|         options = AddActionSelect(max_values=1, placeholder="Select action to add") | ||||
|         options.set_app_name(self.application_name) | ||||
|         options.set_action_type(ActionInteraction.ACCEPT) | ||||
|         for i, que in enumerate(usable_actions): | ||||
|             options.add_option(label=f"{str(i+1)}. {que}", value=str(usable_actions[que])) | ||||
|         view.add_item(options) | ||||
|         await interaction.response.edit_message(view=view) | ||||
| 
 | ||||
|     @discord.ui.button( | ||||
|         label="Remove", | ||||
|         style=discord.ButtonStyle.red, | ||||
|         custom_id="action_accept_editor:remove", | ||||
|         row=0 | ||||
|     ) | ||||
|     async def remove_action(self, button, interaction: discord.Interaction): | ||||
|         view = ActionAcceptEditorView(str(interaction.guild.id), self.application_name) | ||||
|         options = RemoveActionSelect(max_values=1, placeholder="Select action to remove") | ||||
|         options.set_app_name(self.application_name) | ||||
|         actions = GuildAppDB.get_actions(str(interaction.guild.id), self.application_name, action_type=ActionInteraction.ACCEPT) | ||||
|         options.set_action_type(ActionInteraction.ACCEPT) | ||||
|         for i, que in enumerate(actions): | ||||
|             options.add_option(label=f"{str(i+1)}. {que}", value=str(i)) | ||||
|         view.add_item(options) | ||||
|         await interaction.response.edit_message(view=view) | ||||
| 
 | ||||
| class ActionDeclineEditorView(discord.ui.View): | ||||
|     def __init__(self, guild_id, application_name): | ||||
|         super().__init__(timeout=180) | ||||
|         self.guild_id = guild_id | ||||
|         self.application_name = application_name | ||||
| 
 | ||||
|     @discord.ui.button( | ||||
|         label="New", | ||||
|         style=discord.ButtonStyle.green, | ||||
|         custom_id="action_decline_editor:add", | ||||
|         row=0 | ||||
|     ) | ||||
|     async def add_action(self, button: discord.ui.Button, interaction: discord.Interaction): | ||||
|         view = ActionDeclineEditorView(str(interaction.guild.id), self.application_name) | ||||
|         options = AddActionSelect(max_values=1, placeholder="Select action to add") | ||||
|         options.set_app_name(self.application_name) | ||||
|         options.set_action_type(ActionInteraction.DECLINE) | ||||
|         for i, que in enumerate(usable_actions): | ||||
|             options.add_option(label=f"{str(i+1)}. {que}", value=str(usable_actions[que])) | ||||
|         view.add_item(options) | ||||
|         await interaction.response.edit_message(view=view) | ||||
| 
 | ||||
|     @discord.ui.button( | ||||
|         label="Remove", | ||||
|         style=discord.ButtonStyle.red, | ||||
|         custom_id="action_decline_editor:remove", | ||||
|         row=0 | ||||
|     ) | ||||
|     async def remove_action(self, button, interaction: discord.Interaction): | ||||
|         view = ActionDeclineEditorView(str(interaction.guild.id), self.application_name) | ||||
|         options = RemoveActionSelect(max_values=1, placeholder="Select action to remove") | ||||
|         options.set_app_name(self.application_name) | ||||
|         actions = GuildAppDB.get_actions(str(interaction.guild.id), self.application_name, action_type=ActionInteraction.DECLINE) | ||||
|         options.set_action_type(ActionInteraction.DECLINE) | ||||
|         for i, que in enumerate(actions): | ||||
|             options.add_option(label=f"{str(i+1)}. {que}", value=str(i)) | ||||
|         view.add_item(options) | ||||
|         await interaction.response.edit_message(view=view) | ||||
| 
 | ||||
| class AddActionSelect(discord.ui.Select): | ||||
|     def set_app_name(self, app_name): | ||||
|         self.app_name = app_name | ||||
| 
 | ||||
|     def set_action_type(self, action_type): | ||||
|         self.action_type = action_type | ||||
| 
 | ||||
|     async def callback(self, interaction: discord.Interaction): | ||||
|         self.disabled = True | ||||
|         action = self.values[0] | ||||
|         if action == "add_role": | ||||
|             view = discord.ui.View() | ||||
|             options = SelectRoleToAdd(select_type=discord.ComponentType.role_select, max_values=1, placeholder="Select role to add") | ||||
|             options.set_app_name(self.app_name) | ||||
|             options.set_action_type(self.action_type) | ||||
|             view.add_item(options) | ||||
|             await interaction.response.edit_message(view=view) | ||||
| 
 | ||||
| class SelectRoleToAdd(discord.ui.Select): | ||||
|     def set_app_name(self, app_name): | ||||
|         self.app_name = app_name | ||||
| 
 | ||||
|     def set_action_type(self, action_type): | ||||
|         self.action_type = action_type | ||||
| 
 | ||||
|     async def callback(self, interaction: discord.Interaction): | ||||
|         self.disabled = True | ||||
|         role = self.values[0] | ||||
|         action = {"result": self.action_type, "action_type": "add_role", "display_type": "Add Role", "data": {"role_id": role.id}} | ||||
|         GuildAppDB.add_action(str(interaction.guild.id), self.app_name, action) | ||||
|         if self.action_type == ActionInteraction.ACCEPT: | ||||
|             editor = ActionAcceptEditorView(str(interaction.guild.id), self.app_name) | ||||
|             embed = get_actions_embed(str(interaction.guild.id), self.app_name, ActionInteraction.ACCEPT) | ||||
|         if self.action_type == ActionInteraction.DECLINE: | ||||
|             editor = ActionDeclineEditorView(str(interaction.guild.id), self.app_name) | ||||
|             embed = get_actions_embed(str(interaction.guild.id), self.app_name, ActionInteraction.DECLINE) | ||||
|         await interaction.response.edit_message(embed = embed, view = editor) | ||||
| 
 | ||||
| 
 | ||||
| class RemoveActionSelect(discord.ui.Select): | ||||
|     def set_app_name(self, app_name): | ||||
|         self.app_name = app_name | ||||
| 
 | ||||
|     def set_action_type(self, action_type: ActionInteraction): | ||||
|         self.action_type = action_type | ||||
| 
 | ||||
|     async def callback(self, interaction: discord.Interaction): | ||||
|         self.disabled = True | ||||
|         GuildAppDB.remove_action(str(interaction.guild.id), self.app_name, int(self.values[0])+1) | ||||
|         if self.action_type == ActionInteraction.ACCEPT: | ||||
|             editor = ActionAcceptEditorView(str(interaction.guild.id), self.app_name) | ||||
|             embed = get_actions_embed(str(interaction.guild.id), self.app_name, ActionInteraction.ACCEPT) | ||||
|         if self.action_type == ActionInteraction.DECLINE: | ||||
|             editor = ActionDeclineEditorView(str(interaction.guild.id), self.app_name) | ||||
|             embed = get_actions_embed(str(interaction.guild.id), self.app_name, ActionInteraction.DECLINE) | ||||
|         await interaction.response.edit_message(embed = embed, view = editor) | ||||
| 
 | ||||
| 
 | ||||
| class SelectActionOptionsEditor(discord.ui.Select): | ||||
|     async def callback(self, interaction: discord.Interaction): | ||||
|         self.disabled = True | ||||
| 
 | ||||
|         view = discord.ui.View() | ||||
|         options = SelectActionType(max_values=1, placeholder="Select Action™ type") | ||||
|         options.add_option(label="Accept", value="accept") | ||||
|         options.add_option(label="Decline", value="decline") | ||||
|         options.set_app_name(self.values[0]) | ||||
|         view.add_item(options) | ||||
|         await interaction.response.edit_message(view=view) | ||||
| 
 | ||||
| class SelectActionType(discord.ui.Select): | ||||
|     def set_app_name(self, app_name): | ||||
|         self.app_name = app_name | ||||
| 
 | ||||
|     async def callback(self, interaction: discord.Interaction): | ||||
|         self.disabled = True | ||||
|         if self.values[0] == "accept": | ||||
|             editor = ActionAcceptEditorView(str(interaction.guild.id), self.app_name) | ||||
|             embed = get_actions_embed(str(interaction.guild.id), self.app_name, ActionInteraction.ACCEPT) | ||||
|         if self.values[0] == "decline": | ||||
|             editor = ActionDeclineEditorView(str(interaction.guild.id), self.app_name) | ||||
|             embed = get_actions_embed(str(interaction.guild.id), self.app_name, ActionInteraction.DECLINE) | ||||
|         await interaction.response.edit_message(embed = embed, view=editor) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # View with button that starts the application process | ||||
| class ApplicationStartButtonView(discord.ui.View): | ||||
|     def __init__(self): | ||||
|  |  | |||
							
								
								
									
										13
									
								
								dbutil.py
								
								
								
								
							
							
						
						
									
										13
									
								
								dbutil.py
								
								
								
								
							|  | @ -3,7 +3,7 @@ import os | |||
| import sqlite3 | ||||
| import pickle | ||||
| 
 | ||||
| from action import Action | ||||
| from action import Action, ActionInteraction | ||||
| 
 | ||||
| 
 | ||||
| class MessageDB(): | ||||
|  | @ -247,14 +247,13 @@ class GuildAppDB(): | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     def add_action(guild_id: str, application_name: str, action: Action) -> str: | ||||
|     def add_action(guild_id: str, application_name: str, action: dict) -> str: | ||||
|         con = sqlite3.connect("applications.db") | ||||
|         cur = con.cursor() | ||||
|         cur.execute("SELECT applications_blob FROM app_guildapp_db WHERE guild_id=(?)", (guild_id, )) | ||||
|         application_blob = cur.fetchone() | ||||
|         applications = pickle.loads(application_blob[0]) | ||||
|         if application_name in applications.keys(): | ||||
|             action_index = int(len(applications[application_name]["actions"])) | ||||
|             applications[application_name]["actions"].append(action) | ||||
|             application_blob2 = pickle.dumps(applications) | ||||
|             cur.execute("UPDATE app_guildapp_db SET applications_blob = (?) WHERE guild_id= (?)", (application_blob2, guild_id)) | ||||
|  | @ -263,7 +262,7 @@ class GuildAppDB(): | |||
|         else: | ||||
|             return "error on add action: application not found" | ||||
| 
 | ||||
|     def get_actions(guild_id: str, application_name: str): | ||||
|     def get_actions(guild_id: str, application_name: str, action_type: ActionInteraction): | ||||
|         con = sqlite3.connect("applications.db") | ||||
|         cur = con.cursor() | ||||
|         cur.execute("SELECT applications_blob FROM app_guildapp_db WHERE guild_id=(?)", (guild_id, )) | ||||
|  | @ -271,7 +270,11 @@ class GuildAppDB(): | |||
|         applications = pickle.loads(application_blob[0]) | ||||
|         if application_name in applications.keys(): | ||||
|             actions = applications[application_name]["actions"] | ||||
|             return actions | ||||
|             actret = [] | ||||
|             for i in actions: | ||||
|                 if i["result"] == action_type: | ||||
|                     actret.append(i) | ||||
|             return actret | ||||
|         else: | ||||
|             return "error on get actions: application not found" | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										10
									
								
								scheme.py
								
								
								
								
							
							
						
						
									
										10
									
								
								scheme.py
								
								
								
								
							|  | @ -16,12 +16,14 @@ application_name: { | |||
|     "app_id": "", # basically useless but hey its there | ||||
|     "resp_channel": "", | ||||
|     "questions": [], | ||||
|     "actions": { | ||||
|         "action_name": { | ||||
|     "actions": [ | ||||
|             { | ||||
|             "result": ActionInteraction.ACCEPT, | ||||
|             "action_type": "action_type", | ||||
|             "data": "" | ||||
|             }, | ||||
|         "action_name2": Action() | ||||
|         {} | ||||
| 
 | ||||
|     } | ||||
|     ] | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue