@@ -22,20 +22,21 @@ use ruma::{
2222 api:: client:: {
2323 account:: request_openid_token:: v3:: { Request as OpenIdRequest , Response as OpenIdResponse } ,
2424 filter:: RoomEventFilter ,
25+ future,
2526 } ,
2627 assign,
2728 events:: {
28- AnySyncTimelineEvent , AnyTimelineEvent , MessageLikeEventType , StateEventType ,
29- TimelineEventType ,
29+ AnyMessageLikeEventContent , AnyStateEventContent , AnySyncTimelineEvent , AnyTimelineEvent ,
30+ MessageLikeEventType , StateEventType , TimelineEventType ,
3031 } ,
3132 serde:: Raw ,
32- OwnedEventId , RoomId ,
33+ RoomId , TransactionId ,
3334} ;
3435use serde_json:: value:: RawValue as RawJsonValue ;
3536use tokio:: sync:: mpsc:: { unbounded_channel, UnboundedReceiver } ;
3637use tracing:: error;
3738
38- use super :: StateKeySelector ;
39+ use super :: { machine :: SendEventResponse , StateKeySelector } ;
3940use crate :: {
4041 event_handler:: EventHandlerDropGuard , room:: MessagesOptions , HttpResult , Result , Room ,
4142} ;
@@ -112,11 +113,36 @@ impl MatrixDriver {
112113 event_type : TimelineEventType ,
113114 state_key : Option < String > ,
114115 content : Box < RawJsonValue > ,
115- ) -> Result < OwnedEventId > {
116+ future : Option < future:: FutureParameters > ,
117+ ) -> Result < SendEventResponse > {
116118 let type_str = event_type. to_string ( ) ;
117- Ok ( match state_key {
118- Some ( key) => self . room . send_state_event_raw ( & type_str, & key, content) . await ?. event_id ,
119- None => self . room . send_raw ( & type_str, content) . await ?. event_id ,
119+ Ok ( match ( state_key, future) {
120+ ( None , None ) => SendEventResponse :: from_event_id (
121+ self . room . send_raw ( & type_str, content) . await ?. event_id ,
122+ ) ,
123+ ( Some ( key) , None ) => SendEventResponse :: from_event_id (
124+ self . room . send_state_event_raw ( & type_str, & key, content) . await ?. event_id ,
125+ ) ,
126+ ( None , Some ( future) ) => {
127+ let r = future:: send_future_message_event:: unstable:: Request :: new_raw (
128+ self . room . room_id ( ) . to_owned ( ) ,
129+ TransactionId :: new ( ) . to_owned ( ) ,
130+ MessageLikeEventType :: from ( type_str) ,
131+ future,
132+ Raw :: < AnyMessageLikeEventContent > :: from_json ( content) ,
133+ ) ;
134+ self . room . client . send ( r, None ) . await . map ( |r| r. into ( ) ) ?
135+ }
136+ ( Some ( key) , Some ( future) ) => {
137+ let r = future:: send_future_state_event:: unstable:: Request :: new_raw (
138+ self . room . room_id ( ) . to_owned ( ) ,
139+ key,
140+ StateEventType :: from ( type_str) ,
141+ future,
142+ Raw :: < AnyStateEventContent > :: from_json ( content) ,
143+ ) ;
144+ self . room . client . send ( r, None ) . await . map ( |r| r. into ( ) ) ?
145+ }
120146 } )
121147 }
122148
0 commit comments