Files
AstralRinth/src/util/webhook.rs
Leo Chen 13187de97d Rustic cleanups, dedups and making the code less hard to read in general (#251)
* typos :help_me:

* (part 1/?) massive cleanup to make the code more Rust-ic and cut down heap allocations.

* (part 2/?) massive cleanup to make the code more Rust-ic and cut down heap allocations.

* (part 3/?) cut down some pretty major heap allocations here - more Bytes and BytesMuts, less Vec<u8>s

also I don't really understand why you need to `to_vec` when you don't really use it again afterwards

* (part 4/?) deduplicate error handling in backblaze logic

* (part 5/?) fixes, cleanups, refactors, and reformatting

* (part 6/?) cleanups and refactors

* remove loads of `as_str` in types that already are `Display`

* Revert "remove loads of `as_str` in types that already are `Display`"

This reverts commit 4f974310cfb167ceba03001d81388db4f0fbb509.

* reformat and move routes util to the util module

* use streams

* Run prepare + formatting issues

Co-authored-by: Jai A <jaiagr+gpg@pm.me>
Co-authored-by: Geometrically <18202329+Geometrically@users.noreply.github.com>
2021-10-11 20:26:59 -07:00

104 lines
2.3 KiB
Rust

use crate::models::projects::Project;
use chrono::{DateTime, Utc};
use serde::Serialize;
#[derive(Serialize)]
struct DiscordEmbed {
pub title: String,
pub description: String,
pub url: String,
pub timestamp: DateTime<Utc>,
pub color: u32,
pub fields: Vec<DiscordEmbedField>,
pub image: DiscordEmbedImage,
}
#[derive(Serialize)]
struct DiscordEmbedField {
pub name: &'static str,
pub value: String,
pub inline: bool,
}
#[derive(Serialize)]
struct DiscordEmbedImage {
pub url: Option<String>,
}
#[derive(Serialize)]
struct DiscordWebhook {
pub embeds: Vec<DiscordEmbed>,
}
pub async fn send_discord_webhook(
project: Project,
webhook_url: String,
) -> Result<(), reqwest::Error> {
let mut fields = vec![
DiscordEmbedField {
name: "id",
value: project.id.to_string(),
inline: true,
},
DiscordEmbedField {
name: "project_type",
value: project.project_type.clone(),
inline: true,
},
DiscordEmbedField {
name: "client_side",
value: project.client_side.to_string(),
inline: true,
},
DiscordEmbedField {
name: "server_side",
value: project.server_side.to_string(),
inline: true,
},
DiscordEmbedField {
name: "categories",
value: project.categories.join(", "),
inline: true,
},
];
if let Some(ref slug) = project.slug {
fields.push(DiscordEmbedField {
name: "slug",
value: slug.clone(),
inline: true,
});
}
let embed = DiscordEmbed {
url: format!(
"{}/mod/{}",
dotenv::var("SITE_URL").unwrap_or_default(),
project
.clone()
.slug
.unwrap_or_else(|| project.id.to_string())
),
title: project.title,
description: project.description,
timestamp: project.published,
color: 0x5DA545,
fields,
image: DiscordEmbedImage {
url: project.icon_url,
},
};
let client = reqwest::Client::new();
client
.post(&webhook_url)
.json(&DiscordWebhook {
embeds: vec![embed],
})
.send()
.await?;
Ok(())
}