diff options
Diffstat (limited to 'server/src/lib.rs')
-rw-r--r-- | server/src/lib.rs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/server/src/lib.rs b/server/src/lib.rs index 3e22585d..60addd27 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -33,14 +33,17 @@ pub mod websocket; use crate::settings::Settings; use chrono::{DateTime, NaiveDateTime, Utc}; +use chttp::prelude::*; use lettre::smtp::authentication::{Credentials, Mechanism}; use lettre::smtp::extension::ClientId; use lettre::smtp::ConnectionReuseParameters; use lettre::{ClientSecurity, SmtpClient, Transport}; use lettre_email::Email; +use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; use rand::distributions::Alphanumeric; use rand::{thread_rng, Rng}; use regex::{Regex, RegexBuilder}; +use serde::Deserialize; pub fn to_datetime_utc(ndt: NaiveDateTime) -> DateTime<Utc> { DateTime::<Utc>::from_utc(ndt, Utc) @@ -143,6 +146,77 @@ pub fn send_email( } } +#[derive(Deserialize, Debug)] +pub struct IframelyResponse { + title: Option<String>, + description: Option<String>, + thumbnail_url: Option<String>, + html: Option<String>, +} + +pub fn fetch_iframely(url: &str) -> Result<IframelyResponse, failure::Error> { + let fetch_url = format!("http://lemmy_iframely:8061/oembed?url={}", url); + let text = chttp::get(&fetch_url)?.text()?; + let res: IframelyResponse = serde_json::from_str(&text)?; + Ok(res) +} + +#[derive(Deserialize, Debug)] +pub struct PictshareResponse { + status: String, + url: String, +} + +pub fn fetch_pictshare(image_url: &str) -> Result<PictshareResponse, failure::Error> { + let fetch_url = format!( + "http://lemmy_pictshare/api/geturl.php?url={}", + utf8_percent_encode(image_url, NON_ALPHANUMERIC) + ); + let text = chttp::get(&fetch_url)?.text()?; + let res: PictshareResponse = serde_json::from_str(&text)?; + Ok(res) +} + +fn fetch_iframely_and_pictshare_data( + url: Option<String>, +) -> ( + Option<String>, + Option<String>, + Option<String>, + Option<String>, +) { + // Fetch iframely data + let (iframely_title, iframely_description, iframely_thumbnail_url, iframely_html) = match url { + Some(url) => match fetch_iframely(&url) { + Ok(res) => (res.title, res.description, res.thumbnail_url, res.html), + Err(e) => { + eprintln!("iframely err: {}", e); + (None, None, None, None) + } + }, + None => (None, None, None, None), + }; + + // Fetch pictshare thumbnail + let pictshare_thumbnail = match iframely_thumbnail_url { + Some(iframely_thumbnail_url) => match fetch_pictshare(&iframely_thumbnail_url) { + Ok(res) => Some(res.url), + Err(e) => { + eprintln!("pictshare err: {}", e); + None + } + }, + None => None, + }; + + ( + iframely_title, + iframely_description, + iframely_html, + pictshare_thumbnail, + ) +} + #[cfg(test)] mod tests { use crate::{extract_usernames, is_email_regex, remove_slurs, slur_check, slurs_vec_to_str}; @@ -188,6 +262,21 @@ mod tests { assert_eq!(usernames, expected); } + // These helped with testing + // #[test] + // fn test_iframely() { + // let res = fetch_iframely("https://www.redspark.nu/?p=15341"); + // assert!(res.is_ok()); + // } + + // #[test] + // fn test_pictshare() { + // let res = fetch_pictshare("https://upload.wikimedia.org/wikipedia/en/2/27/The_Mandalorian_logo.jpg"); + // assert!(res.is_ok()); + // let res_other = fetch_pictshare("https://upload.wikimedia.org/wikipedia/en/2/27/The_Mandalorian_logo.jpgaoeu"); + // assert!(res_other.is_err()); + // } + // #[test] // fn test_send_email() { // let result = send_email("not a subject", "test_email@gmail.com", "ur user", "<h1>HI there</h1>"); |