Skip to content

Commit b9df9bc

Browse files
committed
Handle via in uris
1 parent 2e66eae commit b9df9bc

File tree

5 files changed

+73
-46
lines changed

5 files changed

+73
-46
lines changed

src/main.rs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use matrix_sdk::crypto::encrypt_room_key_export;
3131
use matrix_sdk::ruma::api::client::error::ErrorKind;
3232
use matrix_sdk::ruma::matrix_uri::MatrixId;
3333
use matrix_sdk::ruma::{MatrixToUri, MatrixUri, OwnedUserId};
34+
use matrix_sdk::OwnedServerName;
3435
use modalkit::keybindings::InputBindings;
3536
use rand::{distributions::Alphanumeric, Rng};
3637
use 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(
194195
fn 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(
252254
fn 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

src/message/html.rs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@ use std::ops::Deref;
1616

1717
use css_color_parser::Color as CssColor;
1818
use markup5ever_rcdom::{Handle, NodeData, RcDom};
19-
use matrix_sdk::ruma::{
20-
matrix_uri::MatrixId,
21-
MatrixToUri,
22-
MatrixUri,
23-
OwnedRoomAliasId,
24-
OwnedRoomId,
25-
OwnedUserId,
19+
use matrix_sdk::{
20+
ruma::{
21+
matrix_uri::MatrixId,
22+
MatrixToUri,
23+
MatrixUri,
24+
OwnedRoomAliasId,
25+
OwnedRoomId,
26+
OwnedUserId,
27+
},
28+
OwnedServerName,
2629
};
2730
use unicode_segmentation::UnicodeSegmentation;
2831
use url::Url;
@@ -299,7 +302,7 @@ pub enum StyleTreeNode {
299302
Text(Cow<'static, str>),
300303
Sequence(StyleTreeChildren),
301304
RoomAlias(OwnedRoomAliasId, Option<char>),
302-
RoomId(OwnedRoomId, Option<char>),
305+
RoomId(OwnedRoomId, Vec<OwnedServerName>, Option<char>),
303306
UserId(OwnedUserId, Option<char>),
304307
DisplayName(String, OwnedUserId, Option<char>),
305308
}
@@ -349,9 +352,11 @@ impl StyleTreeNode {
349352
urls.push((*c, to_url));
350353
}
351354
},
352-
StyleTreeNode::RoomId(room_id, c) => {
355+
StyleTreeNode::RoomId(room_id, via, c) => {
353356
if let Some(c) = c {
354-
let to_url = Url::parse(&room_id.matrix_uri(false).to_string()).unwrap();
357+
let to_url =
358+
Url::parse(&room_id.matrix_uri_via(via.iter().cloned(), false).to_string())
359+
.unwrap();
355360
urls.push((*c, to_url));
356361
}
357362
},
@@ -520,7 +525,7 @@ impl StyleTreeNode {
520525
let style = printer.settings().get_user_style(user_id);
521526
printer.push_str(display_name.as_str(), style);
522527
},
523-
StyleTreeNode::RoomId(room_id, _) => {
528+
StyleTreeNode::RoomId(room_id, _, _) => {
524529
let bold = style.add_modifier(StyleModifier::BOLD);
525530
printer.push_str(room_id.as_str(), bold);
526531
},
@@ -739,9 +744,15 @@ fn attrs_to_style(attrs: &[Attribute]) -> Style {
739744
return style;
740745
}
741746

742-
fn mxid2t(id: &MatrixId, n: Option<char>, c: &StyleTreeNode, h: &Url) -> StyleTreeNode {
747+
fn mxid2t(
748+
id: &MatrixId,
749+
via: &[OwnedServerName],
750+
n: Option<char>,
751+
c: &StyleTreeNode,
752+
h: &Url,
753+
) -> StyleTreeNode {
743754
match id {
744-
MatrixId::Room(room_id) => StyleTreeNode::RoomId(room_id.to_owned(), n),
755+
MatrixId::Room(room_id) => StyleTreeNode::RoomId(room_id.to_owned(), via.to_owned(), n),
745756
MatrixId::RoomAlias(alias) => StyleTreeNode::RoomAlias(alias.to_owned(), n),
746757
MatrixId::User(user_id) => StyleTreeNode::UserId(user_id.to_owned(), n),
747758
MatrixId::Event(room_or_alias_id, _) => {
@@ -751,7 +762,7 @@ fn mxid2t(id: &MatrixId, n: Option<char>, c: &StyleTreeNode, h: &Url) -> StyleTr
751762
StyleTreeNode::RoomAlias(alias_id.to_owned(), n)
752763
} else {
753764
let room_id = <&matrix_sdk::ruma::RoomId>::try_from(room_or_alias_id).unwrap();
754-
StyleTreeNode::RoomId(room_id.to_owned(), n)
765+
StyleTreeNode::RoomId(room_id.to_owned(), via.to_owned(), n)
755766
}
756767
},
757768
_ => {
@@ -784,9 +795,9 @@ fn h2t(hdl: &Handle, state: &mut TreeGenState) -> StyleTreeChildren {
784795
let n = state.next_link_char();
785796

786797
if let Ok(uri) = MatrixToUri::parse(h.as_str()) {
787-
mxid2t(uri.id(), n, &c, &h)
798+
mxid2t(uri.id(), uri.via(), n, &c, &h)
788799
} else if let Ok(uri) = MatrixUri::parse(h.as_str()) {
789-
mxid2t(uri.id(), n, &c, &h)
800+
mxid2t(uri.id(), uri.via(), n, &c, &h)
790801
} else if let Some(n) = n {
791802
StyleTreeNode::Anchor(c, n, h)
792803
} else {

src/message/state.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,7 @@ pub fn html_state(ev: &AnySyncStateEvent) -> StyleTree {
779779
..
780780
}) => {
781781
let prefix = StyleTreeNode::Text("* upgraded the room; replacement room is ".into());
782-
let room = StyleTreeNode::RoomId(content.replacement_room.clone(), Some('0'));
782+
let room = StyleTreeNode::RoomId(content.replacement_room.clone(), vec![], Some('0'));
783783
vec![prefix, room]
784784
},
785785
AnyFullStateEventContent::RoomTopic(FullStateEventContent::Original {
@@ -793,7 +793,7 @@ pub fn html_state(ev: &AnySyncStateEvent) -> StyleTree {
793793
let prefix = StyleTreeNode::Text("* added a space child: ".into());
794794

795795
let room_id = if let Ok(room_id) = OwnedRoomId::from_str(ev.state_key()) {
796-
StyleTreeNode::RoomId(room_id, Some('0'))
796+
StyleTreeNode::RoomId(room_id, vec![], Some('0'))
797797
} else {
798798
bold(ev.state_key().to_string())
799799
};
@@ -810,7 +810,7 @@ pub fn html_state(ev: &AnySyncStateEvent) -> StyleTree {
810810
};
811811

812812
let room_id = if let Ok(room_id) = OwnedRoomId::from_str(ev.state_key()) {
813-
StyleTreeNode::RoomId(room_id, Some('0'))
813+
StyleTreeNode::RoomId(room_id, vec![], Some('0'))
814814
} else {
815815
bold(ev.state_key().to_string())
816816
};

src/windows/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ impl Window<IambInfo> for IambWindow {
858858

859859
IambWindow::open(id, store)
860860
} else {
861-
let room_id = worker.join_room(name.clone())?;
861+
let room_id = worker.join_room(name.clone(), vec![])?;
862862

863863
if let Ok(alias) = OwnedRoomAliasId::from_str(&name) {
864864
names.insert(alias, room_id.clone());

src/worker.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use std::time::{Duration, Instant};
1414
use futures::{stream::FuturesUnordered, StreamExt};
1515
use gethostname::gethostname;
1616
use matrix_sdk::ruma::OwnedRoomAliasId;
17+
use matrix_sdk::OwnedServerName;
1718
use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
1819
use tokio::sync::Semaphore;
1920
use tokio::task::JoinHandle;
@@ -628,7 +629,7 @@ pub enum WorkerTask {
628629
GetInviter(MatrixRoom, ClientReply<IambResult<Option<RoomMember>>>),
629630
GetRoom(OwnedRoomId, ClientReply<IambResult<FetchedRoom>>),
630631
ResolveAlias(OwnedRoomAliasId, ClientReply<IambResult<OwnedRoomId>>),
631-
JoinRoom(String, ClientReply<IambResult<OwnedRoomId>>),
632+
JoinRoom(String, Vec<OwnedServerName>, ClientReply<IambResult<OwnedRoomId>>),
632633
Members(OwnedRoomId, ClientReply<IambResult<Vec<RoomMember>>>),
633634
SpaceMembers(OwnedRoomId, ClientReply<IambResult<Vec<OwnedRoomId>>>),
634635
TypingNotice(OwnedRoomId),
@@ -669,9 +670,10 @@ impl Debug for WorkerTask {
669670
.field(&format_args!("_"))
670671
.finish()
671672
},
672-
WorkerTask::JoinRoom(s, _) => {
673+
WorkerTask::JoinRoom(s, via, _) => {
673674
f.debug_tuple("WorkerTask::JoinRoom")
674675
.field(s)
676+
.field(via)
675677
.field(&format_args!("_"))
676678
.finish()
677679
},
@@ -813,10 +815,10 @@ impl Requester {
813815
return response.recv();
814816
}
815817

816-
pub fn join_room(&self, name: String) -> IambResult<OwnedRoomId> {
818+
pub fn join_room(&self, name: String, via: Vec<OwnedServerName>) -> IambResult<OwnedRoomId> {
817819
let (reply, response) = oneshot();
818820

819-
self.tx.send(WorkerTask::JoinRoom(name, reply)).unwrap();
821+
self.tx.send(WorkerTask::JoinRoom(name, via, reply)).unwrap();
820822

821823
return response.recv();
822824
}
@@ -913,9 +915,9 @@ impl ClientWorker {
913915
assert!(self.initialized);
914916
reply.send(self.resolve_alias(alias_id).await);
915917
},
916-
WorkerTask::JoinRoom(room_id, reply) => {
918+
WorkerTask::JoinRoom(name, via, reply) => {
917919
assert!(self.initialized);
918-
reply.send(self.join_room(room_id).await);
920+
reply.send(self.join_room(name, via).await);
919921
},
920922
WorkerTask::GetInviter(invited, reply) => {
921923
assert!(self.initialized);
@@ -1439,9 +1441,13 @@ impl ClientWorker {
14391441
}
14401442
}
14411443

1442-
async fn join_room(&mut self, name: String) -> IambResult<OwnedRoomId> {
1444+
async fn join_room(
1445+
&mut self,
1446+
name: String,
1447+
via: Vec<OwnedServerName>,
1448+
) -> IambResult<OwnedRoomId> {
14431449
if let Ok(alias_id) = OwnedRoomOrAliasId::from_str(name.as_str()) {
1444-
match self.client.join_room_by_id_or_alias(&alias_id, &[]).await {
1450+
match self.client.join_room_by_id_or_alias(&alias_id, &via).await {
14451451
Ok(resp) => Ok(resp.room_id().to_owned()),
14461452
Err(e) => {
14471453
let msg = e.to_string();

0 commit comments

Comments
 (0)