Skip to content

Member ​

Représente l'appartenance d'un utilisateur à un serveur (guilde) donné sur BloumeChat. Hérite de Base.

Un Member diffère d'un User car il porte des données propres à un serveur précis : date d'arrivée, rôles locaux, surnom, et permissions calculées. Le même utilisateur global aura une instance Member distincte par serveur où le bot le côtoie.

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éTypeDescription
idstringL'identifiant public (Snowflake) de cette appartenance au serveur — distinct de user.id. kick(), ban() et edit() utilisent en réalité user.id (voir plus bas), pas cet id.
userUserL'objet utilisateur global associé à ce membre. Résolu depuis le cache client.users si disponible, sinon reconstruit à partir des données brutes.
serverIdstringL'identifiant public du serveur concerné.
rolesArray<MemberRoleRef | string>Tableau des rôles affectés au membre sur ce serveur. Chaque entrée est normalement un objet { id?, publicId?, permissions? } (pas systématiquement une instance Role complète selon l'origine des données) — mais addRole/removeRole acceptent aussi que l'entrée soit une simple chaîne d'ID, d'où l'union.
joinedAtDateLa date à laquelle le membre a rejoint le serveur.
permissionsbigint (getter)Le masque de permissions effectif du membre sur ce serveur, calculé à la volée (voir ci-dessous). N'inclut pas les surcharges de permissions au niveau salon/catégorie.
voiceVoiceState | undefined (getter, 4.1.0+)L'état vocal courant du membre (salon, muet, sourdine, parle…), ou undefined s'il n'est pas connu comme étant en vocal. Raccourci pour client.voiceStates.cache.get(member.user.id) — voir VoiceStateManager.
isOwnerboolean (getter, 4.2.0+)true si ce membre est le propriétaire du serveur (guild.ownerId === member.user.id). Renvoie false si le serveur n'est pas en cache.

Calcul de permissions ​

Le getter permissions applique cette logique à chaque accès :

  1. Si le serveur correspondant (client.guilds.cache.get(serverId)) n'est pas en cache, renvoie 0n.
  2. Si guild.ownerId === member.user.id, renvoie ALL_PERMISSIONS (le propriétaire du serveur a toujours tous les droits, indépendamment de ses rôles).
  3. Sinon, additionne (OR bit-à-bit) les permissions de chaque rôle dans member.roles.
  4. Si le résultat contient le flag ADMINISTRATOR, renvoie ALL_PERMISSIONS (bypass complet).
  5. Sinon, renvoie le masque agrégé.

permissions dépend du cache et de la fraîcheur des rôles

Ce getter recalcule le masque à chaque appel à partir de member.roles et du cache client.guilds. Si le serveur n'est pas encore en cache (avant ready, ou après un guild.leave()), il renvoie silencieusement 0n plutôt que de lever une erreur. Assurez-vous que member.roles contient bien les permissions de chaque rôle (role.permissions) — un objet de rôle partiel sans ce champ contribuera 0n au calcul.

Méthodes ​

Permissions ​

hasPermission(permission: bigint): boolean ​

Vérifie si le membre possède la permission spécifiée, en se basant sur le getter permissions ci-dessus (donc sans tenir compte des surcharges de salon).

ParamètreTypeRequisDescription
permissionbigintOuiLe flag à vérifier — voir PermissionFlags.

Retour : boolean.

ts
import { PermissionFlags } from "bloumechat";

if (member.hasPermission(PermissionFlags.KICK_MEMBERS)) {
  console.log("Ce membre peut exclure des utilisateurs.");
}
js
const { PermissionFlags } = require("bloumechat");

if (member.hasPermission(PermissionFlags.KICK_MEMBERS)) {
  console.log("Ce membre peut exclure des utilisateurs.");
}

Modération ​

Passent par le socket, pas par une route REST

kick(), ban() et unban() (sur Guild) n'ont aucun équivalent REST — ce sont exactement les mêmes événements Socket.IO (server:kick/server:ban/server:unban) que ceux utilisés par l'application web elle-même. Ils nécessitent donc une connexion active (client.login()) et lèvent BloumeChatAuthError sinon. En cas d'échec (permissions, hiérarchie, cible introuvable…), ils rejettent avec BloumeChatGatewayError, dont .code est la clé i18n brute renvoyée par le serveur (ex. "servers.errors.cannot_kick_owner") — pas un message lisible directement (ce canal est partagé avec l'interface web, qui résout cette clé elle-même). (Corrigé en 4.2.0 — avant cela, ces méthodes appelaient une route REST qui n'a jamais existé et échouaient systématiquement.)

kick(reason?: string): Promise<void> ​

Exclut le membre du serveur (il pourra le rejoindre à nouveau via une invitation).

ParamètreTypeRequisDescription
reasonstringNonConservé pour la symétrie avec ban(), mais non persisté côté serveur pour un kick (seul ban() accepte un motif enregistré dans le journal d'audit).

Retour : Promise<void>. Rejette (BloumeChatGatewayError) si le bot n'a pas la permission KICK_MEMBERS ou si le membre a une position hiérarchique supérieure ou égale au bot.

ts
await member.kick("Non-respect du règlement.");
js
await member.kick("Non-respect du règlement.");

ban(options?): Promise<void> ​

Bannit le membre du serveur (l'empêche de le rejoindre à nouveau tant que le ban n'est pas levé).

ts
ban(options?: { reason?: string; deleteHistory?: "none" | "1d" | "7d" | "14d" | "30d" }): Promise<void>
ParamètreTypeRequisDescription
options.reasonstringNonMotif du bannissement, enregistré dans le journal d'audit.
options.deleteHistory"none" | "1d" | "7d" | "14d" | "30d"NonFenêtre de messages récents de ce membre à supprimer rétroactivement. Omis ou "none" = aucune suppression. (Renommé depuis deleteMessageDays: number en 4.2.0 pour correspondre exactement à ce que le serveur attend.)

Retour : Promise<void>. Nécessite la permission BAN_MEMBERS.

ts
await member.ban({ reason: "Spam répété", deleteHistory: "7d" });
js
await member.ban({ reason: "Spam répété", deleteHistory: "7d" });

Rôles & profil local ​

edit(data): Promise<void> ​

Modifie les rôles et/ou le surnom du membre sur ce serveur en un seul appel.

ts
edit(data: { roles?: string[]; nickname?: string | null }): Promise<void>
ParamètreTypeRequisDescription
data.rolesstring[]NonListe complète des identifiants de rôles à assigner — remplace l'ensemble actuel, ce n'est pas une fusion.
data.nicknamestring | nullNonNouveau surnom, ou null pour le réinitialiser.

Retour : Promise<void>. Après succès, this.roles est mis à jour localement uniquement si data.roles a été fourni.

Corrigé en 4.2.0

Avant 4.2.0, edit() appelait /servers/:id/members/:id avec l'id de l'appartenance au serveur au lieu de l'id de l'utilisateur — la route attend ce dernier, donc l'appel échouait avec common.api.user_not_found pour quasiment tous les membres.

ts
await member.edit({ roles: ["ROLE_ID_1", "ROLE_ID_2"], nickname: "Le Boss" });
js
await member.edit({ roles: ["ROLE_ID_1", "ROLE_ID_2"], nickname: "Le Boss" });

setNickname(nickname: string | null): Promise<void> ​

Raccourci pour edit({ nickname }).

ParamètreTypeRequisDescription
nicknamestring | nullOuiLe nouveau surnom, ou null pour réinitialiser au nom d'utilisateur par défaut.
ts
await member.setNickname("Champion 🏆");
await member.setNickname(null); // retire le surnom
js
await member.setNickname("Champion 🏆");
await member.setNickname(null);

addRole(roleId: string): Promise<void> ​

Ajoute un rôle au membre s'il ne l'a pas déjà. Si le rôle est déjà présent (comparaison sur r.id || r.publicId || r), la méthode retourne immédiatement sans appel réseau.

ParamètreTypeRequisDescription
roleIdstringOuiL'identifiant public du rôle à ajouter.

Retour : Promise<void>.

ts
await member.addRole(vipRole.id);
js
await member.addRole(vipRole.id);

removeRole(roleId: string): Promise<void> ​

Retire un rôle du membre. Si le rôle n'est pas présent, la méthode retourne immédiatement sans appel réseau.

ParamètreTypeRequisDescription
roleIdstringOuiL'identifiant public du rôle à retirer.

Retour : Promise<void>.

ts
await member.removeRole(vipRole.id);
js
await member.removeRole(vipRole.id);

hasRole(roleIdOrName: string): boolean (4.2.0+) ​

Vérifie si le membre possède un rôle, par identifiant ou par nom (insensible à la casse).

ParamètreTypeRequisDescription
roleIdOrNamestringOuiUn identifiant public de rôle, ou son nom exact (casse ignorée).

Retour : boolean. La correspondance par nom nécessite que le cache de rôles du serveur (guild.roles.cache) soit peuplé — appelez guild.fetchRoles() au moins une fois si ce n'est pas déjà fait ailleurs (c'est automatique après un server:role_create/_update/_delete, mais pas au démarrage).

ts
if (member.hasRole("Modérateur")) { /* ... */ }
js
if (member.hasRole("Modérateur")) { /* ... */ }

Messages ​

send(content): Promise<Message> (4.2.0+) ​

Envoie un message privé (DM) à ce membre — raccourci pour member.user.createDM() suivi de l'envoi sur le canal obtenu. Accepte exactement les mêmes formes que Channel.send() / client.sendMessage().

ParamètreTypeRequisDescription
contentstring | EmbedBuilder | { content?, embeds?, replyToId? }OuiLe contenu du message.

Retour : Promise<Message> — le message envoyé dans le DM.

ts
await member.send("Merci de respecter le règlement du serveur !");
js
await member.send("Merci de respecter le règlement du serveur !");

Exemple complet ​

Système de rôle automatique basé sur l'ancienneté :

ts
client.on("guildMemberAdd", async (data) => {
  const guild = client.guilds.cache.get(data.serverPublicId);
  if (!guild) return;

  const member = await client.members.fetch(guild.id, data.userPublicId);
  const veteranRole = guild.roles.cache.find((r) => r.name === "Membre");
  if (veteranRole) await member.addRole(veteranRole.id);
});
js
client.on("guildMemberAdd", async (data) => {
  const guild = client.guilds.cache.get(data.serverPublicId);
  if (!guild) return;

  const member = await client.members.fetch(guild.id, data.userPublicId);
  const veteranRole = guild.roles.cache.find((r) => r.name === "Membre");
  if (veteranRole) await member.addRole(veteranRole.id);
});

Voir aussi ​

  • User — le compte global sous-jacent (member.user).
  • Role — structure des rôles assignables.
  • MemberManager — client.members, cache et fetch()/fetchAll().
  • Guide Permissions — calcul complet incluant les surcharges de salon/catégorie.
  • Référence API — Voix — client.voiceStates, le cache qui alimente member.voice.

SDK publié sous licence ISC.