diff --git a/src/types/entities/voice_state.rs b/src/types/entities/voice_state.rs index 8d14264..6bc45e2 100644 --- a/src/types/entities/voice_state.rs +++ b/src/types/entities/voice_state.rs @@ -18,10 +18,13 @@ use crate::types::{ utils::Snowflake, }; +/// The VoiceState struct. Note, that Discord does not have an `id` field for this, whereas Spacebar +/// does. +/// /// See #[derive(Serialize, Deserialize, Debug, Default, Clone)] #[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))] -#[cfg_attr(feature = "client", derive(Updateable, Composite))] +#[cfg_attr(feature = "client", derive(Composite))] pub struct VoiceState { pub guild_id: Option, pub guild: Option, @@ -38,6 +41,15 @@ pub struct VoiceState { pub self_video: bool, pub suppress: bool, pub request_to_speak_timestamp: Option>, - #[serde(default = "Snowflake::generate")] - pub id: Snowflake, // Only exists on Spacebar + pub id: Option, // Only exists on Spacebar +} + +impl Updateable for VoiceState { + fn id(&self) -> Snowflake { + if let Some(id) = self.id { + id // ID exists: Only the case for Spacebar Server impls + } else { + self.user_id // ID doesn't exist: Discord does not have the ID field - ID is void + } + } }