feat: start ephemeral timers when the chat is noticed

This commit is contained in:
link2xt
2024-12-23 20:56:50 +00:00
committed by l
parent 22bc7567d3
commit beb6a21ecd
2 changed files with 64 additions and 11 deletions

View File

@@ -28,7 +28,7 @@ use crate::contact::{self, Contact, ContactId, Origin};
use crate::context::Context; use crate::context::Context;
use crate::debug_logging::maybe_set_logging_xdc; use crate::debug_logging::maybe_set_logging_xdc;
use crate::download::DownloadState; use crate::download::DownloadState;
use crate::ephemeral::Timer as EphemeralTimer; use crate::ephemeral::{start_chat_ephemeral_timers, Timer as EphemeralTimer};
use crate::events::EventType; use crate::events::EventType;
use crate::html::new_html_mimepart; use crate::html::new_html_mimepart;
use crate::location; use crate::location;
@@ -3269,20 +3269,24 @@ pub async fn marknoticed_chat(context: &Context, chat_id: ChatId) -> Result<()>
context.emit_event(EventType::MsgsNoticed(chat_id_in_archive)); context.emit_event(EventType::MsgsNoticed(chat_id_in_archive));
chatlist_events::emit_chatlist_item_changed(context, chat_id_in_archive); chatlist_events::emit_chatlist_item_changed(context, chat_id_in_archive);
} }
} else if context } else {
.sql start_chat_ephemeral_timers(context, chat_id).await?;
.execute(
"UPDATE msgs if context
.sql
.execute(
"UPDATE msgs
SET state=? SET state=?
WHERE state=? WHERE state=?
AND hidden=0 AND hidden=0
AND chat_id=?;", AND chat_id=?;",
(MessageState::InNoticed, MessageState::InFresh, chat_id), (MessageState::InNoticed, MessageState::InFresh, chat_id),
) )
.await? .await?
== 0 == 0
{ {
return Ok(()); return Ok(());
}
} }
context.emit_event(EventType::MsgsNoticed(chat_id)); context.emit_event(EventType::MsgsNoticed(chat_id));
@@ -3354,6 +3358,7 @@ pub(crate) async fn mark_old_messages_as_noticed(
} }
for c in changed_chats { for c in changed_chats {
start_chat_ephemeral_timers(context, c).await?;
context.emit_event(EventType::MsgsNoticed(c)); context.emit_event(EventType::MsgsNoticed(c));
chatlist_events::emit_chatlist_item_changed(context, c); chatlist_events::emit_chatlist_item_changed(context, c);
} }

View File

@@ -349,6 +349,28 @@ pub(crate) async fn start_ephemeral_timers_msgids(
Ok(()) Ok(())
} }
/// Starts ephemeral timer for all messages in the chat.
///
/// This should be called when chat is marked as noticed.
pub(crate) async fn start_chat_ephemeral_timers(context: &Context, chat_id: ChatId) -> Result<()> {
let now = time();
let should_interrupt = context
.sql
.execute(
"UPDATE msgs SET ephemeral_timestamp = ?1 + ephemeral_timer
WHERE chat_id = ?2
AND ephemeral_timer > 0
AND (ephemeral_timestamp == 0 OR ephemeral_timestamp > ?1 + ephemeral_timer)",
(now, chat_id),
)
.await?
> 0;
if should_interrupt {
context.scheduler.interrupt_ephemeral_task().await;
}
Ok(())
}
/// Selects messages which are expired according to /// Selects messages which are expired according to
/// `delete_device_after` setting or `ephemeral_timestamp` column. /// `delete_device_after` setting or `ephemeral_timestamp` column.
/// ///
@@ -693,6 +715,7 @@ pub(crate) async fn start_ephemeral_timers(context: &Context) -> Result<()> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use crate::chat::marknoticed_chat;
use crate::config::Config; use crate::config::Config;
use crate::download::DownloadState; use crate::download::DownloadState;
use crate::location; use crate::location;
@@ -1420,4 +1443,29 @@ mod tests {
Ok(()) Ok(())
} }
/// Tests that ephemeral timer is started when the chat is noticed.
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn test_noticed_ephemeral_timer() -> Result<()> {
let mut tcm = TestContextManager::new();
let alice = &tcm.alice().await;
let bob = &tcm.bob().await;
let chat = alice.create_chat(bob).await;
let duration = 60;
chat.id
.set_ephemeral_timer(alice, Timer::Enabled { duration })
.await?;
let bob_received_message = tcm.send_recv(alice, bob, "Hello!").await;
marknoticed_chat(bob, bob_received_message.chat_id).await?;
SystemTime::shift(Duration::from_secs(100));
delete_expired_messages(bob, time()).await?;
assert!(Message::load_from_db_optional(bob, bob_received_message.id)
.await?
.is_none());
Ok(())
}
} }