parent
e4a8334b63
commit
c9fcae05db
@ -0,0 +1,60 @@
|
|||||||
|
use crate::messages::sauce::show_sauce_menu;
|
||||||
|
use crate::utils::get_previous_message_or_reply;
|
||||||
|
|
||||||
|
use sauce_api::Sauce;
|
||||||
|
|
||||||
|
use crate::utils::context_data::Store;
|
||||||
|
use serenity::client::Context;
|
||||||
|
use serenity::framework::standard::macros::command;
|
||||||
|
use serenity::framework::standard::CommandResult;
|
||||||
|
use serenity::model::channel::Message;
|
||||||
|
|
||||||
|
#[command]
|
||||||
|
#[description("Searches for the source of a previously posted image or an image replied to.")]
|
||||||
|
#[usage("")]
|
||||||
|
async fn sauce(ctx: &Context, msg: &Message) -> CommandResult {
|
||||||
|
log::debug!("Got sauce command");
|
||||||
|
let source_msg = get_previous_message_or_reply(ctx, msg).await?;
|
||||||
|
|
||||||
|
if source_msg.is_none() {
|
||||||
|
log::debug!("No source message provided");
|
||||||
|
msg.channel_id.say(ctx, "No source message found.").await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let source_msg = source_msg.unwrap();
|
||||||
|
log::trace!("Source message is {:?}", source_msg);
|
||||||
|
let mut attachment_urls: Vec<String> =
|
||||||
|
source_msg.attachments.into_iter().map(|a| a.url).collect();
|
||||||
|
|
||||||
|
let mut embed_images = source_msg
|
||||||
|
.embeds
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|e| e.thumbnail)
|
||||||
|
.map(|t| t.url)
|
||||||
|
.collect::<Vec<String>>();
|
||||||
|
|
||||||
|
attachment_urls.append(&mut embed_images);
|
||||||
|
log::trace!("Image urls {:?}", attachment_urls);
|
||||||
|
|
||||||
|
if attachment_urls.is_empty() {
|
||||||
|
log::debug!("No images in source image");
|
||||||
|
msg.channel_id.say(ctx, "Images in message found.").await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
log::debug!(
|
||||||
|
"Checking SauceNao for {} attachments",
|
||||||
|
attachment_urls.len()
|
||||||
|
);
|
||||||
|
let data = ctx.data.read().await;
|
||||||
|
let store_data = data.get::<Store>().unwrap();
|
||||||
|
let sources = store_data.sauce_nao.check_sauces(attachment_urls).await?;
|
||||||
|
log::trace!("Sources are {:?}", sources);
|
||||||
|
|
||||||
|
log::debug!("Creating menu...");
|
||||||
|
|
||||||
|
show_sauce_menu(ctx, msg, sources).await?;
|
||||||
|
log::debug!("Menu created");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
@ -1 +1,2 @@
|
|||||||
pub mod music;
|
pub mod music;
|
||||||
|
pub mod sauce;
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
use crate::utils::error::BotResult;
|
||||||
|
use crate::utils::get_domain_for_url;
|
||||||
|
use sauce_api::SauceResult;
|
||||||
|
use serenity::builder::CreateMessage;
|
||||||
|
use serenity::{model::channel::Message, prelude::*};
|
||||||
|
use serenity_utils::prelude::*;
|
||||||
|
|
||||||
|
/// Builds a new sauce menu
|
||||||
|
pub async fn show_sauce_menu(
|
||||||
|
ctx: &Context,
|
||||||
|
msg: &Message,
|
||||||
|
sources: Vec<SauceResult>,
|
||||||
|
) -> BotResult<()> {
|
||||||
|
let pages: Vec<CreateMessage> = sources.into_iter().map(create_sauce_page).collect();
|
||||||
|
|
||||||
|
let menu = if pages.len() == 1 {
|
||||||
|
Menu::new(
|
||||||
|
ctx,
|
||||||
|
msg,
|
||||||
|
&pages,
|
||||||
|
MenuOptions {
|
||||||
|
controls: vec![],
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
Menu::new(ctx, msg, &pages, MenuOptions::default())
|
||||||
|
};
|
||||||
|
menu.run().await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a single sauce page
|
||||||
|
fn create_sauce_page<'a>(result: SauceResult) -> CreateMessage<'a> {
|
||||||
|
let mut message = CreateMessage::default();
|
||||||
|
let mut description_lines = Vec::new();
|
||||||
|
let original = result.original_url;
|
||||||
|
description_lines.push(format!("[Original]({})", original));
|
||||||
|
description_lines.push(String::new());
|
||||||
|
|
||||||
|
for item in result.items {
|
||||||
|
if item.similarity > 70. {
|
||||||
|
description_lines.push(format!(
|
||||||
|
"{}% Similarity: [{}]({})",
|
||||||
|
item.similarity,
|
||||||
|
get_domain_for_url(&item.link).unwrap_or("Source".to_string()),
|
||||||
|
item.link
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
message.embed(|e| {
|
||||||
|
e.title("Sources")
|
||||||
|
.description(description_lines.join("\n"))
|
||||||
|
.thumbnail(original)
|
||||||
|
.footer(|f| f.text("Powered by SauceNAO"))
|
||||||
|
});
|
||||||
|
|
||||||
|
message
|
||||||
|
}
|
Loading…
Reference in New Issue