Skip to content

Exemple : bot ping-pong ​

Le bot le plus simple possible — répond à !ping, affiche une activité, et illustre l'usage des embeds. Bon point de départ pour valider que votre token fonctionne et que la connexion s'établit correctement avant d'ajouter de la logique métier.

Bot complet ​

ts
import { BloumeChat, EmbedBuilder } from "bloumechat";

const client = new BloumeChat();

client.on("ready", async () => {
  console.log(`✅ ${client.user?.tagString} est en ligne`);
  await client.setActivity({ type: "playing", name: "!ping" });
});

client.on("messageCreate", async (message) => {
  if (message.author.bot) return;

  if (message.content === "!ping") {
    const start = Date.now();
    const sent = await message.reply("🏓 Pong !");
    const latency = Date.now() - start;

    await sent.edit(
      new EmbedBuilder()
        .setDescription(`🏓 Pong ! (${latency}ms)`)
        .setColor("#5e72e4")
    );
  }
});

client.on("error", (err) => console.error("[BloumeChat SDK]", err));

client.login(process.env.BOT_TOKEN!);
js
const { BloumeChat, EmbedBuilder } = require("bloumechat");

const client = new BloumeChat();

client.on("ready", async () => {
  console.log(`✅ ${client.user?.tagString} est en ligne`);
  await client.setActivity({ type: "playing", name: "!ping" });
});

client.on("messageCreate", async (message) => {
  if (message.author.bot) return;

  if (message.content === "!ping") {
    const start = Date.now();
    const sent = await message.reply("🏓 Pong !");
    const latency = Date.now() - start;

    await sent.edit(
      new EmbedBuilder()
        .setDescription(`🏓 Pong ! (${latency}ms)`)
        .setColor("#5e72e4")
    );
  }
});

client.on("error", (err) => console.error("[BloumeChat SDK]", err));

client.login(process.env.BOT_TOKEN);

Ce que fait ce bot, étape par étape ​

  1. client.on("ready", ...) se déclenche une fois le socket connecté, client.user peuplé et tous les serveurs préchargés dans client.guilds.cache — voir événement ready.
  2. client.setActivity(...) affiche "En train de jouer à !ping" sur le profil du bot, visible par tous les membres — détails complets dans Rich Presence (RPC).
  3. client.on("messageCreate", ...) reçoit chaque nouveau message. Le garde-fou if (message.author.bot) return; est essentiel (voir l'encadré ci-dessous).
  4. message.reply(...) envoie une réponse liée au message d'origine (replyToId défini automatiquement) et retourne l'objet Message créé — voir Message.reply().
  5. sent.edit(new EmbedBuilder()...) remplace ensuite le contenu texte par un embed, une fois la latence mesurée — illustre que edit() accepte directement un EmbedBuilder, sans appeler .toJSON() manuellement.

Pourquoi vérifier message.author.bot ?

Sans ce garde-fou, deux bots qui se répondent l'un à l'autre peuvent créer une boucle infinie de messages. Toujours ignorer les messages provenant d'un bot (y compris soi-même) sauf besoin explicite du contraire.

Variante : mesurer aussi la latence de l'API REST ​

Date.now() - start ci-dessus ne mesure que le round-trip du socket (envoi + accusé de réception). Pour afficher également la latence des appels REST (apiCall), utilisez client.apiCall sur un endpoint léger :

ts
client.on("messageCreate", async (message) => {
  if (message.author.bot || message.content !== "!ping") return;

  const socketStart = Date.now();
  const sent = await message.reply("🏓 Calcul en cours…");
  const socketLatency = Date.now() - socketStart;

  const apiStart = Date.now();
  await client.apiCall("/auth/me");
  const apiLatency = Date.now() - apiStart;

  await sent.edit(`🏓 Pong ! Socket: ${socketLatency}ms · API: ${apiLatency}ms`);
});
js
client.on("messageCreate", async (message) => {
  if (message.author.bot || message.content !== "!ping") return;

  const socketStart = Date.now();
  const sent = await message.reply("🏓 Calcul en cours…");
  const socketLatency = Date.now() - socketStart;

  const apiStart = Date.now();
  await client.apiCall("/auth/me");
  const apiLatency = Date.now() - apiStart;

  await sent.edit(`🏓 Pong ! Socket: ${socketLatency}ms · API: ${apiLatency}ms`);
});

Variante : répondre uniquement en mention ​

Si vous préférez déclencher le bot par mention plutôt que par préfixe !, comparez message.content à la mention du bot (client.user.toString()) :

ts
client.on("messageCreate", async (message) => {
  if (message.author.bot || !client.user) return;
  if (message.content.trim() === client.user.toString()) {
    await message.reply("🏓 Pong ! (mentionne-moi à nouveau pour recommencer)");
  }
});
js
client.on("messageCreate", async (message) => {
  if (message.author.bot || !client.user) return;
  if (message.content.trim() === client.user.toString()) {
    await message.reply("🏓 Pong ! (mentionne-moi à nouveau pour recommencer)");
  }
});

Voir aussi ​

SDK publié sous licence ISC.