Added comprehensive rustdoc documentation for all TDLib modules, configuration, and utility functions. TDLib modules documented: - src/tdlib/auth.rs - AuthManager, AuthState (6 doctests) - src/tdlib/chats.rs - ChatManager (8 doctests) - src/tdlib/messages.rs - MessageManager (14 methods, 6 doctests) - src/tdlib/reactions.rs - ReactionManager (3 doctests) - src/tdlib/users.rs - UserCache, LruCache (2 doctests) Configuration and utilities: - src/config.rs - Config, ColorsConfig, GeneralConfig (4 doctests) - src/formatting.rs - format_text_with_entities (2 doctests) Documentation includes: - Detailed descriptions of all public structs and methods - Usage examples with code snippets - Parameter and return value documentation - Notes about async behavior and edge cases - Cross-references between related functions Total: 34 doctests (30 ignored for async, 4 compiled) All 464 unit tests passing ✅ Priority 4.12 (Rustdoc) - 100% complete Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
198 lines
6.8 KiB
Rust
198 lines
6.8 KiB
Rust
use crate::types::{ChatId, MessageId};
|
||
use tdlib_rs::enums::ReactionType;
|
||
use tdlib_rs::functions;
|
||
use tdlib_rs::types::ReactionTypeEmoji;
|
||
|
||
/// Менеджер реакций на сообщения.
|
||
///
|
||
/// Управляет добавлением, удалением и получением списка доступных
|
||
/// реакций (emoji) для сообщений в чатах.
|
||
///
|
||
/// # Examples
|
||
///
|
||
/// ```ignore
|
||
/// let reaction_manager = ReactionManager::new(client_id);
|
||
///
|
||
/// // Получить доступные реакции
|
||
/// let reactions = reaction_manager.get_message_available_reactions(
|
||
/// chat_id,
|
||
/// message_id
|
||
/// ).await?;
|
||
///
|
||
/// // Добавить/удалить реакцию
|
||
/// reaction_manager.toggle_reaction(chat_id, message_id, "👍".to_string()).await?;
|
||
/// ```
|
||
pub struct ReactionManager {
|
||
/// ID клиента TDLib для API вызовов.
|
||
client_id: i32,
|
||
}
|
||
|
||
impl ReactionManager {
|
||
/// Создает новый менеджер реакций.
|
||
///
|
||
/// # Arguments
|
||
///
|
||
/// * `client_id` - ID клиента TDLib для API вызовов
|
||
pub fn new(client_id: i32) -> Self {
|
||
Self { client_id }
|
||
}
|
||
|
||
/// Получает список доступных реакций для сообщения.
|
||
///
|
||
/// # Arguments
|
||
///
|
||
/// * `chat_id` - ID чата
|
||
/// * `message_id` - ID сообщения
|
||
///
|
||
/// # Returns
|
||
///
|
||
/// * `Ok(Vec<String>)` - Список доступных emoji реакций
|
||
/// * `Err(String)` - Ошибка получения
|
||
///
|
||
/// # Note
|
||
///
|
||
/// В tdlib-rs 1.8.29 структура AvailableReactions изменилась.
|
||
/// Временно возвращается стандартный набор из 12 популярных реакций.
|
||
///
|
||
/// # Examples
|
||
///
|
||
/// ```ignore
|
||
/// let reactions = manager.get_message_available_reactions(
|
||
/// ChatId::new(123),
|
||
/// MessageId::new(456)
|
||
/// ).await?;
|
||
/// println!("Available: {:?}", reactions);
|
||
/// ```
|
||
pub async fn get_message_available_reactions(
|
||
&self,
|
||
chat_id: ChatId,
|
||
message_id: MessageId,
|
||
) -> Result<Vec<String>, String> {
|
||
// Получаем сообщение
|
||
let msg_result = functions::get_message(chat_id.as_i64(), message_id.as_i64(), self.client_id).await;
|
||
let msg = match msg_result {
|
||
Ok(m) => m,
|
||
Err(e) => return Err(format!("Ошибка получения сообщения: {:?}", e)),
|
||
};
|
||
|
||
// Получаем доступные реакции для чата
|
||
let reactions_result = functions::get_message_available_reactions(
|
||
chat_id.as_i64(),
|
||
message_id.as_i64(),
|
||
10, // row_size
|
||
self.client_id,
|
||
)
|
||
.await;
|
||
|
||
match reactions_result {
|
||
Ok(_available) => {
|
||
// TODO: В tdlib-rs 1.8.29 структура AvailableReactions изменилась
|
||
// Временно используем fallback на стандартные реакции
|
||
let emojis: Vec<String> = Vec::new();
|
||
|
||
// let emojis: Vec<String> = if let tdlib_rs::enums::AvailableReactions::AvailableReactions(ar) = available {
|
||
// ar.top_reactions.iter().filter_map(...).collect()
|
||
// } else {
|
||
// Vec::new()
|
||
// };
|
||
|
||
if emojis.is_empty() {
|
||
// Фолбек на стандартные реакции
|
||
Ok(vec![
|
||
"👍".to_string(),
|
||
"👎".to_string(),
|
||
"❤️".to_string(),
|
||
"🔥".to_string(),
|
||
"😊".to_string(),
|
||
"😢".to_string(),
|
||
"😮".to_string(),
|
||
"🎉".to_string(),
|
||
"🤔".to_string(),
|
||
"😡".to_string(),
|
||
"😎".to_string(),
|
||
"🤝".to_string(),
|
||
])
|
||
} else {
|
||
Ok(emojis)
|
||
}
|
||
}
|
||
Err(_) => {
|
||
// В случае ошибки возвращаем стандартный набор
|
||
Ok(vec![
|
||
"👍".to_string(),
|
||
"👎".to_string(),
|
||
"❤️".to_string(),
|
||
"🔥".to_string(),
|
||
"😊".to_string(),
|
||
"😢".to_string(),
|
||
"😮".to_string(),
|
||
"🎉".to_string(),
|
||
"🤔".to_string(),
|
||
"😡".to_string(),
|
||
"😎".to_string(),
|
||
"🤝".to_string(),
|
||
])
|
||
}
|
||
}
|
||
}
|
||
|
||
/// Переключает реакцию на сообщение (добавляет/удаляет).
|
||
///
|
||
/// Сначала пытается добавить реакцию. Если не удалось (уже есть),
|
||
/// то удаляет её.
|
||
///
|
||
/// # Arguments
|
||
///
|
||
/// * `chat_id` - ID чата
|
||
/// * `message_id` - ID сообщения
|
||
/// * `emoji` - Emoji реакции (например, "👍", "❤️")
|
||
///
|
||
/// # Returns
|
||
///
|
||
/// * `Ok(())` - Реакция переключена
|
||
/// * `Err(String)` - Ошибка переключения
|
||
///
|
||
/// # Examples
|
||
///
|
||
/// ```ignore
|
||
/// // Добавить или удалить 👍
|
||
/// manager.toggle_reaction(chat_id, message_id, "👍".to_string()).await?;
|
||
/// ```
|
||
pub async fn toggle_reaction(
|
||
&self,
|
||
chat_id: ChatId,
|
||
message_id: MessageId,
|
||
emoji: String,
|
||
) -> Result<(), String> {
|
||
let reaction = ReactionType::Emoji(ReactionTypeEmoji { emoji });
|
||
|
||
let result = functions::add_message_reaction(
|
||
chat_id.as_i64(),
|
||
message_id.as_i64(),
|
||
reaction.clone(),
|
||
false, // is_big
|
||
false, // update_recent_reactions
|
||
self.client_id,
|
||
)
|
||
.await;
|
||
|
||
match result {
|
||
Ok(_) => Ok(()),
|
||
Err(_) => {
|
||
// Если добавление не удалось, пытаемся удалить
|
||
let remove_result = functions::remove_message_reaction(
|
||
chat_id.as_i64(),
|
||
message_id.as_i64(),
|
||
reaction,
|
||
self.client_id,
|
||
)
|
||
.await;
|
||
match remove_result {
|
||
Ok(_) => Ok(()),
|
||
Err(e) => Err(format!("Ошибка переключения реакции: {:?}", e)),
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|