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