From e9733e7525b4c73ac83a2749dc60c163b8a80746 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 24 Sep 2020 12:10:48 +0200 Subject: [PATCH] always set chat_id on DC_EVENT_MSGS_NOTICED --- deltachat-ffi/deltachat.h | 15 +++++++++------ src/contact.rs | 9 ++++----- src/events.rs | 2 +- src/message.rs | 25 ++++++------------------- 4 files changed, 20 insertions(+), 31 deletions(-) diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 4666342ce..0cdaea382 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -1503,11 +1503,13 @@ void dc_forward_msgs (dc_context_t* context, const uint3 /** - * Mark all messages sent by the given contact - * as _noticed_. See also dc_marknoticed_chat() and - * dc_markseen_msgs() + * Mark all messages sent by the given contact as _noticed_. + * This function is typically used to ignore a user in the deaddrop temporarily ("Not now" button). * - * Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED. + * The contact is expected to belong to the deaddrop; + * only one #DC_EVENT_MSGS_NOTICED with chat_id=DC_CHAT_ID_DEADDROP may be emitted. + * + * See also dc_marknoticed_chat() and dc_markseen_msgs() * * @memberof dc_context_t * @param context The context object. @@ -1526,7 +1528,8 @@ void dc_marknoticed_contact (dc_context_t* context, uint32_t co * Moreover, if messages belong to a chat with ephemeral messages enabled, * the ephemeral timer is started for these messages. * - * Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED. + * The given messages are expected to belong to the same chat or to the deaddrop; + * only one #DC_EVENT_MSGS_NOTICED event with this chat may be emitted. * * @memberof dc_context_t * @param context The context object. @@ -4607,7 +4610,7 @@ void dc_event_unref(dc_event_t* event); * Do not try to derive the state of an item from just the fact you received the event; * use eg. dc_msg_get_state() or dc_get_fresh_msg_cnt() for this purpose. * - * @param data1 (int) chat_id or 0 if the event affects multiple chats. + * @param data1 (int) chat_id * @param data2 0 */ #define DC_EVENT_MSGS_NOTICED 2008 diff --git a/src/contact.rs b/src/contact.rs index fdb9550ee..8c8524e07 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -260,10 +260,9 @@ impl Contact { Ok(contact_id) } - /// Mark all messages sent by the given contact - /// as *noticed*. See also dc_marknoticed_chat() and dc_markseen_msgs() - /// - /// Calling this function usually results in the event `#DC_EVENT_MSGS_NOTICED`. + /// Mark messages from a contact as noticed. + /// The contact is expected to belong to the deaddrop, + /// therefore, DC_EVENT_MSGS_NOTICED(DC_CHAT_ID_DEADDROP) is emitted. pub async fn mark_noticed(context: &Context, id: u32) { if context .sql @@ -274,7 +273,7 @@ impl Contact { .await .is_ok() { - context.emit_event(EventType::MsgsNoticed(ChatId::new(0))); + context.emit_event(EventType::MsgsNoticed(ChatId::new(DC_CHAT_ID_DEADDROP))); } } diff --git a/src/events.rs b/src/events.rs index c67f465ad..f884a7589 100644 --- a/src/events.rs +++ b/src/events.rs @@ -187,7 +187,7 @@ pub enum EventType { IncomingMsg { chat_id: ChatId, msg_id: MsgId }, /// Messages were seen or noticed. - /// If chat_id is 0, this affects multiple chats. + /// chat id is always set. #[strum(props(id = "2008"))] MsgsNoticed(ChatId), diff --git a/src/message.rs b/src/message.rs index 3395ca939..ec4a098d2 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1255,9 +1255,8 @@ pub async fn markseen_msgs(context: &Context, msg_ids: Vec) -> bool { .await .unwrap_or_default(); - let mut send_event = false; - let mut last_chat_id = ChatId::new(0); - let mut chat_ids_are_unique = true; + // we expect all messages belong to the same chat or to the deaddrop. + let mut updated_chat_id = ChatId::new(0); for (id, curr_chat_id, curr_state, curr_blocked) in msgs.into_iter() { if let Err(err) = id.start_ephemeral_timer(context).await { @@ -1278,28 +1277,16 @@ pub async fn markseen_msgs(context: &Context, msg_ids: Vec) -> bool { job::Job::new(Action::MarkseenMsgOnImap, id.to_u32(), Params::new(), 0), ) .await; - send_event = true; + updated_chat_id = curr_chat_id; } } else if curr_state == MessageState::InFresh { update_msg_state(context, id, MessageState::InNoticed).await; - send_event = true; - } - - if last_chat_id.is_unset() { - last_chat_id = curr_chat_id; - } else if last_chat_id != curr_chat_id { - chat_ids_are_unique = false; + updated_chat_id = ChatId::new(DC_CHAT_ID_DEADDROP); } } - if send_event { - context.emit_event(EventType::MsgsNoticed( - if chat_ids_are_unique && !last_chat_id.is_unset() { - last_chat_id - } else { - ChatId::new(0) - }, - )); + if !updated_chat_id.is_unset() { + context.emit_event(EventType::MsgsNoticed(updated_chat_id)); } true