🔊 Trace events from Matrix client callbacks to domain methods
This commit is contained in:
@@ -28,13 +28,12 @@ use matrix_sdk::{
|
||||
},
|
||||
Client as MatrixClient, RoomMemberships, RoomState,
|
||||
};
|
||||
|
||||
use tokio::sync::{
|
||||
broadcast,
|
||||
broadcast::{error::SendError, Receiver, Sender},
|
||||
mpsc::{unbounded_channel, UnboundedReceiver},
|
||||
};
|
||||
use tracing::{debug, error, warn};
|
||||
use tracing::{debug, debug_span, error, instrument, warn, Instrument, Span};
|
||||
|
||||
use super::{
|
||||
account_event::AccountEvent,
|
||||
@@ -75,7 +74,7 @@ impl Senders {
|
||||
|
||||
if let Some(room_sender) = room_senders.get(room_id) {
|
||||
if let Err(err) = room_sender.send(event) {
|
||||
error!("Unable to send event to the {room_id} room: {err}");
|
||||
warn!("Unable to send event to the {room_id} room: {err}");
|
||||
return Err(err);
|
||||
}
|
||||
} else {
|
||||
@@ -117,12 +116,15 @@ impl Client {
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
async fn create_space(
|
||||
senders: &Ctx<Senders>,
|
||||
room_id: &OwnedRoomId,
|
||||
room: Option<&Room>,
|
||||
) -> anyhow::Result<(), SendError<AccountEvent>> {
|
||||
if let Some(receiver) = senders.add_room(&room_id) {
|
||||
if let Some(receiver) = senders.add_room(room_id) {
|
||||
let current_span = Span::current();
|
||||
|
||||
let mut name = None;
|
||||
let mut topic = None;
|
||||
if let Some(room) = room {
|
||||
@@ -139,19 +141,21 @@ impl Client {
|
||||
topic.clone(),
|
||||
receiver,
|
||||
reply,
|
||||
current_span.clone(),
|
||||
);
|
||||
|
||||
if let Err(err) = senders.account_events_sender.send(event) {
|
||||
return Err(err);
|
||||
}
|
||||
senders.account_events_sender.send(event)?;
|
||||
|
||||
// We're expecting a response indicating that the client is able to compute the next RoomEvent
|
||||
response.recv().await;
|
||||
|
||||
let events = vec![RoomEvent::NewTopic(topic), RoomEvent::NewName(name)];
|
||||
let events = vec![
|
||||
RoomEvent::NewTopic(topic, current_span.clone()),
|
||||
RoomEvent::NewName(name, current_span),
|
||||
];
|
||||
|
||||
for event in events {
|
||||
if let Err(_err) = senders.send(&room_id, event.clone()) {
|
||||
if let Err(_err) = senders.send(room_id, event.clone()) {
|
||||
// TODO: Return an error
|
||||
}
|
||||
}
|
||||
@@ -160,6 +164,7 @@ impl Client {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
async fn create_room(
|
||||
senders: &Ctx<Senders>,
|
||||
room: &Room,
|
||||
@@ -172,7 +177,7 @@ impl Client {
|
||||
let is_direct = match room.is_direct().await {
|
||||
Ok(is_direct) => Some(is_direct),
|
||||
Err(err) => {
|
||||
error!("Unable to know if the {room_id} room is direct: {err}");
|
||||
warn!("Unable to know if the {room_id} room is direct: {err}");
|
||||
None
|
||||
}
|
||||
};
|
||||
@@ -205,11 +210,10 @@ impl Client {
|
||||
room.state(),
|
||||
receiver,
|
||||
reply,
|
||||
Span::current(),
|
||||
);
|
||||
|
||||
if let Err(err) = senders.account_events_sender.send(event) {
|
||||
return Err(err);
|
||||
}
|
||||
senders.account_events_sender.send(event)?;
|
||||
|
||||
// We're expecting a response indicating that the client is able to compute the next RoomEvent
|
||||
response.recv().await;
|
||||
@@ -217,6 +221,7 @@ impl Client {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
async fn add_room(
|
||||
senders: &Ctx<Senders>,
|
||||
room: &Room,
|
||||
@@ -255,7 +260,7 @@ impl Client {
|
||||
let _ = Self::create_space(senders, &parent, None).await;
|
||||
}
|
||||
|
||||
let event = RoomEvent::NewChild(room_id.clone());
|
||||
let event = RoomEvent::NewChild(room_id.clone(), Span::current());
|
||||
if let Err(_err) = senders.send(&parent, event) {
|
||||
// TODO: Return an error
|
||||
}
|
||||
@@ -270,7 +275,9 @@ impl Client {
|
||||
room: Room,
|
||||
senders: Ctx<Senders>,
|
||||
) {
|
||||
let _ = Self::add_room(&senders, &room).await;
|
||||
let span = debug_span!("Matrix::NewRoom", r = ?room.room_id());
|
||||
|
||||
let _ = Self::add_room(&senders, &room).instrument(span).await;
|
||||
}
|
||||
|
||||
// SyncStateEvent: A possibly-redacted state event without a room_id.
|
||||
@@ -279,9 +286,12 @@ impl Client {
|
||||
room: Room,
|
||||
senders: Ctx<Senders>,
|
||||
) {
|
||||
let _ = Self::add_room(&senders, &room).await;
|
||||
let span = debug_span!("Matrix::NewRoom", r = ?room.room_id());
|
||||
|
||||
let _ = Self::add_room(&senders, &room).instrument(span).await;
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
fn on_invite_room_member_event(
|
||||
user_id: OwnedUserId,
|
||||
inviter_id: OwnedUserId,
|
||||
@@ -290,15 +300,16 @@ impl Client {
|
||||
senders: &Ctx<Senders>,
|
||||
) {
|
||||
if let Some(client_user_id) = matrix_client.user_id() {
|
||||
let is_account_user = user_id == client_user_id;
|
||||
let room_id = room.room_id();
|
||||
let is_account_user = user_id == client_user_id;
|
||||
|
||||
debug!(
|
||||
"{} (account user: {is_account_user}) invited by {} to join the {} room",
|
||||
&user_id, &inviter_id, &room_id
|
||||
);
|
||||
|
||||
let event = RoomEvent::Invitation(user_id, inviter_id, is_account_user);
|
||||
let event =
|
||||
RoomEvent::Invitation(user_id, inviter_id, is_account_user, Span::current());
|
||||
|
||||
if let Err(_err) = senders.send(room_id, event) {
|
||||
// TODO: Return an error
|
||||
@@ -306,6 +317,7 @@ impl Client {
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
fn on_join_room_member_event(
|
||||
user_id: OwnedUserId,
|
||||
displayname: Option<String>,
|
||||
@@ -318,9 +330,15 @@ impl Client {
|
||||
let is_account_user = user_id == client_user_id;
|
||||
let room_id = room.room_id();
|
||||
|
||||
error!("{} has joined the {} room", &user_id, &room_id);
|
||||
debug!("{} has joined the {} room", &user_id, &room_id);
|
||||
|
||||
let event = RoomEvent::Join(user_id, displayname, avatar_url, is_account_user);
|
||||
let event = RoomEvent::Join(
|
||||
user_id,
|
||||
displayname,
|
||||
avatar_url,
|
||||
is_account_user,
|
||||
Span::current(),
|
||||
);
|
||||
|
||||
if let Err(_err) = senders.send(room_id, event) {
|
||||
// TODO: Return an error
|
||||
@@ -340,21 +358,35 @@ impl Client {
|
||||
let user_id = &ev.state_key;
|
||||
|
||||
match ev.content.membership {
|
||||
MembershipState::Invite => Self::on_invite_room_member_event(
|
||||
user_id.clone(),
|
||||
ev.sender,
|
||||
&room,
|
||||
&matrix_client,
|
||||
&senders,
|
||||
),
|
||||
MembershipState::Join => Self::on_join_room_member_event(
|
||||
ev.sender,
|
||||
ev.content.displayname,
|
||||
ev.content.avatar_url,
|
||||
&room,
|
||||
&matrix_client,
|
||||
&senders,
|
||||
),
|
||||
MembershipState::Invite => {
|
||||
let span = debug_span!("Matrix::RoomInvitation", r = ?room.room_id());
|
||||
|
||||
span.in_scope(|| {
|
||||
Self::on_invite_room_member_event(
|
||||
user_id.clone(),
|
||||
ev.sender,
|
||||
&room,
|
||||
&matrix_client,
|
||||
&senders,
|
||||
)
|
||||
});
|
||||
}
|
||||
MembershipState::Join => {
|
||||
let span =
|
||||
debug_span!("Matrix::RoomJoin", r = ?room.room_id(), u = ?user_id)
|
||||
.entered();
|
||||
|
||||
span.in_scope(|| {
|
||||
Self::on_join_room_member_event(
|
||||
ev.sender,
|
||||
ev.content.displayname,
|
||||
ev.content.avatar_url,
|
||||
&room,
|
||||
&matrix_client,
|
||||
&senders,
|
||||
)
|
||||
});
|
||||
}
|
||||
_ => {
|
||||
error!("TODO: {:?}", ev);
|
||||
}
|
||||
@@ -377,33 +409,42 @@ impl Client {
|
||||
if let SyncStateEvent::Original(ev) = ev {
|
||||
match ev.content.membership {
|
||||
MembershipState::Invite => {
|
||||
let invitee_id = ev.state_key;
|
||||
let span = debug_span!("Matrix::RoomInvitation", r = ?room.room_id());
|
||||
|
||||
Self::on_invite_room_member_event(
|
||||
invitee_id,
|
||||
ev.sender,
|
||||
&room,
|
||||
&matrix_client,
|
||||
&senders,
|
||||
)
|
||||
// .await
|
||||
span.in_scope(|| {
|
||||
let invitee_id = ev.state_key;
|
||||
|
||||
Self::on_invite_room_member_event(
|
||||
invitee_id,
|
||||
ev.sender,
|
||||
&room,
|
||||
&matrix_client,
|
||||
&senders,
|
||||
)
|
||||
});
|
||||
}
|
||||
MembershipState::Join => {
|
||||
Self::on_join_room_member_event(
|
||||
ev.sender,
|
||||
ev.content.displayname,
|
||||
ev.content.avatar_url,
|
||||
&room,
|
||||
&matrix_client,
|
||||
&senders,
|
||||
)
|
||||
// .await
|
||||
let user_id = ev.sender;
|
||||
let span = debug_span!("Matrix::RoomJoin", r = ?room.room_id(), u = ?user_id)
|
||||
.entered();
|
||||
|
||||
span.in_scope(|| {
|
||||
Self::on_join_room_member_event(
|
||||
user_id,
|
||||
ev.content.displayname,
|
||||
ev.content.avatar_url,
|
||||
&room,
|
||||
&matrix_client,
|
||||
&senders,
|
||||
)
|
||||
});
|
||||
}
|
||||
_ => error!("TODO"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
async fn on_room_avatar_event(room: &Room, senders: &Ctx<Senders>) {
|
||||
let room_id = room.room_id();
|
||||
let avatar = match room
|
||||
@@ -416,12 +457,12 @@ impl Client {
|
||||
{
|
||||
Ok(avatar) => avatar,
|
||||
Err(err) => {
|
||||
error!("Unable to fetch avatar for {}: {err}", &room_id);
|
||||
warn!("Unable to fetch avatar for {}: {err}", &room_id);
|
||||
None
|
||||
}
|
||||
};
|
||||
|
||||
let event = RoomEvent::NewAvatar(avatar);
|
||||
let event = RoomEvent::NewAvatar(avatar, Span::current());
|
||||
|
||||
if let Err(_err) = senders.send(room_id, event) {
|
||||
// TODO: Return an error
|
||||
@@ -433,7 +474,11 @@ impl Client {
|
||||
room: Room,
|
||||
senders: Ctx<Senders>,
|
||||
) {
|
||||
Self::on_room_avatar_event(&room, &senders).await;
|
||||
let span = debug_span!("Matrix::RoomAvatar", r = ?room.room_id());
|
||||
|
||||
Self::on_room_avatar_event(&room, &senders)
|
||||
.instrument(span)
|
||||
.await;
|
||||
}
|
||||
|
||||
async fn on_sync_room_avatar_event(
|
||||
@@ -443,13 +488,18 @@ impl Client {
|
||||
) {
|
||||
if let SyncStateEvent::Original(_ev) = ev {
|
||||
dioxus::prelude::spawn(async move {
|
||||
Self::on_room_avatar_event(&room, &senders).await;
|
||||
let span = debug_span!("Matrix::RoomAvatar", r = ?room.room_id());
|
||||
|
||||
Self::on_room_avatar_event(&room, &senders)
|
||||
.instrument(span)
|
||||
.await;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
fn on_room_name_event(name: Option<String>, room: &Room, senders: &Ctx<Senders>) {
|
||||
let event = RoomEvent::NewName(name);
|
||||
let event = RoomEvent::NewName(name, Span::current());
|
||||
|
||||
if let Err(_err) = senders.send(room.room_id(), event) {
|
||||
// TODO: Return an error
|
||||
@@ -461,7 +511,11 @@ impl Client {
|
||||
room: Room,
|
||||
senders: Ctx<Senders>,
|
||||
) {
|
||||
Self::on_room_name_event(ev.content.name, &room, &senders);
|
||||
let span = debug_span!("Matrix::RoomName", r = ?room.room_id());
|
||||
|
||||
span.in_scope(|| {
|
||||
Self::on_room_name_event(ev.content.name, &room, &senders);
|
||||
});
|
||||
}
|
||||
|
||||
async fn on_sync_room_name_event(
|
||||
@@ -470,12 +524,17 @@ impl Client {
|
||||
senders: Ctx<Senders>,
|
||||
) {
|
||||
if let SyncStateEvent::Original(ev) = ev {
|
||||
Self::on_room_name_event(Some(ev.content.name), &room, &senders);
|
||||
let span = debug_span!("Matrix::RoomName", r = ?room.room_id());
|
||||
|
||||
span.in_scope(|| {
|
||||
Self::on_room_name_event(Some(ev.content.name), &room, &senders);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(skip_all)]
|
||||
fn on_room_topic_event(topic: Option<String>, room: &Room, senders: &Ctx<Senders>) {
|
||||
let event = RoomEvent::NewTopic(topic);
|
||||
let event = RoomEvent::NewTopic(topic, Span::current());
|
||||
|
||||
if let Err(_err) = senders.send(room.room_id(), event) {
|
||||
// TODO: Return an error
|
||||
@@ -487,7 +546,11 @@ impl Client {
|
||||
room: Room,
|
||||
senders: Ctx<Senders>,
|
||||
) {
|
||||
Self::on_room_topic_event(ev.content.topic, &room, &senders);
|
||||
let span = debug_span!("Matrix::RoomTopic", r = ?room.room_id());
|
||||
|
||||
span.in_scope(|| {
|
||||
Self::on_room_topic_event(ev.content.topic, &room, &senders);
|
||||
});
|
||||
}
|
||||
|
||||
async fn on_sync_room_topic_event(
|
||||
@@ -496,7 +559,11 @@ impl Client {
|
||||
senders: Ctx<Senders>,
|
||||
) {
|
||||
if let SyncStateEvent::Original(ev) = ev {
|
||||
Self::on_room_topic_event(Some(ev.content.topic), &room, &senders);
|
||||
let span = debug_span!("Matrix::RoomTopic", r = ?room.room_id());
|
||||
|
||||
span.in_scope(|| {
|
||||
Self::on_room_topic_event(Some(ev.content.topic), &room, &senders);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -629,7 +696,7 @@ impl Client {
|
||||
Err(err) => Err(err.into()),
|
||||
}
|
||||
} else {
|
||||
error!("No room found with the \"{}\" id", room_id.as_str());
|
||||
warn!("No room found with the \"{}\" id", room_id.as_str());
|
||||
// TODO: Return an error if the room has not been found
|
||||
Ok(None)
|
||||
}
|
||||
@@ -644,7 +711,7 @@ impl Client {
|
||||
Err(err) => Err(err.into()),
|
||||
}
|
||||
} else {
|
||||
error!("No room found with the \"{}\" id", room_id.as_str());
|
||||
warn!("No room found with the \"{}\" id", room_id.as_str());
|
||||
// TODO: Return an error if the room has not been found
|
||||
Ok(vec![])
|
||||
}
|
||||
@@ -681,8 +748,8 @@ impl Client {
|
||||
// TODO: Check if we can get member before fetching the data and received an error...
|
||||
|
||||
match room.get_member(user_id).await {
|
||||
Ok(room_member) => match room_member {
|
||||
Some(room_member) => {
|
||||
Ok(room_member) => {
|
||||
if let Some(room_member) = room_member {
|
||||
let res = match room_member
|
||||
.avatar(MediaFormat::Thumbnail(MediaThumbnailSize {
|
||||
method: Method::Scale,
|
||||
@@ -696,16 +763,14 @@ impl Client {
|
||||
};
|
||||
return res;
|
||||
}
|
||||
// TODO: Error msg
|
||||
None => (),
|
||||
},
|
||||
}
|
||||
Err(err) => {
|
||||
error!("Unable to get room member {user_id}: {err}");
|
||||
warn!("Unable to get room member {user_id}: {err}");
|
||||
if let Some(avatar_url) = avatar_url {
|
||||
let thumbnail = self.get_thumbnail(avatar_url.clone()).await;
|
||||
return Ok(Some(thumbnail?));
|
||||
} else {
|
||||
error!("No avatar url set for the {room_id} room");
|
||||
debug!("No avatar url set for the {room_id} room");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user