Введение в разработку модулей
Это руководство проведёт вас через создание модуля ErisPulse с нуля.
Структура проекта
Стандартная структура модуля:
MyModule/
├── pyproject.toml
├── README.md
├── LICENSE
└── MyModule/
├── __init__.py
└── Core.py
Конфигурация pyproject.toml
[project]
name = "ErisPulse-MyModule"
version = "1.0.0"
description = "Описание функционала модуля"
readme = "README.md"
requires-python = ">=3.10"
license = { file = "LICENSE" }
authors = [ { name = "yourname", email = "[email protected]" } ]
dependencies = []
[project.urls]
"homepage" = "https://github.com/yourname/MyModule"
[project.entry-points."erispulse.module"]
"MyModule" = "MyModule:Main"
init.py
from .Core import Main
Core.py - Базовый модуль
from ErisPulse import sdk
from ErisPulse.Core.Bases import BaseModule
from ErisPulse.Core.Event import command
class Main(BaseModule):
def __init__(self, sdk):
self.sdk = sdk
self.logger = sdk.logger.get_child("MyModule")
self.storage = sdk.storage
@staticmethod
def get_load_strategy():
"""Возвращает стратегию загрузки модуля"""
from ErisPulse.loaders import ModuleLoadStrategy
return ModuleLoadStrategy(
lazy_load=True,
priority=0,
depends=[], # Опционально: список зависимых других модулей
# Опционально: ленивая активация по событиям — объявите триггеры, модуль загрузится при первом совпадении события/команды
# activate_on=[{"command": {"name": "hello", "help": "Отправить приветствие"}}],
)
async def on_load(self, event):
"""Вызывается при загрузке модуля"""
@command("hello", help="Отправить приветствие")
async def hello_command(event):
name = event.get_user_nickname() or "друг"
await event.reply(f"Привет, {name}!")
self.logger.info("Модуль загружен")
async def on_unload(self, event):
"""Вызывается при выгрузке модуля"""
self.logger.info("Модуль выгружен")
Чтение конфигурации: в приведённом базовом примере конфигурация не используется. При необходимости чтения конфигурации рекомендуется объявить вложенный класс
ConfigClassи читать его черезself.cfgв реальном времени (см. Основные концепции модуля). Старый способ — ручной вызов_load_config()— устарел.
Тестирование модуля
Локальное тестирование
# Установка модуля в проекте
epsdk install ./MyModule
# Запуск проекта
epsdk run main.py --reload
Тестовые команды
Отправьте команду для тестирования:
/hello
Основные концепции
Базовый класс BaseModule
Все модули должны наследоваться от BaseModule, предоставляя следующие методы:
| Метод | Описание | Обязательно |
|---|---|---|
__init__(self, sdk) |
Конструктор (в sdk передаётся экземпляр фреймворка) |
Нет |
get_load_strategy() |
Возвращает стратегию загрузки | Нет |
get_meta() |
Возвращает метаинформацию о модуле (опционально) | Нет |
on_load(self, event) |
Вызывается при загрузке модуля | Да |
on_unload(self, event) |
Вызывается при выгрузке модуля | Да |
Метаинформация о модуле
ВАЖНО Эта функция доступна в ErisPulse 2.8.0+.
Метаинформация о модуле может быть объявлена через get_meta(), описывая, для чего модуль предназначен и к какой категории относится. Метаинформация — это общие сведения о модуле, которые могут использоваться различными интерфейсами и экосистемными модулями, такими как help, Dashboard, список модулей, магазин модулей и т.д.
Как и в случае с get_load_strategy(), рекомендуется возвращать экземпляр конфигурационного класса ModuleMeta (с ключами типизации, автодополнение IDE), но также допускается возвращать dict:
class MyModule(BaseModule):
@staticmethod
def get_meta() -> ModuleMeta:
return ModuleMeta(
name="Погода", # Отображаемое имя (по умолчанию имя регистрации)
description="Получение погоды города", # Описание модуля
version="1.0.0",
author="ErisDev",
group="Инструменты", # Категория функционала
tags=["Погода", "Поиск"],
)
Альтернативный способ (dict):
class MyModule(BaseModule):
@staticmethod
def get_meta() -> dict:
return {
"name": "Погода",
"description": "Получение погоды города",
"version": "1.0.0",
"author": "ErisDev",
"group": "Инструменты",
"tags": ["Погода", "Поиск"],
}
module.get_meta("MyModule")читает уже разобранные метаданные (сначала класс, затем info, автоматически дополняет имена команд этого модуля).module.get_commands_overview()объединяет «метаданные модуля + зарегистрированные команды (алиасы/группы/помощь)», формируя обзор команд по модулям.- Модуль, к которому принадлежит команда, можно получить через
cmd_info["owner"](автоматически вставляется контекстной системой при регистрации).
Поддержка i18n для полей метаинформации
Значения полей метаинформации могут быть простыми строками или словарями i18n {"i18n": "key.path", "default": "текст по умолчанию"} (в соответствии с соглашением для description конфигурации).
Ключи перевода объявляются через I18nClass, а при чтении module.get_meta() автоматически разрешаются в текст текущего языка:
class MyModule(BaseModule):
class I18nClass(BaseI18n):
meta_description: I18nKey = I18nKey(
default="Weather lookup",
zh_CN="Получение погоды города",
en="Weather lookup",
)
@staticmethod
def get_meta() -> ModuleMeta:
return ModuleMeta(
name="Погода",
description={"i18n": "MyModule.meta_description", "default": "Weather lookup"},
)
Объект SDK
Через объект sdk можно получить доступ к основным функциям:
from ErisPulse import sdk
sdk.storage # Система хранения
sdk.config # Система конфигурации
sdk.logger # Система логирования
sdk.adapter # Система адаптеров
sdk.router # Система маршрутизации
sdk.lifecycle # Система жизненного цикла
Далее
- Основные концепции модуля - Глубокое изучение архитектуры модуля
- Подробное описание классов Event - Изучение объекта Event
- Лучшие практики разработки модулей - Создание качественных модулей