Message
Représente un message envoyé sur BloumeChat, dans un salon de serveur ou en messages privés. Hérite de Base.
Notation des signatures
Les signatures sont écrites en notation TypeScript, mais s'appellent à l'identique en JavaScript — voir Utiliser le SDK en JavaScript.
Décodage automatique du contenu
Le serveur échappe le contenu HTML des messages à l'écriture (<, >, & → <, >, &) pour prévenir les failles XSS côté client web. Le SDK décode automatiquement ces entités dans le constructeur, avant d'exposer .content — vos regex, parseurs de commandes ou de mentions voient donc toujours les caractères originaux, sans traitement supplémentaire de votre part.
Propriétés
| Propriété | Type | Description |
|---|---|---|
id | string | L'identifiant public (Snowflake) du message. |
content | string | Le contenu textuel du message, décodé (voir encadré ci-dessus). Chaîne vide si le message n'a pas de texte (par ex. image seule). |
author | User | L'utilisateur qui a envoyé le message. Résolu depuis le cache client.users si disponible, sinon reconstruit à partir des données brutes. |
channelId | string | L'identifiant du salon où le message a été envoyé. |
serverId | string | undefined | L'identifiant du serveur, si le message provient d'un salon de serveur (absent en DM). |
createdAt | Date | La date de création du message. |
nonce | string | undefined | Chaîne unique générée côté client à l'envoi, utilisée en interne pour corréler l'accusé de réception du serveur (sendMessage) — rarement utile directement. |
embeds | Array<EmbedPayload | Record<string, unknown>> | Tableau des embeds attachés au message (tableau vide par défaut). |
fileUrl | string | null | L'URL du fichier ou de l'image joint au message, ou null s'il n'y en a pas. |
rawData | any | Les données brutes complètes reçues du serveur pour ce message, avant transformation — utile en dépannage ou pour accéder à un champ non encore exposé par une propriété dédiée. |
Getters
| Getter | Type | Description |
|---|---|---|
channel | Channel | Le salon dans lequel le message a été posté. Renvoie l'instance en cache si disponible, sinon une instance minimale reconstruite à la volée à partir de channelId/serverId (pas de round-trip réseau). |
guild | Guild | null | Le serveur dans lequel le message a été posté, ou null si serverId est absent (DM) ou si le serveur n'est pas en cache. |
member | Member | null | L'objet membre correspondant à l'auteur sur ce serveur. null en DM, ou si l'appartenance n'est pas encore en cache — dans ce cas, appelez d'abord client.members.fetch(serverId, userId). |
channel et member ne déclenchent aucune requête réseau
Ces deux getters lisent uniquement le cache local (client.channels.cache / client.members.cache). Si l'entrée n'y est pas encore, channel renvoie une instance reconstruite « à la volée » avec seulement id/serverId connus (les autres propriétés comme name seront vides), et member renvoie null. Utilisez client.channels.fetch(id) ou client.members.fetch(serverId, userId) explicitement si vous avez besoin de données complètes et garanties à jour.
Méthodes
Actions de messagerie
reply(content, embeds?): Promise<Message>
Répond directement à ce message — équivalent à channel.send() mais avec replyToId automatiquement renseigné à this.id.
reply(
content: string | { content?: string; embeds?: Array<EmbedBuilder | EmbedPayload | Record<string, unknown>> },
embeds?: Array<EmbedBuilder | EmbedPayload | Record<string, unknown>>
): Promise<Message>| Paramètre | Type | Requis | Description |
|---|---|---|---|
content | string | MessagePayload | Oui | Texte simple, ou objet { content?, embeds? }. |
embeds | Array<EmbedBuilder | EmbedPayload | Record<string, unknown>> | Non | Tableau d'EmbedBuilder — utilisé seulement si content est une chaîne. |
Retour : Promise<Message>. Mêmes conditions d'erreur que Channel.send() (timeout 10s, contenu vide interdit, socket requis).
client.on("messageCreate", async (message) => {
if (message.content === "!ping") {
await message.reply("🏓 Pong !");
}
});client.on("messageCreate", async (message) => {
if (message.content === "!ping") {
await message.reply("🏓 Pong !");
}
});edit(options): Promise<Message>
Modifie le contenu et/ou les embeds du message. Le bot doit être l'auteur du message.
edit(
options: string | EmbedBuilder | { content?: string; embeds?: Array<EmbedBuilder | EmbedPayload | Record<string, unknown>> }
): Promise<Message>| Paramètre | Type | Requis | Description |
|---|---|---|---|
options | string | EmbedBuilder | MessageEditOptions | Oui | Une chaîne pour changer uniquement le texte, une instance d'EmbedBuilder seule, ou un objet { content?, embeds? }. |
Retour : Promise<Message> — l'instance courante (this), avec content/embeds mis à jour localement. Lève BloumeChatAuthError si le socket n'est pas disponible ; l'édition est émise sur le socket sans accusé de réception attendu par cette méthode (mise à jour optimiste locale).
const msg = await channel.send("Calcul en cours…");
const result = await computeSomething();
await msg.edit(`Résultat : ${result}`);const msg = await channel.send("Calcul en cours…");
const result = await computeSomething();
await msg.edit(`Résultat : ${result}`);Avec un embed :
import { EmbedBuilder } from "bloumechat";
await msg.edit(new EmbedBuilder().setTitle("Mis à jour").setColor("#22c55e"));const { EmbedBuilder } = require("bloumechat");
await msg.edit(new EmbedBuilder().setTitle("Mis à jour").setColor("#22c55e"));delete(): Promise<void>
Supprime définitivement le message via le socket.
Retour : Promise<void>. Lève BloumeChatAuthError si le socket n'est pas disponible. Nécessite d'être l'auteur du message ou de disposer de la permission MANAGE_MESSAGES.
if (message.content.includes("mot-interdit")) {
await message.delete();
}if (message.content.includes("mot-interdit")) {
await message.delete();
}Réactions
react(emoji: string): Promise<void>
Ajoute une réaction émoji unicode sur le message.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
emoji | string | Oui | L'émoji unicode à ajouter (ex. "👍", "❤️"). Pour les émojis personnalisés du serveur, voir Emoji. |
Retour : Promise<void> (résout dès l'émission socket, sans attendre de confirmation serveur). Lève BloumeChatAuthError si le socket n'est pas disponible.
await message.react("👍");
await message.react("👎");await message.react("👍");
await message.react("👎");fetchReactions(emoji: string): Promise<ReactionUserDTO[]>
Récupère la liste détaillée des utilisateurs ayant réagi avec un émoji spécifique.
interface ReactionUserDTO {
userPublicId: string;
userName: string;
userImage: string | null;
}| Paramètre | Type | Requis | Description |
|---|---|---|---|
emoji | string | Oui | L'émoji à filtrer (encodé automatiquement dans l'URL — peut contenir des caractères spéciaux sans souci). |
Retour : Promise<ReactionUserDTO[]>.
const reactors = await message.fetchReactions("👍");
console.log(reactors.map((r) => r.userName).join(", "));const reactors = await message.fetchReactions("👍");
console.log(reactors.map((r) => r.userName).join(", "));clearReactions(): Promise<void>
Supprime toutes les réactions présentes sur le message.
Retour : Promise<void>. Nécessite la permission MANAGE_MESSAGES. Lève BloumeChatAuthError si le socket n'est pas disponible.
awaitReactions(options?): Promise<MessageReactionEventData | null>
Attend l'arrivée de réactions sur ce message — utile pour des sondages ou menus interactifs pilotés par émojis. Résout dès que le nombre maximum de réactions (max) est atteint, ou après expiration du délai (time), selon ce qui survient en premier.
awaitReactions(options?: { max?: number; time?: number }): Promise<MessageReactionEventData | null>
interface MessageReactionEventData {
messagePublicId: string;
emoji: string;
userPublicId?: string;
}| Paramètre | Type | Requis | Défaut | Description |
|---|---|---|---|---|
options.max | number | Non | — | Nombre de réactions à atteindre avant résolution anticipée. |
options.time | number | Non | — | Délai maximum d'attente, en millisecondes. |
Retour : Promise<MessageReactionEventData | null> — les données de la dernière réaction reçue qui a déclenché la résolution, ou null si la promesse résout par expiration du délai (time) sans avoir atteint max.
Sans max ni time, la promesse ne résout jamais
Si ni max ni time ne sont fournis, awaitReactions() reste en attente indéfiniment (aucun mécanisme de résolution par défaut). Précisez toujours au moins l'un des deux dans du code de production, sous peine de fuite mémoire (le listener interne messageReactionAdd reste attaché tant que le processus tourne).
await message.react("👍");
await message.react("👎");
// Attend jusqu'à 10 réactions, ou 10 secondes maximum
const result = await message.awaitReactions({ max: 10, time: 10_000 });
if (result) {
console.log("Réaction reçue avant le délai.");
} else {
console.log("Délai écoulé sans atteindre le maximum.");
}await message.react("👍");
await message.react("👎");
const result = await message.awaitReactions({ max: 10, time: 10000 });
if (result) {
console.log("Réaction reçue avant le délai.");
} else {
console.log("Délai écoulé sans atteindre le maximum.");
}createReactionCollector(options?): ReactionCollector (4.2.0+)
Crée un collecteur qui émet collect en continu pour chaque réaction correspondante sur ce message, jusqu'à time/max ou un appel manuel à .stop(). Contrairement à awaitReactions() (résout une seule fois), c'est adapté à un menu ou un vote qui doit rester actif sur la durée.
interface ReactionCollectorOptions {
filter?: (reaction: ReactionInfo, user: User) => boolean;
time?: number;
max?: number;
}| Paramètre | Type | Requis | Description |
|---|---|---|---|
options.filter | (reaction, user) => boolean | Non | Ne déclenche collect que si cette fonction renvoie true. |
options.time | number | Non | Arrête automatiquement la collecte après ce délai (ms). |
options.max | number | Non | Arrête automatiquement la collecte après ce nombre de réactions collectées. |
Retour : ReactionCollector (un EventEmitter) — événements collect(reaction, user) et end(reason), où reason vaut "time", "limit" ou "user" (arrêt manuel via .stop()).
const collector = message.createReactionCollector({
filter: (reaction, user) => user.id === targetUserId,
time: 60_000,
});
collector.on("collect", (reaction, user) => {
console.log(`${user.tagString} a réagi ${reaction.emoji}`);
});
collector.on("end", (reason) => console.log(`Collecte terminée : ${reason}`));const collector = message.createReactionCollector({
filter: (reaction, user) => user.id === targetUserId,
time: 60000,
});
collector.on("collect", (reaction, user) => {
console.log(`${user.tagString} a réagi ${reaction.emoji}`);
});
collector.on("end", (reason) => console.log(`Collecte terminée : ${reason}`));Épingles
pin(): Promise<void>
Épingle le message dans le salon.
Retour : Promise<void>. Nécessite la permission MANAGE_MESSAGES (ou PIN_MESSAGE selon la configuration du serveur).
unpin(): Promise<void>
Désépingle le message du salon.
Retour : Promise<void>. Mêmes prérequis de permission que pin().
await message.pin();
// plus tard…
await message.unpin();await message.pin();
await message.unpin();Exemple complet
Bot de sondage combinant réactions et attente asynchrone :
client.on("messageCreate", async (message) => {
if (message.content !== "!sondage") return;
const poll = await message.channel.send("Café ☕ ou thé 🍵 ?");
await poll.react("☕");
await poll.react("🍵");
await poll.awaitReactions({ time: 30_000 });
const coffee = await poll.fetchReactions("☕");
const tea = await poll.fetchReactions("🍵");
await poll.reply(`Résultat : ☕ ${coffee.length} vs 🍵 ${tea.length}`);
});client.on("messageCreate", async (message) => {
if (message.content !== "!sondage") return;
const poll = await message.channel.send("Café ☕ ou thé 🍵 ?");
await poll.react("☕");
await poll.react("🍵");
await poll.awaitReactions({ time: 30000 });
const coffee = await poll.fetchReactions("☕");
const tea = await poll.fetchReactions("🍵");
await poll.reply(`Résultat : ☕ ${coffee.length} vs 🍵 ${tea.length}`);
});Voir aussi
- Channel — méthodes de messagerie de bas niveau (
send,fetchMessages,bulkDelete…). - EmbedBuilder — construire les embeds passés à
reply()/edit(). - User / Member —
message.authoretmessage.member. - Guide Événements —
messageCreate,messageUpdate,messageDelete,messageReactionAdd…
