refraction/src/handlers/event/analyze_logs/mod.rs

73 lines
1.7 KiB
Rust

use crate::{consts::Colors, Data};
use eyre::Result;
use log::{debug, trace};
use poise::serenity_prelude::{
Context, CreateAllowedMentions, CreateEmbed, CreateMessage, Message,
};
mod issues;
mod providers;
use providers::find_log;
pub async fn handle(ctx: &Context, message: &Message, data: &Data) -> Result<()> {
trace!(
"Checking message {} from {} for logs",
message.id,
message.author.id
);
let channel = message.channel_id;
let log = find_log(&data.http_client, message).await;
if log.is_err() {
let embed = CreateEmbed::new()
.title("Analysis failed!")
.description("Couldn't download log");
let allowed_mentions = CreateAllowedMentions::new().replied_user(true);
let our_message = CreateMessage::new()
.reference_message(message)
.allowed_mentions(allowed_mentions)
.embed(embed);
channel.send_message(ctx, our_message).await?;
return Ok(());
}
let Some(log) = log? else {
debug!("No log found in message! Skipping analysis");
return Ok(());
};
let issues = issues::find(&log, data).await?;
let embed = {
let mut e = CreateEmbed::new().title("Log analysis");
if issues.is_empty() {
e = e
.color(Colors::Green)
.description("The automatic check didn't reveal any issues, but it's possible that some issues went unnoticed. Please wait for a volunteer to assist you.");
} else {
e = e.color(Colors::Red);
for (title, description) in issues {
e = e.field(title, description, false);
}
}
e
};
let allowed_mentions = CreateAllowedMentions::new().replied_user(true);
let message = CreateMessage::new()
.reference_message(message)
.allowed_mentions(allowed_mentions)
.embed(embed);
channel.send_message(ctx, message).await?;
Ok(())
}