mojang_api_wrapper/
utils.rs1
2use base64::{engine::general_purpose, Engine};
3use image::{imageops::{overlay, FilterType}, ImageBuffer, RgbaImage};
4use crate::{errors::Errors, models::player_info::DecodedPlayerProperty};
5
6
7use reqwest::Client;
8
9pub fn decode_property_value(value: &str) -> Result<DecodedPlayerProperty, Errors> {
10 let decoded = general_purpose::STANDARD.decode(value)?;
11 let decoded_str = String::from_utf8_lossy(&decoded).to_string();
12 let value: DecodedPlayerProperty = serde_json::from_str(&decoded_str)?;
13 Ok(value)
14}
15
16pub async fn extract_minecraft_head_from_url(
17 client: &Client,
18 url: &str,
19) -> Result<RgbaImage, Errors> {
20 let response = client.get(url).send().await?;
21 let png_bytes = response.bytes().await?;
22
23 let img = image::load_from_memory(&png_bytes)?;
24
25 let base_head = img.crop_imm(8, 8, 8, 8);
26 let hat = img.crop_imm(40, 8, 8, 8);
27
28 let mut combined: RgbaImage = ImageBuffer::new(128, 128);
29
30 let scaled_base = image::imageops::resize(&base_head, 128, 128, FilterType::Nearest);
31 let scaled_hat = image::imageops::resize(&hat, 128, 128, FilterType::Nearest);
32
33 overlay(&mut combined, &scaled_base, 0, 0);
34 overlay(&mut combined, &scaled_hat, 0, 0);
35
36 Ok(combined)
37}