From d299b9c342afcb30ca465c8a7d76dc6a53643fe6 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 30 Mar 2026 07:18:59 +0000 Subject: [PATCH] Autosave: 20260330-071859 --- Temp/check_divs.php | 19 -- Temp/check_users.php | 13 - Temp/create_admin.php | 33 -- Temp/db_init.php | 10 - Temp/diagnostic.php | 62 ---- Temp/fix_db.php | 103 ------ Temp/test_poll.php | 30 -- assets/js/rnnoise-processor.js | 115 +++++++ assets/js/rnnoise.wasm | Bin 0 -> 111910 bytes assets/js/voice.js | 555 +++++++++++---------------------- index.php | 5 +- 11 files changed, 302 insertions(+), 643 deletions(-) delete mode 100644 Temp/check_divs.php delete mode 100644 Temp/check_users.php delete mode 100644 Temp/create_admin.php delete mode 100644 Temp/db_init.php delete mode 100644 Temp/diagnostic.php delete mode 100644 Temp/fix_db.php delete mode 100644 Temp/test_poll.php create mode 100644 assets/js/rnnoise-processor.js create mode 100644 assets/js/rnnoise.wasm diff --git a/Temp/check_divs.php b/Temp/check_divs.php deleted file mode 100644 index 3ef77f2..0000000 --- a/Temp/check_divs.php +++ /dev/null @@ -1,19 +0,0 @@ - $line) { - $line_open = substr_count($line, '= 760 && ($i + 1) <= 780) { - echo "Line " . ($i + 1) . ": Depth $old_depth -> $depth | " . trim($line) . "\n"; - } -} -echo "Final depth: $depth\n"; diff --git a/Temp/check_users.php b/Temp/check_users.php deleted file mode 100644 index d83595c..0000000 --- a/Temp/check_users.php +++ /dev/null @@ -1,13 +0,0 @@ -query("SELECT id, username, email FROM users"); - $users = $stmt->fetchAll(); - echo "Liste des utilisateurs :\n"; - foreach ($users as $user) { - echo "- ID: {$user['id']} | Username: {$user['username']} | Email: {$user['email']}\n"; - } -} catch (Exception $e) { - echo "Erreur : " . $e->getMessage(); -} -unlink(__FILE__); diff --git a/Temp/create_admin.php b/Temp/create_admin.php deleted file mode 100644 index 1a2f080..0000000 --- a/Temp/create_admin.php +++ /dev/null @@ -1,33 +0,0 @@ -prepare("SELECT id FROM users WHERE email = ? OR username = ?"); - $stmt->execute([$email, $username]); - - if ($stmt->fetch()) { - echo "L'utilisateur admin ou cet email existe déjà."; - } else { - $stmt = $pdo->prepare("INSERT INTO users (username, display_name, email, password_hash, status, is_admin) VALUES (?, ?, ?, ?, ?, ?)"); - $stmt->execute([$username, 'Administrateur', $email, $password_hash, 'offline', 1]); - - echo "

Succès !

"; - echo "

Compte administrateur créé avec succès.

"; - echo ""; - echo "

IMPORTANT : Supprimez ce fichier (create_admin.php) immédiatement après utilisation pour des raisons de sécurité.

"; - } -} catch (PDOException $e) { - echo "Erreur lors de la création du compte : " . $e->getMessage(); -} -?> diff --git a/Temp/db_init.php b/Temp/db_init.php deleted file mode 100644 index 9522d8a..0000000 --- a/Temp/db_init.php +++ /dev/null @@ -1,10 +0,0 @@ -exec($sql); - echo "Database initialized successfully.\n"; -} catch (Exception $e) { - echo "Error initializing database: " . $e->getMessage() . "\n"; -} diff --git a/Temp/diagnostic.php b/Temp/diagnostic.php deleted file mode 100644 index 87d80ef..0000000 --- a/Temp/diagnostic.php +++ /dev/null @@ -1,62 +0,0 @@ -Diagnostic du Projet Corvara"; - -// 1. Test de la connexion -try { - $pdo = db(); - echo "

✅ Connexion à la base de données réussie.

"; -} catch (Exception $e) { - echo "

❌ Erreur de connexion : " . htmlspecialchars($e->getMessage()) . "

"; - exit; -} - -// 2. Vérification des tables -$required_tables = [ - 'users', 'servers', 'channels', 'messages', 'roles', 'server_members', - 'channel_members', 'channel_events', 'poll_votes', 'server_badges', - 'member_badges', 'custom_emotes', 'voice_sessions' -]; - -echo "

Vérification des tables :

"; - -// 3. Extensions PHP -echo "

Extensions PHP :

"; - -// 4. Vérification de l'administrateur -echo "

Compte Administrateur :

"; -try { - $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ? AND is_admin = 1"); - $stmt->execute(['admin@corvara.com']); - $admin = $stmt->fetch(); - if ($admin) { - echo "

✅ SuperAdmin (admin@corvara.com) présent.

"; - } else { - echo "

⚠️ SuperAdmin absent. Utilisez create_admin.php pour le créer.

"; - } -} catch (Exception $e) { - echo "

Impossible de vérifier l'admin (table users manquante ?).

"; -} - -echo "

Si des tables sont manquantes, exécutez fix_db.php.

"; diff --git a/Temp/fix_db.php b/Temp/fix_db.php deleted file mode 100644 index 142982f..0000000 --- a/Temp/fix_db.php +++ /dev/null @@ -1,103 +0,0 @@ -Réparation de la base de données"; - -try { - $pdo = db(); -} catch (Exception $e) { - die("

Erreur de connexion : " . $e->getMessage() . "

"); -} - -$tables = [ - "CREATE TABLE IF NOT EXISTS `channel_events` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `channel_id` int(11) NOT NULL, - `user_id` int(11) NOT NULL, - `title` varchar(255) NOT NULL, - `description` text DEFAULT NULL, - `banner_url` varchar(255) DEFAULT NULL, - `banner_color` varchar(20) DEFAULT NULL, - `start_date` date NOT NULL, - `start_time` time NOT NULL, - `end_date` date NOT NULL, - `end_time` time NOT NULL, - `frequency` varchar(50) DEFAULT NULL, - `is_permanent` tinyint(1) DEFAULT 0, - `created_at` timestamp NULL DEFAULT current_timestamp(), - `enable_reactions` tinyint(1) DEFAULT 0, - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", - - "CREATE TABLE IF NOT EXISTS `poll_votes` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `message_id` int(11) NOT NULL, - `user_id` int(11) NOT NULL, - `option_index` int(11) NOT NULL, - `created_at` timestamp NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", - - "CREATE TABLE IF NOT EXISTS `server_badges` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `server_id` int(11) NOT NULL, - `name` varchar(255) NOT NULL, - `image_url` text NOT NULL, - `created_at` timestamp NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", - - "CREATE TABLE IF NOT EXISTS `member_badges` ( - `server_id` int(11) NOT NULL, - `user_id` int(11) NOT NULL, - `badge_id` int(11) NOT NULL, - PRIMARY KEY (`server_id`,`user_id`,`badge_id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", - - "CREATE TABLE IF NOT EXISTS `event_participations` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `event_id` int(11) NOT NULL, - `user_id` int(11) NOT NULL, - `created_at` timestamp NULL DEFAULT current_timestamp(), - PRIMARY KEY (`id`), - UNIQUE KEY `event_id` (`event_id`,`user_id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;" -]; - -foreach ($tables as $sql) { - try { - $pdo->exec($sql); - echo "

✅ Exécution réussie d'une requête de création.

"; - } catch (Exception $e) { - echo "

⚠️ Info : " . $e->getMessage() . " (Peut-être que la table existe déjà)

"; - } -} - -echo "

Vérification finale des colonnes (Correction Erreur 500 courante)

"; -// Ajout de colonnes si manquantes (exemple pour channels) -try { - $pdo->exec("ALTER TABLE `channels` ADD COLUMN IF NOT EXISTS `message_limit` int(11) DEFAULT NULL;"); - $pdo->exec("ALTER TABLE `channels` ADD COLUMN IF NOT EXISTS `theme_color` varchar(20) DEFAULT NULL;"); - echo "

✅ Mise à jour des colonnes 'channels' terminée.

"; -} catch (Exception $e) { - echo "

ℹ️ Colonnes déjà présentes dans 'channels'.

"; -} - -// Ajout du SuperAdmin si absent -try { - $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?"); - $stmt->execute(['admin@corvara.com']); - if (!$stmt->fetch()) { - $hash = '$2y$10$wvwjJlj0mKf47YRzwsxom./X0w1BX9NDqVnL40D97QGe7oPjdiL5i'; - $pdo->prepare("INSERT INTO users (username, display_name, email, password_hash, is_admin) VALUES (?, ?, ?, ?, 1)") - ->execute(['admin', 'SuperAdmin', 'admin@corvara.com', $hash]); - echo "

✅ Compte SuperAdmin créé (admin@corvara.com / admin123).

"; - } -} catch (Exception $e) { - echo "

⚠️ Impossible de créer l'admin automatique : " . $e->getMessage() . "

"; -} - -echo "

Terminé ! Essayez de rafraîchir votre page index.php.

"; -echo "

IMPORTANT : Supprimez ce fichier (fix_db.php) après usage.

"; diff --git a/Temp/test_poll.php b/Temp/test_poll.php deleted file mode 100644 index 2d470eb..0000000 --- a/Temp/test_poll.php +++ /dev/null @@ -1,30 +0,0 @@ - 1, - 'content' => 'bha a vous de choisir !', - 'is_poll' => '1', - 'poll_title' => 'Test du sondage !', - 'poll_color' => '#f45571', - 'poll_choice_type' => 'single', - 'poll_end_date' => '20/02/2026 23:45', - 'poll_options' => '["Oui je le veux !","Non je ne le veux pas !","Je ne sais pas encore !"]' -]; - -function getallheaders() { return []; } - -// Mock session -if (session_status() === PHP_SESSION_NONE) { - session_start(); -} -$_SESSION['user_id'] = 2; - -// Include the file -ob_start(); -include 'api_v1_messages.php'; -$output = ob_get_clean(); - -echo $output; diff --git a/assets/js/rnnoise-processor.js b/assets/js/rnnoise-processor.js new file mode 100644 index 0000000..15c8ec0 --- /dev/null +++ b/assets/js/rnnoise-processor.js @@ -0,0 +1,115 @@ +// RNNoise Web Audio Worklet Processor +// Uses the RNNoise WASM binary to perform real-time noise suppression + +class RNNoiseProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.alive = true; + this.wasmInstance = null; + this.rnnoise = null; + this.initialized = false; + this.inputBuffer = new Float32Array(480); // RNNoise expects 480 samples (10ms at 48kHz) + this.outputBuffer = new Float32Array(480); + this.bufferPtr = 0; + this.heapInputPtr = null; + this.heapOutputPtr = null; + this.statePtr = null; + + this.vadThreshold = 0.85; // Default strict threshold + this.enabled = true; + + this.port.onmessage = (event) => { + if (event.data.type === 'INIT') { + this.initWasm(event.data.wasmBinary); + } else if (event.data.type === 'SET_ENABLED') { + this.enabled = event.data.enabled; + } else if (event.data.type === 'SET_THRESHOLD') { + this.vadThreshold = event.data.value; + } + }; + } + + async initWasm(wasmBinary) { + try { + const wasmModule = await WebAssembly.instantiate(wasmBinary, { + env: { + memory: new WebAssembly.Memory({ initial: 256, maximum: 256 }), + abort: () => { console.error("WASM Abort"); } + } + }); + this.wasmInstance = wasmModule.instance; + this.rnnoise = this.wasmInstance.exports; + + // Allocate memory on the WASM heap + // rnnoise_create returns a pointer to the state + this.statePtr = this.rnnoise.rnnoise_create(0); + + // Buffer size is 480 floats (4 bytes each) + this.heapInputPtr = this.rnnoise.malloc(480 * 4); + this.heapOutputPtr = this.rnnoise.malloc(480 * 4); + + this.initialized = true; + console.log("RNNoise Processor Initialized with WASM"); + } catch (e) { + console.error("Failed to initialize RNNoise WASM:", e); + } + } + + process(inputs, outputs, parameters) { + const input = inputs[0]; + const output = outputs[0]; + + if (!input || !input[0] || !this.initialized || !this.enabled) { + // Pas d'entrée ou pas initialisé, on bypass + if (input && input[0] && output && output[0]) { + output[0].set(input[0]); + } + return true; + } + + const inputChannel = input[0]; + const outputChannel = output[0]; + + // Fill our internal buffer until we have 480 samples + for (let i = 0; i < inputChannel.length; i++) { + this.inputBuffer[this.bufferPtr] = inputChannel[i] * 32768.0; // RNNoise expects 16-bit PCM range + this.bufferPtr++; + + if (this.bufferPtr >= 480) { + // Process 480 samples + this.processRNNoise(); + this.bufferPtr = 0; + } + + // Output from our buffer (with latency of 480 samples) + // We use a simple circular buffer approach here for the output too + outputChannel[i] = (this.outputBuffer[this.bufferPtr] / 32768.0); + } + + return true; + } + + processRNNoise() { + // Copy input to WASM heap + const heapInput = new Float32Array(this.rnnoise.memory.buffer, this.heapInputPtr, 480); + heapInput.set(this.inputBuffer); + + // Process audio: rnnoise_process_frame(state, output, input) + // Returns the probability of speech (0.0 to 1.0) + const vadProbability = this.rnnoise.rnnoise_process_frame(this.statePtr, this.heapOutputPtr, this.heapInputPtr); + + // Copy output from WASM heap + const heapOutput = new Float32Array(this.rnnoise.memory.buffer, this.heapOutputPtr, 480); + + // Aggressive Voice Gate based on RNNoise VAD + if (vadProbability < this.vadThreshold) { + // Not voice -> Mute completely + this.outputBuffer.fill(0); + } else { + // Voice detected -> Copy denoised output + this.outputBuffer.set(heapOutput); + } + } +} + +registerProcessor('rnnoise-processor', RNNoiseProcessor); \ No newline at end of file diff --git a/assets/js/rnnoise.wasm b/assets/js/rnnoise.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7de4dc383d2fa50398a97500a2442dfb6394b089 GIT binary patch literal 111910 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 rzF+vi_NU>7{D5B+8Fwu2f9>c` RTCPeerConnection this.participants = {}; // userId -> {name} @@ -38,78 +39,69 @@ class VoiceChannel { this.audioContext = null; this.analyser = null; this.microphone = null; + this.inputGainNode = null; this.scriptProcessor = null; - this.inputGain = null; + this.rnnoiseNode = null; + this.rnnoiseLoaded = false; + this.rnnoiseWasmBinary = null; this.isTalking = false; this.pttPressed = false; this.voxActive = false; this.lastVoiceTime = 0; - this.voxHoldTime = 400; // Slightly shorter hold time for better responsiveness + this.voxHoldTime = 400; - // Track who is speaking to persist across UI refreshes this.speakingUsers = new Set(); this.setupPTTListeners(); this.loadWhisperSettings(); - // Auto-rejoin if we were in a channel setTimeout(() => { const savedChannelId = sessionStorage.getItem('activeVoiceChannel'); const savedPeerId = sessionStorage.getItem('activeVoicePeerId'); if (savedChannelId) { console.log('Auto-rejoining voice channel:', savedChannelId); if (savedPeerId) this.myPeerId = savedPeerId; - this.join(savedChannelId, true); // Pass true to indicate auto-rejoin + this.join(savedChannelId, true); } }, 200); } - // Alias for index.php compatibility set whisperParamètres(val) { this.whisperSettings = val; } getAudioConstraints() { const useAdvanced = this.settings.advancedFilters !== false; - - const constraints = { - echoCancellation: { ideal: this.settings.echoCancellation }, - noiseSuppression: { ideal: this.settings.noiseSuppression }, - autoGainControl: { ideal: useAdvanced }, - // Chromium-specific flags - googEchoCancellation: { ideal: this.settings.echoCancellation }, - googAutoGainControl: { ideal: useAdvanced }, - googNoiseSuppression: { ideal: this.settings.noiseSuppression }, - googHighpassFilter: { ideal: useAdvanced }, - googTypingNoiseDetection: { ideal: true }, - googAudioMirroring: { ideal: false }, - googNoiseReduction: { ideal: this.settings.noiseSuppression }, - googAutoGainControl2: { ideal: useAdvanced }, - // Standard constraints - channelCount: { ideal: 1 }, - sampleRate: { ideal: 48000 }, - sampleSize: { ideal: 16 } + const ns = !!this.settings.noiseSuppression; + const ec = !!this.settings.echoCancellation; + + return { + echoCancellation: ec, + noiseSuppression: ns, + autoGainControl: useAdvanced, + googEchoCancellation: ec, + googAutoGainControl: useAdvanced, + googNoiseSuppression: ns, + googHighpassFilter: useAdvanced, + googTypingNoiseDetection: true, + googAudioMirroring: false, + googNoiseReduction: ns, + googAutoGainControl2: useAdvanced, + channelCount: 1, + sampleRate: 48000, + sampleSize: 16, + latency: 0.005 }; - - if (this.settings.inputDevice && this.settings.inputDevice !== 'default') { - constraints.deviceId = { ideal: this.settings.inputDevice }; - } - - return constraints; } setupPTTListeners() { window.addEventListener('keydown', (e) => { - // Ignore if in input field if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return; - - // Normal PTT if (this.settings.mode === 'ptt') { const isMatch = e.key.toLowerCase() === this.settings.pttKey.toLowerCase() || (e.code && e.code.toLowerCase() === this.settings.pttKey.toLowerCase()) || (this.settings.pttKey === '0' && e.code === 'Numpad0'); - if (isMatch) { if (!this.pttPressed) { this.pttPressed = true; @@ -118,29 +110,23 @@ class VoiceChannel { return; } } - - // Whispers this.whisperSettings.forEach(w => { if (e.key.toLowerCase() === w.whisper_key.toLowerCase()) { this.startWhisper(w); } }); }); - window.addEventListener('keyup', (e) => { if (this.settings.mode === 'ptt') { const isMatch = e.key.toLowerCase() === this.settings.pttKey.toLowerCase() || (e.code && e.code.toLowerCase() === this.settings.pttKey.toLowerCase()) || (this.settings.pttKey === '0' && e.code === 'Numpad0'); - if (isMatch) { this.pttPressed = false; this.updateMuteState(); return; } } - - // Whispers this.whisperSettings.forEach(w => { if (e.key.toLowerCase() === w.whisper_key.toLowerCase()) { this.stopWhisper(w); @@ -155,44 +141,32 @@ class VoiceChannel { const data = await resp.json(); if (data.success) { this.whisperSettings = data.whispers; - console.log('VoiceChannel: Loaded whispers:', this.whisperSettings); } } catch (e) { - console.error('Failed to load whispers in VoiceChannel:', e); + console.error('Failed to load whispers:', e); } } setupWhisperListeners() { - // This is called when settings are updated in the UI this.loadWhisperSettings(); } async startWhisper(config) { if (this.isWhispering) return; - console.log('Starting whisper to:', config.target_type, config.target_id); - try { const resp = await fetch(`api_v1_voice.php?action=find_whisper_targets&target_type=${config.target_type}&target_id=${config.target_id}`); const data = await resp.json(); - if (data.success && data.targets.length > 0) { this.isWhispering = true; this.whisperPeers.clear(); - for (const target of data.targets) { if (target.peer_id === this.myPeerId) continue; this.whisperPeers.add(target.peer_id); - - // Establish connection if not exists if (!this.peers[target.peer_id]) { - console.log('Establishing temporary connection for whisper to:', target.peer_id); this.createPeerConnection(target.peer_id, true); } } - this.updateMuteState(); - } else { - console.log('No active targets found for whisper.'); } } catch (e) { console.error('Whisper start error:', e); @@ -201,68 +175,45 @@ class VoiceChannel { stopWhisper(config) { if (!this.isWhispering) return; - console.log('Stopping whisper'); this.isWhispering = false; this.whisperPeers.clear(); this.updateMuteState(); } async join(channelId, isAutoRejoin = false) { - console.log('VoiceChannel.join process started for channel:', channelId, 'isAutoRejoin:', isAutoRejoin); - if (this.currentChannelId === channelId && !isAutoRejoin) { - console.log('Already in this channel'); - return; - } - if (this.currentChannelId && this.currentChannelId != channelId) { - console.log('Leaving previous channel:', this.currentChannelId); - this.leave(); - } + if (this.currentChannelId === channelId && !isAutoRejoin) return; + if (this.currentChannelId && this.currentChannelId != channelId) this.leave(); this.currentChannelId = channelId; sessionStorage.setItem('activeVoiceChannel', channelId); try { - console.log('Requesting microphone access with device:', this.settings.inputDevice); - const constraints = { - audio: this.getAudioConstraints(), - video: false - }; - + const constraints = { audio: this.getAudioConstraints(), video: false }; + console.log('Requesting mic with constraints:', constraints); try { this.localStream = await navigator.mediaDevices.getUserMedia(constraints); } catch (err) { - console.warn('Advanced constraints failed, falling back to basic audio:', err); + console.warn('GUM with constraints failed, falling back to basic audio', err); this.localStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false }); } - console.log('Microphone access granted'); - this.setMute(false); // Join unmuted by default (self-mute off) + this.setMute(false); + await this.setupVOX(); - // Always setup VOX logic for volume meter and detection - this.setupVOX(); - - // Join via PHP - console.log('Calling API join...'); const url = `api_v1_voice.php?action=join&room=${channelId}&name=${encodeURIComponent(window.currentUsername || 'Unknown')}${this.myPeerId ? '&peer_id='+this.myPeerId : ''}`; const resp = await fetch(url); const data = await resp.json(); - console.log('API join response:', data); if (data.success) { this.myPeerId = data.peer_id; this.canSpeak = data.can_speak !== false; sessionStorage.setItem('activeVoicePeerId', this.myPeerId); - console.log('Joined room with peer_id:', this.myPeerId); - - // Start polling this.startPolling(); this.updateVoiceUI(); - } else { - console.error('API join failed:', data.error); } } catch (e) { console.error('Failed to join voice:', e); - alert('Microphone access required for voice channels. Error: ' + e.message); + alert('Microphone access required. Error: ' + e.message); this.currentChannelId = null; } } @@ -270,57 +221,40 @@ class VoiceChannel { startPolling() { if (this.pollInterval) clearInterval(this.pollInterval); this.pollInterval = setInterval(() => this.poll(), 500); - this.poll(); // Initial poll + this.poll(); } async poll() { if (!this.myPeerId || !this.currentChannelId) return; - try { const resp = await fetch(`api_v1_voice.php?action=poll&room=${this.currentChannelId}&peer_id=${this.myPeerId}&is_muted=${this.isSelfMuted ? 1 : 0}&is_deafened=${this.isDeafened ? 1 : 0}`); const data = await resp.json(); - if (data.success) { this.canSpeak = data.can_speak !== false; - // Update participants const oldPs = Object.keys(this.participants); this.participants = data.participants; const newPs = Object.keys(this.participants); - - // If new people joined, initiate offer newPs.forEach(pid => { - if (pid !== this.myPeerId && !this.peers[pid]) { - console.log('New peer found via poll:', pid); - this.createPeerConnection(pid, true); - } + if (pid !== this.myPeerId && !this.peers[pid]) this.createPeerConnection(pid, true); }); - - // Cleanup left peers oldPs.forEach(pid => { if (!this.participants[pid] && this.peers[pid] && !this.whisperPeers.has(pid) && !this.speakingUsers.has(pid)) { - console.log('Peer left or not in channel anymore:', pid); this.peers[pid].close(); delete this.peers[pid]; if (this.remoteAudios[pid]) { this.remoteAudios[pid].pause(); + this.remoteAudios[pid].srcObject = null; this.remoteAudios[pid].remove(); delete this.remoteAudios[pid]; } } }); - - // Handle incoming signals if (data.signals && data.signals.length > 0) { - for (const sig of data.signals) { - await this.handleSignaling(sig); - } + for (const sig of data.signals) await this.handleSignaling(sig); } - this.updateVoiceUI(); } - } catch (e) { - console.error('Polling error:', e); - } + } catch (e) { console.error('Polling error:', e); } } async sendSignal(to, data) { @@ -330,12 +264,7 @@ class VoiceChannel { createPeerConnection(userId, isOfferor) { if (this.peers[userId]) return this.peers[userId]; - - console.log('Creating PeerConnection for:', userId, 'as offeror:', isOfferor); - - if (!this.peerStates[userId]) { - this.peerStates[userId] = { makingOffer: false, ignoreOffer: false }; - } + if (!this.peerStates[userId]) this.peerStates[userId] = { makingOffer: false, ignoreOffer: false }; const pc = new RTCPeerConnection({ iceServers: [ @@ -344,51 +273,34 @@ class VoiceChannel { { urls: 'stun:stun2.l.google.com:19302' } ] }); - this.peers[userId] = pc; - pc.oniceconnectionstatechange = () => { - console.log(`ICE Connection State with ${userId}: ${pc.iceConnectionState}`); - }; - pc.onnegotiationneeded = async () => { try { this.peerStates[userId].makingOffer = true; await pc.setLocalDescription(); this.sendSignal(userId, { type: 'offer', offer: pc.localDescription }); - } catch (err) { - console.error('onnegotiationneeded error:', err); - } finally { - this.peerStates[userId].makingOffer = false; - } + } catch (err) { console.error('onnegotiationneeded error:', err); } + finally { this.peerStates[userId].makingOffer = false; } }; - if (this.localStream) { - this.localStream.getTracks().forEach(track => { - pc.addTrack(track, this.localStream); - }); + const streamToUse = this.processedStream || this.localStream; + if (streamToUse) { + streamToUse.getTracks().forEach(track => pc.addTrack(track, streamToUse)); } pc.onicecandidate = (event) => { - if (event.candidate) { - this.sendSignal(userId, { type: 'ice_candidate', candidate: event.candidate }); - } + if (event.candidate) this.sendSignal(userId, { type: 'ice_candidate', candidate: event.candidate }); }; pc.ontrack = (event) => { - console.log('Received remote track from:', userId); const stream = event.streams[0] || new MediaStream([event.track]); - - if (this.audioContext && this.audioContext.state === 'suspended') { - this.audioContext.resume(); - } - + if (this.audioContext && this.audioContext.state === 'suspended') this.audioContext.resume(); if (this.remoteAudios[userId]) { this.remoteAudios[userId].pause(); this.remoteAudios[userId].srcObject = null; this.remoteAudios[userId].remove(); } - const remoteAudio = new Audio(); remoteAudio.autoplay = true; remoteAudio.style.display = 'none'; @@ -400,41 +312,24 @@ class VoiceChannel { } document.body.appendChild(remoteAudio); this.remoteAudios[userId] = remoteAudio; - - remoteAudio.play().catch(e => { - console.warn('Autoplay prevented for:', userId, e); - }); + remoteAudio.play().catch(e => console.warn('Autoplay prevented:', userId, e)); }; - if (isOfferor && pc.signalingState === 'stable') { - pc.onnegotiationneeded(); - } - + if (isOfferor && pc.signalingState === 'stable') pc.onnegotiationneeded(); return pc; } async handleSignaling(sig) { const from = sig.from; const data = sig.data; - try { switch (data.type) { - case 'offer': - await this.handleOffer(from, data.offer); - break; - case 'answer': - await this.handleAnswer(from, data.answer); - break; - case 'ice_candidate': - await this.handleCandidate(from, data.candidate); - break; - case 'voice_speaking': - this.updateSpeakingUI(data.user_id, data.speaking, data.is_whisper); - break; + case 'offer': await this.handleOffer(from, data.offer); break; + case 'answer': await this.handleAnswer(from, data.answer); break; + case 'ice_candidate': await this.handleCandidate(from, data.candidate); break; + case 'voice_speaking': this.updateSpeakingUI(data.user_id, data.speaking, data.is_whisper); break; } - } catch (err) { - console.error('Signaling error:', err); - } + } catch (err) { console.error('Signaling error:', err); } } async handleOffer(from, offer) { @@ -443,9 +338,7 @@ class VoiceChannel { const offerCollision = (offer.type === "offer") && (state.makingOffer || pc.signalingState !== "stable"); const isPolite = this.myPeerId > from; state.ignoreOffer = !isPolite && offerCollision; - if (state.ignoreOffer) return; - await pc.setRemoteDescription(new RTCSessionDescription(offer)); if (offer.type === "offer") { await pc.setLocalDescription(); @@ -455,54 +348,82 @@ class VoiceChannel { async handleAnswer(from, answer) { const pc = this.peers[from]; - if (pc) { - await pc.setRemoteDescription(new RTCSessionDescription(answer)); - } + if (pc) await pc.setRemoteDescription(new RTCSessionDescription(answer)); } async handleCandidate(from, candidate) { const pc = this.peers[from]; - try { - if (pc) { - await pc.addIceCandidate(new RTCIceCandidate(candidate)); - } - } catch (err) {} + try { if (pc) await pc.addIceCandidate(new RTCIceCandidate(candidate)); } catch (err) {} } - setupVOX() { + async setupVOX() { if (!this.localStream) return; - try { if (!this.audioContext) { - this.audioContext = new (window.AudioContext || window.webkitAudioContext)(); + this.audioContext = new (window.AudioContext || window.webkitAudioContext)({ + sampleRate: 48000, + latencyHint: 'interactive' + }); } - - if (this.audioContext.state === 'suspended') { - this.audioContext.resume(); + if (this.audioContext.state === 'suspended') await this.audioContext.resume(); + + if (this.settings.noiseSuppression && !this.rnnoiseLoaded) { + try { + console.log('Loading RNNoise module and WASM...'); + const version = Date.now(); + await this.audioContext.audioWorklet.addModule(`assets/js/rnnoise-processor.js?v=${version}`); + const resp = await fetch(`assets/js/rnnoise.wasm?v=${version}`); + this.rnnoiseWasmBinary = await resp.arrayBuffer(); + this.rnnoiseLoaded = true; + console.log('RNNoise loaded successfully'); + } catch (e) { console.error('Failed to load RNNoise:', e); } } - if (this.scriptProcessor) { - this.scriptProcessor.onaudioprocess = null; - try { this.scriptProcessor.disconnect(); } catch(e) {} - } - if (this.microphone) { - try { this.microphone.disconnect(); } catch(e) {} + // Cleanup old nodes + [this.scriptProcessor, this.rnnoiseNode, this.inputGainNode, this.microphone].forEach(node => { + if (node) { try { node.disconnect(); } catch(e) {} } + }); + + this.microphone = this.audioContext.createMediaStreamSource(this.localStream); + let lastNode = this.microphone; + + // 1. Noise Suppression (RNNoise) FIRST - so it processes non-amplified signal + if (this.rnnoiseLoaded && this.settings.noiseSuppression) { + console.log('Activating RNNoise suppression node (PRE-GAIN)'); + this.rnnoiseNode = new AudioWorkletNode(this.audioContext, 'rnnoise-processor'); + this.rnnoiseNode.port.postMessage({ type: 'INIT', wasmBinary: this.rnnoiseWasmBinary }); + this.rnnoiseNode.port.postMessage({ type: 'SET_ENABLED', enabled: true }); + lastNode.connect(this.rnnoiseNode); + lastNode = this.rnnoiseNode; } + // 2. Input Gain (Amplification) AFTER Noise Suppression + this.inputGainNode = this.audioContext.createGain(); + this.inputGainNode.gain.value = this.isSelfMuted ? 0 : (this.settings.inputVolume || 1.0); + lastNode.connect(this.inputGainNode); + lastNode = this.inputGainNode; + + // Destination for processed stream + const destination = this.audioContext.createMediaStreamDestination(); + lastNode.connect(destination); + this.processedStream = destination.stream; + + // Update peer tracks + Object.values(this.peers).forEach(pc => { + const sender = pc.getSenders().find(s => s.track && s.track.kind === 'audio'); + if (sender) { + console.log('Replacing track for peer to use processed (denoised) stream'); + sender.replaceTrack(this.processedStream.getAudioTracks()[0]); + } + }); + + // Analysis for VOX (on the FINAL processed signal) this.analyser = this.audioContext.createAnalyser(); - this.analyser.fftSize = 1024; // Better resolution - this.analyser.smoothingTimeConstant = 0.3; // Less jitter - - if (this.analysisStream) { - this.analysisStream.getTracks().forEach(t => t.stop()); - } - this.analysisStream = this.localStream.clone(); - this.analysisStream.getAudioTracks().forEach(t => t.enabled = true); - - this.microphone = this.audioContext.createMediaStreamSource(this.analysisStream); + this.analyser.fftSize = 1024; + this.analyser.smoothingTimeConstant = 0.3; this.scriptProcessor = this.audioContext.createScriptProcessor(2048, 1, 1); - this.microphone.connect(this.analyser); + lastNode.connect(this.analyser); this.analyser.connect(this.scriptProcessor); const silence = this.audioContext.createGain(); @@ -510,108 +431,75 @@ class VoiceChannel { this.scriptProcessor.connect(silence); silence.connect(this.audioContext.destination); - this.voxActive = false; - this.currentVolume = 0; - const buffer = new Float32Array(this.analyser.fftSize); - this.scriptProcessor.onaudioprocess = () => { - // Use Time Domain Data (Waveform) for better volume measurement (RMS) this.analyser.getFloatTimeDomainData(buffer); - let sum = 0; - for (let i = 0; i < buffer.length; i++) { - sum += buffer[i] * buffer[i]; - } + for (let i = 0; i < buffer.length; i++) sum += buffer[i] * buffer[i]; const rms = Math.sqrt(sum / buffer.length); - - // Scale RMS to 0-1. Speech peak is usually around 0.1-0.3 RMS. - // We'll normalize it so the slider at 0.1 feels natural. this.currentVolume = Math.min(1.0, rms * 3); - if (this.settings.mode !== 'vox') { - this.voxActive = false; - return; - } - + if (this.settings.mode !== 'vox') { this.voxActive = false; return; } if (this.currentVolume > this.settings.voxThreshold) { this.lastVoiceTime = Date.now(); - if (!this.voxActive) { - this.voxActive = true; - this.updateMuteState(); - } + if (!this.voxActive) { this.voxActive = true; this.updateMuteState(); } } else { if (this.voxActive && Date.now() - this.lastVoiceTime > this.voxHoldTime) { - this.voxActive = false; - this.updateMuteState(); + this.voxActive = false; this.updateMuteState(); } } }; - } catch (e) { - console.error('Failed to setup VOX:', e); - } + } catch (e) { console.error('Failed setupVOX:', e); } } - getVolume() { - return this.currentVolume || 0; - } + getVolume() { return this.currentVolume || 0; } updateMuteState() { if (!this.localStream) return; - let shouldTalk = (this.settings.mode === 'ptt') ? this.pttPressed : this.voxActive; if (this.canSpeak === false) shouldTalk = false; if (this.isWhispering) shouldTalk = true; - if (this.isTalking !== shouldTalk || this.lastWhisperState !== this.isWhispering) { - this.isTalking = shouldTalk; + // Transmission is only possible if NOT self-muted + const shouldTransmit = !this.isSelfMuted && shouldTalk; + + if (this.isTalking !== shouldTransmit || this.lastWhisperState !== this.isWhispering) { + this.isTalking = shouldTransmit; this.lastWhisperState = this.isWhispering; - this.applyAudioState(); - this.updateSpeakingUI(window.currentUserId, shouldTalk, this.isWhispering); - - const msg = { - type: 'voice_speaking', - channel_id: this.currentChannelId, - user_id: window.currentUserId, - speaking: shouldTalk, - is_whisper: this.isWhispering - }; - + + // Only update UI and send signals if we are actually transmitting + this.updateSpeakingUI(window.currentUserId, shouldTransmit, this.isWhispering); + const msg = { type: 'voice_speaking', channel_id: this.currentChannelId, user_id: window.currentUserId, speaking: shouldTransmit, is_whisper: this.isWhispering }; Object.keys(this.peers).forEach(pid => { if (this.isWhispering) { - if (this.whisperPeers.has(pid)) { - this.sendSignal(pid, msg); - } else { - this.sendSignal(pid, { ...msg, speaking: false }); - } - } else { - this.sendSignal(pid, msg); - } + if (this.whisperPeers.has(pid)) this.sendSignal(pid, msg); + else this.sendSignal(pid, { ...msg, speaking: false }); + } else this.sendSignal(pid, msg); }); - - if (this.isWhispering) { - this.whisperPeers.forEach(pid => { - if (this.peers[pid]) this.sendSignal(pid, msg); - }); - } } } applyAudioState() { - if (this.localStream) { - const shouldTransmit = !this.isSelfMuted && this.isTalking && (this.canSpeak || this.isWhispering); - this.localStream.getAudioTracks().forEach(track => { - track.enabled = shouldTransmit; - }); - + const streamToUse = this.processedStream || this.localStream; + const shouldTransmit = !this.isSelfMuted && this.isTalking && (this.canSpeak || this.isWhispering); + + // Safety: ensure gain is 0 if muted to prevent any signal from reaching the analyzer or destination + if (this.inputGainNode && this.audioContext) { + const targetGain = this.isSelfMuted ? 0 : (this.settings.inputVolume || 1.0); + this.inputGainNode.gain.setTargetAtTime(targetGain, this.audioContext.currentTime, 0.01); + } + + if (streamToUse) { + streamToUse.getAudioTracks().forEach(track => { track.enabled = shouldTransmit; }); Object.entries(this.peers).forEach(([pid, pc]) => { const sender = pc.getSenders().find(s => s.track && s.track.kind === 'audio'); if (sender) { if (this.isWhispering) { - sender.track.enabled = this.whisperPeers.has(pid); + sender.track.enabled = shouldTransmit && this.whisperPeers.has(pid); } else { - sender.track.enabled = !!this.participants[pid]; + // FIX: Ensure track is only enabled if shouldTransmit is true + sender.track.enabled = shouldTransmit && !!this.participants[pid]; } } }); @@ -619,37 +507,33 @@ class VoiceChannel { this.updateUserPanelButtons(); } - setMute(mute) { - this.isSelfMuted = mute; - this.applyAudioState(); + setMute(mute) { + this.isSelfMuted = mute; + this.updateMuteState(); + this.applyAudioState(); // Always update UI even if not "talking" } - - toggleMute() { - if (this.canSpeak === false) return; - this.setMute(!this.isSelfMuted); - } - + toggleMute() { if (this.canSpeak !== false) this.setMute(!this.isSelfMuted); } toggleDeafen() { this.isDeafened = !this.isDeafened; Object.values(this.remoteAudios).forEach(audio => { audio.muted = this.isDeafened; if (!this.isDeafened) audio.volume = this.settings.outputVolume || 1.0; }); - if (this.isDeafened && !this.isSelfMuted) { - this.setMute(true); + if (this.isDeafened && !this.isSelfMuted) this.setMute(true); + else { + this.applyAudioState(); } - this.applyAudioState(); } setOutputVolume(vol) { this.settings.outputVolume = parseFloat(vol); - Object.values(this.remoteAudios).forEach(audio => { - audio.volume = this.settings.outputVolume; - }); + Object.values(this.remoteAudios).forEach(audio => { audio.volume = this.settings.outputVolume; }); } - - setInputVolume(vol) { - this.settings.inputVolume = parseFloat(vol); + setInputVolume(vol) { + this.settings.inputVolume = parseFloat(vol); + if (this.inputGainNode && this.audioContext && !this.isSelfMuted) { + this.inputGainNode.gain.setTargetAtTime(this.settings.inputVolume, this.audioContext.currentTime, 0.01); + } } async setInputDevice(deviceId) { @@ -657,16 +541,9 @@ class VoiceChannel { if (this.currentChannelId && this.localStream) { const constraints = { audio: this.getAudioConstraints(), video: false }; const newStream = await navigator.mediaDevices.getUserMedia(constraints); - const newTrack = newStream.getAudioTracks()[0]; - - Object.values(this.peers).forEach(pc => { - const sender = pc.getSenders().find(s => s.track && s.track.kind === 'audio'); - if (sender) sender.replaceTrack(newTrack); - }); - this.localStream.getTracks().forEach(t => t.stop()); this.localStream = newStream; - this.setupVOX(); + await this.setupVOX(); this.applyAudioState(); } } @@ -674,9 +551,7 @@ class VoiceChannel { async setOutputDevice(deviceId) { this.settings.outputDevice = deviceId; Object.values(this.remoteAudios).forEach(audio => { - if (typeof audio.setSinkId === 'function') { - audio.setSinkId(deviceId).catch(e => console.error('setSinkId failed:', e)); - } + if (typeof audio.setSinkId === 'function') audio.setSinkId(deviceId).catch(e => console.error(e)); }); } @@ -684,31 +559,20 @@ class VoiceChannel { if (this.currentChannelId && this.localStream) { const constraints = { audio: this.getAudioConstraints(), video: false }; try { + console.log('Updating audio constraints:', constraints); const newStream = await navigator.mediaDevices.getUserMedia(constraints); - const newTrack = newStream.getAudioTracks()[0]; - - Object.values(this.peers).forEach(pc => { - const sender = pc.getSenders().find(s => s.track && s.track.kind === 'audio'); - if (sender) sender.replaceTrack(newTrack); - }); - this.localStream.getTracks().forEach(t => t.stop()); this.localStream = newStream; - this.setupVOX(); + await this.setupVOX(); this.applyAudioState(); - } catch (e) { - console.error('Failed to update audio constraints:', e); - } + } catch (e) { console.error(e); } } } updateUserPanelButtons() { const btnMute = document.getElementById('btn-panel-mute'); const btnDeafen = document.getElementById('btn-panel-deafen'); - - let displayMuted = this.isSelfMuted; - if (this.canSpeak === false) displayMuted = true; - + let displayMuted = this.isSelfMuted || this.canSpeak === false; if (btnMute) { btnMute.classList.toggle('active', displayMuted); btnMute.style.color = displayMuted ? '#f23f43' : 'var(--text-muted)'; @@ -716,7 +580,6 @@ class VoiceChannel { '' : ''; } - if (btnDeafen) { btnDeafen.classList.toggle('active', this.isDeafened); btnDeafen.style.color = this.isDeafened ? '#f23f43' : 'var(--text-muted)'; @@ -730,47 +593,20 @@ class VoiceChannel { if (!this.currentChannelId) return; const cid = this.currentChannelId; const pid = this.myPeerId; - sessionStorage.removeItem('activeVoiceChannel'); sessionStorage.removeItem('activeVoicePeerId'); if (this.pollInterval) clearInterval(this.pollInterval); - fetch(`api_v1_voice.php?action=leave&room=${cid}&peer_id=${pid}`, { keepalive: true }); - - if (this.localStream) { - this.localStream.getTracks().forEach(track => track.stop()); - this.localStream = null; - } - if (this.analysisStream) { - this.analysisStream.getTracks().forEach(track => track.stop()); - this.analysisStream = null; - } - - if (this.scriptProcessor) { - try { - this.scriptProcessor.disconnect(); - this.scriptProcessor.onaudioprocess = null; - } catch(e) {} - this.scriptProcessor = null; - } - if (this.microphone) { - try { this.microphone.disconnect(); } catch(e) {} - this.microphone = null; - } - + if (this.localStream) this.localStream.getTracks().forEach(track => track.stop()); + if (this.processedStream) this.processedStream.getTracks().forEach(track => track.stop()); + if (this.analysisStream) this.analysisStream.getTracks().forEach(track => track.stop()); + if (this.scriptProcessor) { try { this.scriptProcessor.disconnect(); this.scriptProcessor.onaudioprocess = null; } catch(e) {} } + if (this.rnnoiseNode) { try { this.rnnoiseNode.disconnect(); } catch(e) {} } + if (this.inputGainNode) { try { this.inputGainNode.disconnect(); } catch(e) {} } + if (this.microphone) { try { this.microphone.disconnect(); } catch(e) {} } Object.values(this.peers).forEach(pc => pc.close()); - Object.values(this.remoteAudios).forEach(audio => { - audio.pause(); - audio.remove(); - audio.srcObject = null; - }); - this.peers = {}; - this.remoteAudios = {}; - this.participants = {}; - this.currentChannelId = null; - this.myPeerId = null; - this.speakingUsers.clear(); - + Object.values(this.remoteAudios).forEach(audio => { audio.pause(); audio.remove(); audio.srcObject = null; }); + this.peers = {}; this.remoteAudios = {}; this.participants = {}; this.currentChannelId = null; this.myPeerId = null; this.speakingUsers.clear(); document.querySelectorAll('.voice-item').forEach(el => el.classList.remove('active')); this.updateVoiceUI(); } @@ -791,8 +627,7 @@ class VoiceChannel { - - `; + `; const sidebar = document.querySelector('.channels-sidebar'); if (sidebar) sidebar.appendChild(controls); const btnLeave = document.getElementById('btn-voice-leave'); @@ -806,22 +641,11 @@ class VoiceChannel { updateSpeakingUI(userId, isSpeaking, isWhisper = false) { userId = String(userId); - if (isSpeaking) { - this.speakingUsers.add(userId); - } else { - this.speakingUsers.delete(userId); - } - + if (isSpeaking) this.speakingUsers.add(userId); else this.speakingUsers.delete(userId); const userEls = document.querySelectorAll(`.voice-user[data-user-id="${userId}"]`); userEls.forEach(el => { const avatar = el.querySelector('.message-avatar'); - if (avatar) { - if (isSpeaking) { - avatar.style.boxShadow = isWhisper ? '0 0 0 2px #00a8fc' : '0 0 0 2px #23a559'; - } else { - avatar.style.boxShadow = 'none'; - } - } + if (avatar) avatar.style.boxShadow = isSpeaking ? (isWhisper ? '0 0 0 2px #00a8fc' : '0 0 0 2px #23a559') : 'none'; if (isWhisper && isSpeaking && userId !== String(window.currentUserId)) { if (!el.querySelector('.whisper-label')) { const label = document.createElement('span'); @@ -830,10 +654,7 @@ class VoiceChannel { label.innerText = 'WHISPER'; el.querySelector('span.text-truncate').after(label); } - } else { - const label = el.querySelector('.whisper-label'); - if (label) label.remove(); - } + } else { const label = el.querySelector('.whisper-label'); if (label) label.remove(); } }); } @@ -844,13 +665,10 @@ class VoiceChannel { if (data.success) { document.querySelectorAll('.voice-users-list').forEach(el => el.innerHTML = ''); document.querySelectorAll('.voice-item').forEach(el => el.classList.remove('connected')); - Object.keys(data.channels).forEach(channelId => { const voiceItem = document.querySelector(`.voice-item[data-channel-id="${channelId}"]`); if (voiceItem) { - if (window.voiceHandler && window.voiceHandler.currentChannelId == channelId) { - voiceItem.classList.add('connected'); - } + if (window.voiceHandler && window.voiceHandler.currentChannelId == channelId) voiceItem.classList.add('connected'); const container = voiceItem.closest('.channel-item-container'); if (container) { const listEl = container.querySelector('.voice-users-list'); @@ -865,9 +683,7 @@ class VoiceChannel { } }); } - } catch (e) { - console.error('Failed to refresh voice users:', e); - } + } catch (e) { console.error('Failed refresh voice users:', e); } } static renderUserToUI(container, userId, username, avatarUrl, isSpeaking = false, isMuted = false, isDeafened = false) { @@ -877,16 +693,13 @@ class VoiceChannel { userEl.style.paddingLeft = '8px'; const avatarStyle = avatarUrl ? `background-image: url('${avatarUrl}'); background-size: cover;` : "background-color: #555;"; const boxShadow = isSpeaking ? 'box-shadow: 0 0 0 2px #23a559;' : ''; - let icons = ''; if (isDeafened) icons += ''; else if (isMuted) icons += ''; - userEl.innerHTML = `
${username} - ${icons} - `; + ${icons}`; container.appendChild(userEl); } } \ No newline at end of file diff --git a/index.php b/index.php index a40ec2e..2cd0164 100644 --- a/index.php +++ b/index.php @@ -1880,8 +1880,9 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
- - + + +
0%100%400%