Select the types of activity you want to include in your feed.
flora is a fast and secure runtime that lets you write discord bots for your servers, with a rich TypeScript SDK, without worrying about running infrastructure. [mirror]
···7373 DeploymentSource::Unknown => DeploymentSource::Api,
7474 _ => source,
7575 };
7676- let actor = actor_from_identity(&identity);
7676+ let actor = actor_from_identity(&state, &identity, &guild_id).await;
77777878 let previous_success = state
7979 .deployments
+39-4
apps/runtime/src/handlers/deployments/upsert.rs
···2020use chrono::Utc;
2121use serde::{Deserialize, Serialize};
2222use std::str::FromStr;
2323-use tracing::error;
2323+use tracing::{error, warn};
2424use utoipa::ToSchema;
25252626pub const DEPLOY_SOURCE_HEADER: HeaderName = HeaderName::from_static("x-flora-deploy-source");
···185185 })
186186}
187187188188-pub fn actor_from_identity(identity: &IdentityContext) -> DeploymentActor {
188188+pub async fn actor_from_identity(
189189+ state: &AppState,
190190+ identity: &IdentityContext,
191191+ guild_id: &str,
192192+) -> DeploymentActor {
189193 let Some(session) = identity.session.as_ref() else {
194194+ let username = resolve_token_username(state, guild_id, &identity.user_id).await;
190195 return DeploymentActor {
191196 user_id: Some(identity.user_id.clone()),
192192- username: None,
197197+ username,
193198 actor_type: DeploymentActorType::Token,
194199 };
195200 };
···198203 user_id: Some(identity.user_id.clone()),
199204 username: Some(session.user.username.clone()),
200205 actor_type: DeploymentActorType::Session,
206206+ }
207207+}
208208+209209+async fn resolve_token_username(state: &AppState, guild_id: &str, user_id: &str) -> Option<String> {
210210+ let Ok(guild_id_num) = guild_id.parse::<u64>() else {
211211+ warn!(target: "flora:api", guild_id, "invalid guild id for deployment actor lookup");
212212+ return None;
213213+ };
214214+215215+ let Ok(user_id_num) = user_id.parse::<u64>() else {
216216+ warn!(target: "flora:api", user_id, "invalid user id for deployment actor lookup");
217217+ return None;
218218+ };
219219+220220+ match state
221221+ .http
222222+ .get_member(guild_id_num.into(), user_id_num.into())
223223+ .await
224224+ {
225225+ Ok(member) => Some(member.user.name.to_string()),
226226+ Err(err) => {
227227+ warn!(
228228+ target: "flora:api",
229229+ guild_id,
230230+ user_id,
231231+ ?err,
232232+ "failed to fetch deployment actor username"
233233+ );
234234+ None
235235+ }
201236 }
202237}
203238···275310 validate_request(&request)?;
276311277312 let deploy_source = parse_deploy_source(&headers)?;
278278- let actor = actor_from_identity(&identity);
313313+ let actor = actor_from_identity(&state, &identity, &guild_id).await;
279314280315 let files = request.files;
281316 let (bundle, source_map) = if let Some(bundle) = request.bundle {