parent
0e9692a8ef
commit
df7b01b5c1
3 changed files with 31 additions and 16 deletions
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "frogbot"
|
||||
version = "0.1.0"
|
||||
version = "0.1.1"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
|
|
@ -15,6 +15,7 @@ use regex::Regex;
|
|||
use scraper::{Html, Selector};
|
||||
|
||||
/// Represents an Embed in the chat
|
||||
#[derive(Default)]
|
||||
pub struct Embed {
|
||||
/// The title of the embed
|
||||
pub title: String,
|
||||
|
@ -30,7 +31,7 @@ impl Embed {
|
|||
}
|
||||
|
||||
/// Scrapes the HTML of a webpage and generates an [`Embed`] with the scraped information.
|
||||
pub fn parse_metadata(page: &str) -> Embed {
|
||||
pub fn parse_metadata(page: &str) -> Option<Embed> {
|
||||
let doc_body = Html::parse_document(page);
|
||||
|
||||
// Selectors used to get metadata are defined here
|
||||
|
@ -44,19 +45,23 @@ pub fn parse_metadata(page: &str) -> Embed {
|
|||
let mut meta_title = String::default();
|
||||
let mut meta_description = String::default();
|
||||
|
||||
if let Some(title) = title {
|
||||
match (title, desc) {
|
||||
// If both title and description aren't found return None
|
||||
(None, None) => {
|
||||
warn!("Couldn't parse any metadata for URL");
|
||||
return None;
|
||||
},
|
||||
// Otherwise set the title/description to whatever we find
|
||||
(Some(title), Some(desc)) => {
|
||||
meta_title = title.text().collect();
|
||||
} else {
|
||||
warn!("Failed to parse title HTML");
|
||||
}
|
||||
|
||||
if let Some(desc) = desc {
|
||||
meta_description = desc.value().attr("content").unwrap().to_string();
|
||||
} else {
|
||||
warn!("Failed to parse description HTML");
|
||||
}
|
||||
// Handle logging of parse failures
|
||||
(Some(_), None) => warn!("Failed to parse description HTML"),
|
||||
(None, Some(_)) => warn!("Failed to parse title HTML"),
|
||||
}
|
||||
|
||||
Embed::new(meta_title, meta_description)
|
||||
Some(Embed::new(meta_title, meta_description))
|
||||
}
|
||||
|
||||
/// Check if the message has any urls in it and get them if it does
|
||||
|
@ -119,15 +124,22 @@ pub async fn embed_handler(event: OriginalSyncRoomMessageEvent, room: Room, clie
|
|||
|
||||
let urls = get_urls_from_message(&text_content.body);
|
||||
|
||||
let reqwest_client = reqwest::Client::builder().user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.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();
|
||||
|
||||
for url in urls {
|
||||
for mut url in urls {
|
||||
if let Ok(req) = reqwest_client.get(url).send().await {
|
||||
if let Ok(res) = req.text().await {
|
||||
// beware, dirty HTML parsing code
|
||||
let embed = parse_metadata(&res);
|
||||
let metadata = parse_metadata(&res);
|
||||
|
||||
// If we didn't get any metadata set URL to nothing so it won't get repeated
|
||||
// With no other embed data in the bot's embed message
|
||||
if metadata.is_none() {
|
||||
url = "";
|
||||
}
|
||||
|
||||
// Build our message reply
|
||||
let embed = metadata.unwrap_or(Embed::new("No metadata found".to_string(), "".to_string()));
|
||||
let bot_reply = RoomMessageEventContent::text_html(
|
||||
&embed.title,
|
||||
format!(
|
||||
|
|
|
@ -141,6 +141,9 @@ pub async fn run(config: Config) -> anyhow::Result<()> {
|
|||
.await
|
||||
.expect("frogbot couldn't log into it's account.");
|
||||
|
||||
// Set the bot account's display name according to config
|
||||
client.account().set_display_name(Some(&config.display_name)).await?;
|
||||
|
||||
warn!("Logged in successfully!");
|
||||
warn!(
|
||||
"server: '{}', username: '{}', display name: '{}'",
|
||||
|
|
Loading…
Reference in a new issue