diff --git a/src/bots/approved_bot/modules/annotations/mod.rs b/src/bots/approved_bot/modules/annotations/mod.rs index 2d77c6c..05b378d 100644 --- a/src/bots/approved_bot/modules/annotations/mod.rs +++ b/src/bots/approved_bot/modules/annotations/mod.rs @@ -18,7 +18,9 @@ use tokio_util::compat::FuturesAsyncReadCompatExt; use crate::bots::{ approved_bot::{ - modules::utils::pagination::generic_get_pagination_keyboard, + modules::utils::{ + message_text::is_message_text_equals, pagination::generic_get_pagination_keyboard, + }, services::book_library::{get_author_annotation, get_book_annotation}, tools::filter_callback_query, }, @@ -145,17 +147,24 @@ where } else { chunked_text.len() }; - let current_text = chunked_text.get(page_index - 1).unwrap(); + let new_text = chunked_text.get(page_index - 1).unwrap(); let keyboard = generic_get_pagination_keyboard(page, chunked_text.len().try_into()?, callback_data, false); - bot.edit_message_text(message.chat().id, message.id(), current_text) + if is_message_text_equals(Some(message.clone()), new_text) { + return Ok(()); + } + + match bot + .edit_message_text(message.chat().id, message.id(), new_text) .reply_markup(keyboard) .send() - .await?; - - Ok(()) + .await + { + Ok(_) => Ok(()), + Err(err) => Err(err.into()), + } } pub fn get_annotations_handler() -> crate::bots::BotHandler { diff --git a/src/bots/approved_bot/modules/book/mod.rs b/src/bots/approved_bot/modules/book/mod.rs index e869748..90823b6 100644 --- a/src/bots/approved_bot/modules/book/mod.rs +++ b/src/bots/approved_bot/modules/book/mod.rs @@ -15,6 +15,7 @@ use teloxide::{ use tracing::log; use crate::bots::approved_bot::{ + modules::utils::message_text::is_message_text_equals, services::{ book_library::{ formatters::{Format, FormatTitle}, @@ -176,12 +177,19 @@ where let keyboard = generic_get_pagination_keyboard(page, items_page.pages, callback_data, true); - bot.edit_message_text(chat_id, message_id, formatted_page) + if is_message_text_equals(cq.message, &formatted_page) { + return Ok(()); + } + + match bot + .edit_message_text(chat_id, message_id, formatted_page) .reply_markup(keyboard) .send() - .await?; - - Ok(()) + .await + { + Ok(_) => Ok(()), + Err(err) => Err(err.into()), + } } pub fn get_book_handler() -> crate::bots::BotHandler { diff --git a/src/bots/approved_bot/modules/search/mod.rs b/src/bots/approved_bot/modules/search/mod.rs index 30f538a..530f5e9 100644 --- a/src/bots/approved_bot/modules/search/mod.rs +++ b/src/bots/approved_bot/modules/search/mod.rs @@ -14,6 +14,7 @@ use teloxide::{ use crate::bots::{ approved_bot::{ + modules::utils::message_text::is_message_text_equals, services::{ book_library::{ formatters::{Format, FormatTitle}, @@ -45,7 +46,7 @@ where let chat_id = cq.chat_id(); let user_id = cq.from.id; let message_id = cq.message.as_ref().map(|message| message.id()); - let query = get_query(cq); + let query = get_query(cq.clone()); let (chat_id, query, message_id) = match (chat_id, query, message_id) { (Some(chat_id), Some(query), Some(message_id)) => (chat_id, query, message_id), @@ -106,15 +107,20 @@ where } let formatted_page = items_page.format(page, 4096); + if is_message_text_equals(cq.message, &formatted_page) { + return Ok(()); + } let keyboard = generic_get_pagination_keyboard(page, items_page.pages, search_data, true); - - bot.edit_message_text(chat_id, message_id, formatted_page) + match bot + .edit_message_text(chat_id, message_id, formatted_page) .reply_markup(keyboard) .send() - .await?; - - Ok(()) + .await + { + Ok(_) => Ok(()), + Err(err) => Err(err.into()), + } } pub async fn message_handler(message: Message, bot: CacheMe>) -> BotHandlerInternal { diff --git a/src/bots/approved_bot/modules/update_history/mod.rs b/src/bots/approved_bot/modules/update_history/mod.rs index 8c2379c..f663a5c 100644 --- a/src/bots/approved_bot/modules/update_history/mod.rs +++ b/src/bots/approved_bot/modules/update_history/mod.rs @@ -4,7 +4,10 @@ pub mod commands; use chrono::{prelude::*, Duration}; use crate::bots::{ - approved_bot::{services::book_library::get_uploaded_books, tools::filter_callback_query}, + approved_bot::{ + modules::utils::message_text::is_message_text_equals, + services::book_library::get_uploaded_books, tools::filter_callback_query, + }, BotHandlerInternal, }; @@ -78,7 +81,7 @@ async fn update_log_pagination_handler( bot: CacheMe>, update_callback_data: UpdateLogCallbackData, ) -> BotHandlerInternal { - let message = match cq.message { + let message = match cq.message.clone() { Some(v) => v, None => { bot.send_message(cq.from.id, "Ошибка! Попробуйте заново(") @@ -138,14 +141,20 @@ async fn update_log_pagination_handler( let formatted_page = items_page.format(page, 4096); let message_text = format!("{header}{formatted_page}"); + if is_message_text_equals(cq.message, &message_text) { + return Ok(()); + } let keyboard = generic_get_pagination_keyboard(page, total_pages, update_callback_data, true); - bot.edit_message_text(message.chat().id, message.id(), message_text) + match bot + .edit_message_text(message.chat().id, message.id(), message_text) .reply_markup(keyboard) .send() - .await?; - - Ok(()) + .await + { + Ok(_) => Ok(()), + Err(err) => Err(err.into()), + } } pub fn get_update_log_handler() -> crate::bots::BotHandler { diff --git a/src/bots/approved_bot/modules/utils/message_text.rs b/src/bots/approved_bot/modules/utils/message_text.rs new file mode 100644 index 0000000..7ac204c --- /dev/null +++ b/src/bots/approved_bot/modules/utils/message_text.rs @@ -0,0 +1,18 @@ +use teloxide::types::*; + +pub fn is_message_text_equals(message: Option, text: &str) -> bool { + let message = match message { + Some(v) => v, + None => return false, + }; + + let message = match message { + MaybeInaccessibleMessage::Inaccessible(_) => return false, + MaybeInaccessibleMessage::Regular(v) => v, + }; + + match message.text() { + Some(msg_text) => text == msg_text, + None => false, + } +} diff --git a/src/bots/approved_bot/modules/utils/mod.rs b/src/bots/approved_bot/modules/utils/mod.rs index e1c34b4..242ae36 100644 --- a/src/bots/approved_bot/modules/utils/mod.rs +++ b/src/bots/approved_bot/modules/utils/mod.rs @@ -1,4 +1,5 @@ pub mod errors; pub mod filter_command; +pub mod message_text; pub mod pagination; pub mod split_text;