Exemple : Rich Presence (RPC)
Affiche une activité dynamique sur le profil du bot, visible par tous les membres (ex : "en train de jouer à...").
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!);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
interface ActivityData {
type: "using" | "browsing" | "listening" | "playing";
name: string;
details?: string;
startedAt?: number;
}| Champ | Type | Requis | Description |
|---|---|---|---|
type | "using" | "browsing" | "listening" | "playing" | Oui | Détermine le verbe affiché (voir table ci-dessous). |
name | string | Oui | Nom de l'activité. Tronqué à 128 caractères côté client avant envoi (name.substring(0, 128)). |
details | string | Non | Texte secondaire, affiché sous le nom principal. Tronqué à 64 caractères. |
startedAt | number | Non | Timestamp 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
| Type | Affiché 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().
await client.setActivity({ type: "playing", name: "Aventure BloumeChat" });await client.setActivity({ type: "playing", name: "Aventure BloumeChat" });Avec details et startedAt personnalisés
const sessionStart = Date.now();
await client.setActivity({
type: "playing",
name: "Partie classée",
details: "Manche 3 sur 5",
startedAt: sessionStart,
});const sessionStart = Date.now();
await client.setActivity({
type: "playing",
name: "Partie classée",
details: "Manche 3 sur 5",
startedAt: sessionStart,
});Effacer l'activité
await client.setActivity(null);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.
await client.setStatus("dnd"); // "Ne pas déranger" pendant une maintenanceawait client.setStatus("dnd"); // "Ne pas déranger" pendant une maintenanceCombiner statut + activité en un seul appel
setPresence() est un raccourci qui appelle séquentiellement setStatus() (si fourni) puis setActivity() (si fourni) :
await client.setPresence({
status: "dnd",
activity: { type: "playing", name: "en maintenance" },
});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.
client.on("activityUpdate", ({ userPublicId, activity }) => {
if (!activity) return console.log(`${userPublicId} n'a plus d'activité`);
console.log(`${userPublicId} : ${activity.type} → ${activity.name}`);
});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
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}`);
});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
BloumeChat— Référence — signatures complètes desetActivity,setStatus,setPresence.- Événements — table complète, y compris
presenceUpdateetactivityUpdate. - Utilisateurs & profils —
User.status, mise à jour du profil du bot.
