diff --git a/.gitignore b/.gitignore index 20f8f40..317b674 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .env launch.sh -src/**/__pycache__ \ No newline at end of file +src/**/__pycache__ +compteur_electrique_data \ No newline at end of file diff --git a/src/bot/__init__.py b/src/bot/__init__.py index 79edeb6..c616342 100644 --- a/src/bot/__init__.py +++ b/src/bot/__init__.py @@ -1,3 +1,7 @@ """ Bot package - Discord bot manager """ + +__all__ = ["Bot"] + +from .bot import * diff --git a/src/test.py b/src/test.py new file mode 100644 index 0000000..01c0914 --- /dev/null +++ b/src/test.py @@ -0,0 +1,5 @@ +from todos_manager import * + +manager = TodosManager() + +print(manager.create_todo("test", "test_todo")) diff --git a/src/todos_manager/todos_commands.py b/src/todos_manager/todos_commands.py index 3d90859..abcb0a7 100644 --- a/src/todos_manager/todos_commands.py +++ b/src/todos_manager/todos_commands.py @@ -1,7 +1,12 @@ -from bot.bot import Bot +import discord +from bot import Bot # Manager controlled by from todos_manager import * def setup_todos_manager_commands(bot: Bot): - pass + @bot.client.tree.command(name="create_todo", description="Create a new todo list") + async def create_todo(interaction: discord.Interaction, todo_list_name: str): + bot.todos_manager.create_todo(interaction.user.id.__str__(), todo_list_name) + await interaction.response.send_message(f"Todo list \"{todo_list_name}\" successfully created !") + diff --git a/src/todos_manager/todos_manager.py b/src/todos_manager/todos_manager.py index b016168..ff9d3e0 100644 --- a/src/todos_manager/todos_manager.py +++ b/src/todos_manager/todos_manager.py @@ -1,11 +1,123 @@ +import json import os class TodosManager: - def __init__(self, todos_dir=os.path.join("compteur_electrique_data", "todos")): + def __init__(self, todos_dir=os.path.join("compteur_electrique_data", "todos")) -> None: try: os.makedirs(todos_dir, exist_ok=True) - except OSError as error: + except: print(f"Error during creation of \"{todos_dir}\" directory") exit(1) self.todos_dir=todos_dir + # Verify if member todos file exist and is valid, try to correct the error by creating the file or making a backup + def verify_todos_file(self, member_id: str): + member_todos_path = os.path.join(self.todos_dir, f"user_{member_id}_todos.json") + + if os.path.exists(member_todos_path): + with open(member_todos_path, 'r') as user_todos_file: + try: + json.load(user_todos_file) + + except json.JSONDecodeError as e: + print(f"Error decoding JSON file {member_todos_path}: {e}") + + backup_path = member_todos_path + ".backup" + with open(backup_path, 'w') as backup_file: + backup_file.write(user_todos_file.read()) + + print(f"Corrupted file saved under: {backup_path}") + + # Reset member todos + self.write_todos(member_id, {}) + + else: + # Create and init member todos + self.write_todos(member_id, {}) + + # Open member's todos and return its dict form + def get_todos(self, member_id: str) -> dict: + self.verify_todos_file(member_id) + + member_todos_path = os.path.join(self.todos_dir, f"user_{member_id}_todos.json") + + with open(member_todos_path, 'r') as member_todos_file: + member_todos = json.load(member_todos_file) + return member_todos + + # Open a todo and return its entries as a list + def get_todo(self, member_id: str, todo_list_name: str) -> list | None: + member_todos = self.get_todos(member_id) + member_todo = member_todos.get(todo_list_name) + return member_todo + + # Write todos as dict to the member's todos file, IT ASSUMES THAT YOU CALLED verify_todos_file BEFORE ! + def write_todos(self, member_id: str, member_todos: dict) -> None: + member_todos_path = os.path.join(self.todos_dir, f"user_{member_id}_todos.json") + + with open(member_todos_path, 'w') as member_todos_file: + json.dump(member_todos, member_todos_file, indent=4) + + # Create a new todo if possible, return 0 if success, -1 if todo already exists + def create_todo(self, member_id: str, todo_list_name: str) -> int: + self.verify_todos_file(member_id) + + member_todos = self.get_todos(member_id) + if member_todos.get(todo_list_name): return -1 + + member_todos[todo_list_name] = [] + self.write_todos(member_id, member_todos) + + return 0 + + # Remove a todo if possible, return 0 if success, -1 if todo list doesn't exists + def remove_todo(self, member_id: str, todo_list_name: str) -> int: + self.verify_todos_file(member_id) + + member_todos = self.get_todos(member_id) + pop_result = member_todos.pop(todo_list_name, None) + + self.write_todos(member_id, member_todos) + + if pop_result: + return 0 + + return -1 + + # Add an entry to member's selected todo list, return 0 if successs, -1 if entry_content is empty, -2 if todo list doesn't exists or -3 if entry is already in todo list + def add_todo_entry(self, member_id: str, todo_list_name: str, entry_content: str) -> int: + self.verify_todos_file(member_id) + + if not entry_content or not entry_content.strip(): + return -1 + + member_todos = self.get_todos(member_id) + member_todo = member_todos.get(todo_list_name) + if not member_todo: + return -2 + + if entry_content in member_todo: + return -3 + + member_todo.append(entry_content) + self.write_todos(member_id, member_todos) + + return 0 + + # Remove an entry to member's selected todo list, return 0 if success, -1 if entry doesn't exist or -2 if todo list doesn't exists + def remove_todo_entry(self, member_id: str, todo_list_name: str, entry_content: str) -> int: + self.verify_todos_file(member_id) + + if not entry_content or not entry_content.strip(): + return -1 + + member_todos = self.get_todos(member_id) + member_todo = member_todos.get(todo_list_name) + if not member_todo: + return -2 + + if entry_content in member_todo: + member_todo.remove(entry_content) + self.write_todos(member_id, member_todos) + + return 0