mirror of
https://github.com/chatmail/core.git
synced 2026-04-26 01:46:34 +03:00
feat: start ephemeral timers when the chat is noticed
This commit is contained in:
27
src/chat.rs
27
src/chat.rs
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user