mirror of
https://github.com/chatmail/core.git
synced 2026-05-05 14:26:30 +03:00
feat: Add realtime advertisement received event (#6043)
Co-authored-by: link2xt <link2xt@testrun.org> Co-authored-by: iequidoo <117991069+iequidoo@users.noreply.github.com>
This commit is contained in:
@@ -6248,7 +6248,7 @@ void dc_event_unref(dc_event_t* event);
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* webxdc status update received.
|
* Webxdc status update received.
|
||||||
* To get the received status update, use dc_get_webxdc_status_updates() with
|
* To get the received status update, use dc_get_webxdc_status_updates() with
|
||||||
* `serial` set to the last known update
|
* `serial` set to the last known update
|
||||||
* (in case of special bots, `status_update_serial` from `data2`
|
* (in case of special bots, `status_update_serial` from `data2`
|
||||||
@@ -6283,6 +6283,15 @@ void dc_event_unref(dc_event_t* event);
|
|||||||
|
|
||||||
#define DC_EVENT_WEBXDC_REALTIME_DATA 2150
|
#define DC_EVENT_WEBXDC_REALTIME_DATA 2150
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advertisement for ephemeral peer channel communication received.
|
||||||
|
* This can be used by bots to initiate peer-to-peer communication from their side.
|
||||||
|
* @param data1 (int) msg_id
|
||||||
|
* @param data2 0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DC_EVENT_WEBXDC_REALTIME_ADVERTISEMENT 2151
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tells that the Background fetch was completed (or timed out).
|
* Tells that the Background fetch was completed (or timed out).
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -563,6 +563,7 @@ pub unsafe extern "C" fn dc_event_get_id(event: *mut dc_event_t) -> libc::c_int
|
|||||||
EventType::WebxdcStatusUpdate { .. } => 2120,
|
EventType::WebxdcStatusUpdate { .. } => 2120,
|
||||||
EventType::WebxdcInstanceDeleted { .. } => 2121,
|
EventType::WebxdcInstanceDeleted { .. } => 2121,
|
||||||
EventType::WebxdcRealtimeData { .. } => 2150,
|
EventType::WebxdcRealtimeData { .. } => 2150,
|
||||||
|
EventType::WebxdcRealtimeAdvertisementReceived { .. } => 2151,
|
||||||
EventType::AccountsBackgroundFetchDone => 2200,
|
EventType::AccountsBackgroundFetchDone => 2200,
|
||||||
EventType::ChatlistChanged => 2300,
|
EventType::ChatlistChanged => 2300,
|
||||||
EventType::ChatlistItemChanged { .. } => 2301,
|
EventType::ChatlistItemChanged { .. } => 2301,
|
||||||
@@ -621,6 +622,7 @@ pub unsafe extern "C" fn dc_event_get_data1_int(event: *mut dc_event_t) -> libc:
|
|||||||
}
|
}
|
||||||
EventType::WebxdcRealtimeData { msg_id, .. }
|
EventType::WebxdcRealtimeData { msg_id, .. }
|
||||||
| EventType::WebxdcStatusUpdate { msg_id, .. }
|
| EventType::WebxdcStatusUpdate { msg_id, .. }
|
||||||
|
| EventType::WebxdcRealtimeAdvertisementReceived { msg_id }
|
||||||
| EventType::WebxdcInstanceDeleted { msg_id, .. } => msg_id.to_u32() as libc::c_int,
|
| EventType::WebxdcInstanceDeleted { msg_id, .. } => msg_id.to_u32() as libc::c_int,
|
||||||
EventType::ChatlistItemChanged { chat_id } => {
|
EventType::ChatlistItemChanged { chat_id } => {
|
||||||
chat_id.unwrap_or_default().to_u32() as libc::c_int
|
chat_id.unwrap_or_default().to_u32() as libc::c_int
|
||||||
@@ -666,6 +668,7 @@ pub unsafe extern "C" fn dc_event_get_data2_int(event: *mut dc_event_t) -> libc:
|
|||||||
| EventType::ChatlistItemChanged { .. }
|
| EventType::ChatlistItemChanged { .. }
|
||||||
| EventType::ConfigSynced { .. }
|
| EventType::ConfigSynced { .. }
|
||||||
| EventType::ChatModified(_)
|
| EventType::ChatModified(_)
|
||||||
|
| EventType::WebxdcRealtimeAdvertisementReceived { .. }
|
||||||
| EventType::EventChannelOverflow { .. } => 0,
|
| EventType::EventChannelOverflow { .. } => 0,
|
||||||
EventType::MsgsChanged { msg_id, .. }
|
EventType::MsgsChanged { msg_id, .. }
|
||||||
| EventType::ReactionsChanged { msg_id, .. }
|
| EventType::ReactionsChanged { msg_id, .. }
|
||||||
@@ -733,6 +736,7 @@ pub unsafe extern "C" fn dc_event_get_data2_str(event: *mut dc_event_t) -> *mut
|
|||||||
| EventType::IncomingMsgBunch { .. }
|
| EventType::IncomingMsgBunch { .. }
|
||||||
| EventType::ChatlistItemChanged { .. }
|
| EventType::ChatlistItemChanged { .. }
|
||||||
| EventType::ChatlistChanged
|
| EventType::ChatlistChanged
|
||||||
|
| EventType::WebxdcRealtimeAdvertisementReceived { .. }
|
||||||
| EventType::EventChannelOverflow { .. } => ptr::null_mut(),
|
| EventType::EventChannelOverflow { .. } => ptr::null_mut(),
|
||||||
EventType::ConfigureProgress { comment, .. } => {
|
EventType::ConfigureProgress { comment, .. } => {
|
||||||
if let Some(comment) = comment {
|
if let Some(comment) = comment {
|
||||||
|
|||||||
@@ -244,6 +244,11 @@ pub enum EventType {
|
|||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
WebxdcRealtimeData { msg_id: u32, data: Vec<u8> },
|
WebxdcRealtimeData { msg_id: u32, data: Vec<u8> },
|
||||||
|
|
||||||
|
/// Advertisement received over an ephemeral peer channel.
|
||||||
|
/// This can be used by bots to initiate peer-to-peer communication from their side.
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
WebxdcRealtimeAdvertisementReceived { msg_id: u32 },
|
||||||
|
|
||||||
/// Inform that a message containing a webxdc instance has been deleted
|
/// Inform that a message containing a webxdc instance has been deleted
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
WebxdcInstanceDeleted { msg_id: u32 },
|
WebxdcInstanceDeleted { msg_id: u32 },
|
||||||
@@ -373,6 +378,11 @@ impl From<CoreEventType> for EventType {
|
|||||||
msg_id: msg_id.to_u32(),
|
msg_id: msg_id.to_u32(),
|
||||||
data,
|
data,
|
||||||
},
|
},
|
||||||
|
CoreEventType::WebxdcRealtimeAdvertisementReceived { msg_id } => {
|
||||||
|
WebxdcRealtimeAdvertisementReceived {
|
||||||
|
msg_id: msg_id.to_u32(),
|
||||||
|
}
|
||||||
|
}
|
||||||
CoreEventType::WebxdcInstanceDeleted { msg_id } => WebxdcInstanceDeleted {
|
CoreEventType::WebxdcInstanceDeleted { msg_id } => WebxdcInstanceDeleted {
|
||||||
msg_id: msg_id.to_u32(),
|
msg_id: msg_id.to_u32(),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ module.exports = {
|
|||||||
DC_EVENT_SMTP_MESSAGE_SENT: 103,
|
DC_EVENT_SMTP_MESSAGE_SENT: 103,
|
||||||
DC_EVENT_WARNING: 300,
|
DC_EVENT_WARNING: 300,
|
||||||
DC_EVENT_WEBXDC_INSTANCE_DELETED: 2121,
|
DC_EVENT_WEBXDC_INSTANCE_DELETED: 2121,
|
||||||
|
DC_EVENT_WEBXDC_REALTIME_ADVERTISEMENT: 2151,
|
||||||
DC_EVENT_WEBXDC_REALTIME_DATA: 2150,
|
DC_EVENT_WEBXDC_REALTIME_DATA: 2150,
|
||||||
DC_EVENT_WEBXDC_STATUS_UPDATE: 2120,
|
DC_EVENT_WEBXDC_STATUS_UPDATE: 2120,
|
||||||
DC_GCL_ADD_ALLDONE_HINT: 4,
|
DC_GCL_ADD_ALLDONE_HINT: 4,
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ module.exports = {
|
|||||||
2120: 'DC_EVENT_WEBXDC_STATUS_UPDATE',
|
2120: 'DC_EVENT_WEBXDC_STATUS_UPDATE',
|
||||||
2121: 'DC_EVENT_WEBXDC_INSTANCE_DELETED',
|
2121: 'DC_EVENT_WEBXDC_INSTANCE_DELETED',
|
||||||
2150: 'DC_EVENT_WEBXDC_REALTIME_DATA',
|
2150: 'DC_EVENT_WEBXDC_REALTIME_DATA',
|
||||||
|
2151: 'DC_EVENT_WEBXDC_REALTIME_ADVERTISEMENT',
|
||||||
2200: 'DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE',
|
2200: 'DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE',
|
||||||
2300: 'DC_EVENT_CHATLIST_CHANGED',
|
2300: 'DC_EVENT_CHATLIST_CHANGED',
|
||||||
2301: 'DC_EVENT_CHATLIST_ITEM_CHANGED',
|
2301: 'DC_EVENT_CHATLIST_ITEM_CHANGED',
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ export enum C {
|
|||||||
DC_EVENT_SMTP_MESSAGE_SENT = 103,
|
DC_EVENT_SMTP_MESSAGE_SENT = 103,
|
||||||
DC_EVENT_WARNING = 300,
|
DC_EVENT_WARNING = 300,
|
||||||
DC_EVENT_WEBXDC_INSTANCE_DELETED = 2121,
|
DC_EVENT_WEBXDC_INSTANCE_DELETED = 2121,
|
||||||
|
DC_EVENT_WEBXDC_REALTIME_ADVERTISEMENT = 2151,
|
||||||
DC_EVENT_WEBXDC_REALTIME_DATA = 2150,
|
DC_EVENT_WEBXDC_REALTIME_DATA = 2150,
|
||||||
DC_EVENT_WEBXDC_STATUS_UPDATE = 2120,
|
DC_EVENT_WEBXDC_STATUS_UPDATE = 2120,
|
||||||
DC_GCL_ADD_ALLDONE_HINT = 4,
|
DC_GCL_ADD_ALLDONE_HINT = 4,
|
||||||
@@ -343,6 +344,7 @@ export const EventId2EventName: { [key: number]: string } = {
|
|||||||
2120: 'DC_EVENT_WEBXDC_STATUS_UPDATE',
|
2120: 'DC_EVENT_WEBXDC_STATUS_UPDATE',
|
||||||
2121: 'DC_EVENT_WEBXDC_INSTANCE_DELETED',
|
2121: 'DC_EVENT_WEBXDC_INSTANCE_DELETED',
|
||||||
2150: 'DC_EVENT_WEBXDC_REALTIME_DATA',
|
2150: 'DC_EVENT_WEBXDC_REALTIME_DATA',
|
||||||
|
2151: 'DC_EVENT_WEBXDC_REALTIME_ADVERTISEMENT',
|
||||||
2200: 'DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE',
|
2200: 'DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE',
|
||||||
2300: 'DC_EVENT_CHATLIST_CHANGED',
|
2300: 'DC_EVENT_CHATLIST_CHANGED',
|
||||||
2301: 'DC_EVENT_CHATLIST_ITEM_CHANGED',
|
2301: 'DC_EVENT_CHATLIST_ITEM_CHANGED',
|
||||||
|
|||||||
@@ -288,6 +288,13 @@ pub enum EventType {
|
|||||||
data: Vec<u8>,
|
data: Vec<u8>,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/// Advertisement received over an ephemeral peer channel.
|
||||||
|
/// This can be used by bots to initiate peer-to-peer communication from their side.
|
||||||
|
WebxdcRealtimeAdvertisementReceived {
|
||||||
|
/// Message ID of the webxdc instance.
|
||||||
|
msg_id: MsgId,
|
||||||
|
},
|
||||||
|
|
||||||
/// Inform that a message containing a webxdc instance has been deleted.
|
/// Inform that a message containing a webxdc instance has been deleted.
|
||||||
WebxdcInstanceDeleted {
|
WebxdcInstanceDeleted {
|
||||||
/// ID of the deleted message.
|
/// ID of the deleted message.
|
||||||
|
|||||||
@@ -576,6 +576,13 @@ mod tests {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
bob.recv_msg_trash(&alice.pop_sent_msg().await).await;
|
bob.recv_msg_trash(&alice.pop_sent_msg().await).await;
|
||||||
|
loop {
|
||||||
|
let event = bob.evtracker.recv().await.unwrap();
|
||||||
|
if let EventType::WebxdcRealtimeAdvertisementReceived { msg_id } = event.typ {
|
||||||
|
assert!(msg_id == alice_webxdc.id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
let bob_iroh = bob.get_or_try_init_peer_channel().await.unwrap();
|
let bob_iroh = bob.get_or_try_init_peer_channel().await.unwrap();
|
||||||
|
|
||||||
// Bob adds alice to gossip peers.
|
// Bob adds alice to gossip peers.
|
||||||
|
|||||||
@@ -1446,6 +1446,9 @@ async fn add_parts(
|
|||||||
Ok(node_addr) => {
|
Ok(node_addr) => {
|
||||||
info!(context, "Adding iroh peer with address {node_addr:?}.");
|
info!(context, "Adding iroh peer with address {node_addr:?}.");
|
||||||
let instance_id = parent.context("Failed to get parent message")?.id;
|
let instance_id = parent.context("Failed to get parent message")?.id;
|
||||||
|
context.emit_event(EventType::WebxdcRealtimeAdvertisementReceived {
|
||||||
|
msg_id: instance_id,
|
||||||
|
});
|
||||||
if let Some(topic) = get_iroh_topic_for_msg(context, instance_id).await? {
|
if let Some(topic) = get_iroh_topic_for_msg(context, instance_id).await? {
|
||||||
let node_id = node_addr.node_id;
|
let node_id = node_addr.node_id;
|
||||||
let relay_server = node_addr.relay_url().map(|relay| relay.as_str());
|
let relay_server = node_addr.relay_url().map(|relay| relay.as_str());
|
||||||
|
|||||||
Reference in New Issue
Block a user