use reqwest::Client;
use crate::{
errors::ChorusResult,
instance::ChorusUser,
ratelimiter::ChorusRequest,
types::{self, LimitType, PublicUser, Snowflake},
};
#[derive(Debug, Clone, PartialEq, Eq, Copy, Hash, PartialOrd, Ord)]
pub struct ReactionMeta {
pub message_id: types::Snowflake,
pub channel_id: types::Snowflake,
}
impl ReactionMeta {
pub async fn delete_all(&self, user: &mut ChorusUser) -> ChorusResult<()> {
let url = format!(
"{}/channels/{}/messages/{}/reactions",
user.belongs_to.read().unwrap().urls.api,
self.channel_id,
self.message_id
);
let request = ChorusRequest {
request: Client::new().delete(url),
limit_type: LimitType::Channel(self.channel_id),
}
.with_headers_for(user);
request.send_and_handle_as_result(user).await
}
pub async fn get(&self, emoji: &str, user: &mut ChorusUser) -> ChorusResult<Vec<PublicUser>> {
let url = format!(
"{}/channels/{}/messages/{}/reactions/{}",
user.belongs_to.read().unwrap().urls.api,
self.channel_id,
self.message_id,
emoji
);
let request = ChorusRequest {
request: Client::new().get(url),
limit_type: LimitType::Channel(self.channel_id),
}
.with_headers_for(user);
request.send_and_deserialize_response::<Vec<PublicUser>>(user).await
}
pub async fn delete_emoji(&self, emoji: &str, user: &mut ChorusUser) -> ChorusResult<()> {
let url = format!(
"{}/channels/{}/messages/{}/reactions/{}",
user.belongs_to.read().unwrap().urls.api,
self.channel_id,
self.message_id,
emoji
);
let request = ChorusRequest {
request: Client::new().delete(url),
limit_type: LimitType::Channel(self.channel_id),
}
.with_headers_for(user);
request.send_and_handle_as_result(user).await
}
pub async fn create(&self, emoji: &str, user: &mut ChorusUser) -> ChorusResult<()> {
let url = format!(
"{}/channels/{}/messages/{}/reactions/{}/@me",
user.belongs_to.read().unwrap().urls.api,
self.channel_id,
self.message_id,
emoji
);
let request = ChorusRequest {
request: Client::new().put(url),
limit_type: LimitType::Channel(self.channel_id),
}
.with_headers_for(user);
request.send_and_handle_as_result(user).await
}
pub async fn remove(&self, emoji: &str, user: &mut ChorusUser) -> ChorusResult<()> {
let url = format!(
"{}/channels/{}/messages/{}/reactions/{}/@me",
user.belongs_to.read().unwrap().urls.api,
self.channel_id,
self.message_id,
emoji
);
let request = ChorusRequest {
request: Client::new().delete(url),
limit_type: LimitType::Channel(self.channel_id),
}
.with_headers_for(user);
request.send_and_handle_as_result(user).await
}
pub async fn delete_user(
&self,
user_id: Snowflake,
emoji: &str,
user: &mut ChorusUser,
) -> ChorusResult<()> {
let url = format!(
"{}/channels/{}/messages/{}/reactions/{}/{}",
user.belongs_to.read().unwrap().urls.api,
self.channel_id,
self.message_id,
emoji,
user_id
);
let request = ChorusRequest {
request: Client::new().delete(url),
limit_type: LimitType::Channel(self.channel_id),
}
.with_headers_for(user);
request.send_and_handle_as_result(user).await
}
}