|
| 1 | +use std::collections::HashSet; |
1 | 2 | use twilight_http::{Client}; |
2 | 3 | use http::StatusCode; |
3 | 4 | use twilight_model::id::Id; |
4 | 5 | use twilight_model::id::marker::GuildMarker; |
5 | | -use twilight_model::user::CurrentUser; |
| 6 | +use twilight_model::user::{CurrentUser, CurrentUserGuild}; |
6 | 7 | use crate::discord::{get_current_user_guilds, get_guild, get_guild_member}; |
7 | 8 |
|
8 | 9 | pub async fn member_guilds( |
9 | | - current_user: &CurrentUser, |
| 10 | + discord_user: &Client, |
10 | 11 | discord_bot: &Client |
11 | | -) -> Result<Vec<twilight_model::guild::Guild>, StatusCode> { |
12 | | - let mut member_guilds = vec![]; |
| 12 | +) -> Result<Vec<CurrentUserGuild>, StatusCode> { |
13 | 13 | let bot_guilds = get_current_user_guilds(discord_bot).await?; |
14 | | - for partial_guild in bot_guilds { |
15 | | - let guild = get_guild(partial_guild.id, discord_bot).await?; |
16 | | - let member_result = get_guild_member(guild.id, current_user.id, discord_bot).await; |
17 | | - if member_result.is_ok() { |
18 | | - member_guilds.push(guild); |
19 | | - } |
20 | | - } |
21 | | - Ok(member_guilds) |
| 14 | + let mut user_guilds = get_current_user_guilds(discord_user).await?; |
| 15 | + let bot_guild_set = bot_guilds.iter().map(|g| g.id).collect::<HashSet<Id<GuildMarker>>>(); |
| 16 | + let user_guild_set = user_guilds.iter().map(|g| g.id).collect::<HashSet<Id<GuildMarker>>>(); |
| 17 | + let mut intersection_set = bot_guild_set.intersection(&user_guild_set); |
| 18 | + user_guilds.retain(|g| intersection_set.any(|ig| ig == &g.id)); |
| 19 | + Ok(user_guilds) |
22 | 20 | } |
23 | 21 |
|
24 | 22 | pub async fn is_client_admin_guild(guild_id: Id<GuildMarker>, current_user: &CurrentUser, discord_bot: &Client) -> Result<bool, StatusCode> { |
25 | 23 | let guild = get_guild(guild_id, discord_bot).await?; |
26 | 24 | let member = get_guild_member(guild_id, current_user.id, discord_bot).await?; |
27 | 25 | Ok(current_user.id == guild.owner_id || guild.roles.iter().any(|r| member.roles.contains(&r.id) && r.permissions & twilight_model::guild::Permissions::ADMINISTRATOR == twilight_model::guild::Permissions::ADMINISTRATOR)) |
28 | | -} |
| 26 | +} |
29 | 27 |
|
30 | 28 | pub async fn admin_guilds( |
31 | | - current_user: &CurrentUser, |
| 29 | + discord_user: &Client, |
32 | 30 | discord_bot: &Client |
33 | | -) -> Result<Vec<twilight_model::guild::Guild>, StatusCode> { |
34 | | - let mut admin_guilds = vec![]; |
| 31 | +) -> Result<Vec<CurrentUserGuild>, StatusCode> { |
35 | 32 | let bot_guilds = get_current_user_guilds(discord_bot).await?; |
36 | | - for partial_guild in bot_guilds { |
37 | | - let guild = get_guild(partial_guild.id, discord_bot).await?; |
38 | | - if guild.owner_id == current_user.id { |
39 | | - admin_guilds.push(guild); |
40 | | - continue; |
41 | | - } |
42 | | - let member_result = get_guild_member(guild.id, current_user.id, discord_bot).await; |
43 | | - if member_result.is_err() { |
44 | | - // Not a member |
45 | | - continue; |
46 | | - } |
47 | | - let admin_role_ids = guild.roles.iter().filter(|r| r.permissions & twilight_model::guild::Permissions::ADMINISTRATOR == twilight_model::guild::Permissions::ADMINISTRATOR).map(|r| r.id).collect::<Vec<_>>(); |
48 | | - if member_result?.roles.iter().any(|r| admin_role_ids.contains(r)) { |
49 | | - admin_guilds.push(guild); |
50 | | - continue; |
| 33 | + let mut user_guilds = get_current_user_guilds(discord_user).await?; |
| 34 | + let bot_guild_set = bot_guilds.iter().map(|g| g.id).collect::<HashSet<Id<GuildMarker>>>(); |
| 35 | + let user_guild_set = user_guilds.iter().map(|g| g.id).collect::<HashSet<Id<GuildMarker>>>(); |
| 36 | + let mut intersection_set = bot_guild_set.intersection(&user_guild_set); |
| 37 | + user_guilds.retain(|g| intersection_set.any(|ig| ig == &g.id)); |
| 38 | + |
| 39 | + let mut admin_guilds = vec![]; |
| 40 | + for partial_guild in user_guilds { |
| 41 | + if partial_guild.owner || partial_guild.permissions & twilight_model::guild::Permissions::ADMINISTRATOR == twilight_model::guild::Permissions::ADMINISTRATOR { |
| 42 | + admin_guilds.push(partial_guild); |
51 | 43 | } |
52 | 44 | } |
53 | 45 | Ok(admin_guilds) |
|
0 commit comments