summaryrefslogtreecommitdiffstats
path: root/server/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/lib.rs')
-rw-r--r--server/src/lib.rs89
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>");