Skip to content

Обработка сообщений

Обработка текстовых сообщений — одна из основных функций Telegram бота. Пакет предоставляет гибкие возможности для работы с сообщениями.

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}");
});

Проверка текста сообщения по строковому паттерну:

// Точное совпадение
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');
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;
// Обработка ответа
});