From 9b479d12362e850fb3b4f6ea2b20798567fa2abc Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 22 Apr 2026 11:57:57 -0400 Subject: [PATCH] feat: respect consent to be recorded --- src/command/join.rs | 32 ++++++++++++++++++++++++++++++-- src/user_data.rs | 9 +++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/command/join.rs b/src/command/join.rs index af5d4cf..3abc0d3 100644 --- a/src/command/join.rs +++ b/src/command/join.rs @@ -1,8 +1,12 @@ -use crate::{OneToManyUniqueBTreeMap, VCs, command::State}; +use crate::{ + OneToManyUniqueBTreeMap, UserDataManager, VCs, command::State, option_ext::OptionExt as _, + user_capnp::user::Consent, user_data::RECORD_IF_CONSENT_UNSPECIFIED, +}; use async_trait::async_trait; +use futures::FutureExt; use hound::{SampleFormat, WavSpec}; use opendal::Operator; -use snafu::{OptionExt, Snafu}; +use snafu::{OptionExt as _, Snafu}; use songbird::{CoreEvent, Event, EventContext, EventHandler}; use std::{ io::Cursor, @@ -104,6 +108,8 @@ struct Handler { audio_channels: u16, audio_sample_rate: u32, + + user_data_manager: UserDataManager, } #[async_trait] @@ -134,6 +140,26 @@ impl EventHandler for Handler { tracing::info!(?user_id); if let Some(pcm) = &voice_data.decoded_voice { + let may_record = user_id + .map_async(|user_id| { + self.user_data_manager + .with(user_id, |user_data| { + user_data.get_voice_recording_consent().unwrap() + }) + .map(|result| result.expect("TODO")) + }) + .await + .map_or(RECORD_IF_CONSENT_UNSPECIFIED, |consent| match consent { + Consent::Unspecified => RECORD_IF_CONSENT_UNSPECIFIED, + Consent::Granted => true, + Consent::Withheld => false, + }); + + if !may_record { + tracing::warn!(?user_id, "may not be recorded"); + continue; + } + let elapsed = self.start_instant.elapsed(); let elapsed = elapsed.try_into().expect("TODO"); @@ -281,6 +307,8 @@ pub async fn handle(state: State, interaction: Interaction) { audio_channels, audio_sample_rate, + + user_data_manager: state.user_data_manager, }; { diff --git a/src/user_data.rs b/src/user_data.rs index 23e3489..07c6791 100644 --- a/src/user_data.rs +++ b/src/user_data.rs @@ -1,7 +1,7 @@ use std::str::FromStr; use async_compression::futures::{bufread::BrotliDecoder, write::BrotliEncoder}; -use capnp::message::{TypedBuilder, TypedReader}; +use capnp::message::TypedBuilder; use futures::{AsyncReadExt, AsyncWriteExt, TryStream, TryStreamExt}; use opendal::Operator; use snafu::{OptionExt as _, ResultExt as _, Snafu, ensure}; @@ -9,6 +9,8 @@ use twilight_model::id::{Id, marker::UserMarker}; use crate::{OperatorExt, option_ext::OptionExt as _, user_capnp}; +pub const RECORD_IF_CONSENT_UNSPECIFIED: bool = true; + #[derive(Debug, Clone)] pub struct UserDataManager { operator: Operator, @@ -242,7 +244,10 @@ impl UserDataManager { .await .context(update_error::WriteSnafu)?; - decompressed_writer.close().await.context(update_error::FinalizeSnafu)?; + decompressed_writer + .close() + .await + .context(update_error::FinalizeSnafu)?; Ok(ret) }