@@ -8,9 +8,9 @@ use assign::assign;
88use async_stream:: try_stream;
99use futures_core:: stream:: Stream ;
1010use ruma:: {
11- DeviceId , UserId ,
11+ DeviceId ,
1212 api:: {
13- OutgoingRequest , SupportedVersions ,
13+ AppserviceUserIdentity , OutgoingRequest , OutgoingRequestAppserviceExt , SupportedVersions ,
1414 auth_scheme:: { AuthScheme , SendAccessToken } ,
1515 client:: {
1616 account:: register:: { self , RegistrationKind } ,
@@ -24,7 +24,8 @@ use ruma::{
2424} ;
2525
2626use crate :: {
27- Error , HttpClient , ResponseError , ResponseResult , add_user_id_to_query, send_customized_request,
27+ Error , HttpClient , ResponseError , ResponseResult , send_customized_request, send_request,
28+ send_request_as,
2829} ;
2930
3031mod builder;
@@ -83,6 +84,18 @@ impl<C> Client<C> {
8384 pub fn access_token ( & self ) -> Option < String > {
8485 self . 0 . access_token . lock ( ) . expect ( "session mutex was poisoned" ) . clone ( )
8586 }
87+
88+ /// Get the `SendAccessToken` according to the client's `TokenMode`.
89+ fn send_access_token < ' a > ( & self , access_token : & ' a Option < String > ) -> SendAccessToken < ' a > {
90+ let token_mode = self . 0 . token_mode ;
91+
92+ match ( token_mode, access_token. as_deref ( ) ) {
93+ ( TokenMode :: AppService , Some ( at) ) => SendAccessToken :: Appservice ( at) ,
94+ ( TokenMode :: SendIfRequired , Some ( at) ) => SendAccessToken :: IfRequired ( at) ,
95+ ( TokenMode :: SendAlways , Some ( at) ) => SendAccessToken :: Always ( at) ,
96+ ( _, None ) => SendAccessToken :: None ,
97+ }
98+ }
8699}
87100
88101impl < C : HttpClient > Client < C > {
@@ -93,7 +106,16 @@ impl<C: HttpClient> Client<C> {
93106 for < ' a > R :: Authentication : AuthScheme < Input < ' a > = SendAccessToken < ' a > > ,
94107 R :: PathBuilder : SupportedPathBuilder ,
95108 {
96- self . send_customized_request ( request, |_| Ok ( ( ) ) ) . await
109+ let access_token = self . access_token ( ) ;
110+
111+ send_request (
112+ & self . 0 . http_client ,
113+ & self . 0 . homeserver_url ,
114+ self . send_access_token ( & access_token) ,
115+ R :: PathBuilder :: get_path_builder_input ( self ) ,
116+ request,
117+ )
118+ . await
97119 }
98120
99121 /// Makes a request to a Matrix API endpoint including additional URL parameters.
@@ -108,20 +130,12 @@ impl<C: HttpClient> Client<C> {
108130 R :: PathBuilder : SupportedPathBuilder ,
109131 F : FnOnce ( & mut http:: Request < C :: RequestBody > ) -> Result < ( ) , ResponseError < C , R > > ,
110132 {
111- let token_mode = self . 0 . token_mode ;
112133 let access_token = self . access_token ( ) ;
113134
114- let send_access_token = match ( token_mode, access_token. as_deref ( ) ) {
115- ( TokenMode :: AppService , Some ( at) ) => SendAccessToken :: Appservice ( at) ,
116- ( TokenMode :: SendIfRequired , Some ( at) ) => SendAccessToken :: IfRequired ( at) ,
117- ( TokenMode :: SendAlways , Some ( at) ) => SendAccessToken :: Always ( at) ,
118- ( _, None ) => SendAccessToken :: None ,
119- } ;
120-
121135 send_customized_request (
122136 & self . 0 . http_client ,
123137 & self . 0 . homeserver_url ,
124- send_access_token,
138+ self . send_access_token ( & access_token ) ,
125139 R :: PathBuilder :: get_path_builder_input ( self ) ,
126140 request,
127141 customize,
@@ -133,13 +147,27 @@ impl<C: HttpClient> Client<C> {
133147 ///
134148 /// This method is meant to be used by application services when interacting with the
135149 /// client-server API.
136- pub async fn send_request_as < R > ( & self , user_id : & UserId , request : R ) -> ResponseResult < C , R >
150+ pub async fn send_request_as < R > (
151+ & self ,
152+ identity : AppserviceUserIdentity < ' _ > ,
153+ request : R ,
154+ ) -> ResponseResult < C , R >
137155 where
138- R : OutgoingRequest ,
156+ R : OutgoingRequestAppserviceExt ,
139157 for < ' a > R :: Authentication : AuthScheme < Input < ' a > = SendAccessToken < ' a > > ,
140158 R :: PathBuilder : SupportedPathBuilder ,
141159 {
142- self . send_customized_request ( request, add_user_id_to_query :: < C , R > ( user_id) ) . await
160+ let access_token = self . access_token ( ) ;
161+
162+ send_request_as (
163+ & self . 0 . http_client ,
164+ & self . 0 . homeserver_url ,
165+ self . send_access_token ( & access_token) ,
166+ identity,
167+ R :: PathBuilder :: get_path_builder_input ( self ) ,
168+ request,
169+ )
170+ . await
143171 }
144172
145173 /// Log in with a username and password.
0 commit comments