Refactor / fix login and register (#495)
Change login and register to only use one ChorusUser object, change the api of related methods which were also somewhat ugly
This commit is contained in:
parent
aac31726ec
commit
03f1e7d983
|
@ -11,7 +11,7 @@ use crate::errors::ChorusResult;
|
||||||
use crate::gateway::Gateway;
|
use crate::gateway::Gateway;
|
||||||
use crate::instance::{ChorusUser, Instance};
|
use crate::instance::{ChorusUser, Instance};
|
||||||
use crate::ratelimiter::ChorusRequest;
|
use crate::ratelimiter::ChorusRequest;
|
||||||
use crate::types::{GatewayIdentifyPayload, LimitType, LoginResult, LoginSchema};
|
use crate::types::{GatewayIdentifyPayload, LimitType, LoginResult, LoginSchema, User};
|
||||||
|
|
||||||
impl Instance {
|
impl Instance {
|
||||||
/// Logs into an existing account on the spacebar server.
|
/// Logs into an existing account on the spacebar server.
|
||||||
|
@ -30,27 +30,22 @@ impl Instance {
|
||||||
// We do not have a user yet, and the UserRateLimits will not be affected by a login
|
// We do not have a user yet, and the UserRateLimits will not be affected by a login
|
||||||
// request (since login is an instance wide limit), which is why we are just cloning the
|
// request (since login is an instance wide limit), which is why we are just cloning the
|
||||||
// instances' limits to pass them on as user_rate_limits later.
|
// instances' limits to pass them on as user_rate_limits later.
|
||||||
let mut shell =
|
let mut user =
|
||||||
ChorusUser::shell(Arc::new(RwLock::new(self.clone())), "None".to_string()).await;
|
ChorusUser::shell(Arc::new(RwLock::new(self.clone())), "None".to_string()).await;
|
||||||
|
|
||||||
let login_result = chorus_request
|
let login_result = chorus_request
|
||||||
.deserialize_response::<LoginResult>(&mut shell)
|
.deserialize_response::<LoginResult>(&mut user)
|
||||||
.await?;
|
.await?;
|
||||||
let object = self.get_user(login_result.token.clone(), None).await?;
|
user.set_token(login_result.token);
|
||||||
if self.limits_information.is_some() {
|
user.settings = login_result.settings;
|
||||||
self.limits_information.as_mut().unwrap().ratelimits = shell.limits.clone().unwrap();
|
|
||||||
}
|
let object = User::get(&mut user, None).await?;
|
||||||
|
*user.object.write().unwrap() = object;
|
||||||
|
|
||||||
let mut identify = GatewayIdentifyPayload::common();
|
let mut identify = GatewayIdentifyPayload::common();
|
||||||
let gateway = Gateway::spawn(self.urls.wss.clone()).await.unwrap();
|
identify.token = user.token();
|
||||||
identify.token = login_result.token.clone();
|
user.gateway.send_identify(identify).await;
|
||||||
gateway.send_identify(identify).await;
|
|
||||||
let user = ChorusUser::new(
|
|
||||||
Arc::new(RwLock::new(self.clone())),
|
|
||||||
login_result.token,
|
|
||||||
self.clone_limits_if_some(),
|
|
||||||
login_result.settings,
|
|
||||||
Arc::new(RwLock::new(object)),
|
|
||||||
gateway,
|
|
||||||
);
|
|
||||||
Ok(user)
|
Ok(user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,26 +23,19 @@ pub mod register;
|
||||||
impl Instance {
|
impl Instance {
|
||||||
/// Logs into an existing account on the spacebar server, using only a token.
|
/// Logs into an existing account on the spacebar server, using only a token.
|
||||||
pub async fn login_with_token(&mut self, token: String) -> ChorusResult<ChorusUser> {
|
pub async fn login_with_token(&mut self, token: String) -> ChorusResult<ChorusUser> {
|
||||||
let object_result = self.get_user(token.clone(), None).await;
|
let mut user =
|
||||||
if let Err(e) = object_result {
|
ChorusUser::shell(Arc::new(RwLock::new(self.clone())), token).await;
|
||||||
return Result::Err(e);
|
|
||||||
}
|
let object = User::get(&mut user, None).await?;
|
||||||
|
let settings = User::get_settings(&mut user).await?;
|
||||||
|
|
||||||
|
*user.object.write().unwrap() = object;
|
||||||
|
*user.settings.write().unwrap() = settings;
|
||||||
|
|
||||||
let user_settings = User::get_settings(&token, &self.urls.api, &mut self.clone())
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
let mut identify = GatewayIdentifyPayload::common();
|
let mut identify = GatewayIdentifyPayload::common();
|
||||||
let gateway = Gateway::spawn(self.urls.wss.clone()).await.unwrap();
|
identify.token = user.token();
|
||||||
identify.token = token.clone();
|
user.gateway.send_identify(identify).await;
|
||||||
gateway.send_identify(identify).await;
|
|
||||||
let user = ChorusUser::new(
|
|
||||||
Arc::new(RwLock::new(self.clone())),
|
|
||||||
token.clone(),
|
|
||||||
self.clone_limits_if_some(),
|
|
||||||
Arc::new(RwLock::new(user_settings)),
|
|
||||||
Arc::new(RwLock::new(object_result.unwrap())),
|
|
||||||
gateway,
|
|
||||||
);
|
|
||||||
Ok(user)
|
Ok(user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ use reqwest::Client;
|
||||||
use serde_json::to_string;
|
use serde_json::to_string;
|
||||||
|
|
||||||
use crate::gateway::{Gateway, GatewayHandle};
|
use crate::gateway::{Gateway, GatewayHandle};
|
||||||
use crate::types::GatewayIdentifyPayload;
|
use crate::types::{GatewayIdentifyPayload, User};
|
||||||
use crate::{
|
use crate::{
|
||||||
errors::ChorusResult,
|
errors::ChorusResult,
|
||||||
instance::{ChorusUser, Instance, Token},
|
instance::{ChorusUser, Instance, Token},
|
||||||
|
@ -37,29 +37,25 @@ impl Instance {
|
||||||
// We do not have a user yet, and the UserRateLimits will not be affected by a login
|
// We do not have a user yet, and the UserRateLimits will not be affected by a login
|
||||||
// request (since register is an instance wide limit), which is why we are just cloning
|
// request (since register is an instance wide limit), which is why we are just cloning
|
||||||
// the instances' limits to pass them on as user_rate_limits later.
|
// the instances' limits to pass them on as user_rate_limits later.
|
||||||
let mut shell =
|
let mut user =
|
||||||
ChorusUser::shell(Arc::new(RwLock::new(self.clone())), "None".to_string()).await;
|
ChorusUser::shell(Arc::new(RwLock::new(self.clone())), "None".to_string()).await;
|
||||||
|
|
||||||
let token = chorus_request
|
let token = chorus_request
|
||||||
.deserialize_response::<Token>(&mut shell)
|
.deserialize_response::<Token>(&mut user)
|
||||||
.await?
|
.await?
|
||||||
.token;
|
.token;
|
||||||
if self.limits_information.is_some() {
|
user.set_token(token);
|
||||||
self.limits_information.as_mut().unwrap().ratelimits = shell.limits.unwrap();
|
|
||||||
}
|
let object = User::get(&mut user, None).await?;
|
||||||
let user_object = self.get_user(token.clone(), None).await.unwrap();
|
let settings = User::get_settings(&mut user).await?;
|
||||||
let settings = ChorusUser::get_settings(&token, &self.urls.api.clone(), self).await?;
|
|
||||||
|
*user.object.write().unwrap() = object;
|
||||||
|
*user.settings.write().unwrap() = settings;
|
||||||
|
|
||||||
let mut identify = GatewayIdentifyPayload::common();
|
let mut identify = GatewayIdentifyPayload::common();
|
||||||
let gateway: GatewayHandle = Gateway::spawn(self.urls.wss.clone()).await.unwrap();
|
identify.token = user.token();
|
||||||
identify.token = token.clone();
|
user.gateway.send_identify(identify).await;
|
||||||
gateway.send_identify(identify).await;
|
|
||||||
let user = ChorusUser::new(
|
|
||||||
Arc::new(RwLock::new(self.clone())),
|
|
||||||
token.clone(),
|
|
||||||
self.clone_limits_if_some(),
|
|
||||||
Arc::new(RwLock::new(settings)),
|
|
||||||
Arc::new(RwLock::new(user_object)),
|
|
||||||
gateway,
|
|
||||||
);
|
|
||||||
Ok(user)
|
Ok(user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,13 +30,9 @@ impl ChorusUser {
|
||||||
/// Gets the user's settings.
|
/// Gets the user's settings.
|
||||||
///
|
///
|
||||||
/// # Notes
|
/// # Notes
|
||||||
/// This functions is a wrapper around [`User::get_settings`].
|
/// This function is a wrapper around [`User::get_settings`].
|
||||||
pub async fn get_settings(
|
pub async fn get_settings(&mut self) -> ChorusResult<UserSettings> {
|
||||||
token: &String,
|
User::get_settings(self).await
|
||||||
url_api: &String,
|
|
||||||
instance: &mut Instance,
|
|
||||||
) -> ChorusResult<UserSettings> {
|
|
||||||
User::get_settings(token, url_api, instance).await
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modifies the current user's representation. (See [`User`])
|
/// Modifies the current user's representation. (See [`User`])
|
||||||
|
@ -118,56 +114,22 @@ impl User {
|
||||||
///
|
///
|
||||||
/// # Reference
|
/// # Reference
|
||||||
/// See <https://luna.gitlab.io/discord-unofficial-docs/docs/user_settings.html#get-usersmesettings>
|
/// See <https://luna.gitlab.io/discord-unofficial-docs/docs/user_settings.html#get-usersmesettings>
|
||||||
pub async fn get_settings(
|
pub async fn get_settings(user: &mut ChorusUser) -> ChorusResult<UserSettings> {
|
||||||
token: &String,
|
let url_api = user.belongs_to.read().unwrap().urls.api.clone();
|
||||||
url_api: &String,
|
|
||||||
instance: &mut Instance,
|
|
||||||
) -> ChorusResult<UserSettings> {
|
|
||||||
let request: reqwest::RequestBuilder = Client::new()
|
let request: reqwest::RequestBuilder = Client::new()
|
||||||
.get(format!("{}/users/@me/settings", url_api))
|
.get(format!("{}/users/@me/settings", url_api))
|
||||||
.header("Authorization", token);
|
.header("Authorization", user.token());
|
||||||
let mut user =
|
|
||||||
ChorusUser::shell(Arc::new(RwLock::new(instance.clone())), token.clone()).await;
|
|
||||||
let chorus_request = ChorusRequest {
|
let chorus_request = ChorusRequest {
|
||||||
request,
|
request,
|
||||||
limit_type: LimitType::Global,
|
limit_type: LimitType::Global,
|
||||||
};
|
};
|
||||||
let result = match chorus_request.send_request(&mut user).await {
|
match chorus_request.send_request(user).await {
|
||||||
Ok(result) => Ok(serde_json::from_str(&result.text().await.unwrap()).unwrap()),
|
Ok(result) => {
|
||||||
Err(e) => Err(e),
|
let result_text = result.text().await.unwrap();
|
||||||
};
|
Ok(serde_json::from_str(&result_text).unwrap())
|
||||||
if instance.limits_information.is_some() {
|
}
|
||||||
instance.limits_information.as_mut().unwrap().ratelimits = user
|
Err(e) => Err(e),
|
||||||
.belongs_to
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.clone_limits_if_some()
|
|
||||||
.unwrap();
|
|
||||||
}
|
}
|
||||||
result
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Instance {
|
|
||||||
/// Gets a user by id, or if the id is None, gets the current user.
|
|
||||||
///
|
|
||||||
/// # Notes
|
|
||||||
/// This function is a wrapper around [`User::get`].
|
|
||||||
///
|
|
||||||
/// # Reference
|
|
||||||
/// See <https://discord-userdoccers.vercel.app/resources/user#get-user> and
|
|
||||||
/// <https://discord-userdoccers.vercel.app/resources/user#get-current-user>
|
|
||||||
pub async fn get_user(&mut self, token: String, id: Option<&String>) -> ChorusResult<User> {
|
|
||||||
let mut user = ChorusUser::shell(Arc::new(RwLock::new(self.clone())), token).await;
|
|
||||||
let result = User::get(&mut user, id).await;
|
|
||||||
if self.limits_information.is_some() {
|
|
||||||
self.limits_information.as_mut().unwrap().ratelimits = user
|
|
||||||
.belongs_to
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.clone_limits_if_some()
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue