Some checks failed
CI / Rust Check (push) Has been cancelled
CI / Rust Tests (push) Has been cancelled
CI / Frontend Check (push) Has been cancelled
CI / Build Tauri (macOS) (push) Has been cancelled
CI / Build Tauri (macOS Intel) (push) Has been cancelled
CI / Build Tauri (Linux) (push) Has been cancelled
Includes server (Rust/Axum API proxy with voice management), Tauri desktop client with Svelte UI, bot-sdk, Docker infra (Synapse, PostgreSQL, Coturn, Nginx), and CI/CD pipeline.
80 lines
2.5 KiB
Rust
80 lines
2.5 KiB
Rust
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<ServerState>,
|
|
headers: HeaderMap,
|
|
Json(req): Json<VoiceRequest>,
|
|
) -> Result<Json<VoiceStateInfo>, 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<ServerState>,
|
|
headers: HeaderMap,
|
|
Json(req): Json<VoiceRequest>,
|
|
) -> Result<Json<bool>, 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<ServerState>,
|
|
headers: HeaderMap,
|
|
Json(req): Json<VoiceRequest>,
|
|
) -> Result<Json<bool>, 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<ServerState>,
|
|
headers: HeaderMap,
|
|
Json(req): Json<VoiceRequest>,
|
|
) -> Result<Json<bool>, 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)
|
|
} |