Webhooks, emojis & invitations
Cette page couvre Webhook, Emoji et Invite — trois structures indépendantes du compte bot connecté (un webhook peut poster sans bot en ligne, une invitation peut être inspectée sans rejoindre).
Depuis la 1.5.0 : managers dédiés
Les opérations de liste/création/suppression sur ces trois structures passent maintenant par des managers scopés : channel.webhooks, guild.emojis, guild.invites. Les raccourcis historiques (channel.createWebhook(), guild.fetchEmojis(), guild.createInvite()…) restent disponibles et délèguent à ces managers — cette page décrit les structures elles-mêmes (Webhook, Emoji, Invite), les managers ajoutent le cache et, pour les émojis, la création.
Webhook
Permet d'envoyer des messages sous une identité personnalisée (nom + avatar arbitraires), sans passer par un compte bot connecté en permanence.
Propriétés
| Propriété | Type | Description |
|---|---|---|
id | string | publicId du webhook. |
name | string | Nom affiché par défaut pour les messages envoyés via ce webhook. |
avatar | string | null | URL de l'avatar par défaut. |
channelId | string | ID du salon auquel ce webhook est attaché. |
token | string | null | Secret du webhook — non-énumérable, absent de console.log(webhook) et de JSON.stringify(webhook) (protection intégrée contre les fuites accidentelles en logs). N'est disponible qu'à la création (channel.createWebhook()) ou si l'endpoint de fetch le renvoie explicitement. |
url | string | null (getter) | URL complète prête à l'emploi ({baseUrl}/webhooks/{id}/{token}), null si token n'est pas chargé. |
Le token du webhook = un secret
Quiconque possède webhook.token peut poster des messages sous cette identité, sans authentification de bot. Ne l'exposez jamais côté client (navigateur, app mobile) — gardez-le uniquement côté serveur/process de bot. Le SDK redirige déjà console.log/JSON.stringify vers "[REDACTED]", mais rien n'empêche un webhook.token explicite d'atterrir ailleurs (variable exportée, requête réseau non chiffrée…) — à vous de le manipuler avec la même rigueur qu'un mot de passe.
send(options): Promise<WebhookSendResult>
| Paramètre | Type | Requis | Description |
|---|---|---|---|
options | string | { content?: string; username?: string; avatarUrl?: string; embeds?: Array<EmbedPayload | Record<string, unknown>> } | Oui | Contenu du message et identité d'affichage. |
Envoie directement via fetch HTTP vers {baseUrl}/webhooks/{id}/{token} — ne passe pas par le client BloumeChat ni par son socket, donc fonctionne même si aucun bot n'est connecté. username/avatarUrl remplacent ponctuellement name/avatar pour ce message uniquement, sans modifier le webhook lui-même. Retourne { id } (l'identifiant du message créé). Lève une BloumeChatAuthError si this.token est null, ou une BloumeChatAPIError si la requête HTTP échoue (timeout 15s).
const webhook = await channel.createWebhook({ name: "Déploiements" });
await webhook.send({
content: "🚀 Nouvelle version déployée !",
username: "CI/CD",
});const webhook = await channel.createWebhook({ name: "Déploiements" });
await webhook.send({
content: "🚀 Nouvelle version déployée !",
username: "CI/CD",
});// Message court, sans changer l'identité par défaut du webhook
await webhook.send("Build terminé ✅");// Message court, sans changer l'identité par défaut du webhook
await webhook.send("Build terminé ✅");edit(data): Promise<void>
| Paramètre | Type | Requis | Description |
|---|---|---|---|
data.name | string | Non | Nouveau nom par défaut. |
data.avatarUrl | string | null | Non | Nouvel avatar (null pour l'effacer). |
Ne modifie que les champs fournis, met à jour l'instance locale.
delete(): Promise<void>
Supprime définitivement le webhook — toute intégration utilisant son token cessera immédiatement de fonctionner.
const channel = await client.channels.fetch(process.env.DEPLOY_CHANNEL_ID!);
const webhook = await channel.createWebhook({ name: "Déploiements" });
console.log("URL du webhook :", webhook.url);
// ... plus tard ...
await webhook.delete();const channel = await client.channels.fetch(process.env.DEPLOY_CHANNEL_ID);
const webhook = await channel.createWebhook({ name: "Déploiements" });
console.log("URL du webhook :", webhook.url);
// ... plus tard ...
await webhook.delete();Emoji
Emoji personnalisé appartenant à un serveur.
Propriétés
| Propriété | Type | Description |
|---|---|---|
id | string | publicId de l'emoji. |
name | string | Nom (sans les deux-points). |
url | string | URL directe de l'image. Chaîne vide si aucune URL n'a été fournie par l'API. |
serverId | string | ID du serveur propriétaire. |
animated | boolean | true si l'emoji est animé (GIF). |
toString() retourne `:${name}:` — pratique pour insérer l'emoji dans un contenu de message texte.
Uploader un nouvel émoji
Emoji n'a pas de méthode statique de création — utilisez guild.emojis.create({ name, imageUrl, isAnimated? }) (nouveau en 1.5.0).
delete(): Promise<void>
Supprime l'emoji du serveur. Toute utilisation existante de l'emoji dans des messages passés reste affichée telle quelle (rendue côté client), mais il ne pourra plus être utilisé dans de nouveaux messages une fois supprimé.
const emojis = await guild.fetchEmojis();
const partyParrot = emojis.find((e) => e.name === "party_parrot");
await message.reply(`Ambiance ${partyParrot}`);const emojis = await guild.fetchEmojis();
const partyParrot = emojis.find((e) => e.name === "party_parrot");
await message.reply(`Ambiance ${partyParrot}`);// Nettoyer les emojis animés (ex: réduire la charge de bande passante)
const emojis = await guild.fetchEmojis();
const animated = emojis.filter((e) => e.animated);
for (const emoji of animated) await emoji.delete();
console.log(`${animated.length} emoji(s) animé(s) supprimé(s).`);// Nettoyer les emojis animés (ex: réduire la charge de bande passante)
const emojis = await guild.fetchEmojis();
const animated = emojis.filter((e) => e.animated);
for (const emoji of animated) await emoji.delete();
console.log(`${animated.length} emoji(s) animé(s) supprimé(s).`);Invite
Représente une invitation vers un serveur.
Propriétés
| Propriété | Type | Description |
|---|---|---|
code | string | Code de l'invitation (ex. "aBcD1234"). |
guild | InviteGuildData | Informations du serveur ciblé (voir ci-dessous). |
interface InviteGuildData {
publicId: string;
name: string;
imageUrl: string | null;
memberCount: number;
isMember: boolean;
channelPublicId: string | null;
}| Champ | Type | Description |
|---|---|---|
isMember | boolean | true si le compte connecté (le bot) est déjà membre de ce serveur. |
channelPublicId | string | null | Salon ciblé par l'invitation, s'il est spécifique à un salon. |
revoke(): Promise<void>
Supprime (révoque) l'invitation — requiert la permission MANAGE_INVITES sur le serveur cible, sinon la requête rejette en 403. Une fois révoquée, le code cesse de fonctionner immédiatement pour quiconque tente de l'utiliser.
Équivalent via le manager
invite.revoke() (sur une instance Invite résolue par client.fetchInvite(code)) et guild.invites.delete(code) appellent le même endpoint (DELETE /invites/:code) — guild.invites.delete() met en plus à jour le cache guild.invites.cache.
const invite = await client.fetchInvite("aBcD1234");
console.log(`${invite.guild.name} — ${invite.guild.memberCount} membres`);const invite = await client.fetchInvite("aBcD1234");
console.log(`${invite.guild.name} — ${invite.guild.memberCount} membres`);// Révoquer une invitation suspecte trouvée par audit
const invites = await guild.fetchInvites();
const stale = invites.find((i: any) => i.code === "old-leaked-code");
if (stale) {
const invite = await client.fetchInvite(stale.code);
await invite.revoke();
}// Révoquer une invitation suspecte trouvée par audit
const invites = await guild.fetchInvites();
const stale = invites.find((i) => i.code === "old-leaked-code");
if (stale) {
const invite = await client.fetchInvite(stale.code);
await invite.revoke();
}Un bot ne peut pas rejoindre via une invitation
fetchInvite() est en lecture seule pour un bot — il ne peut pas s'ajouter lui-même à un serveur. L'ajout d'un bot se fait par un utilisateur disposant des permissions nécessaires, via l'interface BloumeChat.
Voir aussi
WebhookManager/EmojiManager/InviteManager— les managers scopés (1.5.0+).- Messages & salons —
channel.createWebhook(),channel.createInvite(). - Serveurs, rôles & membres —
guild.fetchEmojis(),guild.fetchInvites(),guild.createInvite(). - Gestion des erreurs —
BloumeChatAuthError,BloumeChatAPIError. - Exemple : envoyer via un webhook — cas d'usage complet CI/CD sans process bot permanent.
