[no description]
bendn 3 weeks ago
parent 251ee2d · commit b0c3b6c
-rw-r--r--Cargo.toml21
-rw-r--r--src/main.rs58
2 files changed, 63 insertions, 16 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 7b3bc76..1663352 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,7 +4,7 @@ version = "0.1.0"
edition = "2024"
[dependencies]
-tokio = { version = "1.28.2", features = [
+tokio = { version = "1.52.3", features = [
"net",
"sync",
"rt",
@@ -19,20 +19,20 @@ serenity = { version = "0.12", features = [
"gateway",
"model",
], default-features = false }
-clap = { version = "4.4", features = ["derive"] }
-env_logger = "0.10"
+clap = { version = "4.6", features = ["derive"] }
+env_logger = "0.11"
log = "0.4"
-regex = { version = "1.12.2", features = ["unstable", "use_std"] }
-reqwest = "0.11"
-scraper = "0.17"
+regex = { version = "1.13.0", features = ["unstable", "use_std"] }
+reqwest = "0.13"
+scraper = "0.27"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
poise = { git = "https://github.com/serenity-rs/poise", branch = "current" }
-rustls = "0.23.36"
-openssl = { version = "0.10.35", features = ["vendored"] }
+rustls = "0.23.41"
+openssl = { version = "0.10.81", features = ["vendored"] }
fimg = { git = "https://git.bendn.org/fimg", version = "0.4.51" }
-gif = "0.14.1"
-image = { version = "0.25.9", features = [
+gif = "0.14.2"
+image = { version = "0.25.10", features = [
"bmp",
"dds",
"hdr",
@@ -40,6 +40,7 @@ image = { version = "0.25.9", features = [
"pnm",
"tga",
] }
+klipy = "0.1.0"
[patch.crates-io]
serenity = { git = "https://github.com/serenity-rs/serenity" }
diff --git a/src/main.rs b/src/main.rs
index bcced29..add9ba9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,7 +1,6 @@
#![allow(incomplete_features)]
#![feature(
impl_trait_in_fn_trait_return,
- try_blocks,
try_blocks_heterogeneous,
deref_patterns
)]
@@ -15,6 +14,7 @@ use anyhow::Result;
use fimg::scale::{Lanczos3, Nearest};
use fimg::{Image, WritePng};
use gif::Frame;
+use klipy::{Klipy, MediaItem, Sizes};
use poise::CreateReply;
use poise::samples::register_globally;
use regex::Regex;
@@ -129,7 +129,8 @@ pub async fn spawn() {
static TENOR: LazyLock<Regex> =
LazyLock::new(|| Regex::new("https?://tenor.com/view/.+-[0-9]+").unwrap());
-
+static KLIPY: LazyLock<Regex> =
+ LazyLock::new(|| Regex::new("https://klipy.com/gifs/(.+)").unwrap());
static DISCORD: LazyLock<Regex> = LazyLock::new(|| {
Regex::new(
r"https:\/\/(?:cdn|media)\.discordapp\.(?:com|net)\/attachments\/\d+\/\d+\/(?<name>[.\w-]+)\.(?<ext>\w+)(?<tracking>\?[a-z]+=[0-9a-f]+(?:&[a-z]+=[0-9a-f]+)*)?",
@@ -196,7 +197,7 @@ async fn handle_message(
}
}
println!("hi");
- if let Some(x) = (retenor(&new_message.content).await?) {
+ if let Some(x) = retenor(&new_message.content).await? {
return Ok(Some(x));
}
if new_message.embeds.is_empty() {
@@ -212,13 +213,18 @@ async fn handle_message(
);
}
}
- for embed in dbg!(new_message.embeds.clone()) {
- let Some(u) = dbg!(embed.url) else { continue };
- if let Some(x) = embed.provider
+ for embed in new_message.embeds.clone() {
+ let Some(u) = embed.url else { continue };
+ if let Some(x) = &embed.provider
&& let Some("Tenor") = x.name
&& let Some(x) = retenor(&u).await?
{
return Ok(Some(x));
+ } else if let Some(x) = &embed.provider
+ && let Some("Klipy") = x.name
+ && let Some(x) = reklip(c.http(), u).await?
+ {
+ return Ok(Some(x));
} else if let Some(x) =
embed.image.or(embed.thumbnail.map(|x| unsafe { transmute(x) }))
&& x.height.is_none_or(|x| x > 160)
@@ -371,6 +377,46 @@ async fn retenor(u: &str) -> anyhow::Result<Option<CreateAttachment>> {
}
Ok(None)
}
+static KLIENT: LazyLock<Klipy> = LazyLock::new(|| {
+ klipy::Klipy::new(
+ "DaNOFv9lT9zKrNgF30FUpgE4xVex5fQJ86grPq557NzMCzGRNiuYJwlL88yBEFRU",
+ )
+});
+async fn reklip(
+ c: &Http,
+ u: String,
+) -> anyhow::Result<Option<CreateAttachment>> {
+ let a = if let Some(x) = KLIPY.captures(&u)
+ && let Some(slug) = x.get(1)
+ && let [
+ klipy::Item::Content(MediaItem {
+ ref slug,
+ file: Sizes { ref hd, ref md, ref sm, ref xs },
+ ..
+ }),
+ ] = KLIENT.gifs().items([slug.as_str()]).await?.data
+ && let fmts = [hd, md, sm, xs].into_iter().flatten()
+ && let Some(klipy::File { url, .. }) =
+ fmts.clone().filter_map(|x| x.gif.as_ref()).next()
+ {
+ let a = if let Some(klipy::File { url, .. }) = fmts
+ .filter_map(|x| x.gif.as_ref())
+ .find(|x| x.height <= 160 && x.height >= 110)
+ {
+ println!("easy");
+ CreateAttachment::url(c, url).await?
+ } else {
+ let gif = reqwest::get(url).await?.bytes().await?;
+ let (dec, vec) = regif(&gif)?;
+ let vec = vec(dec)?;
+ CreateAttachment::bytes(vec, format!("g{slug}.gif"))
+ };
+ Some(a)
+ } else {
+ None
+ };
+ Ok(a)
+}
async fn rediscord(
u: &str,