From d3ace772f4703506e4bc90024b77c658ed9a82df Mon Sep 17 00:00:00 2001 From: Aadarsh Mahesh K Date: Sat, 7 Mar 2026 15:37:38 +0530 Subject: [PATCH 1/2] feat: added webhook to mirror with member identitiy --- src/tasks/status_update_mirror.rs | 79 +++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 8 deletions(-) diff --git a/src/tasks/status_update_mirror.rs b/src/tasks/status_update_mirror.rs index 997e698..2834c95 100644 --- a/src/tasks/status_update_mirror.rs +++ b/src/tasks/status_update_mirror.rs @@ -21,6 +21,10 @@ use anyhow::Context; use async_trait::async_trait; use serenity::client::Context as ClientContext; use serenity::prelude::CacheHttp; +use serenity::model::webhook::Webhook; +use serenity::builder::CreateWebhook; +use serenity::builder::ExecuteWebhook; +use serenity::model::id::{UserId}; use std::collections::HashMap; pub struct MirrorNewUpdates; @@ -30,8 +34,6 @@ use chrono::{Datelike, Duration, Local, Timelike}; use chrono_tz::Asia::Kolkata; use mailparse::{MailHeaderMap, ParsedMail}; use poise::serenity_prelude::ChannelId; -use poise::serenity_prelude::CreateEmbed; -use poise::serenity_prelude::CreateMessage; pub struct EmailDetails { pub from: String, @@ -79,22 +81,80 @@ pub async fn mirror_new_updates(ctx: ClientContext, client: GraphQLClient) -> an if member.track.is_none() || member.group_id.is_none() { continue; } + if let Some(discord_id) = &member.discord_id { + let discord_id: u64 = discord_id.parse()?; + send_update( &ctx, member.name.clone(), + discord_id, member.track.clone().unwrap(), member.group_id.unwrap(), email.body.clone(), ) .await?; } + } + } + Ok(()) +} + +async fn get_or_create_webhook( + ctx: &ClientContext, + channel_id: ChannelId, +) -> anyhow::Result { + + let hooks = channel_id.webhooks(ctx.http()).await?; + + if let Some(hook) = hooks.into_iter().find(|h| h.name == Some("amD Updates".to_string())) { + return Ok(hook); } + + let webhook = channel_id + .create_webhook(ctx.http(), CreateWebhook::new("amD Updates")) + .await?; + + Ok(webhook) +} + +async fn send_webhook_message( + ctx: &ClientContext, + channel_id: ChannelId, + username: String, + avatar_url: String, + content: String, +) -> anyhow::Result<()> { + + let webhook = get_or_create_webhook(ctx, channel_id).await?; + + let builder = ExecuteWebhook::new() + .username(username) + .avatar_url(avatar_url) + .content(content); + + webhook.execute(ctx.http(), false, builder).await?; + Ok(()) } +async fn get_avatar_url( + ctx: &ClientContext, + discord_id: u64, +) -> anyhow::Result { + + let user = ctx.http.get_user(UserId::new(discord_id)).await?; + + let avatar = user + .avatar_url() + .unwrap_or_else(|| user.default_avatar_url()); + + Ok(avatar) +} + async fn send_update( ctx: &ClientContext, name: String, + discord_id: u64, track: String, group: i32, content: String, @@ -111,14 +171,17 @@ async fn send_update( _ => STATUS_UPDATE_CHANNEL_ID, }; - let embed = CreateEmbed::new() - .title(format!("Status Update: {}", name)) - .description(content); + let channel = ChannelId::new(channel_id); - let msg = CreateMessage::new().embed(embed); + let avatar_url = get_avatar_url(ctx, discord_id).await?; - let channel = ChannelId::new(channel_id); - channel.send_message(ctx.http(), msg).await?; + send_webhook_message( + ctx, + channel, + name, + avatar_url, + content, + ).await?; Ok(()) } From 7e8a4a6bc8a3bfb8d6cdc5ba5348ed99c6d9f27a Mon Sep 17 00:00:00 2001 From: Aadarsh Mahesh K Date: Sat, 7 Mar 2026 15:39:46 +0530 Subject: [PATCH 2/2] refactor(mirror): cargo formatting --- src/tasks/status_update_mirror.rs | 53 +++++++++++++------------------ 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/src/tasks/status_update_mirror.rs b/src/tasks/status_update_mirror.rs index 2834c95..30ef712 100644 --- a/src/tasks/status_update_mirror.rs +++ b/src/tasks/status_update_mirror.rs @@ -19,12 +19,12 @@ use super::Task; use crate::graphql::GraphQLClient; use anyhow::Context; use async_trait::async_trait; -use serenity::client::Context as ClientContext; -use serenity::prelude::CacheHttp; -use serenity::model::webhook::Webhook; use serenity::builder::CreateWebhook; use serenity::builder::ExecuteWebhook; -use serenity::model::id::{UserId}; +use serenity::client::Context as ClientContext; +use serenity::model::id::UserId; +use serenity::model::webhook::Webhook; +use serenity::prelude::CacheHttp; use std::collections::HashMap; pub struct MirrorNewUpdates; @@ -82,18 +82,18 @@ pub async fn mirror_new_updates(ctx: ClientContext, client: GraphQLClient) -> an continue; } if let Some(discord_id) = &member.discord_id { - let discord_id: u64 = discord_id.parse()?; - - send_update( - &ctx, - member.name.clone(), - discord_id, - member.track.clone().unwrap(), - member.group_id.unwrap(), - email.body.clone(), - ) - .await?; - } + let discord_id: u64 = discord_id.parse()?; + + send_update( + &ctx, + member.name.clone(), + discord_id, + member.track.clone().unwrap(), + member.group_id.unwrap(), + email.body.clone(), + ) + .await?; + } } } Ok(()) @@ -103,10 +103,12 @@ async fn get_or_create_webhook( ctx: &ClientContext, channel_id: ChannelId, ) -> anyhow::Result { - let hooks = channel_id.webhooks(ctx.http()).await?; - if let Some(hook) = hooks.into_iter().find(|h| h.name == Some("amD Updates".to_string())) { + if let Some(hook) = hooks + .into_iter() + .find(|h| h.name == Some("amD Updates".to_string())) + { return Ok(hook); } @@ -124,7 +126,6 @@ async fn send_webhook_message( avatar_url: String, content: String, ) -> anyhow::Result<()> { - let webhook = get_or_create_webhook(ctx, channel_id).await?; let builder = ExecuteWebhook::new() @@ -137,11 +138,7 @@ async fn send_webhook_message( Ok(()) } -async fn get_avatar_url( - ctx: &ClientContext, - discord_id: u64, -) -> anyhow::Result { - +async fn get_avatar_url(ctx: &ClientContext, discord_id: u64) -> anyhow::Result { let user = ctx.http.get_user(UserId::new(discord_id)).await?; let avatar = user @@ -175,13 +172,7 @@ async fn send_update( let avatar_url = get_avatar_url(ctx, discord_id).await?; - send_webhook_message( - ctx, - channel, - name, - avatar_url, - content, - ).await?; + send_webhook_message(ctx, channel, name, avatar_url, content).await?; Ok(()) }