You've already forked AstralRinth
forked from didirus/AstralRinth
* 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>
104 lines
2.3 KiB
Rust
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(())
|
|
}
|