ekonda / kutana

The library for developing systems for messengers and social networks
MIT License
72 stars 17 forks source link

Инкапсулируйте плагины в поддиректории #68

Closed nukdokplex closed 1 year ago

nukdokplex commented 1 year ago

Почему это нужно? Опираясь на опыт Red (Discord bot), разделение плагинов над поддиректории поможет избежать путаницы, удобно дистрибутировать и распространять плагины, как это сделано в вышеприведенном фреймворке. Также в последствии можно будет создать репозиторий с плагинами.

Ожидаемое поведение

Я предлагаю сделать структуру плагинов такой: внутри папки plugins/ будут находиться подпапки, названные как плагины. Внутри каждой папки будет находится __init__.py, который будет создавать плагин, подпапка i18n с переводами для каждого конкретного плагина. Структура должна получится примерно такой: image

Текущее поведение

Плагины расположены в виде файлов внутри папки plugins/, инкапсулированы на уровне файлов. Переводы слиты в один файл, что неудобно переводчикам и разработчикам.

Решение

Нужно просто немного изменить несколько функций внутри класса "Kutana", изменить то, как загружает переводы модуль i18n - и начало будет положено.

Контекст

В моей реализации бота я решил инкапсулировать плагины в поддиректории самостоятельно. Для это написал небольшую функцию:

def load_plugins_from_dir(bot: Kutana, directory="plugins") -> None:
    """Loads all plugins from subdirectories in current working directory's subdirectory using reflection"""

    path = Path.cwd() / directory

    if not path.exists():
        raise FileNotFoundError("Directory doesn't exist!")
    if not path.is_dir():
        raise NotADirectoryError("Path is not a directory!")

    for subdir in path.glob("*"):
        if subdir.is_dir():
            # from plugins.ping import plugins
            module = __import__(f"{directory}.{subdir.name}")
            plugin = getattr(module, subdir.name)
            plugin = getattr(plugin, "plugin")

            if isinstance(plugin, kutana.Plugin):
                bot.add_plugin(plugin)
michaelkryukov commented 1 year ago

Kutana стремится быть инструментом, который можно использовать так, как удобно разработчику, и который не устанавливает инфраструктурных требований. Сейчас ничто не мешает создавать репозитории с плагинами и распространять их, и уже сейчас kutana выгружает плагины рекурсивно, переводы i18n работают так же.

Поэтому из интересного стоит заменить, что надо научить кутану подгружать модули, а не отдельные файлы, но это уже доработка, которая слабо связана с этим issue. Вообще i18n, скорее всего, будет удален.