use axum::{ extract::State, http::HeaderMap, Json, }; use serde::{Deserialize, Serialize}; use crate::ServerState; use super::auth::extract_token; #[derive(Deserialize)] pub struct VoiceRequest { pub room_id: String, } #[derive(Serialize)] pub struct VoiceStateInfo { pub room_id: String, pub muted: bool, pub deafened: bool, pub streaming: bool, } pub async fn join_voice_channel( State(state): State, headers: HeaderMap, Json(req): Json, ) -> Result, axum::http::StatusCode> { let token = extract_token(&headers).ok_or(axum::http::StatusCode::UNAUTHORIZED)?; let mut s = state.write().await; let session = s.sessions.get_mut(&token).ok_or(axum::http::StatusCode::UNAUTHORIZED)?; session.voice_manager.join_channel(req.room_id.clone(), session.user_id.clone()); Ok(Json(VoiceStateInfo { room_id: req.room_id, muted: false, deafened: false, streaming: false, })) } pub async fn leave_voice_channel( State(state): State, headers: HeaderMap, Json(req): Json, ) -> Result, axum::http::StatusCode> { let token = extract_token(&headers).ok_or(axum::http::StatusCode::UNAUTHORIZED)?; let mut s = state.write().await; let session = s.sessions.get_mut(&token).ok_or(axum::http::StatusCode::UNAUTHORIZED)?; Ok(Json(session.voice_manager.leave_channel(&req.room_id, &session.user_id))) } pub async fn toggle_mute( State(state): State, headers: HeaderMap, Json(req): Json, ) -> Result, axum::http::StatusCode> { let token = extract_token(&headers).ok_or(axum::http::StatusCode::UNAUTHORIZED)?; let mut s = state.write().await; let session = s.sessions.get_mut(&token).ok_or(axum::http::StatusCode::UNAUTHORIZED)?; session.voice_manager.toggle_mute(&req.room_id, &session.user_id) .ok_or(axum::http::StatusCode::BAD_REQUEST) .map(Json) } pub async fn toggle_deafen( State(state): State, headers: HeaderMap, Json(req): Json, ) -> Result, axum::http::StatusCode> { let token = extract_token(&headers).ok_or(axum::http::StatusCode::UNAUTHORIZED)?; let mut s = state.write().await; let session = s.sessions.get_mut(&token).ok_or(axum::http::StatusCode::UNAUTHORIZED)?; session.voice_manager.toggle_deafen(&req.room_id, &session.user_id) .ok_or(axum::http::StatusCode::BAD_REQUEST) .map(Json) }