Finisher TodosManager and started creating corresponding commands
This commit is contained in:
parent
53556aeba9
commit
bdac4388b7
|
@ -1,3 +1,4 @@
|
||||||
.env
|
.env
|
||||||
launch.sh
|
launch.sh
|
||||||
src/**/__pycache__
|
src/**/__pycache__
|
||||||
|
compteur_electrique_data
|
|
@ -1,3 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Bot package - Discord bot manager
|
Bot package - Discord bot manager
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
__all__ = ["Bot"]
|
||||||
|
|
||||||
|
from .bot import *
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
from todos_manager import *
|
||||||
|
|
||||||
|
manager = TodosManager()
|
||||||
|
|
||||||
|
print(manager.create_todo("test", "test_todo"))
|
|
@ -1,7 +1,12 @@
|
||||||
from bot.bot import Bot
|
import discord
|
||||||
|
from bot import Bot
|
||||||
|
|
||||||
# Manager controlled by
|
# Manager controlled by
|
||||||
from todos_manager import *
|
from todos_manager import *
|
||||||
|
|
||||||
def setup_todos_manager_commands(bot: Bot):
|
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 !")
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,123 @@
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
|
|
||||||
class TodosManager:
|
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:
|
try:
|
||||||
os.makedirs(todos_dir, exist_ok=True)
|
os.makedirs(todos_dir, exist_ok=True)
|
||||||
except OSError as error:
|
except:
|
||||||
print(f"Error during creation of \"{todos_dir}\" directory")
|
print(f"Error during creation of \"{todos_dir}\" directory")
|
||||||
exit(1)
|
exit(1)
|
||||||
self.todos_dir=todos_dir
|
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
|
||||||
|
|
Loading…
Reference in New Issue