Handle emote messages from Matrix
parent
13dc88f830
commit
33e13eb4b0
|
@ -1,10 +1,12 @@
|
||||||
use matrix_sdk::{
|
use matrix_sdk::{
|
||||||
async_trait,
|
async_trait,
|
||||||
room::Room,
|
room::{Joined, Room},
|
||||||
ruma::{
|
ruma::{
|
||||||
events::{
|
events::{
|
||||||
room::{
|
room::{
|
||||||
message::{MessageEventContent, MessageFormat, MessageType, Relation},
|
message::{
|
||||||
|
FormattedBody, MessageEventContent, MessageFormat, MessageType, Relation,
|
||||||
|
},
|
||||||
redaction::RedactionEventContent,
|
redaction::RedactionEventContent,
|
||||||
},
|
},
|
||||||
AnyMessageEventContent, AnySyncRoomEvent, SyncMessageEvent,
|
AnyMessageEventContent, AnySyncRoomEvent, SyncMessageEvent,
|
||||||
|
@ -20,7 +22,10 @@ use tokio::sync::mpsc;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
message_ast::{convert_matrix, convert_plain, format_discord, format_matrix},
|
message_ast::{
|
||||||
|
convert_matrix, convert_plain, format_discord, format_matrix, MessageComponent,
|
||||||
|
MessageContent,
|
||||||
|
},
|
||||||
messages::{MessageAuthor, MessageReference, SentMessage},
|
messages::{MessageAuthor, MessageReference, SentMessage},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -68,6 +73,33 @@ struct MatrixHandler {
|
||||||
current_user_id: UserId,
|
current_user_id: UserId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl MatrixHandler {
|
||||||
|
async fn get_message_author(&self, room: &Joined, user_id: &UserId) -> Option<MessageAuthor> {
|
||||||
|
if let Ok(Some(sender)) = room.get_member(user_id).await {
|
||||||
|
Some(MessageAuthor {
|
||||||
|
display_name: sender
|
||||||
|
.display_name()
|
||||||
|
.unwrap_or_else(|| sender.name())
|
||||||
|
.to_string(),
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_content(&self, body: &str, formatted_body: &Option<FormattedBody>) -> MessageContent {
|
||||||
|
if let Some(html) = formatted_body
|
||||||
|
.as_ref()
|
||||||
|
.filter(|f| f.format == MessageFormat::Html)
|
||||||
|
.map(|f| &f.body)
|
||||||
|
{
|
||||||
|
convert_matrix(html)
|
||||||
|
} else {
|
||||||
|
convert_plain(body)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl EventHandler for MatrixHandler {
|
impl EventHandler for MatrixHandler {
|
||||||
async fn on_room_message(&self, room: Room, event: &SyncMessageEvent<MessageEventContent>) {
|
async fn on_room_message(&self, room: Room, event: &SyncMessageEvent<MessageEventContent>) {
|
||||||
|
@ -87,27 +119,26 @@ impl EventHandler for MatrixHandler {
|
||||||
|
|
||||||
match message_type {
|
match message_type {
|
||||||
MessageType::Text(text) => {
|
MessageType::Text(text) => {
|
||||||
let content = if let Some(html) = text
|
let content = self.get_content(&text.body, &text.formatted);
|
||||||
.formatted
|
|
||||||
.as_ref()
|
|
||||||
.filter(|f| f.format == MessageFormat::Html)
|
|
||||||
.map(|f| &f.body)
|
|
||||||
{
|
|
||||||
convert_matrix(html)
|
|
||||||
} else {
|
|
||||||
convert_plain(&text.body)
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Ok(Some(sender)) = room.get_member(&event.sender).await {
|
if let Some(author) = self.get_message_author(&room, &event.sender).await {
|
||||||
let _ = self.message_tx.send(SentMessage {
|
let _ = self.message_tx.send(SentMessage {
|
||||||
source: message_ref,
|
source: message_ref,
|
||||||
content,
|
content,
|
||||||
author: MessageAuthor {
|
author,
|
||||||
display_name: sender
|
});
|
||||||
.display_name()
|
}
|
||||||
.unwrap_or_else(|| sender.name())
|
}
|
||||||
.to_string(),
|
|
||||||
},
|
MessageType::Emote(emote) => {
|
||||||
|
let mut content = self.get_content(&emote.body, &emote.formatted);
|
||||||
|
content.insert(0, MessageComponent::Plain("* ".to_string()));
|
||||||
|
|
||||||
|
if let Some(author) = self.get_message_author(&room, &event.sender).await {
|
||||||
|
let _ = self.message_tx.send(SentMessage {
|
||||||
|
source: message_ref,
|
||||||
|
content,
|
||||||
|
author,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,6 +146,8 @@ impl EventHandler for MatrixHandler {
|
||||||
// TODO: Handle reactions, uploads (audio, video, image, file), and any other types of event
|
// TODO: Handle reactions, uploads (audio, video, image, file), and any other types of event
|
||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let _ = room.read_receipt(&event.event_id).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue