diff --git a/src/chat.rs b/src/chat.rs index 51061946b..99769fbcf 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -747,7 +747,7 @@ impl ChatId { .await?; if unread_cnt == 1 { // Added the first unread message in the chat. - context.emit_msgs_changed(DC_CHAT_ID_ARCHIVED_LINK, MsgId::new(0)); + context.emit_msgs_changed_without_msg_id(DC_CHAT_ID_ARCHIVED_LINK); } return Ok(()); } @@ -762,6 +762,8 @@ impl ChatId { /// shown. pub(crate) fn emit_msg_event(self, context: &Context, msg_id: MsgId, important: bool) { if important { + debug_assert!(!msg_id.is_unset()); + context.emit_incoming_msg(self, msg_id); } else { context.emit_msgs_changed(self, msg_id); @@ -823,17 +825,14 @@ impl ChatId { }; if changed { - context.emit_msgs_changed( - self, - if msg.is_some() { - match self.get_draft_msg_id(context).await? { - Some(msg_id) => msg_id, - None => MsgId::new(0), - } - } else { - MsgId::new(0) - }, - ); + if msg.is_some() { + match self.get_draft_msg_id(context).await? { + Some(msg_id) => context.emit_msgs_changed(self, msg_id), + None => context.emit_msgs_changed_without_msg_id(self), + } + } else { + context.emit_msgs_changed_without_msg_id(self) + } } Ok(()) @@ -4649,7 +4648,7 @@ impl Context { /// a noticed chat is archived. Emitting events should be cheap, a false-positive `MsgsChanged` /// is ok. pub(crate) fn on_archived_chats_maybe_noticed(&self) { - self.emit_msgs_changed(DC_CHAT_ID_ARCHIVED_LINK, MsgId::new(0)); + self.emit_msgs_changed_without_msg_id(DC_CHAT_ID_ARCHIVED_LINK); } } diff --git a/src/context.rs b/src/context.rs index 3fa76bc0e..60a3c60f3 100644 --- a/src/context.rs +++ b/src/context.rs @@ -643,14 +643,36 @@ impl Context { } /// Emits a MsgsChanged event with specified chat and message ids + /// + /// If IDs are unset, [`Self::emit_msgs_changed_without_ids`] + /// or [`Self::emit_msgs_changed_without_msg_id`] should be used + /// instead of this function. pub fn emit_msgs_changed(&self, chat_id: ChatId, msg_id: MsgId) { + debug_assert!(!chat_id.is_unset()); + debug_assert!(!msg_id.is_unset()); + self.emit_event(EventType::MsgsChanged { chat_id, msg_id }); chatlist_events::emit_chatlist_changed(self); chatlist_events::emit_chatlist_item_changed(self, chat_id); } + /// Emits a MsgsChanged event with specified chat and without message id. + pub fn emit_msgs_changed_without_msg_id(&self, chat_id: ChatId) { + debug_assert!(!chat_id.is_unset()); + + self.emit_event(EventType::MsgsChanged { + chat_id, + msg_id: MsgId::new(0), + }); + chatlist_events::emit_chatlist_changed(self); + chatlist_events::emit_chatlist_item_changed(self, chat_id); + } + /// Emits an IncomingMsg event with specified chat and message ids pub fn emit_incoming_msg(&self, chat_id: ChatId, msg_id: MsgId) { + debug_assert!(!chat_id.is_unset()); + debug_assert!(!msg_id.is_unset()); + self.emit_event(EventType::IncomingMsg { chat_id, msg_id }); chatlist_events::emit_chatlist_changed(self); chatlist_events::emit_chatlist_item_changed(self, chat_id); diff --git a/src/ephemeral.rs b/src/ephemeral.rs index afca5ac6a..e0c00246a 100644 --- a/src/ephemeral.rs +++ b/src/ephemeral.rs @@ -502,7 +502,7 @@ pub(crate) async fn delete_expired_messages(context: &Context, now: i64) -> Resu } for modified_chat_id in modified_chat_ids { - context.emit_msgs_changed(modified_chat_id, MsgId::new(0)); + context.emit_msgs_changed_without_msg_id(modified_chat_id); } for msg_id in webxdc_deleted { diff --git a/src/message.rs b/src/message.rs index ab8efed4b..dc81d456a 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1637,7 +1637,7 @@ pub async fn delete_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> { res?; for modified_chat_id in modified_chat_ids { - context.emit_msgs_changed(modified_chat_id, MsgId::new(0)); + context.emit_msgs_changed_without_msg_id(modified_chat_id); chatlist_events::emit_chatlist_item_changed(context, modified_chat_id); } diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 27b27c7b8..094e16855 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -607,7 +607,7 @@ pub(crate) async fn receive_imf_inner( } if let Some(replace_chat_id) = replace_chat_id { - context.emit_msgs_changed(replace_chat_id, MsgId::new(0)); + context.emit_msgs_changed_without_msg_id(replace_chat_id); } else if !chat_id.is_trash() { let fresh = received_msg.state == MessageState::InFresh; for msg_id in &received_msg.msg_ids {