mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 17:06:35 +03:00
Add DC_EVENT_MSG_DELETE_TIMEOUT_CHANGED
This event tells the client when the next message will be deleted. When this event is received, the client should start a timer and update current chat or chatlist when timeout expires.
This commit is contained in:
@@ -4405,6 +4405,17 @@ int64_t dc_lot_get_timestamp (const dc_lot_t* lot);
|
|||||||
*/
|
*/
|
||||||
#define DC_EVENT_MSG_READ 2015
|
#define DC_EVENT_MSG_READ 2015
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Time left until the next message deletion has changed.
|
||||||
|
*
|
||||||
|
* The only parameter is the number of seconds left until next message
|
||||||
|
* deletion. It is rounded up. If the timer is 0, it means there are no
|
||||||
|
* messages to be deleted in the future.
|
||||||
|
*
|
||||||
|
* @param data1 (int) Timer in seconds
|
||||||
|
* @param data2 (int) 0
|
||||||
|
*/
|
||||||
|
#define DC_EVENT_MSG_DELETE_TIMEOUT_CHANGED 2016
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chat changed. The name or the image of a chat group was changed or members were added or removed.
|
* Chat changed. The name or the image of a chat group was changed or members were added or removed.
|
||||||
|
|||||||
@@ -167,6 +167,9 @@ impl ContextWrapper {
|
|||||||
msg_id.to_u32() as uintptr_t,
|
msg_id.to_u32() as uintptr_t,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Event::MsgDeleteTimeoutChanged { timer } => {
|
||||||
|
ffi_cb(self, event_id, timer as uintptr_t, 0);
|
||||||
|
}
|
||||||
Event::ChatModified(chat_id) => {
|
Event::ChatModified(chat_id) => {
|
||||||
ffi_cb(self, event_id, chat_id.to_u32() as uintptr_t, 0);
|
ffi_cb(self, event_id, chat_id.to_u32() as uintptr_t, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
48
src/chat.rs
48
src/chat.rs
@@ -1,6 +1,6 @@
|
|||||||
//! # Chat module
|
//! # Chat module
|
||||||
|
|
||||||
use std::convert::TryFrom;
|
use std::convert::{TryFrom, TryInto};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
@@ -931,6 +931,7 @@ impl Chat {
|
|||||||
} else {
|
} else {
|
||||||
error!(context, "Cannot send message, not configured.",);
|
error!(context, "Cannot send message, not configured.",);
|
||||||
}
|
}
|
||||||
|
update_autodelete_timeout(context);
|
||||||
|
|
||||||
Ok(MsgId::new(msg_id))
|
Ok(MsgId::new(msg_id))
|
||||||
}
|
}
|
||||||
@@ -1600,11 +1601,48 @@ pub fn marknoticed_all_chats(context: &Context) -> Result<(), Error> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Emits an event to update the time until the next local deletion.
|
||||||
|
///
|
||||||
|
/// This takes into account only per-chat timeouts, because global device
|
||||||
|
/// timeouts are at least one hour long and deletion is triggered often enough
|
||||||
|
/// by user actions.
|
||||||
|
pub fn update_autodelete_timeout(context: &Context) {
|
||||||
|
let autodelete_timestamp: Option<i64> = match context.sql.query_get_value_result(
|
||||||
|
"SELECT autodelete_timestamp \
|
||||||
|
FROM msgs \
|
||||||
|
WHERE autodelete_timestamp != 0 \
|
||||||
|
ORDER BY autodelete_timestamp ASC \
|
||||||
|
LIMIT 1",
|
||||||
|
rusqlite::NO_PARAMS,
|
||||||
|
) {
|
||||||
|
Err(err) => {
|
||||||
|
warn!(context, "Can't calculate next autodelete timeout: {}", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Ok(autodelete_timestamp) => autodelete_timestamp,
|
||||||
|
};
|
||||||
|
|
||||||
|
let timer = if let Some(next_autodelete) = autodelete_timestamp {
|
||||||
|
let now = time();
|
||||||
|
if now > next_autodelete {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
(next_autodelete - now)
|
||||||
|
.try_into()
|
||||||
|
.unwrap_or(u32::MAX)
|
||||||
|
.saturating_add(1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
emit_event!(context, Event::MsgDeleteTimeoutChanged { timer });
|
||||||
|
}
|
||||||
|
|
||||||
/// Deletes messages which are expired according to "delete_device_after" setting.
|
/// Deletes messages which are expired according to "delete_device_after" setting.
|
||||||
///
|
///
|
||||||
/// Returns true if any message is deleted, so event can be emitted. If nothing
|
/// Returns true if any message is deleted, so event can be emitted. If nothing
|
||||||
/// has been deleted, returns false.
|
/// has been deleted, returns false.
|
||||||
pub fn delete_device_expired_messages(context: &Context) -> Result<bool, Error> {
|
pub(crate) fn delete_device_expired_messages(context: &Context) -> Result<bool, Error> {
|
||||||
let now = time();
|
let now = time();
|
||||||
|
|
||||||
let threshold_timestamp = match context.get_config_delete_device_after() {
|
let threshold_timestamp = match context.get_config_delete_device_after() {
|
||||||
@@ -1650,7 +1688,11 @@ pub fn delete_device_expired_messages(context: &Context) -> Result<bool, Error>
|
|||||||
],
|
],
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
Ok(rows_modified > 0)
|
let updated = rows_modified > 0;
|
||||||
|
if updated {
|
||||||
|
update_autodelete_timeout(context);
|
||||||
|
}
|
||||||
|
Ok(updated)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_chat_media(
|
pub fn get_chat_media(
|
||||||
|
|||||||
@@ -132,6 +132,14 @@ pub enum Event {
|
|||||||
#[strum(props(id = "2015"))]
|
#[strum(props(id = "2015"))]
|
||||||
MsgRead { chat_id: ChatId, msg_id: MsgId },
|
MsgRead { chat_id: ChatId, msg_id: MsgId },
|
||||||
|
|
||||||
|
/// Time left until the next message deletion has changed.
|
||||||
|
///
|
||||||
|
/// The only parameter is the number of seconds left until next message
|
||||||
|
/// deletion. It is rounded up. If the timer is 0, it means there are no
|
||||||
|
/// messages to be deleted in the future.
|
||||||
|
#[strum(props(id = "2016"))]
|
||||||
|
MsgDeleteTimeoutChanged { timer: u32 },
|
||||||
|
|
||||||
/// Chat changed. The name or the image of a chat group was changed or members were added or removed.
|
/// Chat changed. The name or the image of a chat group was changed or members were added or removed.
|
||||||
/// Or the verify state of a chat has changed.
|
/// Or the verify state of a chat has changed.
|
||||||
/// See dc_set_chat_name(), dc_set_chat_profile_image(), dc_add_contact_to_chat()
|
/// See dc_set_chat_name(), dc_set_chat_profile_image(), dc_add_contact_to_chat()
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use deltachat_derive::{FromSql, ToSql};
|
|||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::chat::{self, Chat, ChatId};
|
use crate::chat::{self, update_autodelete_timeout, Chat, ChatId};
|
||||||
use crate::constants::*;
|
use crate::constants::*;
|
||||||
use crate::contact::*;
|
use crate::contact::*;
|
||||||
use crate::context::*;
|
use crate::context::*;
|
||||||
@@ -157,10 +157,10 @@ impl MsgId {
|
|||||||
WHERE (autodelete_timestamp == 0 OR autodelete_timestamp > ?) \
|
WHERE (autodelete_timestamp == 0 OR autodelete_timestamp > ?) \
|
||||||
AND id = ?",
|
AND id = ?",
|
||||||
params![autodelete_timestamp, autodelete_timestamp, self],
|
params![autodelete_timestamp, autodelete_timestamp, self],
|
||||||
)
|
)?;
|
||||||
} else {
|
update_autodelete_timeout(context);
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Bad evil escape hatch.
|
/// Bad evil escape hatch.
|
||||||
|
|||||||
Reference in New Issue
Block a user