Skip to content

Commit d3e1070

Browse files
committed
fix: optimisations
1 parent 3ce9908 commit d3e1070

File tree

4 files changed

+49
-53
lines changed

4 files changed

+49
-53
lines changed

api/src/discord.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,11 @@ where
3131
}
3232

3333
match e.kind() {
34-
ErrorType::Response { error, ..} => {
35-
match error {
36-
ApiError::Ratelimited(ratelimited) => {
37-
attempts += 1;
38-
sleep(Duration::from_secs_f64(ratelimited.retry_after)).await;
39-
continue;
40-
}
41-
_ => return Err(e)
34+
ErrorType::Response { error: ApiError::Ratelimited(ratelimited), ..} => {
35+
attempts += 1;
36+
sleep(Duration::from_secs_f64(ratelimited.retry_after)).await;
37+
continue;
4238
}
43-
}
4439
_ => return Err(e)
4540
}
4641
}

api/src/guilds/mod.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use twilight_http::Client;
1313
use twilight_model::guild::Permissions;
1414
use twilight_model::id::Id;
1515
use twilight_model::id::marker::GuildMarker;
16-
use twilight_model::user::CurrentUser;
16+
use twilight_model::user::{CurrentUser, CurrentUserGuild};
1717
use crate::discord::{get_guild, get_guild_member};
1818
use crate::guilds::tasks::{add_role_to_guild, remove_role_from_guild};
1919
use crate::utils::{admin_guilds, is_client_admin_guild};
@@ -55,33 +55,38 @@ async fn _verify_admin(
5555
}
5656

5757
async fn post_guilds(
58-
Extension(current_user): Extension<CurrentUser>,
58+
Extension(discord_user): Extension<Arc<Client>>,
5959
State(app_state): State<AppState>,
6060
) -> Result<Json<Value>, StatusCode> {
6161
info!("post_guilds");
62-
let admin_guilds = admin_guilds(&current_user, &app_state.discord_bot).await?;
62+
let admin_guilds = admin_guilds(&discord_user, &app_state.discord_bot).await?;
6363
let mut guilds = Guild::vec_from_db(admin_guilds.iter().map(|g| g.id).collect(), &app_state.dynamo).await;
64-
let missing_guilds: Vec<&twilight_model::guild::Guild> = admin_guilds.iter().filter(|a| !guilds.iter().any(|g| g.guild_id == a.id)).collect();
64+
for guild in &mut guilds {
65+
for g in &admin_guilds {
66+
if g.id == guild.guild_id && (g.name != guild.name || g.icon != guild.icon) {
67+
guild.name = g.name.clone();
68+
guild.icon = g.icon.clone();
69+
guild.save(&app_state.dynamo).await;
70+
}
71+
}
72+
}
73+
74+
let missing_guilds: Vec<&CurrentUserGuild> = admin_guilds.iter().filter(|a| !guilds.iter().any(|g| g.guild_id == a.id)).collect();
6575
for admin_guild in missing_guilds {
6676
guilds.push(Guild {
6777
guild_id: admin_guild.id,
6878
..Default::default()
6979
})
7080
}
7181

72-
for guild in &mut guilds {
73-
let guild_dsc = get_guild(guild.guild_id, &app_state.discord_bot).await?;
74-
guild.name = guild_dsc.name;
75-
guild.icon = guild_dsc.icon;
76-
guild.save(&app_state.dynamo).await;
77-
}
82+
7883

7984
Ok(Json(json!(guilds)))
8085
}
8186

8287

8388
async fn get_guilds(
84-
Extension(discord_user): Extension<Arc<twilight_http::Client>>,
89+
Extension(discord_user): Extension<Arc<Client>>,
8590
State(app_state): State<AppState>,
8691
) -> Result<Json<Value>, StatusCode> {
8792
let guilds = Guild::vec_from_db(

api/src/users/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
mod links;
22
pub mod models;
33

4+
use std::sync::Arc;
45
use crate::AppState;
56
use crate::users::models::{LinkGuild, User};
67
use axum::extract::{Path, State};
@@ -128,25 +129,28 @@ async fn put_users_id(
128129

129130
async fn post_users_me(
130131
Extension(current_user): Extension<CurrentUser>,
132+
Extension(discord_user): Extension<Arc<twilight_http::Client>>,
131133
State(app_state): State<AppState>,
132134
) -> Result<Json<Value>, StatusCode> {
133-
post_users_id(Path(current_user.id), Extension(current_user), State(app_state)).await
135+
post_users_id(Path(current_user.id), Extension(current_user), Extension(discord_user), State(app_state)).await
134136
}
135137

136138
async fn post_users_id(
137139
Path(user_id): Path<Id<UserMarker>>,
138140
Extension(current_user): Extension<CurrentUser>,
141+
Extension(discord_user): Extension<Arc<twilight_http::Client>>,
139142
State(app_state): State<AppState>,
140143
) -> Result<Json<Value>, StatusCode> {
141144
if current_user.id.ne(&user_id) {
142145
return Err(StatusCode::UNAUTHORIZED);
143146
}
144147

145-
let mut member_guilds = member_guilds(&current_user, &app_state.discord_bot).await?;
148+
let mut member_guilds = member_guilds(&discord_user, &app_state.discord_bot).await?;
146149
let mut user = User::from_db(&user_id.to_string(), &app_state.dynamo).await.unwrap_or_else(|| User {
147150
user_id,
148151
..Default::default()
149152
});
153+
150154
// Set Discord Values
151155
user.global_name = current_user.name;
152156
user.avatar = current_user.avatar;

api/src/utils.rs

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,45 @@
1+
use std::collections::HashSet;
12
use twilight_http::{Client};
23
use http::StatusCode;
34
use twilight_model::id::Id;
45
use twilight_model::id::marker::GuildMarker;
5-
use twilight_model::user::CurrentUser;
6+
use twilight_model::user::{CurrentUser, CurrentUserGuild};
67
use crate::discord::{get_current_user_guilds, get_guild, get_guild_member};
78

89
pub async fn member_guilds(
9-
current_user: &CurrentUser,
10+
discord_user: &Client,
1011
discord_bot: &Client
11-
) -> Result<Vec<twilight_model::guild::Guild>, StatusCode> {
12-
let mut member_guilds = vec![];
12+
) -> Result<Vec<CurrentUserGuild>, StatusCode> {
1313
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)
2220
}
2321

2422
pub async fn is_client_admin_guild(guild_id: Id<GuildMarker>, current_user: &CurrentUser, discord_bot: &Client) -> Result<bool, StatusCode> {
2523
let guild = get_guild(guild_id, discord_bot).await?;
2624
let member = get_guild_member(guild_id, current_user.id, discord_bot).await?;
2725
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+
}
2927

3028
pub async fn admin_guilds(
31-
current_user: &CurrentUser,
29+
discord_user: &Client,
3230
discord_bot: &Client
33-
) -> Result<Vec<twilight_model::guild::Guild>, StatusCode> {
34-
let mut admin_guilds = vec![];
31+
) -> Result<Vec<CurrentUserGuild>, StatusCode> {
3532
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);
5143
}
5244
}
5345
Ok(admin_guilds)

0 commit comments

Comments
 (0)