diff --git a/src/chat.rs b/src/chat.rs index f30714d0f..11184b5cd 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2670,10 +2670,11 @@ pub(crate) async fn get_chat_id_by_grpid( /// Adds a message to device chat. /// /// Optional `label` can be provided to ensure that message is added only once. -pub async fn add_device_msg( +pub async fn add_device_msg_with_importance( context: &Context, label: Option<&str>, msg: Option<&mut Message>, + important: bool, ) -> Result { ensure!( label.is_some() || msg.is_some(), @@ -2697,7 +2698,14 @@ pub async fn add_device_msg( let rfc724_mid = dc_create_outgoing_rfc724_mid(None, "@device"); msg.try_calc_and_set_dimensions(context).await.ok(); prepare_msg_blob(context, msg).await?; + chat_id.unarchive(context).await?; + let muted = if important { + MuteDuration::NotMuted + } else { + MuteDuration::Forever + }; + set_muted(context, chat_id, muted).await?; context.sql.execute( "INSERT INTO msgs (chat_id,from_id,to_id, timestamp,type,state, txt,param,rfc724_mid) \ @@ -2739,6 +2747,14 @@ pub async fn add_device_msg( Ok(msg_id) } +pub async fn add_device_msg( + context: &Context, + label: Option<&str>, + msg: Option<&mut Message>, +) -> Result { + add_device_msg_with_importance(context, label, msg, false).await +} + pub async fn was_device_msg_ever_added(context: &Context, label: &str) -> Result { ensure!(!label.is_empty(), "empty label"); if let Ok(()) = context diff --git a/src/config.rs b/src/config.rs index 2c59d6435..1fd6016b7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -117,6 +117,9 @@ pub enum Config { #[strum(serialize = "sys.config_keys")] SysConfigKeys, + + #[strum(props(default = "0"))] + WarnedAboutWrongPw, } impl Context { diff --git a/src/configure/mod.rs b/src/configure/mod.rs index 7b45e5386..d76e410ab 100644 --- a/src/configure/mod.rs +++ b/src/configure/mod.rs @@ -102,6 +102,7 @@ impl Context { match success { Ok(_) => { + self.set_config(Config::WarnedAboutWrongPw, None).await?; progress!(self, 1000); Ok(()) } diff --git a/src/imap/mod.rs b/src/imap/mod.rs index 59970e4fd..85cf92a85 100644 --- a/src/imap/mod.rs +++ b/src/imap/mod.rs @@ -30,7 +30,7 @@ use crate::mimeparser; use crate::oauth2::dc_get_oauth2_access_token; use crate::param::Params; use crate::provider::get_provider_info; -use crate::{scheduler::InterruptInfo, stock::StockMessage}; +use crate::{chat, scheduler::InterruptInfo, stock::StockMessage}; mod client; mod idle; @@ -38,6 +38,7 @@ pub mod select_folder; mod session; use client::Client; +use message::Message; use session::Session; type Result = std::result::Result; @@ -118,6 +119,7 @@ pub struct Imap { connected: bool, interrupt: Option, should_reconnect: bool, + login_failed_once: bool, } #[derive(Debug)] @@ -191,6 +193,7 @@ impl Imap { connected: Default::default(), interrupt: Default::default(), should_reconnect: Default::default(), + login_failed_once: Default::default(), } } @@ -295,8 +298,10 @@ impl Imap { // needs to be set here to ensure it is set on reconnects. self.connected = true; self.session = Some(session); + self.login_failed_once = false; Ok(()) } + Err((err, _)) => { let imap_user = self.config.imap_user.to_owned(); let message = context @@ -304,6 +309,19 @@ impl Imap { .await; error!(context, "{}", message); + if self.login_failed_once + && self.fetch + && !context.get_config_bool(Config::WarnedAboutWrongPw).await + { + context + .set_config(Config::WarnedAboutWrongPw, Some("1")) + .await; + let mut msg = Message::new(Viewtype::Text); + msg.text = Some(message); + chat::add_device_msg_with_importance(context, None, Some(&mut msg), true).await; + } else { + self.login_failed_once = true; + } self.trigger_reconnect(); Err(Error::LoginFailed(format!("cannot login as {}", imap_user)))