diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 1111cb625..789be5a04 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -481,8 +481,9 @@ char* dc_get_blobdir (const dc_context_t* context); * - `bot` = Set to "1" if this is a bot. * Prevents adding the "Device messages" and "Saved messages" chats, * adds Auto-Submitted header to outgoing messages, - * accepts contact requests automatically (calling dc_accept_chat() is not needed for bots) - * and does not cut large incoming text messages. + * accepts contact requests automatically (calling dc_accept_chat() is not needed), + * does not cut large incoming text messages, + * handles existing messages the same way as new ones if `fetch_existing_msgs=1`. * - `last_msg_id` = database ID of the last message processed by the bot. * This ID and IDs below it are guaranteed not to be returned * by dc_get_next_msgs() and dc_wait_next_msgs(). @@ -493,8 +494,8 @@ char* dc_get_blobdir (const dc_context_t* context); * For most bots calling `dc_markseen_msgs()` is the * recommended way to update this value * even for self-sent messages. - * - `fetch_existing_msgs` = 1=fetch most recent existing messages on configure (default), - * 0=do not fetch existing messages on configure. + * - `fetch_existing_msgs` = 0=do not fetch existing messages on configure (default), + * 1=fetch most recent existing messages on configure. * In both cases, existing recipients are added to the contact database. * - `disable_idle` = 1=disable IMAP IDLE even if the server supports it, * 0=use IMAP IDLE if the server supports it. diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 8526146ed..ae9f416dc 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -696,6 +696,9 @@ async fn add_parts( prevent_rename: bool, verified_encryption: VerifiedEncryption, ) -> Result { + let is_bot = context.get_config_bool(Config::Bot).await?; + // Bots handle existing messages the same way as new ones. + let fetching_existing_messages = fetching_existing_messages && !is_bot; let rfc724_mid_orig = &mime_parser .get_rfc724_mid() .unwrap_or(rfc724_mid.to_string()); @@ -788,9 +791,6 @@ async fn add_parts( info!(context, "Message is an MDN (TRASH).",); } - // signals whether the current user is a bot - let is_bot = context.get_config_bool(Config::Bot).await?; - let create_blocked_default = if is_bot { Blocked::Not } else { diff --git a/src/receive_imf/tests.rs b/src/receive_imf/tests.rs index 32ec430fa..3dcf4ce55 100644 --- a/src/receive_imf/tests.rs +++ b/src/receive_imf/tests.rs @@ -3276,6 +3276,46 @@ async fn test_send_as_bot() -> Result<()> { Ok(()) } +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_bot_recv_existing_msg() -> Result<()> { + let mut tcm = TestContextManager::new(); + let bob = &tcm.bob().await; + bob.set_config(Config::Bot, Some("1")).await.unwrap(); + bob.set_config(Config::FetchExistingMsgs, Some("1")) + .await + .unwrap(); + let fetching_existing_messages = true; + let msg = receive_imf_from_inbox( + bob, + "first@example.org", + b"From: Alice \n\ + To: Bob \n\ + Chat-Version: 1.0\n\ + Message-ID: \n\ + Date: Sun, 14 Nov 2021 00:10:00 +0000\n\ + Content-Type: text/plain\n\ + \n\ + hello\n", + false, + None, + fetching_existing_messages, + ) + .await? + .unwrap(); + let msg = Message::load_from_db(bob, msg.msg_ids[0]).await?; + assert_eq!(msg.state, MessageState::InFresh); + let event = bob + .evtracker + .get_matching(|ev| matches!(ev, EventType::IncomingMsg { .. })) + .await; + let EventType::IncomingMsg { chat_id, msg_id } = event else { + unreachable!(); + }; + assert_eq!(chat_id, msg.chat_id); + assert_eq!(msg_id, msg.id); + Ok(()) +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_no_private_reply_to_blocked_account() -> Result<()> { let mut tcm = TestContextManager::new();