Обработка сообщений
Обработка текстовых сообщений — одна из основных функций Telegram бота. Пакет предоставляет гибкие возможности для работы с сообщениями.
Базовое использование
Section titled “Базовое использование”Все сообщения
Section titled “Все сообщения”use HybridGram\Facades\TelegramRouter;use HybridGram\Core\Routing\RouteData\TextMessageData;
TelegramRouter::onMessage(function(TextMessageData $data) { $message = $data->message; // Текст сообщения $chatId = $data->getChat()->id;
$telegram = app(\HybridGram\Telegram\TelegramBotApi::class); $telegram->sendMessage($chatId, "Вы написали: {$message}");});Сообщения по паттерну
Section titled “Сообщения по паттерну”Проверка текста сообщения по строковому паттерну:
// Точное совпадениеTelegramRouter::onMessage(function(MessageData $data) { // ...}, '*', 'привет');
// С использованием wildcard (Laravel Str::is)TelegramRouter::onMessage(function(MessageData $data) { // Сработает для: "привет", "привет всем", "скажи привет"}, '*', 'привет*');Кастомная проверка через Closure
Section titled “Кастомная проверка через Closure”Для сложной логики используйте closure:
TelegramRouter::onMessage(function(MessageData $data) { // Обработка}, '*', function(MessageData $data) { // Возвращайте true, если роут должен сработать $text = $data->message;
// Проверка длины if (strlen($text) < 10) { return false; }
// Проверка на наличие ключевых слов $keywords = ['заказ', 'доставка', 'оплата']; return str_contains($text, $keywords);});Доступ к данным сообщения
Section titled “Доступ к данным сообщения”Объект MessageData содержит:
TelegramRouter::onMessage(function(MessageData $data) { // Текст сообщения $message = $data->message;
// Полный объект Update $update = $data->update;
// Объект Message из Telegram API $messageObject = $update->message;
// Chat и User $chat = $data->getChat(); $user = $data->getUser();
// Дополнительная информация из сообщения $messageId = $messageObject->messageId; $date = $messageObject->date; $entities = $messageObject->entities; // Форматирование текста});Работа с форматированием
Section titled “Работа с форматированием”Telegram поддерживает различные типы форматирования в сообщениях:
TelegramRouter::onMessage(function(MessageData $data) { $message = $data->update->message;
// Проверка наличия форматирования if ($message->entities !== null) { foreach ($message->entities as $entity) { if ($entity->type === 'bold') { // Обработка жирного текста } if ($entity->type === 'code') { // Обработка кода } } }});Сообщения в контексте состояний
Section titled “Сообщения в контексте состояний”Сообщения часто обрабатываются в зависимости от текущего состояния:
TelegramRouter::onMessage(function(MessageData $data) { $stateManager = app(\HybridGram\Core\State\StateManagerInterface::class); $chat = $data->getChat();
$currentState = $stateManager->getChatState($chat);
if ($currentState?->getName() === 'awaiting_name') { // Пользователь вводит имя $name = $data->message; // Сохранить имя и перейти к следующему шагу }}, '*', function(MessageData $data) { // Проверяем, что это состояние "ожидание имени" $stateManager = app(\HybridGram\Core\State\StateManagerInterface::class); $chat = $data->getChat(); $state = $stateManager->getChatState($chat);
return $state?->getName() === 'awaiting_name';});Фильтрация по типам чатов
Section titled “Фильтрация по типам чатов”Вы можете фильтровать сообщения по типу чата:
TelegramRouter::forBot('main') ->onMessage(function(MessageData $data) { // Только приватные чаты }) ->whereChatType('private');Примеры использования
Section titled “Примеры использования”Эхо-бот
Section titled “Эхо-бот”TelegramRouter::onMessage(function(MessageData $data) { $telegram = app(\HybridGram\Telegram\TelegramBotApi::class); $telegram->sendMessage( $data->getChat()->id, "Вы написали: {$data->message}" );});Поиск по ключевым словам
Section titled “Поиск по ключевым словам”TelegramRouter::onMessage(function(MessageData $data) { $text = strtolower($data->message); $chatId = $data->getChat()->id; $telegram = app(\HybridGram\Telegram\TelegramBotApi::class);
if (str_contains($text, 'погода')) { $telegram->sendMessage($chatId, 'Запрашиваю прогноз погоды...'); // ... } elseif (str_contains($text, 'курс')) { $telegram->sendMessage($chatId, 'Запрашиваю курс валют...'); // ... }}, '*', function(MessageData $data) { $keywords = ['погода', 'курс', 'новости']; $text = strtolower($data->message); return str_contains($text, $keywords);});Обработка длинных сообщений
Section titled “Обработка длинных сообщений”TelegramRouter::onMessage(function(MessageData $data) { $text = $data->message;
// Разбить длинное сообщение на части if (strlen($text) > 4096) { $chunks = str_split($text, 4090); $telegram = app(\HybridGram\Telegram\TelegramBotApi::class);
foreach ($chunks as $chunk) { $telegram->sendMessage($data->getChat()->id, $chunk); } }}, '*', function(MessageData $data) { return strlen($data->message) > 4096;});Обработка ответов на сообщения
Section titled “Обработка ответов на сообщения”Для обработки ответов (reply) на сообщения используйте специальный роут:
use HybridGram\Core\Routing\RouteData\ReplyData;
TelegramRouter::onReply(function(ReplyData $data) { $originalMessage = $data->update->message->replyToMessage; $replyText = $data->update->message->text;
// Обработка ответа});Что дальше?
Section titled “Что дальше?”- Callback Query — обработка нажатий на inline кнопки
- Состояния — управление диалогами