use std::collections::HashMap;
use crate::client::endpoints::TargetAPI;
use crate::client::{EndpointUser, Error, RequestParameters, Wrapped};
use crate::client::{Paginated, SignedIn};
use crate::mc::user::{
EditableSettings, EditableUserInfo, NewEmail, NewPassword, NotificationInterests, PlayerCode,
Settings, ShopCode, User,
};
use crate::mc::util::{ClaimVideoId, License, LicenseID};
use serde_json::Value;
impl EndpointUser<'_, SignedIn> {
pub fn get_info(&self) -> Result<(Settings, User), Error> {
let mut user_info_wrapper = self.client.get::<Wrapped<Value>>(
TargetAPI::Player,
"/me",
None::<HashMap<String, String>>,
)?;
let settings_val = user_info_wrapper
.remove("Settings")
.ok_or(Error::NotFound("user settings"))?;
let release_obj = serde_json::from_value::<Settings>(settings_val)
.map_err(|err| Error::Deserialization(err))?;
let user_val = user_info_wrapper
.remove("User")
.ok_or(Error::NotFound("user information"))?;
let tracks_obj =
serde_json::from_value::<User>(user_val).map_err(|err| Error::Deserialization(err))?;
Ok((release_obj, tracks_obj))
}
pub fn set_info(&self, user_info: EditableUserInfo) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me",
None::<HashMap<String, String>>,
Some(user_info),
)
}
pub fn set_settings(&self, user_info: EditableSettings) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/settings",
None::<HashMap<String, String>>,
Some(user_info),
)
}
pub fn get_player_code(&self) -> Result<String, Error> {
let resp = self.client.get::<PlayerCode>(
TargetAPI::Player,
"/me/player-code",
None::<HashMap<String, String>>,
)?;
Ok(resp.player_code)
}
pub fn generate_player_code(&self) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/player-code",
None::<HashMap<String, String>>,
None::<()>,
)
}
pub fn set_email(&self, new_email: String) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/email",
None::<HashMap<String, String>>,
Some(NewEmail { new_email }),
)
}
pub fn set_password(&self, old_password: String, new_password: String) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/password",
None::<HashMap<String, String>>,
Some(NewPassword {
old_password,
new_password,
}),
)
}
pub fn enable_2fa_totp(&self) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/two-factor/enable-totp",
None::<HashMap<String, String>>,
None::<()>,
)
}
pub fn disable_2fa_totp(&self) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/two-factor/disable-totp",
None::<HashMap<String, String>>,
None::<()>,
)
}
pub fn enable_2fa_email(&self) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/two-factor/enable-email",
None::<HashMap<String, String>>,
None::<()>,
)
}
pub fn disable_2fa_email(&self) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/two-factor/disable-email",
None::<HashMap<String, String>>,
None::<()>,
)
}
pub fn get_totp_qr_code_image(&self) -> Result<Box<dyn std::io::Read + Send + Sync>, Error> {
self.client.get_reader(
TargetAPI::Player,
"/me/two-factor/totp-qr",
None::<HashMap<String, String>>,
)
}
pub fn set_notification_interests(
&self,
interests: Vec<NotificationInterests>,
) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
"/me/notifications",
None::<HashMap<String, String>>,
Some(interests),
)
}
pub fn get_licenses(
&self,
parameters: Option<RequestParameters>,
) -> Result<Paginated<License>, Error> {
self.client
.get::<Wrapped<Paginated<License>>>(TargetAPI::Player, "/self/licenses", parameters)?
.remove("Licenses")
.ok_or(Error::NotFound("licenses"))
}
pub fn remove_license(&self, license_id: LicenseID) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
&format!("/self/license/{license_id}/delete"),
None::<HashMap<String, String>>,
None::<()>,
)
}
pub fn remove_video_claim(&self, video_id: String) -> Result<(), Error> {
self.client.post_empty_response(
TargetAPI::Player,
&format!("/me/remove-claims"),
None::<HashMap<String, String>>,
Some(ClaimVideoId { video_id: video_id }),
)
}
pub fn generate_shop_discount_code(&self) -> Result<ShopCode, Error> {
self.client
.post::<Wrapped<ShopCode>>(
TargetAPI::Player,
"/me/benefits/shop-code",
None::<HashMap<String, String>>,
None::<()>,
)?
.remove("ShopCode")
.ok_or(Error::NotFound("shop code"))
}
}