Skip to content

Commit e619d96

Browse files
authored
Webxdc delete event (#3592)
webxdc delete event
1 parent 40dc182 commit e619d96

File tree

9 files changed

+43
-3
lines changed

9 files changed

+43
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
- order contact lists by "last seen";
3030
this affects `dc_get_chat_contacts()`, `dc_get_contacts()` and `dc_get_blocked_contacts()` #3562
3131
- add `internet_access` flag to `dc_msg_get_webxdc_info()` #3516
32+
- `DC_EVENT_WEBXDC_INSTANCE_DELETED` is emitted when a message containing a webxdc gets deleted #3105
3233

3334
### Fixes
3435
- do not emit notifications for blocked chats #3557

deltachat-ffi/deltachat.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -5724,7 +5724,15 @@ void dc_event_unref(dc_event_t* event);
57245724
* @param data1 (int) msg_id
57255725
* @param data2 (int) status_update_serial - must not be used by UI implementations.
57265726
*/
5727-
#define DC_EVENT_WEBXDC_STATUS_UPDATE 2120
5727+
#define DC_EVENT_WEBXDC_STATUS_UPDATE 2120
5728+
5729+
/**
5730+
* Message deleted which contained a webxdc instance.
5731+
*
5732+
* @param data1 (int) msg_id
5733+
*/
5734+
5735+
#define DC_EVENT_WEBXDC_INSTANCE_DELETED 2121
57285736

57295737

57305738
/**

deltachat-ffi/src/lib.rs

+4
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,7 @@ pub unsafe extern "C" fn dc_event_get_id(event: *mut dc_event_t) -> libc::c_int
504504
EventType::ConnectivityChanged => 2100,
505505
EventType::SelfavatarChanged => 2110,
506506
EventType::WebxdcStatusUpdate { .. } => 2120,
507+
EventType::WebxdcInstanceDeleted { .. } => 2121,
507508
}
508509
}
509510

@@ -550,6 +551,7 @@ pub unsafe extern "C" fn dc_event_get_data1_int(event: *mut dc_event_t) -> libc:
550551
contact_id.to_u32() as libc::c_int
551552
}
552553
EventType::WebxdcStatusUpdate { msg_id, .. } => msg_id.to_u32() as libc::c_int,
554+
EventType::WebxdcInstanceDeleted { msg_id, .. } => msg_id.to_u32() as libc::c_int,
553555
}
554556
}
555557

@@ -581,6 +583,7 @@ pub unsafe extern "C" fn dc_event_get_data2_int(event: *mut dc_event_t) -> libc:
581583
| EventType::ImexFileWritten(_)
582584
| EventType::MsgsNoticed(_)
583585
| EventType::ConnectivityChanged
586+
| EventType::WebxdcInstanceDeleted { .. }
584587
| EventType::SelfavatarChanged => 0,
585588
EventType::ChatModified(_) => 0,
586589
EventType::MsgsChanged { msg_id, .. }
@@ -637,6 +640,7 @@ pub unsafe extern "C" fn dc_event_get_data2_str(event: *mut dc_event_t) -> *mut
637640
| EventType::ConnectivityChanged
638641
| EventType::SelfavatarChanged
639642
| EventType::WebxdcStatusUpdate { .. }
643+
| EventType::WebxdcInstanceDeleted { .. }
640644
| EventType::ChatEphemeralTimerModified { .. } => ptr::null_mut(),
641645
EventType::ConfigureProgress { comment, .. } => {
642646
if let Some(comment) = comment {

deltachat-jsonrpc/src/api/events.rs

+3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ pub fn event_to_json_rpc_notification(event: Event) -> Value {
6060
msg_id,
6161
status_update_serial,
6262
} => (json!(msg_id), json!(status_update_serial)),
63+
EventType::WebxdcInstanceDeleted { msg_id } => (json!(msg_id), Value::Null),
6364
};
6465

6566
let id: EventTypeName = event.typ.into();
@@ -102,6 +103,7 @@ pub enum EventTypeName {
102103
ConnectivityChanged,
103104
SelfavatarChanged,
104105
WebxdcStatusUpdate,
106+
WebXdInstanceDeleted,
105107
}
106108

107109
impl From<EventType> for EventTypeName {
@@ -137,6 +139,7 @@ impl From<EventType> for EventTypeName {
137139
EventType::ConnectivityChanged => ConnectivityChanged,
138140
EventType::SelfavatarChanged => SelfavatarChanged,
139141
EventType::WebxdcStatusUpdate { .. } => WebxdcStatusUpdate,
142+
EventType::WebxdcInstanceDeleted { .. } => WebXdInstanceDeleted,
140143
}
141144
}
142145
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
// AUTO-GENERATED by typescript-type-def
22

3-
export type EventTypeName=("Info"|"SmtpConnected"|"ImapConnected"|"SmtpMessageSent"|"ImapMessageDeleted"|"ImapMessageMoved"|"NewBlobFile"|"DeletedBlobFile"|"Warning"|"Error"|"ErrorSelfNotInGroup"|"MsgsChanged"|"IncomingMsg"|"MsgsNoticed"|"MsgDelivered"|"MsgFailed"|"MsgRead"|"ChatModified"|"ChatEphemeralTimerModified"|"ContactsChanged"|"LocationChanged"|"ConfigureProgress"|"ImexProgress"|"ImexFileWritten"|"SecurejoinInviterProgress"|"SecurejoinJoinerProgress"|"ConnectivityChanged"|"SelfavatarChanged"|"WebxdcStatusUpdate");
3+
export type EventTypeName=("Info"|"SmtpConnected"|"ImapConnected"|"SmtpMessageSent"|"ImapMessageDeleted"|"ImapMessageMoved"|"NewBlobFile"|"DeletedBlobFile"|"Warning"|"Error"|"ErrorSelfNotInGroup"|"MsgsChanged"|"IncomingMsg"|"MsgsNoticed"|"MsgDelivered"|"MsgFailed"|"MsgRead"|"ChatModified"|"ChatEphemeralTimerModified"|"ContactsChanged"|"LocationChanged"|"ConfigureProgress"|"ImexProgress"|"ImexFileWritten"|"SecurejoinInviterProgress"|"SecurejoinJoinerProgress"|"ConnectivityChanged"|"SelfavatarChanged"|"WebxdcStatusUpdate"|"WebXdInstanceDeleted");

deltachat-jsonrpc/typescript/generated/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ export type Viewtype=("Unknown"|
6565
"Webxdc");
6666
export type I32=number;
6767
export type U64=number;
68-
export type Message={"id":U32;"chatId":U32;"fromId":U32;"quotedText":(string|null);"quotedMessageId":(U32|null);"text":(string|null);"hasLocation":boolean;"hasHtml":boolean;"viewType":Viewtype;"state":U32;"timestamp":I64;"sortTimestamp":I64;"receivedTimestamp":I64;"hasDeviatingTimestamp":boolean;"subject":string;"showPadlock":boolean;"isSetupmessage":boolean;"isInfo":boolean;"isForwarded":boolean;"duration":I32;"dimensionsHeight":I32;"dimensionsWidth":I32;"videochatType":(U32|null);"videochatUrl":(string|null);"overrideSenderName":(string|null);"sender":Contact;"setupCodeBegin":(string|null);"file":(string|null);"fileMime":(string|null);"fileBytes":U64;"fileName":(string|null);};
6968
export type WebxdcMessageInfo={
7069
/**
7170
* The name of the app.
@@ -103,4 +102,5 @@ export type WebxdcMessageInfo={
103102
* True if full internet access should be granted to the app.
104103
*/
105104
"internetAccess":boolean;};
105+
export type Message={"id":U32;"chatId":U32;"fromId":U32;"quotedText":(string|null);"quotedMessageId":(U32|null);"text":(string|null);"hasLocation":boolean;"hasHtml":boolean;"viewType":Viewtype;"state":U32;"timestamp":I64;"sortTimestamp":I64;"receivedTimestamp":I64;"hasDeviatingTimestamp":boolean;"subject":string;"showPadlock":boolean;"isSetupmessage":boolean;"isInfo":boolean;"isForwarded":boolean;"duration":I32;"dimensionsHeight":I32;"dimensionsWidth":I32;"videochatType":(U32|null);"videochatUrl":(string|null);"overrideSenderName":(string|null);"sender":Contact;"setupCodeBegin":(string|null);"file":(string|null);"fileMime":(string|null);"fileBytes":U64;"fileName":(string|null);"webxdcInfo":(WebxdcMessageInfo|null);};
106106
export type __AllTyps=[string,boolean,Record<string,string>,U32,U32,null,(U32)[],U32,null,(U32|null),(Account)[],U32,Account,U32,string,(ProviderInfo|null),U32,boolean,U32,Record<string,string>,U32,string,(string|null),null,U32,Record<string,(string|null)>,null,U32,string,null,U32,string,Qr,U32,string,(string|null),U32,(string)[],Record<string,(string|null)>,U32,null,U32,null,U32,(U32)[],U32,U32,Usize,U32,string,U32,U32,string,null,U32,(U32|null),(string|null),(U32|null),(ChatListEntry)[],U32,(ChatListEntry)[],Record<U32,ChatListItemFetchResult>,U32,U32,FullChat,U32,U32,null,U32,U32,null,U32,U32,null,U32,U32,string,U32,(U32|null),[string,string],U32,U32,null,U32,U32,U32,null,U32,U32,U32,null,U32,string,string,U32,U32,U32,U32,(U32)[],U32,U32,Message,U32,(U32)[],Record<U32,Message>,U32,(U32)[],null,U32,U32,string,U32,U32,Contact,U32,string,(string|null),U32,U32,U32,U32,U32,U32,null,U32,U32,null,U32,(Contact)[],U32,U32,(string|null),(U32)[],U32,U32,(string|null),(Contact)[],U32,(U32)[],Record<U32,Contact>,U32,(U32|null),Viewtype,(Viewtype|null),(Viewtype|null),(U32)[],U32,U32,string,string,null,U32,U32,U32,string,U32,U32,WebxdcMessageInfo,U32,string,U32,U32];

