N
G
System Integration & Bot

Gianagni Audio Bot.

Node.js Discord.js v14 FFmpeg Media Stream End-to-End Encryption

The Challenge

Membuat bot musik Discord awalnya sederhana, hingga pembaruan keamanan terbaru Discord menerapkan DAVE Protocol (End-to-End Encryption) secara paksa pada Voice Channel. Update ini membuat 90% bot audio open-source terblokir dan menjadi "bisu".

Tantangannya adalah merekayasa ulang lapisan jaringan bot agar dapat menegosiasikan kunci enkripsi baru dengan server Discord, sekaligus mengkonversi stream radio Zeno FM (MP3) secara real-time menjadi format Opus yang aman.

Technical Solution

Saya merombak arsitektur backend bot menggunakan Node.js dan ekosistem library @discordjs/voice terbaru.

  • DAVE Protocol Bypass: Menginjeksi library @snazzah/davey untuk melewati pemblokiran Voice Server.
  • Audio Transcoding: Menggunakan ffmpeg-static untuk konversi data media on-the-fly.
  • Memory Optimization: Mem-bypass caching metadata audio untuk mencegah kebocoran memori pada server saat bot berjalan 24/7.

Security Bypass Architecture

Untuk menembus pemblokiran audio dari server Discord, bot harus melakukan handshake kriptografi yang valid sebelum diizinkan mengirim paket suara melalui protokol UDP.

Komponen Keamanan (Dependencies):
1. @snazzah/davey: Menginisiasi dan menjaga sesi DAVE Protocol.
2. tweetnacl: Library kriptografi untuk memvalidasi signature kunci rahasia secara lokal.
3. libsodium-wrappers: Melakukan enkripsi End-to-End (E2EE) pada setiap pecahan paket audio sebelum dikirim.

DAVE Protocol Flow:

Bot Request Join Voice Channel
Discord Server: "Require E2EE Key!"
snazzah/davey generates Session Key
tweetnacl signs the packet
Discord Server: "Handshake Accepted"
FFmpeg opens OPUS Stream Pipeline.
index.js (Backend Logic: Audio Resource Injection)

Berikut adalah core logic untuk pemutaran stream radio. Penggunaan StreamType.Arbitrary sangat krusial agar sistem FFmpeg tidak mencoba mengunduh seluruh stasiun radio (infinite loop), melainkan langsung meneruskan paket datanya secara mentah.

const connection = joinVoiceChannel({
    channelId: voiceChannel.id,
    guildId: interaction.guild.id,
    adapterCreator: interaction.guild.voiceAdapterCreator,
});

const player = createAudioPlayer();

// StreamType.Arbitrary: Memaksa FFmpeg membaca stream radio internet (Zeno FM)
// tanpa mendownload metadata-nya terlebih dahulu (Mencegah RAM overload).
const resource = createAudioResource('http://stream.zeno.fm/f3wvbbqmdg8uv', {
    inputType: StreamType.Arbitrary,
});

player.play(resource);
connection.subscribe(player);

// Event Listener Debugging State
player.on(AudioPlayerStatus.Playing, () => {
    console.log('▶️ Stream DAVE Protocol Active: Musik diputar di Discord!');
});