Другие статьи серии:
3) Исходный код
Бот разработан с использованием языка программирования C# (dotnet 6.0), база данных mongoDb (6.0), для развертывания решения используется docker.
Решение состоит из двух проектов Shared.csproj (библиотека классов) и Taro-bot.csproj(веб-приложение).
Бот написан с прицелом на переиспользование его основы в других проектах и на добавление дополнительных .csproj которые могут использовать общий код который будет находиться в Shared
В проекте с общим кодом находится логика подключения к базе данных и текстовые данные бота (лейблы кнопок и различные текстовые блоки для использования их в сообщениях).
Описание проекта Taro-bot.csproj:
Program.cs
Код в Program.cs представляет собой стандартную настройку ASP.NET Core приложения, которая включает конфигурацию сервисов, настройку маршрутизации и определение конечных точек для обработки HTTP-запросов. Он также включает поддержку gRPC, HTTP-клиента и проверку статуса приложения.
services.Configure<...> используется для привязки конфигурационных секций из файла конфигурации (например, appsettings.json) к соответствующим классам настроек. Это позволяет легко управлять конфигурацией приложения.
Регистрация сервисов:
TaroBotCore - представляет собой реализацию сервиса на основе BackgroundService для работы с Telegram Bot API. Он позволяет боту обрабатывать обновления и взаимодействовать с различными сервисами.
MockGptApi - этот класс реализует эмуляцию вызова API, возвращает форматированную строку, которая включает в себя переданный prompt. Это полезно для тестирования и разработки без необходимости подключения к реальному API.
CardDataFromJsonProvider, PromptFromJsonProvider, TgChannelsProvider - сервисы поставщики данных для бота.
UserService - представляет собой комплексный сервис, который обеспечивает управление пользователями и их взаимодействие с Telegram-ботом. Он включает в себя логику проверки прав пользователей, а также создание и обновление профилей пользователей в базе данных.
MongoDbProvider - реализует интерфейс IMongoDbProvider и предоставляет реализацию метода для создания клиента MongoDB. Он поддерживает как создание клиента через строку подключения, так и через явные настройки, а также логирует процесс создания клиента и возможные ошибки.
TaroBotDbService - организует доступ к базе данных MongoDB в приложении, предоставляя интерфейсы и реализацию для управления профилями пользователей и конфигурации базы данных. TaroBotDbService обеспечивает настройку MongoDB и предоставляет доступ к CRUD-операциям через интерфейс IUserProfileDbCrudOperations.
Данные приложения
В папке Data находятся различные данные которые бот использует для работы: изображения карт, текстовые данные карт, заготовленные шаблоны промтов для языковых моделей, список каналов наличие подписки на которые мы сможем проверять у пользователя.
Общение с языковыми моделями (ChatGPT, Gigachat)
Кроме mock-заглушки для тестирования MockGptApi в боте реализованы фасады для общения с chatgpt и gigachat - ChatGptApi и GigaChatApi
Файл конфигурации appsettings.json
Представлен в формате JSON, содержит различные настройки, используемые приложением. Вот детальное описание каждой секции этого файла:
1. Logging
Назначение: Настройка уровня логирования для приложения.
Default: Устанавливает уровень логирования по умолчанию на Information, что означает запись информационных сообщений и более серьезных сообщений (ошибки, предупреждения и т.д.).
Microsoft.AspNetCore: Устанавливает уровень логирования для компонентов ASP.NET Core на Warning, что означает запись только предупреждений и ошибок.
2. AllowedHosts
Назначение: Определяет, какие хосты могут отправлять запросы к приложению. Значение "*" означает, что приложение разрешает запросы от любых хостов.
3. Kestrel
Назначение: Конфигурация веб-сервера Kestrel.
Protocols: Устанавливает, что Kestrel будет использовать HTTP/2 для всех конечных точек.
4. TelegramApiSettings
Назначение: Настройки для взаимодействия с Telegram API.Token: Токен для аутентификации и доступа к Telegram API. В текущем состоянии он пустой и должен быть заполнен.
5. ChatGptApiSettings
Назначение: Настройки для взаимодействия с API ChatGPT.ApiKey: API-ключ для доступа к ChatGPT. В текущем состоянии он пустой и должен быть заполнен.
6. GigaChatApiSettings
Назначение: Настройки для взаимодействия с GigaChat API.
ClientSecret: Секрет клиента для аутентификации с GigaChat API. Должен быть заполнен.
AuthData: Данные для аутентификации с GigaChat API. Должны быть заполнены.
7. DataSettings
Назначение: Пути к файлам данных, которые используются приложением.
MajorArcanaDataPath: Путь к файлу с данными для карт Старших Арканов.
PentacleDataPath: Путь к файлу с данными для карт Пентаклей.
CupDataPath: Путь к файлу с данными для карт Кубков.
SwordsDataPath: Путь к файлу с данными для карт Мечей.
WandsDataPath: Путь к файлу с данными для карт Жезлов.
PromptsDataPath: Путь к файлу с данными для подсказок.
SubChannelsDataPath: Путь к файлу с данными для проверки подписки на каналы.
8. PermissionsSettings
Назначение: Настройки разрешений для пользователя.
FreeRequestsPerDay: Количество бесплатных запросов, разрешенных пользователю в день.
9. AdminSettings
Назначение: Настройки для определения администраторов приложения.
Admins: Список идентификаторов пользователей, которые имеют административные права. В текущем состоянии он пустой и должен быть заполнен.
10. MainDbSettings
Назначение: Настройки подключения к базе данных MongoDB.
Address: Адрес сервера MongoDB. В текущем состоянии задано как "mongodb", что может быть использовано в Docker-контейнере.
DatabaseName: Имя базы данных, к которой нужно подключиться.
User: Имя пользователя для аутентификации.
Password: Пароль для аутентификации.
MaxConnectionPoolSize: Максимальный размер пула соединений.
MinConnectionPoolSize: Минимальный размер пула соединений.
NeedPassword: Флаг, указывающий, требуется ли пароль для подключения.
Port: Порт MongoDB (по умолчанию 27017).
ConnectionString: Строка подключения, если она используется вместо явных настроек (в текущем состоянии пустая).
В следующей статье рассмотрим принципы работы бота и его функциональность.
Больше статей на boosty 😎