src/events.rs

+5
Original file line numberDiff line numberDiff line change
@@ -302,4 +302,9 @@ pub enum EventType {
302302
msg_id: MsgId,
303303
status_update_serial: StatusUpdateSerial,
304304
},
305+
306+
/// Inform that a message containing a webxdc instance has been deleted
307+
WebxdcInstanceDeleted {
308+
msg_id: MsgId,
309+
},
305310
}

src/message.rs

+5
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,11 @@ pub async fn delete_msgs(context: &Context, msg_ids: &[MsgId]) -> Result<()> {
12361236
.trash(context)
12371237
.await
12381238
.with_context(|| format!("Unable to trash message {}", msg_id))?;
1239+
1240+
if msg.viewtype == Viewtype::Webxdc {
1241+
context.emit_event(EventType::WebxdcInstanceDeleted { msg_id: *msg_id });
1242+
}
1243+
12391244
context
12401245
.sql
12411246
.execute(

src/webxdc.rs

+14
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,7 @@ mod tests {
753753
use crate::chatlist::Chatlist;
754754
use crate::config::Config;
755755
use crate::contact::Contact;
756+
use crate::message;
756757
use crate::receive_imf::{receive_imf, receive_imf_inner};
757758
use crate::test_utils::TestContext;
758759

@@ -2377,4 +2378,17 @@ sth_for_the = "future""#
23772378
);
23782379
Ok(())
23792380
}
2381+
2382+
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
2383+
async fn test_webxdc_delete_event() -> Result<()> {
2384+
let alice = TestContext::new_alice().await;
2385+
let chat_id = create_group_chat(&alice, ProtectionStatus::Unprotected, "foo").await?;
2386+
let instance = send_webxdc_instance(&alice, chat_id).await?;
2387+
message::delete_msgs(&alice, &[instance.id]).await?;
2388+
alice
2389+
.evtracker
2390+
.get_matching(|evt| matches!(evt, EventType::WebxdcInstanceDeleted { .. }))
2391+
.await;
2392+
Ok(())
2393+
}
23802394
}

0 commit comments

Comments
 (0)