use mcvm_auth::mc::{call_mc_api, Keypair};
use reqwest::Client;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Debug)]
pub struct MinecraftUserProfile {
pub name: String,
#[serde(rename = "id")]
pub uuid: String,
pub skins: Vec<Skin>,
pub capes: Vec<Cape>,
}
#[derive(Deserialize, Serialize, Debug)]
pub struct Skin {
#[serde(flatten)]
pub cosmetic: Cosmetic,
pub variant: SkinVariant,
}
#[derive(Deserialize, Serialize, Debug, Copy, Clone, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum SkinVariant {
Classic,
Slim,
}
#[derive(Deserialize, Serialize, Debug)]
pub struct Cape {
#[serde(flatten)]
pub cosmetic: Cosmetic,
pub alias: String,
}
#[derive(Deserialize, Serialize, Debug)]
pub struct Cosmetic {
pub id: String,
pub url: String,
pub state: CosmeticState,
}
#[derive(Deserialize, Serialize, Debug, Copy, Clone, PartialEq, Eq)]
#[serde(rename_all = "UPPERCASE")]
pub enum CosmeticState {
Active,
Inactive,
}
pub async fn get_user_profile(
access_token: &str,
client: &Client,
) -> anyhow::Result<MinecraftUserProfile> {
call_mc_api(
"https://api.minecraftservices.com/minecraft/profile",
access_token,
client,
)
.await
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct MinecraftUserCertificate {
pub key_pair: Keypair,
}
pub async fn get_user_certificate(
access_token: &str,
client: &Client,
) -> anyhow::Result<MinecraftUserCertificate> {
let response = client
.post("https://api.minecraftservices.com/player/certificates")
.header("Authorization", format!("Bearer {access_token}"))
.send()
.await?
.error_for_status()?
.json()
.await?;
Ok(response)
}