8.9 KiB
8.9 KiB
🤖 Команды бота
Полное описание всех команд Telegram бота.
📋 Список команд
| Команда | Описание | Доступность |
|---|---|---|
/start |
Начать работу с ботом | Все пользователи |
/help |
Показать справку | Все пользователи |
/clear |
Очистить историю диалога | Все пользователи |
/settings |
Показать текущие настройки | Все пользователи |
/status |
Проверить статус бота | Все пользователи |
🔧 Детальное описание
/start
Описание: Инициализация бота и приветствие пользователя.
Использование:
/start
Ответ:
👋 Привет! Я готов к общению.
Просто напиши мне что-нибудь, и я отвечу.
Используй /help для списка команд.
Что происходит:
- Создается новая сессия (если не существует)
- Загружается системный промпт
- Отправляется приветственное сообщение
Реализация:
public class StartCommand : TelegramCommandBase
{
public override string Command => "start";
public override string Description => "Начать работу с ботом";
public override async Task<ReplyInfo> ExecuteAsync(TelegramCommandContext context)
{
// Логика команды
}
}
/help
Описание: Показать список всех доступных команд.
Использование:
/help
Ответ:
📖 Доступные команды:
/start - Начать работу с ботом
/help - Показать эту справку
/clear - Очистить историю диалога
/settings - Показать текущие настройки
/status - Проверить статус бота
💬 Просто напиши мне сообщение, и я отвечу!
Динамическая генерация:
Список команд генерируется автоматически через CommandRegistry:
var commands = _commandRegistry.GetAllCommands();
foreach (var cmd in commands)
{
message += $"/{cmd.Command} - {cmd.Description}\n";
}
/clear
Описание: Очистить историю диалога с сохранением сессии.
Использование:
/clear
Ответ:
🧹 История диалога очищена!
Можешь начать новый разговор.
Что происходит:
- Вызывается
ChatService.ClearHistoryAsync(chatId) - Удаляются все сообщения из истории
- Сохраняется системный промпт
- Обновляется
LastUpdatedAt
Важно:
- Сессия не удаляется
- Настройки модели сохраняются
- История в БД обновляется
Код:
public override async Task<ReplyInfo> ExecuteAsync(TelegramCommandContext context)
{
await _chatService.ClearHistoryAsync(context.ChatId);
return new ReplyInfo { Text = "🧹 История диалога очищена!" };
}
/settings
Описание: Показать текущие настройки сессии.
Использование:
/settings
Ответ:
⚙️ Текущие настройки:
🤖 Модель: gemma2:2b
🌡️ Temperature: 0.9
📝 Сообщений в истории: 5/30
🗜️ Сжатие истории: Включено
📊 Порог сжатия: 20 сообщений
🎯 Цель сжатия: 10 сообщений
Информация:
- Используемая AI модель
- Температура генерации
- Количество сообщений в истории
- Статус сжатия истории
- Пороги компрессии
Код:
var session = _chatService.GetSession(context.ChatId);
if (session == null)
return new ReplyInfo { Text = "Сессия не найдена" };
var info = $@"⚙️ Текущие настройки:
🤖 Модель: {session.Model}
📝 Сообщений: {session.GetMessageCount()}/{session.MaxHistoryLength}";
return new ReplyInfo { Text = info };
/status
Описание: Проверить статус бота и подключенных сервисов.
Использование:
/status
Ответ (все ОК):
✅ Статус системы:
🤖 Telegram Bot: ✅ Работает
🧠 Ollama AI: ✅ Подключен
💾 База данных: ✅ Доступна
📊 Активных сессий: 5
🕐 Время работы: 2ч 15м
Ответ (есть проблемы):
⚠️ Статус системы:
🤖 Telegram Bot: ✅ Работает
🧠 Ollama AI: ❌ Недоступен
💾 База данных: ✅ Доступна
Обнаружены проблемы с подключением к Ollama.
Проверки:
- Telegram Bot - Проверка
TelegramBotHealthCheck - Ollama AI - Проверка доступности API
- Database - Проверка подключения к PostgreSQL
- Active Sessions - Количество активных чатов
- Uptime - Время работы бота
Health Checks:
var healthCheckService = _serviceProvider.GetRequiredService<HealthCheckService>();
var result = await healthCheckService.CheckHealthAsync();
foreach (var entry in result.Entries)
{
var status = entry.Value.Status == HealthStatus.Healthy ? "✅" : "❌";
message += $"{entry.Key}: {status}\n";
}
🎨 Формат ответов
ReplyInfo
Все команды возвращают ReplyInfo:
public class ReplyInfo
{
public string Text { get; set; } // Текст ответа
public bool DisableNotification { get; set; } = false;
public bool DisableWebPagePreview { get; set; } = false;
}
Markdown форматирование
Поддерживаемые форматы:
**bold**- жирный*italic*- курсив`code`-код- Emoji - 🚀 ✅ ❌ ⚙️
🔄 Command Processing Flow
User sends command
↓
TelegramBotService receives update
↓
TelegramMessageHandler validates
↓
TelegramCommandProcessor checks if command
↓
CommandRegistry finds handler
↓
Command.ExecuteAsync()
↓
Return ReplyInfo
↓
TelegramMessageSender sends response
🛠️ Добавление новой команды
1. Создать класс команды
public class MyCommand : TelegramCommandBase
{
public override string Command => "mycommand";
public override string Description => "Описание команды";
public override async Task<ReplyInfo> ExecuteAsync(TelegramCommandContext context)
{
// Ваша логика
return new ReplyInfo
{
Text = "Ответ команды"
};
}
}
2. Зарегистрировать в DI
В Program.cs:
builder.Services.AddScoped<ITelegramCommand, MyCommand>();
3. Добавить в BotFather (опционально)
/setcommands
start - Начать работу
help - Справка
mycommand - Описание
🧪 Тестирование команд
[Fact]
public async Task StartCommand_ShouldReturnWelcomeMessage()
{
// Arrange
var command = new StartCommand();
var context = new TelegramCommandContext
{
ChatId = 123,
UserId = 456
};
// Act
var result = await command.ExecuteAsync(context);
// Assert
result.Text.Should().Contain("Привет");
}
📊 Статистика использования
Логирование команд:
_logger.LogInformation(
"Command executed: {Command} by user {UserId} in chat {ChatId}",
Command, context.UserId, context.ChatId
);
🔐 Безопасность
Валидация контекста
if (context.ChatId <= 0)
throw new ArgumentException("Invalid chat ID");
Rate Limiting (будущее)
Планируется добавить ограничение частоты команд.