Files
telegram-tui/src/tdlib/reactions.rs
Mikhail Kilin 93e43a59d0 docs: complete rustdoc documentation for all public APIs (P4.12)
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>
2026-02-01 01:03:30 +03:00

198 lines
6.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)),
}
}
}
}
}