@@ -31,6 +31,7 @@ use matrix_sdk::crypto::encrypt_room_key_export;
3131use matrix_sdk:: ruma:: api:: client:: error:: ErrorKind ;
3232use matrix_sdk:: ruma:: matrix_uri:: MatrixId ;
3333use matrix_sdk:: ruma:: { MatrixToUri , MatrixUri , OwnedUserId } ;
34+ use matrix_sdk:: OwnedServerName ;
3435use modalkit:: keybindings:: InputBindings ;
3536use rand:: { distributions:: Alphanumeric , Rng } ;
3637use temp_dir:: TempDir ;
@@ -151,12 +152,12 @@ fn config_tab_to_desc(
151152
152153 let window = match window {
153154 config:: WindowPath :: UserId ( user_id) => {
154- let room_id = worker. join_room ( user_id. to_string ( ) ) ?;
155+ let room_id = worker. join_room ( user_id. to_string ( ) , vec ! [ ] ) ?;
155156 IambId :: Room ( room_id, None )
156157 } ,
157158 config:: WindowPath :: RoomId ( room_id) => IambId :: Room ( room_id, None ) ,
158159 config:: WindowPath :: AliasId ( alias) => {
159- let room_id = worker. join_room ( alias. to_string ( ) ) ?;
160+ let room_id = worker. join_room ( alias. to_string ( ) , vec ! [ ] ) ?;
160161 names. insert ( alias, room_id. clone ( ) ) ;
161162 IambId :: Room ( room_id, None )
162163 } ,
@@ -194,6 +195,7 @@ fn restore_layout(
194195fn resolve_mxid (
195196 store : & mut ProgramStore ,
196197 id : MatrixId ,
198+ via : & [ OwnedServerName ] ,
197199 join_or_create : bool ,
198200) -> IambResult < Result < IambId , String > > {
199201 let mut room_name = String :: new ( ) ;
@@ -210,7 +212,7 @@ fn resolve_mxid(
210212 match store. application . worker . client . get_dm_room ( & user_id) {
211213 Some ( room) => room. room_id ( ) . to_owned ( ) ,
212214 None if join_or_create => {
213- store. application . worker . join_room ( user_id. to_string ( ) ) ?
215+ store. application . worker . join_room ( user_id. to_string ( ) , via . to_owned ( ) ) ?
214216 } ,
215217 None => return Ok ( Err ( format ! ( "No dm with {user_id} found. Create new DM?" ) ) ) ,
216218 }
@@ -240,7 +242,7 @@ fn resolve_mxid(
240242 . any ( |room| room. room_id ( ) == room_id)
241243 {
242244 if join_or_create {
243- store. application . worker . join_room ( room_id. to_string ( ) ) ?;
245+ store. application . worker . join_room ( room_id. to_string ( ) , via . to_owned ( ) ) ?;
244246 } else {
245247 return Ok ( Err ( format ! ( "Join room {room_name:?}?" ) ) ) ;
246248 }
@@ -252,14 +254,14 @@ fn resolve_mxid(
252254fn setup_screen (
253255 settings : ApplicationSettings ,
254256 store : & mut ProgramStore ,
255- initial_room : Option < MatrixId > ,
257+ initial_room : Option < ( MatrixId , Vec < OwnedServerName > ) > ,
256258) -> IambResult < ScreenState < IambWindow , IambInfo > > {
257259 let cmd = CommandBarState :: new ( store) ;
258260 let dims = crossterm:: terminal:: size ( ) ?;
259261 let area = Rect :: new ( 0 , 0 , dims. 0 , dims. 1 ) ;
260262
261- if let Some ( id ) = initial_room {
262- match resolve_mxid ( store, id. clone ( ) , false ) ? {
263+ if let Some ( ( id , via ) ) = initial_room {
264+ match resolve_mxid ( store, id. clone ( ) , & via , false ) ? {
263265 Ok ( id) => {
264266 return Ok ( ScreenState :: new ( IambWindow :: open ( id, store) ?, cmd) ) ;
265267 } ,
@@ -275,7 +277,7 @@ fn setup_screen(
275277 setup_tty ( & settings, false ) ?;
276278
277279 if join_or_create {
278- if let Ok ( id) = resolve_mxid ( store, id, true ) ? {
280+ if let Ok ( id) = resolve_mxid ( store, id, & via , true ) ? {
279281 return Ok ( ScreenState :: new ( IambWindow :: open ( id, store) ?, cmd) ) ;
280282 }
281283 }
@@ -353,7 +355,7 @@ impl Application {
353355 pub async fn new (
354356 settings : ApplicationSettings ,
355357 store : AsyncProgramStore ,
356- initial_room : Option < MatrixId > ,
358+ initial_room : Option < ( MatrixId , Vec < OwnedServerName > ) > ,
357359 ) -> IambResult < Application > {
358360 let backend = CrosstermBackend :: new ( stdout ( ) ) ;
359361 let terminal = Terminal :: new ( backend) ?;
@@ -691,13 +693,16 @@ impl Application {
691693 } ,
692694
693695 IambAction :: OpenLink ( url, join_or_create) => {
694- let matrix_id = MatrixUri :: parse ( & url)
695- . map ( |uri| uri. id ( ) . clone ( ) )
696- . or_else ( |_| MatrixToUri :: parse ( & url) . map ( |uri| uri. id ( ) . clone ( ) ) )
697- . ok ( ) ;
696+ let matrix_uri = MatrixUri :: parse ( & url) . ok ( ) ;
697+ let matrix_to_uri = MatrixToUri :: parse ( & url) . ok ( ) ;
698698
699- if let Some ( id) = matrix_id {
700- match resolve_mxid ( store, id. clone ( ) , join_or_create) ? {
699+ let matrix_id = matrix_uri
700+ . as_ref ( )
701+ . map ( |uri| ( uri. id ( ) , uri. via ( ) ) )
702+ . or ( matrix_to_uri. as_ref ( ) . map ( |uri| ( uri. id ( ) , uri. via ( ) ) ) ) ;
703+
704+ if let Some ( ( id, via) ) = matrix_id {
705+ match resolve_mxid ( store, id. clone ( ) , via, join_or_create) ? {
701706 Ok ( room) => {
702707 let target = OpenTarget :: Application ( room) ;
703708 let action = WindowAction :: Switch ( target) ;
@@ -1123,7 +1128,10 @@ fn restore_tty(enable_enhanced_keys: bool, enable_mouse: bool) {
11231128 let _ = crossterm:: terminal:: disable_raw_mode ( ) ;
11241129}
11251130
1126- async fn run ( settings : ApplicationSettings , initial_room : Option < MatrixId > ) -> IambResult < ( ) > {
1131+ async fn run (
1132+ settings : ApplicationSettings ,
1133+ initial_room : Option < ( MatrixId , Vec < OwnedServerName > ) > ,
1134+ ) -> IambResult < ( ) > {
11271135 // Get old keys the first time we run w/ the upgraded SDK.
11281136 let import_keys = check_import_keys ( & settings) . await ?;
11291137
@@ -1198,8 +1206,10 @@ fn main() -> IambResult<()> {
11981206
11991207 let initial_room = if let Some ( uri) = & iamb. uri {
12001208 MatrixUri :: parse ( uri)
1201- . map ( |uri| uri. id ( ) . clone ( ) )
1202- . or_else ( |_| MatrixToUri :: parse ( uri) . map ( |uri| uri. id ( ) . clone ( ) ) )
1209+ . map ( |uri| ( uri. id ( ) . clone ( ) , uri. via ( ) . to_owned ( ) ) )
1210+ . or_else ( |_| {
1211+ MatrixToUri :: parse ( uri) . map ( |uri| ( uri. id ( ) . clone ( ) , uri. via ( ) . to_owned ( ) ) )
1212+ } )
12031213 . ok ( )
12041214 } else {
12051215 None
0 commit comments