Skip to content

Commit 8b93f3c

Browse files
committed
fix: new guilds error on creation
1 parent e33dad5 commit 8b93f3c

File tree

8 files changed

+54
-101
lines changed

8 files changed

+54
-101
lines changed

api/src/guilds/mod.rs

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,6 @@ async fn post_guilds(
6363
) -> Result<Json<Value>, StatusCode> {
6464
let admin_guilds = admin_guilds(&discord_user, &app_state.discord_bot).await?;
6565
let mut guilds = Guild::vec_from_db(admin_guilds.iter().map(|g| g.id).collect(), &app_state.dynamo).await;
66-
for guild in &mut guilds {
67-
for g in &admin_guilds {
68-
if g.id == guild.guild_id && (g.name != guild.name || g.icon != guild.icon) {
69-
guild.name = g.name.clone();
70-
guild.icon = g.icon.clone();
71-
guild.save(&app_state.dynamo).await;
72-
}
73-
}
74-
}
75-
7666
let missing_guilds: Vec<&CurrentUserGuild> = admin_guilds.iter().filter(|a| !guilds.iter().any(|g| g.guild_id == a.id)).collect();
7767
for admin_guild in missing_guilds {
7868
guilds.push(Guild {
@@ -112,15 +102,10 @@ async fn post_guilds_id(
112102
State(app_state): State<AppState>,
113103
) -> Result<Json<Value>, StatusCode> {
114104
is_client_admin_guild(guild_id, &current_user, &app_state.discord_bot).await?;
115-
let mut guild = Guild::from_db(guild_id, &app_state.dynamo).await.unwrap_or(Guild {
105+
let guild = Guild::from_db(guild_id, &app_state.dynamo).await.unwrap_or(Guild {
116106
guild_id,
117107
..Default::default()
118108
});
119-
let guild_dsc = get_guild(guild.guild_id, &app_state.discord_bot).await?;
120-
guild.name = guild_dsc.name;
121-
guild.icon = guild_dsc.icon;
122-
guild.save(&app_state.dynamo).await;
123-
124109
Ok(Json(json!(guild)))
125110
}
126111

api/src/guilds/models.rs

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
use crate::dynamo::{as_map, as_string, as_string_opt};
1+
use crate::dynamo::{as_string, as_string_opt};
22
use aws_sdk_dynamodb::types::{AttributeValue, KeysAndAttributes};
33
use http::StatusCode;
44
use lambda_http::tracing::{error, info};
55
use serde::{Deserialize, Serialize};
66
use std::collections::HashMap;
77
use twilight_model::id::Id;
88
use twilight_model::id::marker::GuildMarker;
9-
use twilight_model::util::ImageHash;
109
use crate::discord::ise;
1110
use crate::guilds::verify::models::Verify;
1211
use crate::guilds::votes::models::Vote;
@@ -16,8 +15,6 @@ pub struct Guild {
1615
pub guild_id: Id<GuildMarker>,
1716
pub verify: Verify,
1817
pub vote: Vote,
19-
pub name: String,
20-
pub icon: Option<ImageHash>,
2118
}
2219

2320
impl Default for Guild {
@@ -26,8 +23,6 @@ impl Default for Guild {
2623
guild_id: Id::new(1),
2724
verify: Verify { roles: vec![], user_links: HashMap::new() },
2825
vote: Vote::default(),
29-
name: "".to_string(),
30-
icon: None,
3126
}
3227
}
3328
}
@@ -39,10 +34,8 @@ impl From<&HashMap<String, AttributeValue>> for Guild {
3934
.parse::<u64>()
4035
.map(Id::new)
4136
.unwrap(),
42-
verify: as_map(item.get("verify")).unwrap().into(),
43-
vote: as_string_opt(item.get("vote")).map(|v| serde_json::from_str(&*v).unwrap()).unwrap_or_default(),
44-
name: as_string(item.get("name"), &"".to_string()),
45-
icon: as_string_opt(item.get("icon")).and_then(|s| ImageHash::parse(s.as_bytes()).ok()),
37+
verify: as_string_opt(item.get("verify")).map(|v| serde_json::from_str(&*v).unwrap_or_default()).unwrap_or_default(),
38+
vote: as_string_opt(item.get("vote")).map(|v| serde_json::from_str(&*v).unwrap_or_default()).unwrap_or_default(),
4639
}
4740
}
4841
}
@@ -51,12 +44,8 @@ impl From<Guild> for HashMap<String, AttributeValue> {
5144
fn from(guild: Guild) -> Self {
5245
let mut item = HashMap::new();
5346
item.insert("guild_id".to_string(), AttributeValue::S(guild.guild_id.to_string()));
54-
item.insert("verify".to_string(), AttributeValue::M(guild.verify.into()));
47+
item.insert("verify".to_string(), AttributeValue::S(serde_json::to_string(&guild.verify).unwrap()));
5548
item.insert("vote".to_string(), AttributeValue::S(serde_json::to_string(&guild.vote).unwrap()));
56-
item.insert("name".to_string(), AttributeValue::S(guild.name));
57-
if let Some(icon) = guild.icon {
58-
item.insert("icon".to_string(), AttributeValue::S(icon.to_string()));
59-
}
6049

6150
item
6251
}
@@ -87,13 +76,12 @@ impl Guild {
8776
.send()
8877
.await
8978
.map_err(ise)
90-
.map(|resp| {
91-
let item = resp.item.unwrap_or_default();
92-
info!("before map to guild");
93-
let guild: Guild = (&item).into();
94-
info!("after map to guild");
95-
guild
96-
}) {
79+
.map(|resp|
80+
match resp.item {
81+
Some(item) => Guild::from(&item),
82+
None => Guild{guild_id, ..Default::default()}
83+
}
84+
) {
9785
Ok(guild) => Some(guild),
9886
Err(e) => {
9987
error!("Error fetching guild from DynamoDB: {}", e);

api/src/guilds/tasks.rs

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,46 +4,9 @@ use lambda_http::tracing::info;
44
use regex::Regex;
55
use twilight_model::id::Id;
66
use twilight_model::id::marker::{GuildMarker, RoleMarker, UserMarker};
7-
use crate::discord::{add_guild_member_role, get_current_user_guilds, get_guild_member, remove_guild_member_role};
7+
use crate::discord::{add_guild_member_role, get_guild_member, remove_guild_member_role};
88
use crate::guilds::verify::models::VerifyRole;
99

10-
pub async fn _update_guilds(bot: &twilight_http::Client, dynamo: &aws_sdk_dynamodb::Client) -> Result<(), StatusCode> {
11-
info!("Updating guilds...");
12-
let d_guilds = get_current_user_guilds(bot).await?;
13-
14-
let k_guilds =
15-
Guild::vec_from_db(d_guilds.iter().map(|g| g.id).collect(), dynamo).await;
16-
17-
for d_guild in d_guilds {
18-
let mut found = false;
19-
for k_guild in &k_guilds {
20-
if d_guild.id == k_guild.guild_id {
21-
info!("Guild {} found in DB, checking for updates...", d_guild.id);
22-
let mut updated_guild = k_guild.clone();
23-
updated_guild.name = d_guild.name.clone();
24-
updated_guild.icon = d_guild.icon;
25-
if updated_guild != *k_guild {
26-
updated_guild.save(dynamo).await;
27-
info!("Guild {} updated.", d_guild.id);
28-
}
29-
found = true;
30-
continue;
31-
}
32-
}
33-
if !found {
34-
let new_guild = Guild {
35-
guild_id: d_guild.id,
36-
name: d_guild.name.clone(),
37-
icon: d_guild.icon,
38-
..Default::default()
39-
};
40-
new_guild.save(dynamo).await;
41-
}
42-
}
43-
info!("Guilds updated.");
44-
Ok(())
45-
}
46-
4710
async fn assign_role_user(
4811
guild_id: Id<GuildMarker>,
4912
user_id: Id<UserMarker>,

api/src/guilds/verify/models.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ impl From<UserLink> for HashMap<String, AttributeValue> {
7878
}
7979
}
8080

81-
#[derive(Clone, Serialize, Deserialize, PartialEq)]
81+
#[derive(Clone, Serialize, Deserialize, PartialEq, Default)]
8282
pub struct Verify {
8383
pub roles: Vec<VerifyRole>,
8484
pub user_links: HashMap<Id<UserMarker>, Vec<Link>>,

api/src/meta/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use axum::{Extension, Json, Router};
55
use axum::extract::{Path, State};
66
use axum::routing::get;
77
use http::StatusCode;
8-
use lambda_http::tracing::{error, info, warn};
8+
use lambda_http::tracing::{debug, error, info, warn};
99
use serde::{Deserialize, Serialize};
1010
use serde_json::{json, Value};
1111
use tokio::time::{sleep, Instant};
@@ -94,7 +94,7 @@ async fn get_meta_guilds_id(
9494
icon: guild.icon,
9595
is_admin: u_guild.owner || u_guild.permissions & Permissions::ADMINISTRATOR == Permissions::ADMINISTRATOR,
9696
roles: guild.roles,
97-
channels
97+
channels: channels
9898
}
9999
)))
100100
}
@@ -103,11 +103,11 @@ async fn get_meta_guilds_id(
103103

104104
async fn refresh_meta_cache(discord_bot: Arc<Client>) {
105105
loop {
106-
info!("Refreshing meta cache");
106+
debug!("Refreshing meta cache");
107107
let time = Instant::now();
108108
match get_current_user_guilds_prime_cache(&*discord_bot).await {
109109
Ok(guilds) => {
110-
info!("Refreshing meta cache: {}", guilds.len());
110+
debug!("Refreshing meta cache: {}", guilds.len());
111111
for guild in guilds {
112112
let _ = get_guild_prime_cache(guild.id, &*discord_bot).await;
113113
}
@@ -116,7 +116,7 @@ async fn refresh_meta_cache(discord_bot: Arc<Client>) {
116116
error!("refresh_meta_cache error: {:#?}", e);
117117
}
118118
}
119-
info!("{:?} {:?} Waiting {} seconds",time, Instant::now(), (time.sub(Instant::now()).add(Duration::from_secs(50))).as_secs());
119+
debug!("{:?} {:?} Waiting {} seconds",time, Instant::now(), (time.sub(Instant::now()).add(Duration::from_secs(50))).as_secs());
120120
sleep((time.sub(Instant::now())).add(Duration::from_secs(50))).await;
121121
}
122122
}

ui/src/components/verify/LinkedGuildsSelect.vue

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,19 @@
22
33
import {User} from "../../stores/user.js";
44
import {ref} from "vue";
5+
import {GuildMeta} from "../../stores/meta.js";
56
67
let props = defineProps({
7-
user: User
8-
})
8+
user: {
9+
type: User
10+
},
11+
guildMetaArr: {
12+
type: Array, // PartialGuildMeta[]
13+
required: true
14+
}
15+
}
16+
)
17+
console.log(props.guildMetaArr);
918
let loadingGuilds = ref([])
1019
async function toggle_guild(guildId) {
1120
loadingGuilds.value.push(guildId)
@@ -16,14 +25,22 @@ async function toggle_guild(guildId) {
1625
loadingGuilds.value = loadingGuilds.value.filter(guild => guild !== guildId)
1726
}
1827
28+
function isLinked(guildId) {
29+
return props.user.linkGuilds.find(guild => guild.guildId === guildId && guild.enabled) !== undefined
30+
}
31+
32+
function isLoading(guildId) {
33+
return loadingGuilds.value.find(g => g === guildId) !== undefined
34+
}
35+
1936
</script>
2037

2138
<template>
2239
<div class="grid md:grid-cols-3 sm:grid-cols-2">
23-
<button class="btn m-2 min-w-48" :class="{'btn-success': guild.enabled, 'btn-soft': !guild.enabled, 'btn-disabled': loadingGuilds.includes(guild.guildId)}" v-if="user" v-for="guild in user.linkGuilds"
24-
@click="toggle_guild(guild.guildId)">
25-
<span class="w-5 h-5 loading loading-spinner" v-if="loadingGuilds.includes(guild.guildId)"></span>
26-
<img class="w-5 h-5" :src="`https://cdn.discordapp.com/icons/${guild.guildId}/${guild.icon}.webp`" v-if="guild.icon && !loadingGuilds.includes(guild.guildId)" alt="guild icon">
40+
<button class="btn m-2 min-w-48" :class="{'btn-success': isLinked(guild.id), 'btn-soft': !isLinked(guild.id), 'btn-disabled': isLoading(guild.id)}" v-if="$props.user" v-for="guild in $props.guildMetaArr"
41+
@click="toggle_guild(guild.id)">
42+
<span class="w-5 h-5 loading loading-spinner" v-if="isLoading(guild.id)"></span>
43+
<img class="w-5 h-5" :src="`https://cdn.discordapp.com/icons/${guild.id}/${guild.icon}.webp`" v-if="guild.icon && !isLoading(guild.id)" alt="guild icon">
2744
{{ guild.name }}
2845
</button>
2946
</div>

ui/src/pages/verify/VerifyView.vue

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
<script setup>
22
33
import DiscordAuthButton from "../../components/auth/DiscordAuthButton.vue";
4-
import {ref} from "vue";
4+
import {onMounted, ref} from "vue";
55
import {isUserLoggedIn, User} from "../../stores/user.js";
66
import LinkedAccountsTable from "../../components/verify/LinkedAccountsTable.vue";
77
import LinkAccountButton from "../../components/verify/LinkAccountButton.vue";
88
import MainWithFooter from "../../components/MainWithFooter.vue";
99
import LinkedGuildsSelect from "../../components/verify/LinkedGuildsSelect.vue";
1010
import {internalRedirect, reload} from "../../helpers/redirect.js";
11+
import {PartialGuildMeta} from "../../stores/meta.js";
1112
1213
let user = ref(User.loadCache());
14+
let guildMetaArr = ref([])
1315
if (!isUserLoggedIn(user.value)){
1416
internalRedirect("/login")
1517
}
1618
19+
onMounted(async () => {
20+
guildMetaArr.value = await PartialGuildMeta.fetchAll(user.value.token.accessToken)
21+
})
22+
23+
1724
</script>
1825

1926
<template>
@@ -43,10 +50,11 @@ if (!isUserLoggedIn(user.value)){
4350

4451
<div class="divider"></div>
4552
<div class="flex flex-col w-full">
46-
<div class="flex flex-row justify-between mb-2.5">
47-
<h3 class="text-lg font-bold self-center">Linked Servers</h3>
53+
<div class="justify-between mb-2.5">
54+
<h3 class="text-lg font-bold">Linked Servers</h3>
55+
<h3 class="text-sm italic">Click to enable</h3>
4856
</div>
49-
<LinkedGuildsSelect :user="user"/>
57+
<LinkedGuildsSelect :user="user" :guild-meta-arr="guildMetaArr"/>
5058
</div>
5159
</div>
5260
</div>

ui/src/stores/guild.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -166,16 +166,12 @@ export class Guild {
166166
guildId
167167
verify
168168
vote
169-
name
170-
icon
171169
userLinks
172170

173-
constructor(guildId, verify, vote, name, icon, userLinks) {
171+
constructor(guildId, verify, vote, userLinks) {
174172
this.guildId = guildId
175173
this.verify = verify
176174
this.vote = vote
177-
this.name = name
178-
this.icon = icon
179175
this.userLinks = userLinks
180176
}
181177

@@ -184,8 +180,6 @@ export class Guild {
184180
'guild_id': this.guildId,
185181
'verify': this.verify.toJson(),
186182
'vote': this.vote.toJson(),
187-
'name': this.name,
188-
'icon': this.icon,
189183
}
190184
}
191185

@@ -194,8 +188,6 @@ export class Guild {
194188
guild.guildId = json['guild_id']
195189
guild.verify = Verify.fromJson(json['verify'])
196190
guild.vote = Vote.fromJson(json['vote'])
197-
guild.name = json['name']
198-
guild.icon = json['icon']
199191
return guild
200192
}
201193

0 commit comments

Comments
 (0)