use reqwest::Client;
use serde_json::to_string;
use crate::{
errors::ChorusResult,
instance::ChorusUser,
ratelimiter::ChorusRequest,
types::{
self, BulkRemoveRelationshipsQuery, CreateUserRelationshipSchema, FriendRequestSendSchema,
LimitType, RelationshipType, Snowflake,
},
};
impl ChorusUser {
pub async fn get_mutual_relationships(
&mut self,
user_id: Snowflake,
) -> ChorusResult<Vec<types::PublicUser>> {
let url = format!(
"{}/users/{}/relationships",
self.belongs_to.read().unwrap().urls.api,
user_id
);
let chorus_request = ChorusRequest {
request: Client::new().get(url),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request
.send_and_deserialize_response::<Vec<types::PublicUser>>(self)
.await
}
pub async fn get_relationships(&mut self) -> ChorusResult<Vec<types::Relationship>> {
let url = format!(
"{}/users/@me/relationships",
self.belongs_to.read().unwrap().urls.api
);
let chorus_request = ChorusRequest {
request: Client::new().get(url),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request
.send_and_deserialize_response::<Vec<types::Relationship>>(self)
.await
}
pub async fn send_friend_request(
&mut self,
schema: FriendRequestSendSchema,
) -> ChorusResult<()> {
let url = format!(
"{}/users/@me/relationships",
self.belongs_to.read().unwrap().urls.api
);
let chorus_request = ChorusRequest {
request: Client::new().post(url).json(&schema),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request.send_and_handle_as_result(self).await
}
pub async fn modify_user_relationship(
&mut self,
user_id: Snowflake,
relationship_type: RelationshipType,
) -> ChorusResult<()> {
let api_url = self.belongs_to.read().unwrap().urls.api.clone();
match relationship_type {
RelationshipType::None => {
let chorus_request = ChorusRequest {
request: Client::new()
.delete(format!("{}/users/@me/relationships/{}", api_url, user_id)),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request.send_and_handle_as_result(self).await
}
RelationshipType::Friends | RelationshipType::Incoming | RelationshipType::Outgoing => {
let schema = CreateUserRelationshipSchema {
relationship_type: None, from_friend_suggestion: None,
friend_token: None,
};
let chorus_request = ChorusRequest {
request: Client::new()
.put(format!("{}/users/@me/relationships/{}", api_url, user_id))
.json(&schema),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request.send_and_handle_as_result(self).await
}
RelationshipType::Blocked => {
let schema = CreateUserRelationshipSchema {
relationship_type: Some(RelationshipType::Blocked),
from_friend_suggestion: None,
friend_token: None,
};
let chorus_request = ChorusRequest {
request: Client::new()
.put(format!("{}/users/@me/relationships/{}", api_url, user_id))
.json(&schema),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request.send_and_handle_as_result(self).await
}
RelationshipType::Suggestion | RelationshipType::Implicit => Ok(()),
}
}
pub async fn remove_relationship(&mut self, user_id: Snowflake) -> ChorusResult<()> {
let url = format!(
"{}/users/@me/relationships/{}",
self.belongs_to.read().unwrap().urls.api,
user_id
);
let chorus_request = ChorusRequest {
request: Client::new().delete(url),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request.send_and_handle_as_result(self).await
}
pub async fn bulk_remove_relationships(
&mut self,
query: Option<BulkRemoveRelationshipsQuery>,
) -> ChorusResult<()> {
let query_parameters = if let Some(passed) = query {
passed.to_query()
} else {
Vec::new()
};
let url = format!(
"{}/users/@me/relationships",
self.belongs_to.read().unwrap().urls.api,
);
let chorus_request = ChorusRequest {
request: Client::new().delete(url).query(&query_parameters),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request.send_and_handle_as_result(self).await
}
pub async fn ignore_user(&mut self, user_id: Snowflake) -> ChorusResult<()> {
let url = format!(
"{}/users/@me/relationships/{}/ignore",
self.belongs_to.read().unwrap().urls.api,
user_id
);
let chorus_request = ChorusRequest {
request: Client::new().put(url),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request.send_and_handle_as_result(self).await
}
pub async fn unignore_user(&mut self, user_id: Snowflake) -> ChorusResult<()> {
let url = format!(
"{}/users/@me/relationships/{}/ignore",
self.belongs_to.read().unwrap().urls.api,
user_id
);
let chorus_request = ChorusRequest {
request: Client::new().delete(url),
limit_type: LimitType::Global,
}
.with_headers_for(self);
chorus_request.send_and_handle_as_result(self).await
}
}