MaShowMagic
Blog

Streaming audio with Lavalink

ตอนแรกที่สร้าง MaShowBot ผมใช้ @discordjs/voice จัดการเสียงตรงๆ เลย — มันทำงานได้นะครับ แต่พอมีคนใช้พร้อมกันหลายห้อง CPU พุ่งทันที เสียงกระตุก บางทีหลุดกลางคัน นั่นคือจุดที่ผมตัดสินใจเปลี่ยนมาใช้ Lavalink

Lavalink คืออะไร

Lavalink คือ audio node แยกต่างหากที่สร้างบน Lavaplayer ซึ่งเป็น Java library สำหรับโหลดและ stream เสียง บอทของเราเชื่อมต่อกับมันผ่าน WebSocket แล้วส่ง track request ไป Lavalink จัดการ decode, buffer, และส่งเสียงไปยัง Discord voice server เอง

ผลลัพธ์คือบอทที่เบาขึ้นมากไม่ว่าจะมีกี่ห้องเล่นพร้อมกัน เพราะงานหนักทั้งหมดย้ายออกจาก Node.js process ไปแล้ว

ติดตั้งยังไง

ต้องการสองอย่าง คือ Lavalink server ที่รันอยู่ และ Node.js client library ผมใช้ Shoukaku เพราะจัดการ reconnection, node balancing และ WebSocket lifecycle ได้ดีมาก

import { Shoukaku, Connectors } from 'shoukaku';

const nodes = [{
  name: 'main',
  url: 'localhost:2333',
  auth: 'youshallnotpass',
}];

const shoukaku = new Shoukaku(new Connectors.DiscordJS(client), nodes);

จากนั้นการเข้าห้องเสียงและเล่นเพลงแค่ไม่กี่บรรทัด:

const player = await shoukaku.joinVoiceChannel({
  guildId: guild.id,
  channelId: voiceChannel.id,
  shardId: 0,
});

const result = await shoukaku.searchTracks('ytsearch:Midnight City');
await player.playTrack({ track: result.tracks[0] });

สิ่งที่เรียนรู้

ถ้า queue logic อยู่ใน skip command เดี๋ยวก็เจอ race condition — ให้ player เป็นคนบอกว่าพร้อมสำหรับเพลงถัดไปดีกว่า

การเปลี่ยนมาใช้ Lavalink คือการปรับปรุงด้าน stability ที่ดีที่สุดที่เคยทำให้ MaShowBot มาก ถ้ากำลังสร้างบอทเพลงและติดปัญหาเรื่อง performance มันคุ้มค่ากับเวลาที่ใช้ setup ครับ แวะมาคุยกันได้ที่ Discord