From 516a1467fa4e37335c459fcf284e75d418517d17 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Fri, 25 Aug 2023 01:35:57 +0200 Subject: [PATCH] Add some more routes --- src/api/guilds/guilds.rs | 86 ++++++++++++++++++++++++++++++++++++++- src/types/schema/guild.rs | 17 +++++++- 2 files changed, 99 insertions(+), 4 deletions(-) diff --git a/src/api/guilds/guilds.rs b/src/api/guilds/guilds.rs index 09afe79..e59f3bc 100644 --- a/src/api/guilds/guilds.rs +++ b/src/api/guilds/guilds.rs @@ -8,8 +8,8 @@ use crate::errors::ChorusResult; use crate::instance::ChorusUser; use crate::ratelimiter::ChorusRequest; use crate::types::{ - Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildCreateSchema, - GuildModifySchema, GuildPreview, MFALevel, + Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildCreateSchema, GuildMember, + GuildMemberSearchSchema, GuildModifySchema, GuildPreview, }; use crate::types::{GuildBan, Snowflake}; @@ -213,6 +213,88 @@ impl Guild { .await?; Ok(response) } + + /// Returns a list of guild member objects that are members of the guild. + /// + /// # Reference + /// See + pub async fn get_members( + guild_id: Snowflake, + user: &mut ChorusUser, + ) -> ChorusResult> { + 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::>(user).await + } + + /// Returns a list of guild member objects whose username or nickname starts with a provided string. + /// + /// # Reference: + /// See + pub async fn search_members( + guild_id: Snowflake, + query: GuildMemberSearchSchema, + user: &mut ChorusUser, + ) -> ChorusResult> { + 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::>(user).await + } + + /// Removes a member from a guild. Requires the KICK_MEMBERS permission. Returns a 204 empty response on success. + /// + /// # Reference + /// See + pub async fn remove_member( + guild_id: Snowflake, + member_id: Snowflake, + audit_log_reason: Option, + 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 { diff --git a/src/types/schema/guild.rs b/src/types/schema/guild.rs index 2622796..34ced20 100644 --- a/src/types/schema/guild.rs +++ b/src/types/schema/guild.rs @@ -1,5 +1,3 @@ -use std::default; - use serde::{Deserialize, Serialize}; use crate::types::entities::Channel; @@ -93,3 +91,18 @@ pub struct GuildPreview { 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, +} + +impl Default for GuildMemberSearchSchema { + fn default() -> Self { + Self { + query: Default::default(), + limit: Some(1), + } + } +}