Guild routes (#410)
Merging this adds some new Guild routes, and also checks some boxes in the Guild Meta Issue.
This commit is contained in:
commit
c6caa4907e
|
@ -8,7 +8,8 @@ use crate::errors::ChorusResult;
|
||||||
use crate::instance::ChorusUser;
|
use crate::instance::ChorusUser;
|
||||||
use crate::ratelimiter::ChorusRequest;
|
use crate::ratelimiter::ChorusRequest;
|
||||||
use crate::types::{
|
use crate::types::{
|
||||||
Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildCreateSchema, GuildModifySchema,
|
Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildCreateSchema, GuildMember,
|
||||||
|
GuildMemberSearchSchema, GuildModifySchema, GuildPreview,
|
||||||
};
|
};
|
||||||
use crate::types::{GuildBan, Snowflake};
|
use crate::types::{GuildBan, Snowflake};
|
||||||
|
|
||||||
|
@ -180,12 +181,120 @@ impl Guild {
|
||||||
guild_id,
|
guild_id,
|
||||||
))
|
))
|
||||||
.header("Authorization", user.token())
|
.header("Authorization", user.token())
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
.body(to_string(&schema).unwrap()),
|
.body(to_string(&schema).unwrap()),
|
||||||
limit_type: LimitType::Guild(guild_id),
|
limit_type: LimitType::Guild(guild_id),
|
||||||
};
|
};
|
||||||
let response = chorus_request.deserialize_response::<Guild>(user).await?;
|
let response = chorus_request.deserialize_response::<Guild>(user).await?;
|
||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a guild preview object for the given guild ID. If the user is not in the guild, the guild must be discoverable.
|
||||||
|
/// # Reference:
|
||||||
|
///
|
||||||
|
/// See <https://discord-userdoccers.vercel.app/resources/guild#get-guild-preview>
|
||||||
|
pub async fn get_preview(
|
||||||
|
guild_id: Snowflake,
|
||||||
|
user: &mut ChorusUser,
|
||||||
|
) -> ChorusResult<GuildPreview> {
|
||||||
|
let chorus_request = ChorusRequest {
|
||||||
|
request: Client::new()
|
||||||
|
.patch(format!(
|
||||||
|
"{}/guilds/{}/preview",
|
||||||
|
user.belongs_to.borrow().urls.api,
|
||||||
|
guild_id,
|
||||||
|
))
|
||||||
|
.header("Authorization", user.token())
|
||||||
|
.header("Content-Type", "application/json"),
|
||||||
|
limit_type: LimitType::Guild(guild_id),
|
||||||
|
};
|
||||||
|
let response = chorus_request
|
||||||
|
.deserialize_response::<GuildPreview>(user)
|
||||||
|
.await?;
|
||||||
|
Ok(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a list of guild member objects that are members of the guild.
|
||||||
|
///
|
||||||
|
/// # Reference
|
||||||
|
/// See <https://discord-userdoccers.vercel.app/resources/guild#get-guild-members>
|
||||||
|
pub async fn get_members(
|
||||||
|
guild_id: Snowflake,
|
||||||
|
user: &mut ChorusUser,
|
||||||
|
) -> ChorusResult<Vec<GuildMember>> {
|
||||||
|
let request = ChorusRequest::new(
|
||||||
|
http::Method::GET,
|
||||||
|
format!(
|
||||||
|
"{}/guilds/{}/members",
|
||||||
|
user.belongs_to.borrow().urls.api,
|
||||||
|
guild_id,
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some(user),
|
||||||
|
LimitType::Guild(guild_id),
|
||||||
|
);
|
||||||
|
request.deserialize_response::<Vec<GuildMember>>(user).await
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a list of guild member objects whose username or nickname starts with a provided string.
|
||||||
|
///
|
||||||
|
/// # Reference:
|
||||||
|
/// See <https://discord-userdoccers.vercel.app/resources/guild#search-guild-members>
|
||||||
|
pub async fn search_members(
|
||||||
|
guild_id: Snowflake,
|
||||||
|
query: GuildMemberSearchSchema,
|
||||||
|
user: &mut ChorusUser,
|
||||||
|
) -> ChorusResult<Vec<GuildMember>> {
|
||||||
|
let mut request = ChorusRequest::new(
|
||||||
|
http::Method::GET,
|
||||||
|
format!(
|
||||||
|
"{}/guilds/{}/members/search",
|
||||||
|
user.belongs_to.borrow().urls.api,
|
||||||
|
guild_id,
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some(user),
|
||||||
|
LimitType::Guild(guild_id),
|
||||||
|
);
|
||||||
|
request.request = request
|
||||||
|
.request
|
||||||
|
.query(&[("query", to_string(&query).unwrap())]);
|
||||||
|
request.deserialize_response::<Vec<GuildMember>>(user).await
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Removes a member from a guild. Requires the KICK_MEMBERS permission. Returns a 204 empty response on success.
|
||||||
|
///
|
||||||
|
/// # Reference
|
||||||
|
/// See <https://discord-userdoccers.vercel.app/resources/guild#remove-guild-member>
|
||||||
|
pub async fn remove_member(
|
||||||
|
guild_id: Snowflake,
|
||||||
|
member_id: Snowflake,
|
||||||
|
audit_log_reason: Option<String>,
|
||||||
|
user: &mut ChorusUser,
|
||||||
|
) -> ChorusResult<()> {
|
||||||
|
let request = ChorusRequest::new(
|
||||||
|
http::Method::DELETE,
|
||||||
|
format!(
|
||||||
|
"{}/guilds/{}/members/{}",
|
||||||
|
user.belongs_to.borrow().urls.api,
|
||||||
|
guild_id,
|
||||||
|
member_id,
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
None,
|
||||||
|
audit_log_reason.as_deref(),
|
||||||
|
None,
|
||||||
|
Some(user),
|
||||||
|
LimitType::Guild(guild_id),
|
||||||
|
);
|
||||||
|
request.handle_request_as_result(user).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Channel {
|
impl Channel {
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
use serde_json::to_string;
|
use serde_json::to_string;
|
||||||
|
|
||||||
|
use crate::api::LimitType;
|
||||||
use crate::errors::ChorusResult;
|
use crate::errors::ChorusResult;
|
||||||
use crate::instance::ChorusUser;
|
use crate::instance::ChorusUser;
|
||||||
use crate::ratelimiter::ChorusRequest;
|
use crate::ratelimiter::ChorusRequest;
|
||||||
use crate::types::Snowflake;
|
use crate::types::{GetUserGuildSchema, Guild, Snowflake};
|
||||||
|
|
||||||
impl ChorusUser {
|
impl ChorusUser {
|
||||||
/// Leaves a given guild.
|
/// Leaves a given guild.
|
||||||
|
@ -30,4 +31,28 @@ impl ChorusUser {
|
||||||
.handle_request_as_result(self)
|
.handle_request_as_result(self)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a list of user guild objects representing the guilds the current user is a member of.
|
||||||
|
/// This endpoint returns 200 guilds by default
|
||||||
|
///
|
||||||
|
/// # Reference:
|
||||||
|
/// See: <https://discord-userdoccers.vercel.app/resources/guild#get-user-guilds>
|
||||||
|
pub async fn get_guilds(
|
||||||
|
&mut self,
|
||||||
|
query: Option<GetUserGuildSchema>,
|
||||||
|
) -> ChorusResult<Vec<Guild>> {
|
||||||
|
let url = format!("{}/users/@me/guilds", self.belongs_to.borrow().urls.api,);
|
||||||
|
let chorus_request = ChorusRequest {
|
||||||
|
request: Client::new()
|
||||||
|
.get(url)
|
||||||
|
.header("Authorization", self.token())
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
|
.body(to_string(&query).unwrap()),
|
||||||
|
|
||||||
|
limit_type: LimitType::Global,
|
||||||
|
};
|
||||||
|
chorus_request
|
||||||
|
.deserialize_response::<Vec<Guild>>(self)
|
||||||
|
.await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::types::{entities::User, utils::Snowflake};
|
use crate::types::{entities::User, utils::Snowflake};
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
|
||||||
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
|
#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
|
||||||
/// Represents a sticker that can be sent in messages.
|
/// Represents a sticker that can be sent in messages.
|
||||||
///
|
///
|
||||||
|
@ -28,6 +28,68 @@ pub struct Sticker {
|
||||||
pub sort_value: Option<u8>,
|
pub sort_value: Option<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for Sticker {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.id == other.id
|
||||||
|
&& self.pack_id == other.pack_id
|
||||||
|
&& self.name == other.name
|
||||||
|
&& self.description == other.description
|
||||||
|
&& self.tags == other.tags
|
||||||
|
&& self.asset == other.asset
|
||||||
|
&& self.sticker_type == other.sticker_type
|
||||||
|
&& self.format_type == other.format_type
|
||||||
|
&& self.available == other.available
|
||||||
|
&& self.guild_id == other.guild_id
|
||||||
|
&& self.sort_value == other.sort_value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for Sticker {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||||
|
match self.id.partial_cmp(&other.id) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.pack_id.partial_cmp(&other.pack_id) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.name.partial_cmp(&other.name) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.description.partial_cmp(&other.description) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.tags.partial_cmp(&other.tags) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.asset.partial_cmp(&other.asset) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.sticker_type.partial_cmp(&other.sticker_type) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.format_type.partial_cmp(&other.format_type) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.available.partial_cmp(&other.available) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
match self.guild_id.partial_cmp(&other.guild_id) {
|
||||||
|
Some(core::cmp::Ordering::Equal) => {}
|
||||||
|
ord => return ord,
|
||||||
|
}
|
||||||
|
self.sort_value.partial_cmp(&other.sort_value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
/// A partial sticker object.
|
/// A partial sticker object.
|
||||||
///
|
///
|
||||||
|
|
|
@ -3,8 +3,8 @@ use serde::{Deserialize, Serialize};
|
||||||
use crate::types::entities::Channel;
|
use crate::types::entities::Channel;
|
||||||
use crate::types::types::guild_configuration::GuildFeatures;
|
use crate::types::types::guild_configuration::GuildFeatures;
|
||||||
use crate::types::{
|
use crate::types::{
|
||||||
ExplicitContentFilterLevel, MessageNotificationLevel, Snowflake, SystemChannelFlags,
|
Emoji, ExplicitContentFilterLevel, MessageNotificationLevel, Snowflake, Sticker,
|
||||||
VerificationLevel,
|
SystemChannelFlags, VerificationLevel,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
|
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
|
||||||
|
@ -56,3 +56,53 @@ pub struct GuildModifySchema {
|
||||||
pub preferred_locale: Option<String>,
|
pub preferred_locale: Option<String>,
|
||||||
pub premium_progress_bar_enabled: Option<bool>,
|
pub premium_progress_bar_enabled: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Serialize, Clone, Eq, PartialEq, Ord, PartialOrd)]
|
||||||
|
pub struct GetUserGuildSchema {
|
||||||
|
pub before: Option<Snowflake>,
|
||||||
|
pub after: Option<Snowflake>,
|
||||||
|
pub limit: Option<u8>,
|
||||||
|
pub with_counts: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::default::Default for GetUserGuildSchema {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
before: Default::default(),
|
||||||
|
after: Default::default(),
|
||||||
|
limit: Some(200),
|
||||||
|
with_counts: Some(false),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq, PartialOrd)]
|
||||||
|
pub struct GuildPreview {
|
||||||
|
pub id: Snowflake,
|
||||||
|
pub name: String,
|
||||||
|
pub icon: Option<String>,
|
||||||
|
pub description: Option<String>,
|
||||||
|
pub splash: Option<String>,
|
||||||
|
pub discovery_splash: Option<String>,
|
||||||
|
pub home_header: Option<String>,
|
||||||
|
pub features: Vec<String>,
|
||||||
|
pub emojis: Vec<Emoji>,
|
||||||
|
pub stickers: Vec<Sticker>,
|
||||||
|
pub approximate_member_count: u32,
|
||||||
|
pub approximate_presence_count: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd, Eq, Ord)]
|
||||||
|
pub struct GuildMemberSearchSchema {
|
||||||
|
pub query: String,
|
||||||
|
pub limit: Option<u16>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for GuildMemberSearchSchema {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
query: Default::default(),
|
||||||
|
limit: Some(1),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue