//! 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, /// ID текущего открытого чата. pub current_chat_id: Option, /// Текущее закрепленное сообщение открытого чата. pub current_pinned_message: Option, /// Очередь сообщений для отметки как прочитанных: (chat_id, message_ids). pub pending_view_messages: Vec<(ChatId, Vec)>, /// 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)); } } }