mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 08:56:30 +03:00
add flag to get only info/system messages of chat
useful for creating an "audit log" view of a chat that helps to find actions like who added/removed who quickly and without endless scrolling
This commit is contained in:
@@ -1000,6 +1000,7 @@ dc_msg_t* dc_get_draft (dc_context_t* context, uint32_t ch
|
|||||||
|
|
||||||
|
|
||||||
#define DC_GCM_ADDDAYMARKER 0x01
|
#define DC_GCM_ADDDAYMARKER 0x01
|
||||||
|
#define DC_GCM_SYSTEM_ONLY 0x02
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1018,6 +1019,7 @@ dc_msg_t* dc_get_draft (dc_context_t* context, uint32_t ch
|
|||||||
* @param flags If set to DC_GCM_ADDDAYMARKER, the marker DC_MSG_ID_DAYMARKER will
|
* @param flags If set to DC_GCM_ADDDAYMARKER, the marker DC_MSG_ID_DAYMARKER will
|
||||||
* be added before each day (regarding the local timezone). Set this to 0 if you do not want this behaviour.
|
* be added before each day (regarding the local timezone). Set this to 0 if you do not want this behaviour.
|
||||||
* To get the concrete time of the marker, use dc_array_get_timestamp().
|
* To get the concrete time of the marker, use dc_array_get_timestamp().
|
||||||
|
* If set to DC_GCM_SYSTEM_ONLY, only system messages will be returned, can be combined with DC_GCM_ADDDAYMARKER.
|
||||||
* @param marker1before An optional message ID. If set, the id DC_MSG_ID_MARKER1 will be added just
|
* @param marker1before An optional message ID. If set, the id DC_MSG_ID_MARKER1 will be added just
|
||||||
* before the given ID in the returned array. Set this to 0 if you do not want this behaviour.
|
* before the given ID in the returned array. Set this to 0 if you do not want this behaviour.
|
||||||
* @return Array of message IDs, must be dc_array_unref()'d when no longer used.
|
* @return Array of message IDs, must be dc_array_unref()'d when no longer used.
|
||||||
|
|||||||
58
src/chat.rs
58
src/chat.rs
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use deltachat_derive::{FromSql, ToSql};
|
use deltachat_derive::{FromSql, ToSql};
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
use std::str::FromStr;
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use anyhow::Context as _;
|
use anyhow::Context as _;
|
||||||
@@ -1764,14 +1765,42 @@ pub async fn get_chat_msgs(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let process_row =
|
let process_row = if (flags & DC_GCM_SYSTEM_ONLY) != 0 {
|
||||||
|row: &rusqlite::Row| Ok((row.get::<_, MsgId>("id")?, row.get::<_, i64>("timestamp")?));
|
|row: &rusqlite::Row| {
|
||||||
|
// is_info logic taken from Message.is_info()
|
||||||
|
let params = row.get::<_, String>("param")?;
|
||||||
|
let (from_id, to_id) = (row.get::<_, u32>("from_id")?, row.get::<_, u32>("to_id")?);
|
||||||
|
let is_info_msg: bool = from_id == DC_CONTACT_ID_INFO as u32
|
||||||
|
|| to_id == DC_CONTACT_ID_INFO as u32
|
||||||
|
|| match Params::from_str(¶ms) {
|
||||||
|
Ok(p) => {
|
||||||
|
let cmd = p.get_cmd();
|
||||||
|
cmd != SystemMessage::Unknown && cmd != SystemMessage::AutocryptSetupMessage
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok((
|
||||||
|
row.get::<_, MsgId>("id")?,
|
||||||
|
row.get::<_, i64>("timestamp")?,
|
||||||
|
!is_info_msg,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|row: &rusqlite::Row| {
|
||||||
|
Ok((
|
||||||
|
row.get::<_, MsgId>("id")?,
|
||||||
|
row.get::<_, i64>("timestamp")?,
|
||||||
|
false,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
};
|
||||||
let process_rows = |rows: rusqlite::MappedRows<_>| {
|
let process_rows = |rows: rusqlite::MappedRows<_>| {
|
||||||
let mut ret = Vec::new();
|
let mut ret = Vec::new();
|
||||||
let mut last_day = 0;
|
let mut last_day = 0;
|
||||||
let cnv_to_local = dc_gm2local_offset();
|
let cnv_to_local = dc_gm2local_offset();
|
||||||
for row in rows {
|
for row in rows {
|
||||||
let (curr_id, ts) = row?;
|
let (curr_id, ts, exclude_message): (MsgId, i64, bool) = row?;
|
||||||
if let Some(marker_id) = marker1before {
|
if let Some(marker_id) = marker1before {
|
||||||
if curr_id == marker_id {
|
if curr_id == marker_id {
|
||||||
ret.push(ChatItem::Marker1);
|
ret.push(ChatItem::Marker1);
|
||||||
@@ -1787,7 +1816,9 @@ pub async fn get_chat_msgs(
|
|||||||
last_day = curr_day;
|
last_day = curr_day;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret.push(ChatItem::Message { msg_id: curr_id });
|
if !exclude_message {
|
||||||
|
ret.push(ChatItem::Message { msg_id: curr_id });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Ok(ret)
|
Ok(ret)
|
||||||
};
|
};
|
||||||
@@ -1815,6 +1846,25 @@ pub async fn get_chat_msgs(
|
|||||||
process_rows,
|
process_rows,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
} else if (flags & DC_GCM_SYSTEM_ONLY) != 0 {
|
||||||
|
context
|
||||||
|
.sql
|
||||||
|
.query_map(
|
||||||
|
"SELECT m.id AS id, m.timestamp AS timestamp, m.param AS param, m.from_id AS from_id, m.to_id AS to_id
|
||||||
|
FROM msgs m
|
||||||
|
WHERE m.chat_id=?
|
||||||
|
AND m.hidden=0
|
||||||
|
AND (
|
||||||
|
m.param GLOB \"*S=*\"
|
||||||
|
OR m.from_id == 2
|
||||||
|
OR m.to_id == 2
|
||||||
|
)
|
||||||
|
ORDER BY m.timestamp, m.id;",
|
||||||
|
paramsv![chat_id],
|
||||||
|
process_row,
|
||||||
|
process_rows,
|
||||||
|
)
|
||||||
|
.await
|
||||||
} else {
|
} else {
|
||||||
context
|
context
|
||||||
.sql
|
.sql
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ pub const DC_GCL_ADD_ALLDONE_HINT: usize = 0x04;
|
|||||||
pub const DC_GCL_FOR_FORWARDING: usize = 0x08;
|
pub const DC_GCL_FOR_FORWARDING: usize = 0x08;
|
||||||
|
|
||||||
pub const DC_GCM_ADDDAYMARKER: u32 = 0x01;
|
pub const DC_GCM_ADDDAYMARKER: u32 = 0x01;
|
||||||
|
pub const DC_GCM_SYSTEM_ONLY: u32 = 0x02;
|
||||||
|
|
||||||
pub const DC_GCL_VERIFIED_ONLY: usize = 0x01;
|
pub const DC_GCL_VERIFIED_ONLY: usize = 0x01;
|
||||||
pub const DC_GCL_ADD_SELF: usize = 0x02;
|
pub const DC_GCL_ADD_SELF: usize = 0x02;
|
||||||
|
|||||||
Reference in New Issue
Block a user