Initial commit: EifelDC - Discord-like Matrix chat platform
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
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.
This commit is contained in:
80
server/src/routes/voice.rs
Normal file
80
server/src/routes/voice.rs
Normal file
@@ -0,0 +1,80 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user