From 376ae83f589d05d30f070e4e3fd973ae024e7d60 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Tue, 16 May 2023 15:59:23 +0200 Subject: [PATCH] Implement modify(), untested as of now --- src/api/users/users.rs | 59 +++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/src/api/users/users.rs b/src/api/users/users.rs index 1320546..7d97734 100644 --- a/src/api/users/users.rs +++ b/src/api/users/users.rs @@ -1,13 +1,15 @@ use reqwest::Client; +use serde_json::{from_str, to_string}; use crate::{ api::{ limits::Limits, types::{User, UserObject}, - UserSettings, + UserModifySchema, UserSettings, }, errors::InstanceServerError, instance::Instance, + limit::LimitedRequester, }; impl<'a> User<'a> { @@ -77,21 +79,48 @@ impl<'a> User<'a> { } } + /// Modify the current user's `UserObject`. + /// + /// # Arguments + /// + /// * `modify_schema` - A `UserModifySchema` object containing the fields to modify. + /// + /// # Errors + /// + /// Returns an `InstanceServerError` if the request fails or if a password is required but not provided. pub async fn modify( - self, - username: Option<&str>, - avatar: Option<&str>, - bio: Option<&str>, - accent_color: Option, - banner: Option<&str>, - current_password: Option<&str>, - new_password: Option<&str>, - code: Option<&str>, - email: Option<&str>, - discriminator: Option, - ) { - let mut limits = self.limits; - let request = Client::new().patch(format!("{}/users/@me/", self.belongs_to.urls.get_api())); + &mut self, + modify_schema: UserModifySchema, + ) -> Result { + if modify_schema.new_password.is_some() + || modify_schema.email.is_some() + || modify_schema.code.is_some() + { + return Err(InstanceServerError::PasswordRequiredError); + } + let request = Client::new() + .patch(format!("{}/users/@me/", self.belongs_to.urls.get_api())) + .body(to_string(&modify_schema).unwrap()) + .bearer_auth(self.token()); + let result = match LimitedRequester::new() + .await + .send_request( + request, + crate::api::limits::LimitType::Global, + &mut self.belongs_to.limits, + &mut self.limits, + ) + .await + { + Ok(response) => response, + Err(e) => return Err(e), + }; + let user_updated: UserObject = from_str(&result.text().await.unwrap()).unwrap(); + let _ = std::mem::replace( + &mut self.object.as_mut().unwrap(), + &mut user_updated.clone(), + ); + Ok(user_updated) } }