☑️ Использование /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
.
Пример:
# 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
, не вмешиваясь в работу других модулей.