Skip to content

Commit 686f931

Browse files
authored
feat: add futo discord (#1517)
1 parent 94a6576 commit 686f931

27 files changed

Lines changed: 1173 additions & 56 deletions

File tree

.github/workflows/terragrunt.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ env:
2323
TG_NON_INTERACTIVE: 'true'
2424
permissions: {}
2525

26+
defaults:
27+
run:
28+
shell: bash
29+
2630
jobs:
2731
check:
2832
runs-on: ubuntu-latest

tf/deployment/.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export TF_VAR_op_connect_url="op://tf/1pass_connect/url"
1010
export TF_VAR_op_connect_token="op://tf/1pass_connect/token"
1111
export TF_VAR_futo_op_service_account_token="op://tf_$ENVIRONMENT/yucca_futo_1pass_superuser_service_account/password"
1212
export TF_VAR_discord_token="op://tf/IMMICH_TF_DISCORD_BOT_TOKEN/password"
13+
export TF_VAR_futo_discord_token="op://tf/FUTO_TF_DISCORD_BOT_TOKEN/password"
1314
export TF_VAR_zitadel_profile_json="op://tf/ZITADEL_PROFILE_JSON/password"
1415
export TF_VAR_zitadel_github_client_id="op://tf/GITHUB_OAUTH_APP_IMMICH_ZITADEL_CLIENT_ID/password"
1516
export TF_VAR_zitadel_github_client_secret="op://tf/GITHUB_OAUTH_APP_IMMICH_ZITADEL_CLIENT_SECRET/password"
@@ -27,4 +28,5 @@ export DOCKER_PASSWORD="op://tf/dockerhub/password"
2728
export TF_VAR_grafana_token="op://tf_$ENVIRONMENT/MONITORING_GRAFANA_TF_AUTH_TOKEN/password"
2829
export TF_VAR_grafana_url="op://tf_$ENVIRONMENT/MONITORING_GRAFANA_URL/password"
2930
export TF_VAR_discord_server_id="op://tf_$ENVIRONMENT/IMMICH_DISCORD_SERVER_ID/password"
31+
export TF_VAR_futo_discord_server_id="op://tf_$ENVIRONMENT/FUTO_DISCORD_SERVER_ID/password"
3032
export TF_VAR_env=$ENVIRONMENT

tf/deployment/data/users.json

Lines changed: 69 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
"id": 285511635735543828
1010
},
1111
"roles": [
12-
"admin",
13-
"immich"
12+
"immich_admin",
13+
"futo_admin",
14+
"immich",
15+
"futo"
1416
]
1517
},
1618
{
@@ -23,10 +25,10 @@
2325
"id": 613523742479483183
2426
},
2527
"roles": [
26-
"admin",
27-
"immich"
28-
],
29-
"dev": true
28+
"immich_admin",
29+
"immich",
30+
"futo"
31+
]
3032
},
3133
{
3234
"github": {
@@ -38,11 +40,11 @@
3840
"id": 324007594262003722
3941
},
4042
"roles": [
41-
"admin",
43+
"immich_admin",
4244
"yucca",
43-
"immich"
44-
],
45-
"dev": true
45+
"immich",
46+
"futo"
47+
]
4648
},
4749
{
4850
"github": {
@@ -54,11 +56,12 @@
5456
"id": 185097470215192579
5557
},
5658
"roles": [
57-
"admin",
59+
"immich_admin",
60+
"futo_admin",
5861
"yucca",
59-
"immich"
60-
],
61-
"dev": true
62+
"immich",
63+
"futo"
64+
]
6265
},
6366
{
6467
"github": {
@@ -71,7 +74,8 @@
7174
},
7275
"roles": [
7376
"team",
74-
"yucca"
77+
"yucca",
78+
"futo"
7579
]
7680
},
7781
{
@@ -85,7 +89,8 @@
8589
},
8690
"roles": [
8791
"team",
88-
"yucca"
92+
"yucca",
93+
"futo"
8994
]
9095
},
9196
{
@@ -99,7 +104,8 @@
99104
},
100105
"roles": [
101106
"team",
102-
"yucca"
107+
"yucca",
108+
"futo"
103109
]
104110
},
105111
{
@@ -113,9 +119,9 @@
113119
},
114120
"roles": [
115121
"team",
116-
"immich"
117-
],
118-
"dev": true
122+
"immich",
123+
"futo"
124+
]
119125
},
120126
{
121127
"github": {
@@ -128,7 +134,8 @@
128134
},
129135
"roles": [
130136
"team",
131-
"immich"
137+
"immich",
138+
"futo"
132139
]
133140
},
134141
{
@@ -142,9 +149,9 @@
142149
},
143150
"roles": [
144151
"team",
145-
"immich"
146-
],
147-
"dev": true
152+
"immich",
153+
"futo"
154+
]
148155
},
149156
{
150157
"github": {
@@ -157,7 +164,8 @@
157164
},
158165
"roles": [
159166
"team",
160-
"immich"
167+
"immich",
168+
"futo"
161169
]
162170
},
163171
{
@@ -171,7 +179,8 @@
171179
},
172180
"roles": [
173181
"team",
174-
"immich"
182+
"immich",
183+
"futo"
175184
]
176185
},
177186
{
@@ -185,7 +194,8 @@
185194
},
186195
"roles": [
187196
"team",
188-
"yucca"
197+
"yucca",
198+
"futo"
189199
]
190200
},
191201
{
@@ -212,7 +222,8 @@
212222
"id": 1402320140938510398
213223
},
214224
"roles": [
215-
"futo"
225+
"futo",
226+
"futo_admin"
216227
]
217228
},
218229
{
@@ -228,6 +239,36 @@
228239
"futo"
229240
]
230241
},
242+
{
243+
"github": null,
244+
"discord": {
245+
"username": "thekinocorner",
246+
"id": 407763616528334848
247+
},
248+
"roles": [
249+
"futo"
250+
]
251+
},
252+
{
253+
"github": null,
254+
"discord": {
255+
"username": "orhan_08299",
256+
"id": 1450543861108838491
257+
},
258+
"roles": [
259+
"futo"
260+
]
261+
},
262+
{
263+
"github": null,
264+
"discord": {
265+
"username": "somewhatjustin",
266+
"id": 396114422906486784
267+
},
268+
"roles": [
269+
"futo"
270+
]
271+
},
231272
{
232273
"github": {
233274
"username": "adamantike",

tf/deployment/modules/scoped/discord/community/.terraform.lock.hcl

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tf/deployment/modules/scoped/discord/community/config.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,9 @@ terraform {
1111
source = "1Password/onepassword"
1212
version = "~> 2.1"
1313
}
14+
external = {
15+
source = "hashicorp/external"
16+
version = "~> 2.3"
17+
}
1418
}
1519
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
input="$(cat)"
5+
token="$(jq -r '.token' <<<"$input")"
6+
server_id="$(jq -r '.server_id' <<<"$input")"
7+
user_ids_csv="$(jq -r '.user_ids' <<<"$input")"
8+
9+
members=()
10+
11+
if [[ -n "$user_ids_csv" ]]; then
12+
IFS=',' read -ra user_ids <<<"$user_ids_csv"
13+
for uid in "${user_ids[@]}"; do
14+
[[ -z "$uid" ]] && continue
15+
16+
while :; do
17+
headers_file="$(mktemp)"
18+
status="$(curl -sS -o /dev/null -D "$headers_file" -w '%{http_code}' \
19+
-H "Authorization: Bot $token" \
20+
"https://discord.com/api/v10/guilds/$server_id/members/$uid" || echo '000')"
21+
22+
case "$status" in
23+
200)
24+
members+=("$uid")
25+
rm -f "$headers_file"
26+
break
27+
;;
28+
404)
29+
rm -f "$headers_file"
30+
break
31+
;;
32+
429)
33+
reset="$(awk 'BEGIN{IGNORECASE=1} /^X-RateLimit-Reset-After:/ {print $2}' "$headers_file" | tr -d '\r')"
34+
rm -f "$headers_file"
35+
sleep "${reset:-5}"
36+
;;
37+
*)
38+
echo "uid=$uid returned status=$status" >&2
39+
rm -f "$headers_file"
40+
break
41+
;;
42+
esac
43+
done
44+
done
45+
fi
46+
47+
if [[ ${#members[@]} -eq 0 ]]; then
48+
member_ids_json='[]'
49+
else
50+
member_ids_json="$(printf '%s\n' "${members[@]}" | jq -R . | jq -sc .)"
51+
fi
52+
jq -nc --arg member_ids "$member_ids_json" '{member_ids: $member_ids}'

tf/deployment/modules/scoped/discord/community/users.tf

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,37 @@
11
locals {
22
users = jsondecode(file(var.users_data_file_path))
3+
4+
candidate_users = {
5+
for user in local.users : user.discord.id => user
6+
if try(user.discord.username, "") != ""
7+
}
8+
}
9+
10+
data "external" "members" {
11+
program = ["${path.module}/scripts/check-members.sh"]
12+
query = {
13+
token = var.discord_token
14+
server_id = discord_server.server.id
15+
user_ids = join(",", [for user in local.candidate_users : user.discord.id])
16+
}
317
}
418

519
resource "discord_member_roles" "roles" {
6-
for_each = { for user in local.users : user.discord.id => user if(var.env == "prod" || lookup(user, "dev", false)) && try(user.discord.username, "") != "" }
20+
for_each = {
21+
for id, user in local.candidate_users : id => user
22+
if contains(jsondecode(data.external.members.result.member_ids), id)
23+
}
724

825
server_id = discord_server.server.id
926
user_id = each.value.discord.id
1027
role {
1128
role_id = discord_role.admin.id
12-
has_role = contains(each.value.roles, "admin")
29+
has_role = contains(each.value.roles, "immich_admin")
1330
}
1431

1532
role {
1633
role_id = discord_role.team.id
17-
has_role = length(setintersection(toset(each.value.roles), toset(["yucca", "team", "admin"]))) > 0
34+
has_role = length(setintersection(toset(each.value.roles), toset(["yucca", "team", "immich_admin"]))) > 0
1835
}
1936

2037
role {
@@ -24,12 +41,12 @@ resource "discord_member_roles" "roles" {
2441

2542
role {
2643
role_id = discord_role.contributor.id
27-
has_role = length(setintersection(toset(each.value.roles), toset(["contributor", "futo", "yucca", "team", "admin"]))) > 0
44+
has_role = length(setintersection(toset(each.value.roles), toset(["contributor", "futo", "yucca", "team", "immich_admin"]))) > 0
2845
}
2946

3047
role {
3148
role_id = discord_role.futo.id
32-
has_role = length(setintersection(toset(each.value.roles), toset(["futo", "yucca", "team", "admin"]))) > 0
49+
has_role = length(setintersection(toset(each.value.roles), toset(["futo", "yucca", "team", "immich_admin"]))) > 0
3350
}
3451

3552
role {

0 commit comments

Comments
 (0)