From 8443cfab00ef91e2cc3f0a4553b3891c0c08a3e2 Mon Sep 17 00:00:00 2001 From: goat <16760685+goaaats@users.noreply.github.com> Date: Wed, 8 Sep 2021 17:59:29 +0200 Subject: [PATCH] feat(january): fetch embeds for multiple links --- src/database/entities/microservice/january.rs | 58 +++++++++++++------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/src/database/entities/microservice/january.rs b/src/database/entities/microservice/january.rs index 97ffaf62..4f92f636 100644 --- a/src/database/entities/microservice/january.rs +++ b/src/database/entities/microservice/january.rs @@ -124,34 +124,56 @@ impl Embed { .collect::>() .join("\n"); - // ! FIXME: allow multiple links let mut finder = LinkFinder::new(); finder.kinds(&[LinkKind::Url]); - let links: Vec<_> = finder.links(&content).collect(); + let links: Vec<_> = finder.links(&content).take(5).collect(); if links.len() == 0 { return Err(Error::LabelMe); } - let link = &links[0]; + let mut embeds: Vec = Vec::new(); - let client = reqwest::Client::new(); - let result = client - .get(&format!("{}/embed", *JANUARY_URL)) - .query(&[("url", link.as_str())]) - .send() - .await; + // ! FIXME: allow configuration of number of embeds + // ! FIXME: batch request to january? + let mut link_index = 0; - match result { - Err(_) => return Err(Error::LabelMe), - Ok(result) => match result.status() { - reqwest::StatusCode::OK => { - let res: Embed = result.json().await.map_err(|_| Error::InvalidOperation)?; + while link_index < links.len() { + let link = &links[link_index]; - Ok(vec![res]) - } - _ => return Err(Error::LabelMe), - }, + // Check if we did the same link already in for this message. + if link_index != 0 && links.iter().take(link_index).any(|x| x.as_str() == link.as_str()) { + link_index = link_index + 1; + continue; + } + + let client = reqwest::Client::new(); + let result = client + .get(&format!("{}/embed", *JANUARY_URL)) + .query(&[("url", link.as_str())]) + .send() + .await; + + if result.is_err() { + link_index = link_index + 1; + continue; + } + + let response = result.unwrap(); + if response.status().is_success() { + let res: Embed = response.json().await.map_err(|_| Error::InvalidOperation)?; + + embeds.push(res); + } + + link_index = link_index + 1; + } + + // Prevent database update when no embeds are found + if embeds.len() > 0 { + Ok(embeds) + } else { + Err(Error::LabelMe) } } }