mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 17:36:29 +03:00
add ffi to get mailinglist post address (#3520)
* add ffi to get mailinglist post address * Update deltachat-ffi/deltachat.h Co-authored-by: Hocuri <hocuri@gmx.de> * adapt tests to check get_mailinglist_addr() Co-authored-by: Hocuri <hocuri@gmx.de>
This commit is contained in:
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
### API-Changes
|
||||||
|
- add `dc_chat_get_mailinglist_addr()` #3520
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|||||||
@@ -3257,6 +3257,19 @@ uint32_t dc_chat_get_id (const dc_chat_t* chat);
|
|||||||
int dc_chat_get_type (const dc_chat_t* chat);
|
int dc_chat_get_type (const dc_chat_t* chat);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the address where messages are sent to if the chat is a mailing list.
|
||||||
|
* If you just want to know if a mailing list can be written to,
|
||||||
|
* use dc_chat_can_send() instead.
|
||||||
|
*
|
||||||
|
* @memberof dc_chat_t
|
||||||
|
* @param chat The chat object.
|
||||||
|
* @return The mailing list address. Must be released using dc_str_unref() after usage.
|
||||||
|
* If there is no such address, an empty string is returned, NULL is never returned.
|
||||||
|
*/
|
||||||
|
char* dc_chat_get_mailinglist_addr (const dc_chat_t* chat);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get name of a chat. For one-to-one chats, this is the name of the contact.
|
* Get name of a chat. For one-to-one chats, this is the name of the contact.
|
||||||
* For group chats, this is the name given e.g. to dc_create_group_chat() or
|
* For group chats, this is the name given e.g. to dc_create_group_chat() or
|
||||||
|
|||||||
@@ -2781,6 +2781,16 @@ pub unsafe extern "C" fn dc_chat_get_name(chat: *mut dc_chat_t) -> *mut libc::c_
|
|||||||
ffi_chat.chat.get_name().strdup()
|
ffi_chat.chat.get_name().strdup()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn dc_chat_get_mailinglist_addr(chat: *mut dc_chat_t) -> *mut libc::c_char {
|
||||||
|
if chat.is_null() {
|
||||||
|
eprintln!("ignoring careless call to dc_chat_get_mailinglist_addr()");
|
||||||
|
return "".strdup();
|
||||||
|
}
|
||||||
|
let ffi_chat = &*chat;
|
||||||
|
ffi_chat.chat.get_mailinglist_addr().strdup()
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn dc_chat_get_profile_image(chat: *mut dc_chat_t) -> *mut libc::c_char {
|
pub unsafe extern "C" fn dc_chat_get_profile_image(chat: *mut dc_chat_t) -> *mut libc::c_char {
|
||||||
if chat.is_null() {
|
if chat.is_null() {
|
||||||
|
|||||||
@@ -1129,6 +1129,11 @@ impl Chat {
|
|||||||
&self.name
|
&self.name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns mailing list address where messages are sent to.
|
||||||
|
pub fn get_mailinglist_addr(&self) -> &str {
|
||||||
|
self.param.get(Param::ListPost).unwrap_or_default()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns profile image path for the chat.
|
/// Returns profile image path for the chat.
|
||||||
pub async fn get_profile_image(&self, context: &Context) -> Result<Option<PathBuf>> {
|
pub async fn get_profile_image(&self, context: &Context) -> Result<Option<PathBuf>> {
|
||||||
if let Some(image_rel) = self.param.get(Param::ProfileImage) {
|
if let Some(image_rel) = self.param.get(Param::ProfileImage) {
|
||||||
|
|||||||
@@ -2932,6 +2932,10 @@ mod tests {
|
|||||||
|
|
||||||
assert!(chat.is_mailing_list());
|
assert!(chat.is_mailing_list());
|
||||||
assert!(chat.can_send(&t.ctx).await?);
|
assert!(chat.can_send(&t.ctx).await?);
|
||||||
|
assert_eq!(
|
||||||
|
chat.get_mailinglist_addr(),
|
||||||
|
"reply+elernshsetushoyseshetihseusaferuhsedtisneu@reply.github.com"
|
||||||
|
);
|
||||||
assert_eq!(chat.name, "deltachat/deltachat-core-rust");
|
assert_eq!(chat.name, "deltachat/deltachat-core-rust");
|
||||||
assert_eq!(chat::get_chat_contacts(&t.ctx, chat_id).await?.len(), 1);
|
assert_eq!(chat::get_chat_contacts(&t.ctx, chat_id).await?.len(), 1);
|
||||||
|
|
||||||
@@ -2939,6 +2943,7 @@ mod tests {
|
|||||||
|
|
||||||
let chat = chat::Chat::load_from_db(&t.ctx, chat_id).await?;
|
let chat = chat::Chat::load_from_db(&t.ctx, chat_id).await?;
|
||||||
assert!(!chat.can_send(&t.ctx).await?);
|
assert!(!chat.can_send(&t.ctx).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "");
|
||||||
|
|
||||||
let chats = Chatlist::try_load(&t.ctx, 0, None, None).await?;
|
let chats = Chatlist::try_load(&t.ctx, 0, None, None).await?;
|
||||||
assert_eq!(chats.len(), 1);
|
assert_eq!(chats.len(), 1);
|
||||||
@@ -2997,6 +3002,7 @@ mod tests {
|
|||||||
let chat = Chat::load_from_db(&t.ctx, chat_id).await.unwrap();
|
let chat = Chat::load_from_db(&t.ctx, chat_id).await.unwrap();
|
||||||
assert_eq!(chat.name, "delta-dev");
|
assert_eq!(chat.name, "delta-dev");
|
||||||
assert!(chat.can_send(&t).await?);
|
assert!(chat.can_send(&t).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "delta@codespeak.net");
|
||||||
|
|
||||||
let msg = get_chat_msg(&t, chat_id, 0, 1).await;
|
let msg = get_chat_msg(&t, chat_id, 0, 1).await;
|
||||||
let contact1 = Contact::load_from_db(&t.ctx, msg.from_id).await.unwrap();
|
let contact1 = Contact::load_from_db(&t.ctx, msg.from_id).await.unwrap();
|
||||||
@@ -3225,7 +3231,7 @@ Hello mailinglist!\r\n"
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn test_majordomo_mailing_list() {
|
async fn test_majordomo_mailing_list() -> Result<()> {
|
||||||
let t = TestContext::new_alice().await;
|
let t = TestContext::new_alice().await;
|
||||||
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
||||||
|
|
||||||
@@ -3252,6 +3258,8 @@ Hello mailinglist!\r\n"
|
|||||||
assert_eq!(chat.grpid, "mylist@bar.org");
|
assert_eq!(chat.grpid, "mylist@bar.org");
|
||||||
assert_eq!(chat.name, "ola");
|
assert_eq!(chat.name, "ola");
|
||||||
assert_eq!(chat::get_chat_msgs(&t, chat.id, 0).await.unwrap().len(), 1);
|
assert_eq!(chat::get_chat_msgs(&t, chat.id, 0).await.unwrap().len(), 1);
|
||||||
|
assert!(!chat.can_send(&t).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "");
|
||||||
|
|
||||||
// receive another message with no sender name but the same address,
|
// receive another message with no sender name but the same address,
|
||||||
// make sure this lands in the same chat
|
// make sure this lands in the same chat
|
||||||
@@ -3271,10 +3279,12 @@ Hello mailinglist!\r\n"
|
|||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(chat::get_chat_msgs(&t, chat.id, 0).await.unwrap().len(), 2);
|
assert_eq!(chat::get_chat_msgs(&t, chat.id, 0).await.unwrap().len(), 2);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn test_mailchimp_mailing_list() {
|
async fn test_mailchimp_mailing_list() -> Result<()> {
|
||||||
let t = TestContext::new_alice().await;
|
let t = TestContext::new_alice().await;
|
||||||
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
||||||
|
|
||||||
@@ -3301,10 +3311,14 @@ Hello mailinglist!\r\n"
|
|||||||
"399fc0402f1b154b67965632e.100761.list-id.mcsv.net"
|
"399fc0402f1b154b67965632e.100761.list-id.mcsv.net"
|
||||||
);
|
);
|
||||||
assert_eq!(chat.name, "Atlas Obscura");
|
assert_eq!(chat.name, "Atlas Obscura");
|
||||||
|
assert!(!chat.can_send(&t).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn test_dhl_mailing_list() {
|
async fn test_dhl_mailing_list() -> Result<()> {
|
||||||
let t = TestContext::new_alice().await;
|
let t = TestContext::new_alice().await;
|
||||||
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
||||||
|
|
||||||
@@ -3326,10 +3340,14 @@ Hello mailinglist!\r\n"
|
|||||||
assert_eq!(chat.blocked, Blocked::Request);
|
assert_eq!(chat.blocked, Blocked::Request);
|
||||||
assert_eq!(chat.grpid, "1234ABCD-123LMNO.mailing.dhl.de");
|
assert_eq!(chat.grpid, "1234ABCD-123LMNO.mailing.dhl.de");
|
||||||
assert_eq!(chat.name, "DHL Paket");
|
assert_eq!(chat.name, "DHL Paket");
|
||||||
|
assert!(!chat.can_send(&t).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn test_dpd_mailing_list() {
|
async fn test_dpd_mailing_list() -> Result<()> {
|
||||||
let t = TestContext::new_alice().await;
|
let t = TestContext::new_alice().await;
|
||||||
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
||||||
|
|
||||||
@@ -3351,6 +3369,10 @@ Hello mailinglist!\r\n"
|
|||||||
assert_eq!(chat.blocked, Blocked::Request);
|
assert_eq!(chat.blocked, Blocked::Request);
|
||||||
assert_eq!(chat.grpid, "dpdde.mxmail.service.dpd.de");
|
assert_eq!(chat.grpid, "dpdde.mxmail.service.dpd.de");
|
||||||
assert_eq!(chat.name, "DPD");
|
assert_eq!(chat.name, "DPD");
|
||||||
|
assert!(!chat.can_send(&t).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
@@ -3368,6 +3390,8 @@ Hello mailinglist!\r\n"
|
|||||||
assert_eq!(chat.typ, Chattype::Mailinglist);
|
assert_eq!(chat.typ, Chattype::Mailinglist);
|
||||||
assert_eq!(chat.grpid, "96540.xt.local");
|
assert_eq!(chat.grpid, "96540.xt.local");
|
||||||
assert_eq!(chat.name, "Microsoft Store");
|
assert_eq!(chat.name, "Microsoft Store");
|
||||||
|
assert!(!chat.can_send(&t).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "");
|
||||||
|
|
||||||
receive_imf(
|
receive_imf(
|
||||||
&t,
|
&t,
|
||||||
@@ -3379,6 +3403,8 @@ Hello mailinglist!\r\n"
|
|||||||
assert_eq!(chat.typ, Chattype::Mailinglist);
|
assert_eq!(chat.typ, Chattype::Mailinglist);
|
||||||
assert_eq!(chat.grpid, "121231234.xt.local");
|
assert_eq!(chat.grpid, "121231234.xt.local");
|
||||||
assert_eq!(chat.name, "DER SPIEGEL Kundenservice");
|
assert_eq!(chat.name, "DER SPIEGEL Kundenservice");
|
||||||
|
assert!(!chat.can_send(&t).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -3400,6 +3426,8 @@ Hello mailinglist!\r\n"
|
|||||||
assert_eq!(chat.typ, Chattype::Mailinglist);
|
assert_eq!(chat.typ, Chattype::Mailinglist);
|
||||||
assert_eq!(chat.grpid, "51231231231231231231231232869f58.xing.com");
|
assert_eq!(chat.grpid, "51231231231231231231231232869f58.xing.com");
|
||||||
assert_eq!(chat.name, "xing.com");
|
assert_eq!(chat.name, "xing.com");
|
||||||
|
assert!(!chat.can_send(&t).await?);
|
||||||
|
assert_eq!(chat.get_mailinglist_addr(), "");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user