Skip to content

Commit 9f9904a

Browse files
feat(http): get guild role member counts (#2489)
1 parent 364e723 commit 9f9904a

File tree

5 files changed

+74
-3
lines changed

5 files changed

+74
-3
lines changed

twilight-http/src/client/mod.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ use crate::{
7171
RemoveRoleFromMember, SearchGuildMembers, UpdateGuildMember,
7272
},
7373
role::{
74-
CreateRole, DeleteRole, GetGuildRoles, GetRole, UpdateRole, UpdateRolePositions,
74+
CreateRole, DeleteRole, GetGuildRoleMemberCounts, GetGuildRoles, GetRole,
75+
UpdateRole, UpdateRolePositions,
7576
},
7677
sticker::{
7778
CreateGuildSticker, DeleteGuildSticker, GetGuildSticker, GetGuildStickers,
@@ -1671,6 +1672,14 @@ impl Client {
16711672
GetGuildRoles::new(self, guild_id)
16721673
}
16731674

1675+
/// Get the role member counts of a guild.
1676+
pub const fn role_member_counts(
1677+
&self,
1678+
guild_id: Id<GuildMarker>,
1679+
) -> GetGuildRoleMemberCounts<'_> {
1680+
GetGuildRoleMemberCounts::new(self, guild_id)
1681+
}
1682+
16741683
/// Get a role of a guild.
16751684
pub const fn role(&self, guild_id: Id<GuildMarker>, role_id: Id<RoleMarker>) -> GetRole<'_> {
16761685
GetRole::new(self, guild_id, role_id)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use crate::{
2+
client::Client,
3+
error::Error,
4+
request::{Request, TryIntoRequest},
5+
response::{Response, ResponseFuture},
6+
routing::Route,
7+
};
8+
use std::{collections::HashMap, future::IntoFuture};
9+
use twilight_model::id::{
10+
Id,
11+
marker::{GuildMarker, RoleMarker},
12+
};
13+
14+
#[must_use = "requests must be configured and executed"]
15+
pub struct GetGuildRoleMemberCounts<'a> {
16+
guild_id: Id<GuildMarker>,
17+
http: &'a Client,
18+
}
19+
20+
impl<'a> GetGuildRoleMemberCounts<'a> {
21+
pub(crate) const fn new(http: &'a Client, guild_id: Id<GuildMarker>) -> Self {
22+
Self { guild_id, http }
23+
}
24+
}
25+
26+
impl IntoFuture for GetGuildRoleMemberCounts<'_> {
27+
type Output = Result<Response<HashMap<Id<RoleMarker>, u64>>, Error>;
28+
29+
type IntoFuture = ResponseFuture<HashMap<Id<RoleMarker>, u64>>;
30+
31+
fn into_future(self) -> Self::IntoFuture {
32+
let http = self.http;
33+
34+
match self.try_into_request() {
35+
Ok(request) => http.request(request),
36+
Err(source) => ResponseFuture::error(source),
37+
}
38+
}
39+
}
40+
41+
impl TryIntoRequest for GetGuildRoleMemberCounts<'_> {
42+
fn try_into_request(self) -> Result<Request, Error> {
43+
Ok(Request::from_route(&Route::GetGuildRoleMemberCounts {
44+
guild_id: self.guild_id.get(),
45+
}))
46+
}
47+
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
mod create_role;
22
mod delete_role;
3+
mod get_guild_role_member_counts;
34
mod get_guild_roles;
45
mod get_role;
56
mod update_role;
67
mod update_role_positions;
78

89
pub use self::{
9-
create_role::CreateRole, delete_role::DeleteRole, get_guild_roles::GetGuildRoles,
10+
create_role::CreateRole, delete_role::DeleteRole,
11+
get_guild_role_member_counts::GetGuildRoleMemberCounts, get_guild_roles::GetGuildRoles,
1012
get_role::GetRole, update_role::UpdateRole, update_role_positions::UpdateRolePositions,
1113
};

twilight-http/src/request/try_into_request.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ mod private {
7676
RemoveRoleFromMember, SearchGuildMembers, UpdateGuildMember,
7777
},
7878
role::{
79-
CreateRole, DeleteRole, GetGuildRoles, GetRole, UpdateRole, UpdateRolePositions,
79+
CreateRole, DeleteRole, GetGuildRoleMemberCounts, GetGuildRoles, GetRole,
80+
UpdateRole, UpdateRolePositions,
8081
},
8182
sticker::{
8283
CreateGuildSticker, DeleteGuildSticker, GetGuildSticker, GetGuildStickers,
@@ -221,6 +222,7 @@ mod private {
221222
impl Sealed for GetGuildOnboarding<'_> {}
222223
impl Sealed for GetGuildPreview<'_> {}
223224
impl Sealed for GetGuildPruneCount<'_> {}
225+
impl Sealed for GetGuildRoleMemberCounts<'_> {}
224226
impl Sealed for GetGuildRoles<'_> {}
225227
impl Sealed for GetGuildScheduledEvent<'_> {}
226228
impl Sealed for GetGuildScheduledEventUsers<'_> {}

twilight-http/src/routing.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,10 @@ pub enum Route<'a> {
648648
/// pruned.
649649
include_roles: &'a [Id<RoleMarker>],
650650
},
651+
/// Route information to get guild's roles' member counts.
652+
GetGuildRoleMemberCounts {
653+
guild_id: u64,
654+
},
651655
/// Route information to get guild's roles.
652656
GetGuildRoles {
653657
/// The ID of the guild.
@@ -1304,6 +1308,7 @@ impl Route<'_> {
13041308
| Self::GetGuildPreview { .. }
13051309
| Self::GetGuildPruneCount { .. }
13061310
| Self::GetGuildRoles { .. }
1311+
| Self::GetGuildRoleMemberCounts { .. }
13071312
| Self::GetGuildScheduledEvent { .. }
13081313
| Self::GetGuildScheduledEventUsers { .. }
13091314
| Self::GetGuildScheduledEvents { .. }
@@ -1715,6 +1720,12 @@ impl Display for Route<'_> {
17151720

17161721
f.write_str("/roles")
17171722
}
1723+
Route::GetGuildRoleMemberCounts { guild_id } => {
1724+
f.write_str("guilds/")?;
1725+
Display::fmt(guild_id, f)?;
1726+
1727+
f.write_str("/roles/member-counts")
1728+
}
17181729
Route::CreateStageInstance { .. } => f.write_str("stage-instances"),
17191730
Route::CreateTemplate { guild_id } | Route::GetTemplates { guild_id } => {
17201731
f.write_str("guilds/")?;

0 commit comments

Comments
 (0)