mirror of
https://github.com/chatmail/core.git
synced 2026-04-02 05:22:14 +03:00
Compare commits
3 Commits
8518d3fc3a
...
sk/hide_dr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c68e25a970 | ||
|
|
e04c4446d6 | ||
|
|
1b9f3368fa |
93
src/chat.rs
93
src/chat.rs
@@ -1,11 +1,11 @@
|
||||
//! # Chat module.
|
||||
|
||||
use std::cmp;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::fmt;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::str::FromStr;
|
||||
use std::time::Duration;
|
||||
use std::{cmp, convert};
|
||||
|
||||
use anyhow::{anyhow, bail, ensure, Context as _, Result};
|
||||
use deltachat_contact_tools::{sanitize_bidi_characters, sanitize_single_line, ContactAddress};
|
||||
@@ -809,6 +809,14 @@ impl ChatId {
|
||||
///
|
||||
/// Passing `None` as message just deletes the draft
|
||||
pub async fn set_draft(self, context: &Context, mut msg: Option<&mut Message>) -> Result<()> {
|
||||
let self_in_chat = self.is_self_in_chat(context).await?;
|
||||
if !self_in_chat {
|
||||
warn!(
|
||||
context,
|
||||
"Not setting draft because self is not member of the chat"
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
if self.is_special() {
|
||||
return Ok(());
|
||||
}
|
||||
@@ -875,6 +883,22 @@ impl ChatId {
|
||||
> 0)
|
||||
}
|
||||
|
||||
async fn get_chat_type(self, context: &Context) -> Result<Chattype> {
|
||||
context
|
||||
.sql
|
||||
.query_get_value("SELECT type FROM chats WHERE id=?;", (self,))
|
||||
.await
|
||||
.map(|res| res.ok_or(anyhow!("Can't get type for char")))
|
||||
.and_then(convert::identity)
|
||||
}
|
||||
|
||||
async fn is_self_in_chat(self, context: &Context) -> Result<bool> {
|
||||
match self.get_chat_type(context).await? {
|
||||
Chattype::Single | Chattype::Broadcast | Chattype::Mailinglist => Ok(true),
|
||||
Chattype::Group => is_contact_in_chat(context, self, ContactId::SELF).await,
|
||||
}
|
||||
}
|
||||
|
||||
/// Set provided message as draft message for specified chat.
|
||||
/// Returns true if the draft was added or updated in place.
|
||||
async fn do_set_draft(self, context: &Context, msg: &mut Message) -> Result<bool> {
|
||||
@@ -1838,8 +1862,9 @@ impl Chat {
|
||||
/// This is somewhat experimental, even more so than the rest of
|
||||
/// deltachat, and the data returned is still subject to change.
|
||||
pub async fn get_info(&self, context: &Context) -> Result<ChatInfo> {
|
||||
let self_in_chat = self.is_self_in_chat(context).await?;
|
||||
let draft = match self.id.get_draft(context).await? {
|
||||
Some(message) => message.text,
|
||||
Some(message) if self_in_chat => message.text,
|
||||
_ => String::new(),
|
||||
};
|
||||
Ok(ChatInfo {
|
||||
@@ -4894,6 +4919,70 @@ mod tests {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn test_draft_only_in_accesible_chat_summary() -> Result<()> {
|
||||
let mut t = TestContextManager::new();
|
||||
let alice = t.alice().await;
|
||||
let bob = t.bob().await;
|
||||
let chat_id = create_group_chat(&alice, ProtectionStatus::Unprotected, "chat").await?;
|
||||
let bob_contact = Contact::create(&alice, "Bob", "bob@example.net").await?;
|
||||
add_contact_to_chat(&alice, chat_id, bob_contact).await?;
|
||||
let bob_chat_id = bob
|
||||
.recv_msg(&alice.send_text(chat_id, "hello bob").await)
|
||||
.await
|
||||
.chat_id;
|
||||
bob_chat_id.accept(&bob).await?;
|
||||
|
||||
// Set draft and assure it is in chat info.
|
||||
let draft = String::from("I'm gonna send this!!");
|
||||
bob_chat_id
|
||||
.set_draft(&bob, Some(&mut Message::new_text(draft.clone())))
|
||||
.await?;
|
||||
let chat = Chat::load_from_db(&bob, bob_chat_id).await?;
|
||||
let info = chat.get_info(&bob).await?;
|
||||
assert_eq!(info.draft, draft);
|
||||
|
||||
// Alice removes bob, so draft is not shown in chat info.
|
||||
remove_contact_from_chat(&alice, chat_id, bob_contact).await?;
|
||||
bob.recv_msg(&alice.pop_sent_msg().await).await;
|
||||
let chat = Chat::load_from_db(&bob, bob_chat_id).await?;
|
||||
assert!(!chat.can_send(&bob).await?);
|
||||
let info = chat.get_info(&bob).await?;
|
||||
assert_eq!(info.draft, String::from(""));
|
||||
|
||||
// Alice re-adds bob, so draft is shown again.
|
||||
add_contact_to_chat(&alice, chat_id, bob_contact).await?;
|
||||
let bob_chat_id = bob
|
||||
.recv_msg(&alice.send_text(chat_id, "hello again, bob").await)
|
||||
.await
|
||||
.chat_id;
|
||||
|
||||
let chat = Chat::load_from_db(&bob, bob_chat_id).await?;
|
||||
assert!(chat.can_send(&bob).await?);
|
||||
let info = chat.get_info(&bob).await?;
|
||||
assert_eq!(info.draft, draft);
|
||||
|
||||
// Bob leaves group so draft is not shown.
|
||||
remove_contact_from_chat(&bob, bob_chat_id, ContactId::SELF).await?;
|
||||
let chat = Chat::load_from_db(&bob, bob_chat_id).await?;
|
||||
assert!(!chat.can_send(&bob).await?);
|
||||
let info = chat.get_info(&bob).await?;
|
||||
assert_eq!(info.draft, String::from(""));
|
||||
|
||||
// Bob can not set a draft if not in chat.
|
||||
bob_chat_id
|
||||
.set_draft(
|
||||
&bob,
|
||||
Some(&mut Message::new_text(String::from(
|
||||
"I'm gonna send this fr fr!!",
|
||||
))),
|
||||
)
|
||||
.await?;
|
||||
assert_eq!(bob_chat_id.get_draft(&bob).await?.unwrap().text, draft);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn test_change_quotes_on_reused_message_object() -> Result<()> {
|
||||
let t = TestContext::new_alice().await;
|
||||
|
||||
Reference in New Issue
Block a user