Channel
Représente un salon textuel ou vocal sur BloumeChat. Hérite de Base.
Channel est aussi la classe parente de DMChannel — toutes les méthodes documentées ici sont donc également disponibles sur un salon de messages privés.
Notation des signatures
Les signatures sont écrites en notation TypeScript, mais s'appellent à l'identique en JavaScript — voir Utiliser le SDK en JavaScript.
Propriétés
| Propriété | Type | Description |
|---|---|---|
id | string | L'identifiant public (Snowflake) du salon. |
name | string | Le nom du salon. |
type | string | Le type de salon : "TEXT", "VOICE", "DM", "GROUP_DM", "ANNOUNCEMENT"… |
serverId | string | null | L'identifiant public du serveur parent, ou null pour les DMs/groupes. |
webhooks | WebhookManager | (1.5.0+) Gestionnaire de webhooks scopé à ce salon — channel.webhooks.fetchAll() / .create() / .delete(). |
Méthodes
Messagerie
send(content, embeds?): Promise<Message>
Envoie un message dans ce salon.
send(
content: string | { content?: string; embeds?: Array<EmbedBuilder | EmbedPayload | Record<string, unknown>>; replyToId?: string },
embeds?: Array<EmbedBuilder | EmbedPayload | Record<string, unknown>>
): Promise<Message>| Paramètre | Type | Requis | Description |
|---|---|---|---|
content | string | MessagePayload | Oui | Une chaîne de texte simple, ou un objet { content?, embeds?, replyToId? } pour un message complet. |
embeds | Array<EmbedBuilder | EmbedPayload | Record<string, unknown>> | Non | Tableau d'EmbedBuilder ou de payloads bruts — utilisé seulement quand content est une chaîne. |
Retour : Promise<Message> — le message tel que confirmé par le serveur (avec son id définitif).
Comportement et erreurs :
- Délègue à
client.sendMessage(), qui exige une connexion socket active (lèveBloumeChatAuthErrorsinon). - Un contenu vide et aucun embed lève une
BloumeChatAuthError("sendMessage requires non-empty content or at least one embed.") avant même d'émettre sur le socket. - La promesse rejette après 10 secondes si le serveur n'a pas confirmé la réception (
Error("sendMessage timeout after 10s")).
// Message textuel simple
await channel.send("Salut tout le monde !");
// Avec un embed
import { EmbedBuilder } from "bloumechat";
const embed = new EmbedBuilder().setTitle("Titre").setDescription("Description");
await channel.send("Voici les infos :", [embed]);
// Payload complet avec réponse à un message précis
await channel.send({ content: "Merci !", replyToId: someMessage.id });await channel.send("Salut tout le monde !");
const { EmbedBuilder } = require("bloumechat");
const embed = new EmbedBuilder().setTitle("Titre").setDescription("Description");
await channel.send("Voici les infos :", [embed]);
await channel.send({ content: "Merci !", replyToId: someMessage.id });fetchMessages(limit?, before?): Promise<Message[]>
Récupère l'historique des messages du salon, du plus récent au plus ancien.
fetchMessages(limit = 50, before?: string): Promise<Message[]>| Paramètre | Type | Requis | Défaut | Description |
|---|---|---|---|---|
limit | number | Non | 50 | Nombre de messages à récupérer (maximum 100 côté API). |
before | string | Non | — | Identifiant d'un message : ne renvoie que les messages envoyés avant lui — utile pour paginer vers l'arrière. |
Retour : Promise<Message[]> — tableau vide si le salon n'a aucun message.
const recent = await channel.fetchMessages(20);
const older = await channel.fetchMessages(20, recent[recent.length - 1]?.id);const recent = await channel.fetchMessages(20);
const older = await channel.fetchMessages(20, recent[recent.length - 1] && recent[recent.length - 1].id);bulkDelete(messageIds: string[]): Promise<void>
Supprime plusieurs messages en une seule requête.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
messageIds | string[] | Oui | Liste des identifiants de messages à supprimer. |
Retour : Promise<void>. Nécessite la permission MANAGE_MESSAGES.
const messages = await channel.fetchMessages(100);
const spam = messages.filter((m) => m.author.bot && m.content.includes("http"));
await channel.bulkDelete(spam.map((m) => m.id));const messages = await channel.fetchMessages(100);
const spam = messages.filter((m) => m.author.bot && m.content.includes("http"));
await channel.bulkDelete(spam.map((m) => m.id));search(query, options?): Promise<Message[]>
Effectue une recherche textuelle parmi les messages du salon.
search(query: string, options?: { limit?: number; before?: string; after?: string }): Promise<Message[]>| Paramètre | Type | Requis | Description |
|---|---|---|---|
query | string | Oui | Le texte à rechercher. |
options.limit | number | Non | Nombre maximum de résultats. |
options.before | string | Non | Limite la recherche aux messages avant cet identifiant. |
options.after | string | Non | Limite la recherche aux messages après cet identifiant. |
Retour : Promise<Message[]>.
const results = await channel.search("erreur 500", { limit: 10 });const results = await channel.search("erreur 500", { limit: 10 });fetchPins(): Promise<Message[]>
Récupère la liste des messages épinglés dans ce salon.
Retour : Promise<Message[]>.
const pins = await channel.fetchPins();
console.log(`${pins.length} message(s) épinglé(s).`);const pins = await channel.fetchPins();
console.log(`${pins.length} message(s) épinglé(s).`);Indicateurs de frappe
sendTyping(): void
Émet un indicateur "en train d'écrire…" dans ce salon, visible pendant quelques secondes côté client.
Retour : void (synchrone — émission socket sans accusé de réception attendu). Lève BloumeChatAuthError si le socket n'est pas connecté.
stopTyping(): void
Arrête manuellement l'indicateur de frappe avant son expiration naturelle.
Retour : void. Mêmes conditions d'erreur que sendTyping().
channel.sendTyping();
const result = await computeExpensiveAnswer();
channel.stopTyping();
await channel.send(result);channel.sendTyping();
const result = await computeExpensiveAnswer();
channel.stopTyping();
await channel.send(result);Voix
Référence complète
Voir le guide Salons vocaux et la Référence API — Voix pour l'architecture (maillage WebRTC pair-à-pair), la lecture audio, et tous les événements.
join(options?): Promise<VoiceConnection> (2.1.0+)
Rejoint ce salon (doit être de type "VOICE"). Quitte d'abord tout autre salon vocal déjà rejoint.
join(options?: { selfMute?: boolean; selfDeaf?: boolean; timeoutMs?: number }): Promise<VoiceConnection>Retour : Promise<VoiceConnection>. Lève BloumeChatVoiceError si type !== "VOICE" ou si la confirmation du serveur n'arrive pas avant timeoutMs (défaut 15s).
const connection = await voiceChannel.join();
connection.play("https://example.com/musique.mp3");const connection = await voiceChannel.join();
connection.play("https://example.com/musique.mp3");leave(): void (2.1.0+)
Quitte ce salon vocal si le bot y est actuellement connecté. Ne fait rien sinon (y compris sur un salon non-vocal).
Gestion du salon
edit(data): Promise<void>
Modifie le nom et/ou la description du salon.
edit(data: { name?: string; description?: string | null }): Promise<void>| Paramètre | Type | Requis | Description |
|---|---|---|---|
data.name | string | Non | Nouveau nom. |
data.description | string | null | Non | Nouvelle description, ou null pour la retirer. |
Retour : Promise<void>. Seul this.name est mis à jour localement après succès (la description n'est pas stockée sur l'instance Channel).
setName(name: string): Promise<void>
Raccourci pour edit({ name }).
delete(): Promise<void>
Supprime définitivement le salon, avec tout son historique de messages.
Retour : Promise<void>.
duplicate(): Promise<Channel>
Duplique le salon, en copiant son type, ses paramètres et ses permissions.
Retour : Promise<Channel> — la nouvelle instance créée.
await channel.setName("annonces-2026");
const copy = await channel.duplicate();
console.log(`Copie créée : ${copy.id}`);await channel.setName("annonces-2026");
const copy = await channel.duplicate();
console.log(`Copie créée : ${copy.id}`);Invitations
createInvite(options?): Promise<GuildInviteDTO>
Génère une invitation ciblant spécifiquement ce salon.
createInvite(options?: { maxAge?: number; maxUses?: number }): Promise<GuildInviteDTO>
interface GuildInviteDTO {
code: string;
expiresAt: string | null;
maxUses?: number | null;
uses?: number;
inviter?: { publicId: string; name: string; image: string | null; tag: string };
channel?: { publicId: string; name: string };
}| Paramètre | Type | Requis | Description |
|---|---|---|---|
options.maxAge | number | Non | Durée de validité en secondes. |
options.maxUses | number | Non | Nombre maximum d'utilisations. |
Retour : Promise<GuildInviteDTO>. Voir l'encadré sur Invite concernant la différence entre cette forme et une instance Invite.
const invite = await channel.createInvite({ maxAge: 86_400, maxUses: 10 });
console.log(`https://bloumechat.com/invite/${invite.code}`);const invite = await channel.createInvite({ maxAge: 86400, maxUses: 10 });
console.log(`https://bloumechat.com/invite/${invite.code}`);Permissions
fetchPermissionOverrides(): Promise<PermissionOverrideDTO[]>
Récupère les surcharges de permissions propres à ce salon (indépendantes de celles de sa catégorie parente).
interface PermissionOverrideDTO {
id: string;
type: "ROLE" | "MEMBER";
targetId: string;
targetName: string;
allow: string;
deny: string;
}Retour : Promise<PermissionOverrideDTO[]>.
editPermissions(targetId, type, options): Promise<void>
Crée ou met à jour une surcharge de permissions pour un rôle ou un membre sur ce salon.
editPermissions(
targetId: string,
type: "ROLE" | "MEMBER",
options: { allow: bigint | string; deny: bigint | string }
): Promise<void>| Paramètre | Type | Requis | Description |
|---|---|---|---|
targetId | string | Oui | Identifiant du rôle ou du membre ciblé. |
type | "ROLE" | "MEMBER" | Oui | Type de cible. |
options.allow | bigint | string | Oui | Masque des permissions explicitement autorisées. |
options.deny | bigint | string | Oui | Masque des permissions explicitement refusées. |
Retour : Promise<void>.
import { PermissionFlags } from "bloumechat";
await channel.editPermissions("ROLE_ID", "ROLE", {
allow: PermissionFlags.VIEW_CHANNELS | PermissionFlags.SEND_MESSAGES,
deny: PermissionFlags.MENTION_EVERYONE,
});const { PermissionFlags } = require("bloumechat");
await channel.editPermissions("ROLE_ID", "ROLE", {
allow: PermissionFlags.VIEW_CHANNELS | PermissionFlags.SEND_MESSAGES,
deny: PermissionFlags.MENTION_EVERYONE,
});deletePermissionOverride(overrideId: string): Promise<void>
Supprime une surcharge de permissions existante par son identifiant.
Retour : Promise<void>.
syncPermissions(): Promise<void>
Synchronise les permissions de ce salon avec celles de sa catégorie parente, en écrasant ses surcharges propres.
Retour : Promise<void>.
Webhooks
Depuis la 1.5.0 : channel.webhooks
fetchWebhooks()/createWebhook() ci-dessous délèguent maintenant à channel.webhooks (WebhookManager), qui expose aussi cache et delete(id). Les deux formes restent équivalentes.
fetchWebhooks(): Promise<Webhook[]>
Récupère tous les webhooks configurés dans ce salon.
Retour : Promise<Webhook[]> — voir Webhook.
createWebhook(options): Promise<Webhook>
Crée un nouveau webhook dans ce salon.
createWebhook(options: { name: string; avatarUrl?: string }): Promise<Webhook>| Paramètre | Type | Requis | Description |
|---|---|---|---|
options.name | string | Oui | Nom d'affichage du webhook. |
options.avatarUrl | string | Non | Avatar par défaut du webhook. |
Retour : Promise<Webhook> — l'instance créée, avec son token disponible immédiatement (seul moment où il l'est, en dehors d'une récupération explicite avec token).
const webhook = await channel.createWebhook({ name: "CI/CD" });
await webhook.send("Déploiement terminé ✅");const webhook = await channel.createWebhook({ name: "CI/CD" });
await webhook.send("Déploiement terminé ✅");Voir aussi
- DMChannel — sous-classe pour les salons de messages privés.
- Category — regroupement de salons, avec sa propre
syncPermissions(). - Message — les objets renvoyés par
send()/fetchMessages(). - ChannelManager — cache global accessible via
client.channels. - WebhookManager —
channel.webhooks, la forme complète (1.5.0+). - Guide Permissions — hiérarchie catégorie → salon → rôle → membre.
- Guide Salons vocaux et Référence API — Voix —
join()/leave()en détail (2.1.0+).
