diff --git a/Cargo.toml b/Cargo.toml index 177135e..78b2886 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fulturate" -version = "0.13.0" +version = "0.13.1" edition = "2024" [dependencies] diff --git a/src/bot/callbacks/mod.rs b/src/bot/callbacks/mod.rs index 0e41464..5f2ad48 100644 --- a/src/bot/callbacks/mod.rs +++ b/src/bot/callbacks/mod.rs @@ -10,7 +10,7 @@ use crate::{ whisper::handle_whisper_callback, }, commands::settings::update_settings_message, - modules::{registry::MOD_MANAGER, Owner}, + modules::{Owner, registry::MOD_MANAGER}, }, core::{ config::Config, @@ -18,13 +18,13 @@ use crate::{ }, errors::MyError, }; +use log::info; use std::sync::Arc; use teloxide::{ - payloads::EditMessageTextSetters, - prelude::{CallbackQuery, Requester}, Bot, + payloads::{AnswerCallbackQuerySetters, EditMessageTextSetters}, + prelude::{CallbackQuery, Requester}, }; -use teloxide::payloads::AnswerCallbackQuerySetters; pub mod cobalt_pagination; pub mod delete; @@ -71,58 +71,88 @@ fn parse_callback_data(data: &'_ str) -> Option> { if let Some(rest) = data.strip_prefix("module_select:") { let parts: Vec<_> = rest.split(':').collect(); if parts.len() == 4 - && let Ok(commander_id) = parts[3].parse() { - return Some(CallbackAction::ModuleSelect { - owner_type: parts[0], - owner_id: parts[1], - module_key: parts[2], - commander_id, - }); - } + && let Ok(commander_id) = parts[3].parse() + { + return Some(CallbackAction::ModuleSelect { + owner_type: parts[0], + owner_id: parts[1], + module_key: parts[2], + commander_id, + }); + } } if let Some(rest) = data.strip_prefix("settings_back:") { let parts: Vec<_> = rest.split(':').collect(); if parts.len() == 3 - && let Ok(commander_id) = parts[2].parse() { - return Some(CallbackAction::SettingsBack { - owner_type: parts[0], - owner_id: parts[1], - commander_id, - }); - } + && let Ok(commander_id) = parts[2].parse() + { + return Some(CallbackAction::SettingsBack { + owner_type: parts[0], + owner_id: parts[1], + commander_id, + }); + } } if let Some(module_key) = MOD_MANAGER.get_all_modules().iter().find_map(|m| { - data.starts_with(&format!("{}:settings:", m.key())).then_some(m.key()) + data.starts_with(&format!("{}:settings:", m.key())) + .then_some(m.key()) }) { - let rest_with_id = data.strip_prefix(&format!("{}:settings:", module_key)).unwrap_or(""); - let parts: Vec<_> = rest_with_id.rsplitn(2, ':').collect(); - if parts.len() == 2 - && let Ok(commander_id) = parts[0].parse() { - let rest = parts[1]; - return Some(CallbackAction::ModuleSettings { - module_key, - rest, - commander_id, - }); - } + let full_rest = data + .strip_prefix(&format!("{}:settings:", module_key)) + .unwrap_or_default(); + + if let Some((rest, id_str)) = full_rest.rsplit_once(':') + && let Ok(commander_id) = id_str.parse() + { + return Some(CallbackAction::ModuleSettings { + module_key, + rest, + commander_id, + }); + } + + return Some(CallbackAction::ModuleSettings { + module_key, + rest: full_rest, + commander_id: 0, + }); } if let Some(commander_id_str) = data.strip_prefix("delete_data:") - && let Ok(commander_id) = commander_id_str.parse() { - return Some(CallbackAction::DeleteData { commander_id }); - } + && let Ok(commander_id) = commander_id_str.parse() + { + return Some(CallbackAction::DeleteData { commander_id }); + } - if data.starts_with("delete_data_confirm:") { return Some(CallbackAction::DeleteDataConfirmation); } - if data.starts_with("delete_msg") { return Some(CallbackAction::DeleteMessage); } - if data.starts_with("delete_confirm:") { return Some(CallbackAction::DeleteConfirmation); } - if data.starts_with("summarize") { return Some(CallbackAction::Summarize); } - if data.starts_with("speech:page:") { return Some(CallbackAction::SpeechPage); } - if data.starts_with("back_to_full") { return Some(CallbackAction::BackToFull); } - if data.starts_with("whisper") { return Some(CallbackAction::Whisper); } - if data.starts_with("tr_") || data.starts_with("tr:") { return Some(CallbackAction::Translate); } - if data.starts_with("cobalt:") { return Some(CallbackAction::CobaltPagination); } + if data.starts_with("delete_data_confirm:") { + return Some(CallbackAction::DeleteDataConfirmation); + } + if data.starts_with("delete_msg") { + return Some(CallbackAction::DeleteMessage); + } + if data.starts_with("delete_confirm:") { + return Some(CallbackAction::DeleteConfirmation); + } + if data.starts_with("summarize") { + return Some(CallbackAction::Summarize); + } + if data.starts_with("speech:page:") { + return Some(CallbackAction::SpeechPage); + } + if data.starts_with("back_to_full") { + return Some(CallbackAction::BackToFull); + } + if data.starts_with("whisper") { + return Some(CallbackAction::Whisper); + } + if data.starts_with("tr_") || data.starts_with("tr:") { + return Some(CallbackAction::Translate); + } + if data.starts_with("cobalt:") { + return Some(CallbackAction::CobaltPagination); + } None } @@ -130,16 +160,35 @@ fn parse_callback_data(data: &'_ str) -> Option> { pub async fn callback_query_handlers(bot: Bot, q: CallbackQuery) -> Result<(), MyError> { let config = Arc::new(Config::new().await); - let Some(data) = &q.data else { return Ok(()); }; + let Some(data) = &q.data else { + return Ok(()); + }; match parse_callback_data(data) { - Some(CallbackAction::ModuleSelect { owner_type, owner_id, module_key, commander_id }) => { + Some(CallbackAction::ModuleSelect { + owner_type, + owner_id, + module_key, + commander_id, + }) => { + info!( + "module_select: id: {} | commander_id: {}", + q.from.clone().id.0, + commander_id + ); if q.from.id.0 != commander_id { - bot.answer_callback_query(q.id).text("❌ Вы не можете управлять этими настройками.").show_alert(true).await?; + bot.answer_callback_query(q.id) + .text("❌ Вы не можете управлять этими настройками.") + .show_alert(true) + .await?; return Ok(()); } - if let (Some(module), Some(message)) = (MOD_MANAGER.get_module(module_key), &q.message) { - let owner = Owner { id: owner_id.to_string(), r#type: owner_type.to_string() }; + if let (Some(module), Some(message)) = (MOD_MANAGER.get_module(module_key), &q.message) + { + let owner = Owner { + id: owner_id.to_string(), + r#type: owner_type.to_string(), + }; let (text, keyboard) = module.get_settings_ui(&owner, commander_id).await?; bot.edit_message_text(message.chat().id, message.id(), text) .reply_markup(keyboard) @@ -147,39 +196,85 @@ pub async fn callback_query_handlers(bot: Bot, q: CallbackQuery) -> Result<(), M .await?; } } - Some(CallbackAction::SettingsBack { owner_type, owner_id, commander_id }) => { + Some(CallbackAction::SettingsBack { + owner_type, + owner_id, + commander_id, + }) => { + info!( + "settings_back: id: {} | commander_id: {}", + q.from.clone().id.0, + commander_id + ); if q.from.id.0 != commander_id { - bot.answer_callback_query(q.id).text("❌ Вы не можете управлять этими настройками.").show_alert(true).await?; + bot.answer_callback_query(q.id) + .text("❌ Вы не можете управлять этими настройками.") + .show_alert(true) + .await?; return Ok(()); } if let Some(message) = q.message { - update_settings_message(bot, message, owner_id.to_string(), owner_type.to_string(), commander_id).await?; + update_settings_message( + bot, + message, + owner_id.to_string(), + owner_type.to_string(), + commander_id, + ) + .await?; } } - Some(CallbackAction::ModuleSettings { module_key, rest, commander_id }) => { + Some(CallbackAction::ModuleSettings { + module_key, + rest, + commander_id, + }) => { + info!( + "module_settings: id: {} | commander_id: {}", + q.from.clone().id.0, + commander_id + ); if q.from.id.0 != commander_id { - bot.answer_callback_query(q.id).text("❌ Вы не можете управлять этими настройками.").show_alert(true).await?; + bot.answer_callback_query(q.id) + .text("❌ Вы не можете управлять этими настройками.") + .show_alert(true) + .await?; return Ok(()); } - if let (Some(module), Some(message)) = (MOD_MANAGER.get_module(module_key), &q.message) { + if let (Some(module), Some(message)) = (MOD_MANAGER.get_module(module_key), &q.message) + { let owner = Owner { id: message.chat().id.to_string(), - r#type: (if message.chat().is_private() { "user" } else { "group" }).to_string(), + r#type: (if message.chat().is_private() { + "user" + } else { + "group" + }) + .to_string(), }; - module.handle_callback(bot, &q, &owner, rest, commander_id).await?; + module + .handle_callback(bot, &q, &owner, rest, commander_id) + .await?; } } Some(CallbackAction::DeleteData { commander_id }) => { if q.from.id.0 != commander_id { - bot.answer_callback_query(q.id).text("❌ Вы не можете управлять этими настройками.").show_alert(true).await?; + bot.answer_callback_query(q.id) + .text("❌ Вы не можете управлять этими настройками.") + .show_alert(true) + .await?; return Ok(()); } handle_delete_data(bot, q).await? } Some(CallbackAction::CobaltPagination) => handle_cobalt_pagination(bot, q, config).await?, - Some(CallbackAction::DeleteDataConfirmation) => handle_delete_data_confirmation(bot, q).await?, + Some(CallbackAction::DeleteDataConfirmation) => { + handle_delete_data_confirmation(bot, q).await? + } Some(CallbackAction::DeleteMessage) => handle_delete_request(bot, q).await?, - Some(CallbackAction::DeleteConfirmation) => handle_delete_confirmation(bot, q, &config).await?, + Some(CallbackAction::DeleteConfirmation) => { + handle_delete_confirmation(bot, q, &config).await? + } Some(CallbackAction::Summarize) => summarization_handler(bot, q, &config).await?, Some(CallbackAction::SpeechPage) => pagination_handler(bot, q, &config).await?, Some(CallbackAction::BackToFull) => back_handler(bot, q, &config).await?, @@ -195,4 +290,4 @@ pub async fn callback_query_handlers(bot: Bot, q: CallbackQuery) -> Result<(), M } Ok(()) -} \ No newline at end of file +} diff --git a/src/bot/inlines/cobalter.rs b/src/bot/inlines/cobalter.rs index 4139860..c8cb852 100644 --- a/src/bot/inlines/cobalter.rs +++ b/src/bot/inlines/cobalter.rs @@ -18,7 +18,7 @@ use teloxide::{ prelude::*, types::{ InlineQuery, InlineQueryResult, InlineQueryResultArticle, InlineQueryResultPhoto, - InputMessageContent, InputMessageContentText, InputFile, InputMedia, InputMediaVideo + InputFile, InputMedia, InputMediaVideo, InputMessageContent, InputMessageContentText, }, }; use url::Url; diff --git a/src/bot/modules/currency.rs b/src/bot/modules/currency.rs index 55b63bb..63c225e 100644 --- a/src/bot/modules/currency.rs +++ b/src/bot/modules/currency.rs @@ -95,7 +95,7 @@ impl Module for CurrencyModule { return Ok(()); } - if parts.len() == 2 && parts[0] == "page" { + if parts.len() >= 2 && parts[0] == "page" { let page = parts[1].parse::().unwrap_or(0); let (text, keyboard) = self.get_paged_settings_ui(owner, page, commander_id).await?; bot.edit_message_text(message.chat.id, message.id, text) @@ -105,7 +105,7 @@ impl Module for CurrencyModule { return Ok(()); } - if parts.len() == 2 && parts[0] == "toggle" { + if parts.len() >= 2 && parts[0] == "toggle" { let currency_code = parts[1].to_string(); let mut settings: CurrencySettings = Settings::get_module_settings(owner, self.key()).await?; @@ -183,6 +183,7 @@ impl CurrencyModule { .current_page(page) .add_bottom_row(vec![back_button]) .set_callback_prefix(format!("{}:settings", self.key())) + .set_callback_formatter(move |p| format!("{}:settings:page:{}:{}", self.key(), p, commander_id)) .build(|currency| { let is_selected = settings.selected_codes.contains(¤cy.code); let icon = if is_selected { "✅" } else { "❌" };