5197518029
It's version 0.2.0
54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
import importlib
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
class AddonManager:
|
||
def __init__(self, dp, state, bot):
|
||
self.dp = dp
|
||
self.state = state
|
||
self.bot = bot
|
||
self.loaded = {}
|
||
|
||
def load(self, name: str):
|
||
"""Загрузить аддон по имени"""
|
||
if name in self.loaded:
|
||
return f"Аддон {name} уже загружен"
|
||
|
||
module_path = f"addons.{name}"
|
||
module = importlib.import_module(module_path)
|
||
if hasattr(module, "register"):
|
||
module.register(self.dp, self.state, self.bot)
|
||
self.loaded[name] = module
|
||
return f"✅ Аддон {name} подключен"
|
||
return f"⚠️ У аддона {name} нет функции register"
|
||
|
||
def unload(self, name: str):
|
||
"""Отключить аддон"""
|
||
module = self.loaded.get(name)
|
||
if not module:
|
||
return f"Аддон {name} не загружен"
|
||
|
||
if hasattr(module, "unregister"):
|
||
module.unregister(self.dp)
|
||
|
||
# Удаляем из sys.modules, чтобы можно было перезагрузить
|
||
sys.modules.pop(f"addons.{name}", None)
|
||
self.loaded.pop(name)
|
||
return f"❌ Аддон {name} отключен"
|
||
|
||
def reload(self, name: str):
|
||
"""Перезагрузить аддон"""
|
||
self.unload(name)
|
||
return self.load(name)
|
||
|
||
def list_addons(self):
|
||
"""Возвращает список (имя, состояние) для всех аддонов"""
|
||
addons_path = Path("addons")
|
||
result = []
|
||
for addon in addons_path.iterdir():
|
||
if addon.is_dir() and (addon / "__init__.py").exists():
|
||
name = addon.name
|
||
status = "✅ Загружен" if name in self.loaded else "❌ Выключен"
|
||
result.append((name, status))
|
||
return result
|