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)` - Список доступных 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, 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 = Vec::new(); // let emojis: Vec = 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)), } } } } }