Some checks failed
ci/woodpecker/pr/check Pipeline failed
CI / Check (pull_request) Has been cancelled
CI / Format (pull_request) Has been cancelled
CI / Clippy (pull_request) Has been cancelled
CI / Build (macos-latest) (pull_request) Has been cancelled
CI / Build (ubuntu-latest) (pull_request) Has been cancelled
CI / Build (windows-latest) (pull_request) Has been cancelled
103 lines
3.9 KiB
Rust
103 lines
3.9 KiB
Rust
//! Message management: storage, conversion, and TDLib API operations.
|
||
|
||
mod convert;
|
||
mod operations;
|
||
|
||
use crate::constants::MAX_MESSAGES_IN_CHAT;
|
||
use crate::types::{ChatId, MessageId};
|
||
|
||
use super::types::MessageInfo;
|
||
|
||
/// Менеджер сообщений TDLib.
|
||
///
|
||
/// Управляет загрузкой, отправкой, редактированием и удалением сообщений.
|
||
/// Кеширует сообщения текущего открытого чата и закрепленные сообщения.
|
||
///
|
||
/// # Основные возможности
|
||
///
|
||
/// - Загрузка истории сообщений чата
|
||
/// - Отправка текстовых сообщений с поддержкой Markdown
|
||
/// - Редактирование и удаление сообщений
|
||
/// - Пересылка сообщений между чатами
|
||
/// - Поиск сообщений по тексту
|
||
/// - Управление закрепленными сообщениями
|
||
/// - Управление черновиками
|
||
/// - Автоматическая отметка сообщений как прочитанных
|
||
///
|
||
/// # Examples
|
||
///
|
||
/// ```ignore
|
||
/// let mut msg_manager = MessageManager::new(client_id);
|
||
///
|
||
/// // Загрузить историю чата
|
||
/// let messages = msg_manager.get_chat_history(chat_id, 50).await?;
|
||
///
|
||
/// // Отправить сообщение
|
||
/// let msg = msg_manager.send_message(
|
||
/// chat_id,
|
||
/// "Hello, **world**!".to_string(),
|
||
/// None,
|
||
/// None
|
||
/// ).await?;
|
||
/// ```
|
||
pub struct MessageManager {
|
||
/// Список сообщений текущего открытого чата (до MAX_MESSAGES_IN_CHAT).
|
||
pub current_chat_messages: Vec<MessageInfo>,
|
||
|
||
/// ID текущего открытого чата.
|
||
pub current_chat_id: Option<ChatId>,
|
||
|
||
/// Текущее закрепленное сообщение открытого чата.
|
||
pub current_pinned_message: Option<MessageInfo>,
|
||
|
||
/// Очередь сообщений для отметки как прочитанных: (chat_id, message_ids).
|
||
pub pending_view_messages: Vec<(ChatId, Vec<MessageId>)>,
|
||
|
||
/// ID клиента TDLib для API вызовов.
|
||
pub(crate) client_id: i32,
|
||
}
|
||
|
||
impl MessageManager {
|
||
/// Создает новый менеджер сообщений.
|
||
///
|
||
/// # Arguments
|
||
///
|
||
/// * `client_id` - ID клиента TDLib для API вызовов
|
||
///
|
||
/// # Returns
|
||
///
|
||
/// Новый экземпляр `MessageManager` с пустым списком сообщений.
|
||
pub fn new(client_id: i32) -> Self {
|
||
Self {
|
||
current_chat_messages: Vec::new(),
|
||
current_chat_id: None,
|
||
current_pinned_message: None,
|
||
pending_view_messages: Vec::new(),
|
||
client_id,
|
||
}
|
||
}
|
||
|
||
/// Добавляет сообщение в список текущего чата.
|
||
///
|
||
/// Автоматически ограничивает размер списка до [`MAX_MESSAGES_IN_CHAT`],
|
||
/// удаляя старые сообщения при превышении лимита.
|
||
///
|
||
/// # Arguments
|
||
///
|
||
/// * `msg` - Сообщение для добавления
|
||
///
|
||
/// # Note
|
||
///
|
||
/// Сообщение добавляется в конец списка. При превышении лимита
|
||
/// удаляются самые старые сообщения из начала списка.
|
||
pub fn push_message(&mut self, msg: MessageInfo) {
|
||
self.current_chat_messages.push(msg); // Добавляем в конец
|
||
|
||
// Ограничиваем размер списка (удаляем старые с начала)
|
||
if self.current_chat_messages.len() > MAX_MESSAGES_IN_CHAT {
|
||
self.current_chat_messages
|
||
.drain(0..(self.current_chat_messages.len() - MAX_MESSAGES_IN_CHAT));
|
||
}
|
||
}
|
||
}
|