Skip to content

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 ​

SDK publié sous licence ISC.