VisionApp/utils/modmail_config.py

111 lines
2.4 KiB
Python
Raw Normal View History

import json
from pathlib import Path
from config import DATA_DIR
CONFIG_PATH = DATA_DIR / "modmail.json"
DEFAULT_CONFIG = {
"enabled": False,
"category_id": None,
"staff_role_id": None,
"log_channel_id": None,
"categories": {},
"open_tickets": {},
}
def _load() -> dict:
if CONFIG_PATH.exists():
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
return json.load(f)
return DEFAULT_CONFIG.copy()
def _save(data: dict):
CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True)
with open(CONFIG_PATH, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
def get_config() -> dict:
return _load()
def set_enabled(guild_id: int, enabled: bool):
data = _load()
data["enabled"] = enabled
_save(data)
def set_category(guild_id: int, category_id: int):
data = _load()
data["category_id"] = category_id
_save(data)
def set_staff_role(guild_id: int, role_id: int):
data = _load()
data["staff_role_id"] = role_id
_save(data)
def set_log_channel(guild_id: int, channel_id: int):
data = _load()
data["log_channel_id"] = channel_id
_save(data)
def add_category(guild_id: int, name: str, emoji: str, description: str = ""):
data = _load()
data["categories"][name.lower()] = {
"name": name,
"emoji": emoji,
"description": description,
}
_save(data)
def remove_category(guild_id: int, name: str):
data = _load()
data["categories"].pop(name.lower(), None)
_save(data)
def get_categories() -> dict:
data = _load()
return data.get("categories", {})
def register_ticket(guild_id: int, user_id: int, channel_id: int, category: str):
data = _load()
data["open_tickets"][str(user_id)] = {
"channel_id": channel_id,
"category": category,
"guild_id": guild_id,
}
_save(data)
def unregister_ticket(user_id: int):
data = _load()
data["open_tickets"].pop(str(user_id), None)
_save(data)
def get_ticket_by_user(user_id: int) -> dict | None:
data = _load()
return data["open_tickets"].get(str(user_id))
def get_ticket_by_channel(channel_id: int) -> dict | None:
data = _load()
for uid, ticket in data.get("open_tickets", {}).items():
if ticket["channel_id"] == channel_id:
return {"user_id": int(uid), **ticket}
return None
def is_enabled() -> bool:
return _load().get("enabled", False)