Exemple : Bot de musique vocal
Un bot qui rejoint le salon vocal de l'auteur du message, diffuse une piste audio, et propose !pause/!resume/!stop/!leave.
FFmpeg requis
Installez FFmpeg sur la machine qui exécute le bot — voir Salons vocaux pour les détails et l'alternative ffmpeg-static.
ts
import { BloumeChat, VoiceConnection } from "bloumechat";
const client = new BloumeChat();
client.on("messageCreate", async (message) => {
if (message.author.bot) return;
const [command, ...args] = message.content.trim().split(/\s+/);
if (command === "!play") {
const url = args[0];
if (!url) return message.reply("Usage : `!play <url>`");
let connection: VoiceConnection | null = client.voice.connection;
if (!connection) {
// Rejoint le salon vocal où se trouve l'auteur du message (4.1.0+) —
// voir /guide/voice#savoir-dans-quel-salon-vocal-se-trouve-un-membre.
const authorVoice = client.voiceStates.cache.get(message.author.id);
const voiceChannel = authorVoice && client.channels.cache.get(authorVoice.channelId);
if (!voiceChannel) return message.reply("Rejoignez d'abord un salon vocal.");
connection = await voiceChannel.join();
}
try {
connection.play(url);
await message.reply(`🔊 Lecture : ${url}`);
} catch (err) {
await message.reply(`Erreur : ${(err as Error).message}`);
}
return;
}
const connection = client.voice.connection;
if (!connection) return;
if (command === "!pause") {
connection.pause();
await message.reply("⏸️ En pause.");
} else if (command === "!resume") {
connection.resume();
await message.reply("▶️ Reprise.");
} else if (command === "!stop") {
connection.stopPlaying();
await message.reply("⏹️ Arrêté.");
} else if (command === "!leave") {
connection.destroy();
await message.reply("👋 Salon vocal quitté.");
}
});
client.on("error", (error) => console.error("Erreur de connexion :", error.message));
client.login(process.env.BOT_TOKEN!);js
const { BloumeChat } = require("bloumechat");
const client = new BloumeChat();
client.on("messageCreate", async (message) => {
if (message.author.bot) return;
const parts = message.content.trim().split(/\s+/);
const command = parts[0];
const args = parts.slice(1);
if (command === "!play") {
const url = args[0];
if (!url) return message.reply("Usage : `!play <url>`");
let connection = client.voice.connection;
if (!connection) {
// Rejoint le salon vocal où se trouve l'auteur du message (4.1.0+) —
// voir /guide/voice#savoir-dans-quel-salon-vocal-se-trouve-un-membre.
const authorVoice = client.voiceStates.cache.get(message.author.id);
const voiceChannel = authorVoice && client.channels.cache.get(authorVoice.channelId);
if (!voiceChannel) return message.reply("Rejoignez d'abord un salon vocal.");
connection = await voiceChannel.join();
}
try {
connection.play(url);
await message.reply(`🔊 Lecture : ${url}`);
} catch (err) {
await message.reply(`Erreur : ${err.message}`);
}
return;
}
const connection = client.voice.connection;
if (!connection) return;
if (command === "!pause") {
connection.pause();
await message.reply("⏸️ En pause.");
} else if (command === "!resume") {
connection.resume();
await message.reply("▶️ Reprise.");
} else if (command === "!stop") {
connection.stopPlaying();
await message.reply("⏹️ Arrêté.");
} else if (command === "!leave") {
connection.destroy();
await message.reply("👋 Salon vocal quitté.");
}
});
client.on("error", (error) => console.error("Erreur de connexion :", error.message));
client.login(process.env.BOT_TOKEN);Pourquoi réutiliser client.voice.connection s'il existe déjà
client.voice ne garde jamais qu'une seule connexion active à la fois. Réutiliser la connexion existante évite de la recréer (et l'interruption audio que ça provoquerait) quand !play est appelé une deuxième fois pendant que le bot est déjà connecté — peu importe le salon depuis lequel part cette deuxième commande.
Voir aussi
- Guide — Salons vocaux — architecture SFU LiveKit,
client.voiceStates, toutes les options deplay(). - Référence API — Voix —
VoiceConnection,VoiceManager, événements. - Bot de modération — un autre exemple de bot à commandes.
