1
0
Fork 0
stickerdeploy/src/deploy_mastodon.rs

143 lines
4.2 KiB
Rust

use std::{collections::HashMap, io::Read, path::PathBuf, process::Command};
use crate::{
mastodon_api::{AdminEmoji, MastodonAPI},
sticker_config::{Sticker, StickerConfig},
};
fn convert_to_png(path: PathBuf) -> Vec<u8> {
let output = Command::new("convert")
.args([
"-format",
"png",
"-resize",
"128x128",
path.as_os_str().to_str().unwrap(),
"png:-",
])
.output()
.expect("failed to execute process");
if !output.status.success() {
panic!(
"failed to run convert, stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
}
output.stdout
}
pub async fn deploy_mastodon(
deploy_id: String,
sticker_config: StickerConfig,
creds: HashMap<String, String>,
base_stickerdb_path: String,
) {
let deploy_where = sticker_config.deploy_where.get(&deploy_id).unwrap();
let deploy_location = deploy_where.mastodon.as_ref().unwrap();
let pack_contents = sticker_config
.sticker_sets
.get(&deploy_where.pack_id)
.unwrap();
let pack_stickers: HashMap<String, Sticker> = pack_contents
.iter()
.map(|sticker_name| {
return (
sticker_name.clone(),
sticker_config.stickers.get(sticker_name).unwrap().clone(),
);
})
.collect();
let token = creds.get(&deploy_location.credential_name).unwrap();
let mastodon_api = MastodonAPI::new(token.to_string(), deploy_location.api_base.clone());
let filter = vec!["domain:local".to_string()];
let mut mastodon_emojis = mastodon_api
.get_custom_emoji(&filter)
.await
.expect("could not get custom emojis");
// Delete emojis which have been removed from list
{
let invalid_emojis: Vec<AdminEmoji> = mastodon_emojis
.clone()
.into_iter()
.filter(|emoji| {
!(pack_contents.contains(&emoji.shortcode)
|| emoji.category != deploy_location.category)
})
.collect();
for invalid_emoji in invalid_emojis.iter() {
println!("Deleting emoji with name {}", &invalid_emoji.shortcode);
mastodon_api
.delete_custom_emoji(&invalid_emoji.id)
.await
.expect("could not delete emoji");
}
}
if let Some(category) = &deploy_location.category {
mastodon_emojis = mastodon_emojis
.into_iter()
.filter(|emoji| emoji.category.is_some())
.filter(|emoji| emoji.category == Some(category.to_string()))
.collect();
} else {
mastodon_emojis = mastodon_emojis
.into_iter()
.filter(|emoji| emoji.category.is_none())
.collect()
}
// add emoji that arent in mastodon_emojis
{
let missing_emoji: Vec<String> = pack_contents
.clone()
.into_iter()
.filter(|emoji_name| {
for emoji in mastodon_emojis.iter() {
if &emoji.shortcode == emoji_name {
return false;
}
}
true
})
.collect();
for emoji_name in missing_emoji.iter() {
println!("Uploading Emoji: {}", emoji_name);
let sticker_data = pack_stickers.get(emoji_name).unwrap();
let file_path = PathBuf::from(&base_stickerdb_path).join(&sticker_data.file);
let mut file_data: Vec<u8>;
if file_path.extension().unwrap() != "png" {
file_data = convert_to_png(file_path);
} else {
file_data = Vec::new();
let mut file = std::fs::File::open(file_path).unwrap();
file.read_to_end(&mut file_data)
.expect("could not read file");
}
mastodon_api
.upload_emoji(
emoji_name.clone(),
deploy_location.category.clone(),
file_data,
)
.await
.expect("could not upload emoji");
}
}
}