import discord from discord import app_commands from discord.ext import commands from customs.log import AuroraLogger error_logger = AuroraLogger('AuroraErrorLog', 'logs/errors.log') # VIEW class Confirm(discord.ui.View): def __init__(self): super().__init__() self.value = None @discord.ui.button(label="✓", style=discord.ButtonStyle.green) async def confirm(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_message("Confirming...", ephemeral=True) self.value = True self.stop() @discord.ui.button(label="✕", style=discord.ButtonStyle.red) async def cancel(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_message("Cancelling...", ephemeral=True) self.value = False self.stop() class Todo(commands.GroupCog, name="todo"): def __init__(self, client): self.client = client @app_commands.command(name="add", description="Adds a task to your todo") @app_commands.describe( task="The task that you want to add to your todo list" ) async def add_task(self, interaction: discord.Interaction, task: str): try: data = await self.client.database.fetch_row("SELECT task FROM todo WHERE user_id = $1", interaction.user.id) if data is None: values: tuple = (interaction.user.id, [task]) await self.client.database.execute("INSERT INTO todo(user_id, task) VALUES ($1, $2)", values[0], values[1]) await interaction.response.send_message(f"<:todo:1003109477375037500> Added task `#1`: `{task}`") elif data is not None: data = await self.client.database.fetch_row("SELECT task FROM todo WHERE user_id = $1", interaction.user.id) length = len(data[0]) formatted_values: list = data[0] formatted_values.append(task) # print(formatted_values) await self.client.database.execute("UPDATE todo set task = $1 WHERE user_id = $2", formatted_values, interaction.user.id) await interaction.response.send_message( f"<:todo:1003109477375037500> Added task `#{length + 1}`: `{task}`") except: error_logger.error("An error occurred while running todo[add] command:- ", exc_info=True) @app_commands.command(name="view", description="Shows your todo list") async def view_tasks(self, interaction: discord.Interaction): try: try: get_list = await self.client.database.fetch_row("SELECT task FROM todo WHERE user_id = $1", interaction.user.id) tasks = get_list[0] formatted_data = [] if len(tasks) == 0: await interaction.response.send_message( "<:hellno:871582891585437759> You do not have any task set in your TODO list!") elif len(tasks) >= 1: for i, k in enumerate(tasks, start=1): formatted_data.append(f"{i}. {k}") raw = '\n'.join(formatted_data) todo = f"```markdown\n{raw}```" embed = discord.Embed(title=f"{interaction.user.name}'s Todo", description=todo, color=discord.Color.brand_green(), timestamp=interaction.created_at) embed.set_thumbnail( url="https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/GNOME_Todo_icon_2019.svg/1200px-GNOME_Todo_icon_2019.svg.png") embed.set_footer(text="It is the southern cousin to the aurora borealis.", icon_url=interaction.user.display_avatar) await interaction.response.send_message(embed=embed) except TypeError: await interaction.response.send_message( "<:hellno:871582891585437759> You do not have any task set in your TODO list!") except: error_logger.error("An error occurred while running todo[view] command:- ", exc_info=True) @app_commands.command(name="remove", description="Remove a todo from the list") @app_commands.describe( task_number="The task number of the task which you want to remove." ) async def remove_task(self, interaction: discord.Interaction, task_number: int): # Get the number of the todo. remove it from the corresponding position of the todo from the list and update it. try: get_list = await self.client.database.fetch_row("SELECT task FROM todo WHERE user_id = $1", interaction.user.id) raw_list: list = get_list[0] if task_number > len(raw_list) or task_number < 1: await interaction.response.send_message("Please give a valid task number!") else: raw_list.pop(task_number - 1) await self.client.database.execute("UPDATE todo SET task = $1 WHERE user_id = $2", raw_list, interaction.user.id) await interaction.response.send_message( f" Successfully removed task `#{task_number}` from your todo list <:todo:1003109477375037500>") except: error_logger.error("An error occurred while running todo[remove] command:- ", exc_info=True) @app_commands.command(name="delete", description="Delete your current todo list") async def delete_list(self, interaction: discord.Interaction): view = Confirm() ConfirmationEmbed = discord.Embed(title=" Confirmation", description="Are you sure that you want to delete your TODO list? This action cannot be undone.", timestamp=interaction.created_at, color=discord.Color.blurple()) await interaction.response.send_message(embed=ConfirmationEmbed, view=view) await view.wait() if view.value is None: await interaction.edit_original_message( embed=discord.Embed(title="<:pandacop:831800704372178944> Confirmation timed out!", description="**You did not click on any of the buttons hence the confirmation timed out.**", color=discord.Colour.red(), timestamp=interaction.created_at)) elif view.value: await self.client.database.execute("DELETE FROM todo WHERE user_id = $1", interaction.user.id) await interaction.edit_original_message(content=" Successfully Deleted your TODO list!", embed=None, view=None) async def setup(client): await client.add_cog(Todo(client))