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

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:
root
2026-04-28 08:23:23 +02:00
commit 0978d0c2e9
82 changed files with 12417 additions and 0 deletions

View 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)
}