Skip to content

☑️ Использование /start

Поскольку PBModular рассчитан на сосуществование нескольких модулей, назначение стандартной команды /start одному модулю было бы нецелесообразным. Вместо этого фреймворк позволяет каждому модулю обрабатывать команды /start, предназначенные именно для него, обычно с помощью payload.

Как это работает

Сама команда /start обычно обрабатывается модулем core или основной логикой приложения бота. Этот начальный обработчик проверяет, содержит ли команда /start payload (например, /start ModuleName-Payload). Если payload указывает на целевой модуль, фреймворк направляет команду в метод start_cmd этого модуля.

Реализация start_cmd

Чтобы обработать целевую команду start, переопределите метод async def start_cmd(self, client: Client, message: Message) в своем основном классе BaseModule.

Важно:

  • Этот метод вызывается только в том случае, если входящее сообщение /start содержит полезную нагрузку, которую фреймворк идентифицирует как принадлежащую вашему модулю. Точный механизм идентификации целевого модуля (например, сопоставление префиксов типа /start YourModuleName_...) зависит от реализации основного обработчика запуска. За подробностями о предполагаемом формате полезной нагрузки обратитесь к основному модулю или основной логике фреймворка.
  • Метод start_cmd не может быть определен внутри ModuleExtension; он должен быть частью класса основного модуля, наследующего непосредственно от BaseModule.

Пример:

python
# main.py (внутри вашего класса BaseModule)
from pyrogram import Client
from pyrogram.types import Message

class MyAuthModule(BaseModule):

    # ... другие методы ...

    async def start_cmd(self, client: Client, message: Message):
        """
        Обрабатывает команды /start MyAuthModule-SomeToken.
        Ожидаемый формат: /start MyAuthModule-ABC123XYZ
        """
        self.logger.info(f"start_cmd запускается пользователем {message.from_user.id}")
        payload = message.command[1] # Предполагается, что команда имеет вид ['/start', 'MyAuthModule-SomeToken'].

        # Проверьте, начинается ли полезная нагрузка с ожидаемого префикса (при необходимости скорректируйте)
        prefix = self.module_info.name + "-" # e.g., "MyAuthModule-"
        if payload.startswith(prefix):
            token = payload[len(prefix):]
            self.logger.info(f"Получена команда запуска с маркером: {token}")
            # Обработайте токен (например, проверьте его, свяжите учетную запись пользователя)
            await self.process_auth_token(message.from_user.id, token)
            await message.reply(self.S["auth_token_received"].format(token=token))
        else:
            # Эта часть может быть даже не достигнута, если маршрутизация строгая
            self.logger.warning(f"Received unexpected payload in start_cmd: {payload}")
            await message.reply(self.S["errors"]["invalid_start_payload"])

    async def process_auth_token(self, user_id, token):
        # Фиктивная функция: Замените на реальную логику обработки токенов
        self.logger.info(f"Processing token {token} for user {user_id}...")
        # (Взаимодействие с базой данных, вызовы API и т.д.)
        pass

    # ... остальная часть класса ...

Реализовав start_cmd, ваш модуль сможет чисто обрабатывать глубокие ссылки или специфические рабочие процессы инициации, запускаемые универсальной командой /start, не вмешиваясь в работу других модулей.