From 487ceae1108a49e6d272a205abb5eec272773fb8 Mon Sep 17 00:00:00 2001 From: Ladislav Hano <524934@mail.muni.cz> Date: Sat, 15 Jul 2023 11:18:08 +0200 Subject: [PATCH] MOOving works --- .gitignore | 3 +- src/commands/mod.rs | 1 + src/commands/moove.rs | 67 ++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 19 +++++------- src/message_handler.rs | 12 ++++++++ src/moove.rs | 56 ----------------------------------- 6 files changed, 89 insertions(+), 69 deletions(-) create mode 100644 src/commands/mod.rs create mode 100644 src/commands/moove.rs create mode 100644 src/message_handler.rs delete mode 100644 src/moove.rs diff --git a/.gitignore b/.gitignore index 0b745e2..a5cbe4f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target -.env \ No newline at end of file +.env +.vscode \ No newline at end of file diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..2930a52 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1 @@ +pub mod moove; \ No newline at end of file diff --git a/src/commands/moove.rs b/src/commands/moove.rs new file mode 100644 index 0000000..7c10d38 --- /dev/null +++ b/src/commands/moove.rs @@ -0,0 +1,67 @@ +use std::sync::Arc; + +use anyhow::{self, Context}; +use poise::serenity_prelude::AttachmentType; +use serenity::builder::CreateEmbed; +use serenity::http::Http; +use serenity::model::channel::Message; +use url::Url; +use regex::Regex; + +// Checks if the message should be mooved +// If the message should be mooved, try to move it and return Ok if mooved succesfully +// else returns Err() + +pub enum MooveResult { + Mooved, + NotMooveRequest +} + +pub async fn moove(http: Arc, msg: Message) -> anyhow::Result { + let word_count = msg.content.trim().split_whitespace().count(); + + let re = Regex::new(r"<#[0-9]*>$").unwrap(); + + if word_count != 1 || re.captures(&msg.content).is_none() { + return Ok(MooveResult::NotMooveRequest); + } + + let msg_to_moove = msg.referenced_message.context("no message present")?; + + let mentioned_channel = http.get_channel( + msg.content[2..msg.content.len() - 1].parse::() + .unwrap()).await?.id(); + + //steals all attachments, but sets all of them as Image urls, so rip actual docs etc + let attachments = msg_to_moove + .attachments + .into_iter() + .map(|att| AttachmentType::Image(Url::parse(att.url.as_str()).unwrap())); + + //steals all the embeds + let embeds: Vec = msg_to_moove + .embeds + .into_iter() + .map(|em| CreateEmbed::from(em)) + .collect(); + + let mut new_content = format!("Sent by {}\n mooved {}\n", msg_to_moove.author, msg.author); + + if !msg_to_moove.content.is_empty() { + mentioned_channel.send_message(http, |m| { + m.add_embed(|e| { + e.field("MOO", new_content, false) + .field("Message:\n", msg_to_moove.content.clone(), false) + }) + }).await?; + } + else if attachments.len() > 0 || embeds.len() > 0 { + new_content += format!("Message:\n{}", msg_to_moove.content).as_str(); + mentioned_channel.send_message(http, |m| { + m.content(new_content) + .add_embeds(embeds) + .add_files(attachments) + }).await?; + } + Ok(MooveResult::Mooved) +} diff --git a/src/main.rs b/src/main.rs index f82f07c..724b8ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,3 @@ -use moove::moove; use rand::random; use serenity::async_trait; use serenity::model::channel::Message; @@ -6,7 +5,10 @@ use serenity::model::gateway::Ready; use serenity::prelude::*; use util::security::dotenv_var; -mod moove; +mod message_handler; +use message_handler::handle; + +mod commands; mod util; struct Handler; @@ -14,15 +16,8 @@ struct Handler; #[async_trait] impl EventHandler for Handler { async fn message(&self, ctx: Context, msg: Message) { - match moove(ctx.http.clone(), msg.clone()).await { - Ok(_) => (), - Err(e) => println!("ERROR MOVING!{e}"), - } - if msg.content == "!ping" { - if let Err(why) = msg.channel_id.say(&ctx.http, "Pong!").await { - println!("Error sending message: {:?}", why); - } - } + println!("Got message"); + handle(ctx, msg).await; } async fn ready(&self, ctx: Context, ready: Ready) { @@ -31,7 +26,7 @@ impl EventHandler for Handler { Some(v) => v, None => "OFF".to_string(), }; - if debug == "ON" { + if debug != "ON" { let messages = [ "AAAAAAAAAAAAAAAAAAAA", "Henlooo", diff --git a/src/message_handler.rs b/src/message_handler.rs new file mode 100644 index 0000000..b06f005 --- /dev/null +++ b/src/message_handler.rs @@ -0,0 +1,12 @@ +use serenity::client::Context; +use serenity::model::channel::Message; + +use crate::commands::moove::moove; + +pub async fn handle(ctx: Context, msg: Message) { + println!("In handler"); + match moove(ctx.http, msg).await { + Ok(_) => return, + Err(e) => println!("ERROR: {e}") + }; +} \ No newline at end of file diff --git a/src/moove.rs b/src/moove.rs deleted file mode 100644 index 5afcb95..0000000 --- a/src/moove.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::sync::Arc; - -use anyhow::{self, Context}; -use poise::serenity_prelude::AttachmentType; -use serenity::builder::{CreateEmbed, CreateMessage}; -use serenity::http::Http; -use serenity::model::channel::Attachment; -use serenity::model::channel::Message; -use serenity::model::mention; -use url::Url; - -// use regex::Regex; - -// Checks if the message should be mooved, if not returns Ok(0) -// If the message should be mooved, try to move it and return Ok(1) if mooved succesfully -// else returns Err() - -pub async fn moove(http: Arc, msg: Message) -> anyhow::Result<()> { - let channel_mentions = msg.mention_channels; - let words = msg.content.trim().split_whitespace().count(); - // let re = Regex::new(r"<#[0-9]*>$").unwrap(); - // if re.captures(content) - - if channel_mentions.len() != 1 || words != 1 || msg.content.is_empty() { - anyhow::bail!("no message worth processing"); - } - - let msg_to_moove = msg.referenced_message.context("no message present")?; - - let mentioned_channel = channel_mentions[0].id; - - //steals all attachments, but sets all of them as Image urls, so rip actual docs etc - let attachments = msg_to_moove - .attachments - .into_iter() - .map(|att| AttachmentType::Image(Url::parse(att.url.as_str()).unwrap())); - - //steals all the embeds - let embeds: Vec = msg_to_moove - .embeds - .into_iter() - .map(|em| CreateEmbed::from(em)) - .collect(); - - let mut new_content = format!("Sent by {}\n mooved {}\n", msg_to_moove.author, msg.author); - new_content += format!("Message:\n{}", msg_to_moove.content).as_str(); - - mentioned_channel - .send_message(http, |m| { - m.content(new_content) - .add_embeds(embeds) - .add_files(attachments) - }) - .await?; - Ok(()) -}