use crate::api::BotApi;
use crate::models::api::AudioAction;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u8)]
pub enum AudioStatus {
Start = 0,
Pause = 1,
Resume = 2,
Stop = 3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u8)]
pub enum PublicAudioType {
Voice = 2,
Live = 5,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioControl {
pub audio_url: String,
pub text: String,
pub status: AudioStatus,
}
#[derive(Debug, Clone, Serialize)]
pub struct Audio {
#[serde(skip)]
api: BotApi,
pub event_id: Option<String>,
pub channel_id: Option<String>,
pub guild_id: Option<String>,
pub audio_url: Option<String>,
pub text: Option<String>,
}
impl Audio {
pub fn new(api: BotApi, event_id: Option<String>, data: AudioAction) -> Self {
Self {
api,
event_id,
channel_id: data.channel_id,
guild_id: data.guild_id,
audio_url: data.audio_url,
text: data.text,
}
}
pub fn api(&self) -> &BotApi {
&self.api
}
}
impl std::fmt::Display for Audio {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Audio {{ channel_id: {:?}, guild_id: {:?}, audio_url: {:?}, text: {:?}, event_id: {:?} }}",
self.channel_id, self.guild_id, self.audio_url, self.text, self.event_id
)
}
}
#[derive(Debug, Clone, Serialize)]
pub struct PublicAudio {
#[serde(skip)]
api: BotApi,
pub guild_id: Option<String>,
pub channel_id: Option<String>,
pub channel_type: Option<PublicAudioType>,
pub user_id: Option<String>,
}
impl PublicAudio {
pub fn new(api: BotApi, data: serde_json::Value) -> Self {
Self {
api,
guild_id: data
.get("guild_id")
.and_then(|v| v.as_str())
.map(String::from),
channel_id: data
.get("channel_id")
.and_then(|v| v.as_str())
.map(String::from),
channel_type: data
.get("channel_type")
.and_then(|v| v.as_u64())
.and_then(|v| match v {
2 => Some(PublicAudioType::Voice),
5 => Some(PublicAudioType::Live),
_ => None,
}),
user_id: data
.get("user_id")
.and_then(|v| v.as_str())
.map(String::from),
}
}
pub fn api(&self) -> &BotApi {
&self.api
}
}
impl std::fmt::Display for PublicAudio {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"PublicAudio {{ guild_id: {:?}, channel_id: {:?}, channel_type: {:?}, user_id: {:?} }}",
self.guild_id, self.channel_id, self.channel_type, self.user_id
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_audio_status() {
assert_eq!(AudioStatus::Start as u8, 0);
assert_eq!(AudioStatus::Pause as u8, 1);
assert_eq!(AudioStatus::Resume as u8, 2);
assert_eq!(AudioStatus::Stop as u8, 3);
}
#[test]
fn test_public_audio_type() {
assert_eq!(PublicAudioType::Voice as u8, 2);
assert_eq!(PublicAudioType::Live as u8, 5);
}
}