Compare commits

...

6 Commits

Author SHA1 Message Date
Akulij
4277fc5523 use answer_message_varianted_silence_flag in replace message
All checks were successful
Build && Deploy / cargo build (push) Successful in 56s
2025-05-04 19:18:33 +03:00
Akulij
4e95c846d1 use text variations in replace_message 2025-05-04 19:18:05 +03:00
Akulij
624951392e create answer_message_varianted_silence_flag
reason: to be able to silence if it used as fallback in replace_message
2025-05-04 19:17:27 +03:00
Akulij
f69eff72d6 store variant in Message 2025-05-04 19:14:54 +03:00
Akulij
af53efca0e change variant_text naming asnwer_message_varianted, to not mix up with argument 2025-05-04 19:14:11 +03:00
Akulij
d68c7d688c store variants in message info holder
reason: people can go forward with callback and backward and see
defferent message, when they shouldn't
2025-05-04 19:10:33 +03:00
2 changed files with 73 additions and 8 deletions

View File

@ -103,6 +103,7 @@ pub struct Message {
pub chat_id: i64,
pub message_id: i64,
pub token: String,
pub variant: Option<String>,
}
#[derive(Serialize, Deserialize)]
@ -299,6 +300,32 @@ pub trait CallDB {
Ok(())
}
async fn set_message_literal_variant(
&mut self,
chatid: i64,
messageid: i32,
literal: &str,
variant: &str,
) -> DbResult<()> {
let db = self.get_database().await;
let messages = db.collection::<Message>("messages");
messages
.update_one(
doc! {
"chat_id": chatid,
"message_id": messageid as i64
},
doc! {
"$set": { "token": literal, "variant": variant }
},
)
.upsert(true)
.await?;
Ok(())
}
async fn get_literal(&mut self, literal: &str) -> DbResult<Option<Literal>> {
let db = self.get_database().await;
let messages = db.collection::<Literal>("literals");

View File

@ -777,17 +777,29 @@ async fn answer_message_varianted<RM: Into<ReplyMarkup>>(
variant: Option<&str>,
keyboard: Option<RM>,
) -> BotResult<()> {
let variant = match variant {
answer_message_varianted_silence_flag(bot, chat_id, db, literal, variant, false, keyboard).await
}
async fn answer_message_varianted_silence_flag<RM: Into<ReplyMarkup>>(
bot: &Bot,
chat_id: i64,
db: &mut DB,
literal: &str,
variant: Option<&str>,
silence_non_variant: bool,
keyboard: Option<RM>,
) -> BotResult<()> {
let variant_text = match variant {
Some(variant) => {
let value = db.get_literal_alternative_value(literal, variant).await?;
if value.is_none() {
if value.is_none() && !silence_non_variant {
notify_admin(&format!("variant {variant} for literal {literal} is not found! falling back to just literal")).await;
}
value
}
None => None,
};
let text = match variant {
let text = match variant_text {
Some(text) => text,
None => db
.get_literal_value(literal)
@ -907,7 +919,13 @@ async fn answer_message_varianted<RM: Into<ReplyMarkup>>(
(msg[0].chat.id.0, msg[0].id.0)
}
};
db.set_message_literal(chat_id, msg_id, literal).await?;
match variant {
Some(variant) => {
db.set_message_literal_variant(chat_id, msg_id, literal, variant)
.await?
}
None => db.set_message_literal(chat_id, msg_id, literal).await?,
};
Ok(())
}
@ -919,10 +937,21 @@ async fn replace_message(
literal: &str,
keyboard: Option<InlineKeyboardMarkup>,
) -> BotResult<()> {
let text = db
.get_literal_value(literal)
let variant = db
.get_message(chat_id, message_id)
.await?
.unwrap_or("Please, set content of this message".into());
.and_then(|m| m.variant);
let variant_text = match variant {
Some(ref variant) => db.get_literal_alternative_value(literal, variant).await?,
None => None,
};
let text = match variant_text {
Some(ref text) => text.to_string(),
None => db
.get_literal_value(literal)
.await?
.unwrap_or("Please, set content of this message".into()),
};
let media = db.get_media(literal).await?;
let (chat_id, msg_id) = match media.len() {
// just a text
@ -942,7 +971,16 @@ async fn replace_message(
{
// fallback to sending message
warn!("Fallback into sending message instead of editing because it contains media");
return answer_message(bot, chat_id, db, literal, keyboard).await;
return answer_message_varianted_silence_flag(
bot,
chat_id,
db,
literal,
variant.as_deref(),
true,
keyboard,
)
.await;
}
Err(err) => return Err(err.into()),
};