Compare commits
2 commits
286b000034
...
9f334e1836
Author | SHA1 | Date | |
---|---|---|---|
9f334e1836 | |||
1a2f168f4e |
1 changed files with 9 additions and 9 deletions
|
@ -14,8 +14,9 @@ use matrix_sdk::{
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use scraper::{Html, Selector};
|
use scraper::{Html, Selector};
|
||||||
|
|
||||||
|
use std::time::Instant;
|
||||||
|
|
||||||
/// Represents an Embed in the chat
|
/// Represents an Embed in the chat
|
||||||
#[derive(Default)]
|
|
||||||
pub struct Embed {
|
pub struct Embed {
|
||||||
/// The title of the embed
|
/// The title of the embed
|
||||||
pub title: String,
|
pub title: String,
|
||||||
|
@ -46,20 +47,15 @@ pub fn parse_metadata(page: &str) -> Option<Embed> {
|
||||||
let mut meta_description = String::default();
|
let mut meta_description = String::default();
|
||||||
|
|
||||||
if let (None, None) = (title, desc) {
|
if let (None, None) = (title, desc) {
|
||||||
warn!("Couldn't parse any metadata for URL");
|
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(title) = title {
|
if let Some(title) = title {
|
||||||
meta_title = title.text().collect();
|
meta_title = title.text().collect();
|
||||||
} else {
|
|
||||||
warn!("Failed to parse title HTML");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(desc) = desc {
|
if let Some(desc) = desc {
|
||||||
meta_description = desc.value().attr("content").unwrap().to_string();
|
meta_description = desc.value().attr("content").unwrap().to_string();
|
||||||
} else {
|
|
||||||
warn!("Failed to parse description HTML");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(Embed::new(meta_title, meta_description))
|
Some(Embed::new(meta_title, meta_description))
|
||||||
|
@ -87,7 +83,7 @@ fn get_urls_from_message(message: &str) -> Vec<&str> {
|
||||||
{
|
{
|
||||||
warn!("This is probably a malicious URL, ignoring!");
|
warn!("This is probably a malicious URL, ignoring!");
|
||||||
} else {
|
} else {
|
||||||
warn!("Found {}", ®ex_match.as_str());
|
warn!("Found '{}'", ®ex_match.as_str());
|
||||||
urls.push(regex_match.as_str());
|
urls.push(regex_match.as_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,6 +95,8 @@ fn get_urls_from_message(message: &str) -> Vec<&str> {
|
||||||
|
|
||||||
/// Checks messages for valid links and generates embeds if found
|
/// Checks messages for valid links and generates embeds if found
|
||||||
pub async fn embed_handler(event: OriginalSyncRoomMessageEvent, room: Room, client: Client) {
|
pub async fn embed_handler(event: OriginalSyncRoomMessageEvent, room: Room, client: Client) {
|
||||||
|
let fn_start = Instant::now();
|
||||||
|
|
||||||
if let Room::Joined(room) = room {
|
if let Room::Joined(room) = room {
|
||||||
let full_reply_event = event.clone().into_full_event(room.room_id().to_owned());
|
let full_reply_event = event.clone().into_full_event(room.room_id().to_owned());
|
||||||
|
|
||||||
|
@ -113,17 +111,16 @@ pub async fn embed_handler(event: OriginalSyncRoomMessageEvent, room: Room, clie
|
||||||
// Unfortunately, this makes it so that if your reply has a URL, it will not embed.
|
// Unfortunately, this makes it so that if your reply has a URL, it will not embed.
|
||||||
// TODO: Fix this by scanning replies and only generating embeds for new URLs in future.
|
// TODO: Fix this by scanning replies and only generating embeds for new URLs in future.
|
||||||
if let Some(Relation::Reply { in_reply_to: _ }) = &event.content.relates_to {
|
if let Some(Relation::Reply { in_reply_to: _ }) = &event.content.relates_to {
|
||||||
warn!("Ignoring message, it's a reply to someone else!");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ignore anything that isn't text
|
// Ignore anything that isn't text
|
||||||
let MessageType::Text(text_content) = event.content.msgtype else {
|
let MessageType::Text(text_content) = event.content.msgtype else {
|
||||||
warn!("Ignoring message, content is not plaintext!");
|
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let urls = get_urls_from_message(&text_content.body);
|
let urls = get_urls_from_message(&text_content.body);
|
||||||
|
warn!("Ran fn get_urls_from_message after: '{:#?}'", fn_start.elapsed());
|
||||||
|
|
||||||
let reqwest_client = reqwest::Client::builder().user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36").build().unwrap();
|
let reqwest_client = reqwest::Client::builder().user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36").build().unwrap();
|
||||||
|
|
||||||
|
@ -132,6 +129,7 @@ pub async fn embed_handler(event: OriginalSyncRoomMessageEvent, room: Room, clie
|
||||||
if let Ok(res) = req.text().await {
|
if let Ok(res) = req.text().await {
|
||||||
// beware, dirty HTML parsing code
|
// beware, dirty HTML parsing code
|
||||||
let metadata = parse_metadata(&res);
|
let metadata = parse_metadata(&res);
|
||||||
|
warn!("Ran fn parse_metadata after: '{:#?}'", fn_start.elapsed());
|
||||||
|
|
||||||
// Build and send our message reply
|
// Build and send our message reply
|
||||||
if metadata.is_some() {
|
if metadata.is_some() {
|
||||||
|
@ -153,6 +151,7 @@ pub async fn embed_handler(event: OriginalSyncRoomMessageEvent, room: Room, clie
|
||||||
if room.send(bot_reply, None).await.is_err() {
|
if room.send(bot_reply, None).await.is_err() {
|
||||||
warn!("Failed to send embed for URL: '{}'", &url);
|
warn!("Failed to send embed for URL: '{}'", &url);
|
||||||
}
|
}
|
||||||
|
warn!("Ran fn room.send after: '{:#?}'", fn_start.elapsed());
|
||||||
// If we didn't get any metadata send a generic "No metadata" response
|
// If we didn't get any metadata send a generic "No metadata" response
|
||||||
} else {
|
} else {
|
||||||
let bot_reply = RoomMessageEventContent::text_html(
|
let bot_reply = RoomMessageEventContent::text_html(
|
||||||
|
@ -165,6 +164,7 @@ pub async fn embed_handler(event: OriginalSyncRoomMessageEvent, room: Room, clie
|
||||||
if room.send(bot_reply, None).await.is_err() {
|
if room.send(bot_reply, None).await.is_err() {
|
||||||
warn!("Failed to send embed for URL: '{}'", &url);
|
warn!("Failed to send embed for URL: '{}'", &url);
|
||||||
}
|
}
|
||||||
|
warn!("Ran fn room.send after: '{:#?}'", fn_start.elapsed());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
warn!("Failed to parse HTML for URL: '{}'", &url);
|
warn!("Failed to parse HTML for URL: '{}'", &url);
|
||||||
|
|
Loading…
Reference in a new issue