Skip to content

Exemple : Rich Presence (RPC) ​

Affiche une activité dynamique sur le profil du bot, visible par tous les membres (ex : "en train de jouer à...").

ts
import { BloumeChat } from "bloumechat";

const client = new BloumeChat();

client.on("ready", async () => {
  await client.setActivity({
    type: "listening",
    name: "les commandes des membres",
  });
});

// Activité dynamique : nombre de serveurs, mise à jour toutes les 60s
setInterval(async () => {
  await client.setActivity({
    type: "using",
    name: `${client.guilds.cache.size} serveurs`,
    details: "BloumeChat SDK",
  });
}, 60_000);

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

const client = new BloumeChat();

client.on("ready", async () => {
  await client.setActivity({
    type: "listening",
    name: "les commandes des membres",
  });
});

// Activité dynamique : nombre de serveurs, mise à jour toutes les 60s
setInterval(async () => {
  await client.setActivity({
    type: "using",
    name: `${client.guilds.cache.size} serveurs`,
    details: "BloumeChat SDK",
  });
}, 60_000);

client.login(process.env.BOT_TOKEN);

ActivityData — forme complète ​

ts
interface ActivityData {
  type: "using" | "browsing" | "listening" | "playing";
  name: string;
  details?: string;
  startedAt?: number;
}
ChampTypeRequisDescription
type"using" | "browsing" | "listening" | "playing"OuiDétermine le verbe affiché (voir table ci-dessous).
namestringOuiNom de l'activité. Tronqué à 128 caractères côté client avant envoi (name.substring(0, 128)).
detailsstringNonTexte secondaire, affiché sous le nom principal. Tronqué à 64 caractères.
startedAtnumberNonTimestamp Unix (ms) du début de l'activité, utilisé pour afficher une durée écoulée. Par défaut Date.now() si omis.

Types d'activité disponibles ​

TypeAffiché comme
playing"En train de jouer à…"
listening"Écoute…"
browsing"Navigue sur…"
using"Utilise…"

client.setActivity(activity): Promise<void> ​

Émet activity:update sur le socket. Lève une BloumeChatAuthError si le socket n'est pas établi — appelez-la après ready ou dans un setInterval démarré depuis le handler ready, jamais avant login().

ts
await client.setActivity({ type: "playing", name: "Aventure BloumeChat" });
js
await client.setActivity({ type: "playing", name: "Aventure BloumeChat" });

Avec details et startedAt personnalisés ​

ts
const sessionStart = Date.now();
await client.setActivity({
  type: "playing",
  name: "Partie classée",
  details: "Manche 3 sur 5",
  startedAt: sessionStart,
});
js
const sessionStart = Date.now();
await client.setActivity({
  type: "playing",
  name: "Partie classée",
  details: "Manche 3 sur 5",
  startedAt: sessionStart,
});

Effacer l'activité ​

ts
await client.setActivity(null);
js
await client.setActivity(null);

Passer null émet { type: "none", name: "" } sur le socket — l'activité disparaît du profil du bot mais le statut (online/idle/…) n'est pas affecté.

client.setStatus(status): Promise<void> ​

Change uniquement le statut de présence, indépendamment de l'activité. Accepte "online" | "idle" | "dnd" | "invisible". Émet presence:update sur le socket et persiste le changement via un appel REST (PATCH /users/settings) pour qu'il survive à une reconnexion.

ts
await client.setStatus("dnd"); // "Ne pas déranger" pendant une maintenance
js
await client.setStatus("dnd"); // "Ne pas déranger" pendant une maintenance

Combiner statut + activité en un seul appel ​

setPresence() est un raccourci qui appelle séquentiellement setStatus() (si fourni) puis setActivity() (si fourni) :

ts
await client.setPresence({
  status: "dnd",
  activity: { type: "playing", name: "en maintenance" },
});
js
await client.setPresence({
  status: "dnd",
  activity: { type: "playing", name: "en maintenance" },
});

activity: null efface explicitement, activity omis ne touche à rien

setPresence({ status: "idle" }) sans activity laisse l'activité actuelle inchangée. setPresence({ status: "idle", activity: null }) efface l'activité en plus de changer le statut — la distinction se fait au niveau de data.activity !== undefined dans le SDK.

Écouter l'activité des autres utilisateurs ​

L'event activityUpdate est reçu pour tout utilisateur visible par le bot (pas seulement lui-même) qui change son activité — utile pour construire un tableau de bord ou une commande !activite @user.

ts
client.on("activityUpdate", ({ userPublicId, activity }) => {
  if (!activity) return console.log(`${userPublicId} n'a plus d'activité`);
  console.log(`${userPublicId} : ${activity.type} → ${activity.name}`);
});
js
client.on("activityUpdate", ({ userPublicId, activity }) => {
  if (!activity) return console.log(`${userPublicId} n'a plus d'activité`);
  console.log(`${userPublicId} : ${activity.type} → ${activity.name}`);
});

Exemple : commande !activite @user ​

ts
const lastActivity = new Map<string, { type: string; name: string } | null>();

client.on("activityUpdate", ({ userPublicId, activity }) => {
  lastActivity.set(userPublicId, activity);
});

client.on("messageCreate", async (message) => {
  if (!message.content.startsWith("!activite ")) return;
  const targetId = message.content.split(" ")[1]?.replace(/[<@>]/g, "");
  const activity = targetId ? lastActivity.get(targetId) : undefined;

  if (!activity) return message.reply("Aucune activité connue pour cet utilisateur.");
  await message.reply(`${activity.type} : ${activity.name}`);
});
js
const lastActivity = new Map();

client.on("activityUpdate", ({ userPublicId, activity }) => {
  lastActivity.set(userPublicId, activity);
});

client.on("messageCreate", async (message) => {
  if (!message.content.startsWith("!activite ")) return;
  const targetId = message.content.split(" ")[1] && message.content.split(" ")[1].replace(/[<@>]/g, "");
  const activity = targetId ? lastActivity.get(targetId) : undefined;

  if (!activity) return message.reply("Aucune activité connue pour cet utilisateur.");
  await message.reply(`${activity.type} : ${activity.name}`);
});

activityUpdate ne couvre que ce qui arrive après l'écoute

Le SDK ne fournit pas de snapshot initial des activités en cours au moment du ready — seuls les changements ultérieurs à l'enregistrement du listener sont reçus. Pour un état initial, combinez avec vos propres données (par ex. persistées côté bot) plutôt que de supposer une activité "actuelle" par défaut.

Voir aussi ​

SDK publié sous licence ISC.