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é | Type | Description |
|---|---|---|
id | string | L'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. |
user | User | L'objet utilisateur global associé à ce membre. Résolu depuis le cache client.users si disponible, sinon reconstruit à partir des données brutes. |
serverId | string | L'identifiant public du serveur concerné. |
roles | Array<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. |
joinedAt | Date | La date à laquelle le membre a rejoint le serveur. |
permissions | bigint (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. |
voice | VoiceState | 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. |
isOwner | boolean (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 :
- Si le serveur correspondant (
client.guilds.cache.get(serverId)) n'est pas en cache, renvoie0n. - Si
guild.ownerId === member.user.id, renvoieALL_PERMISSIONS(le propriétaire du serveur a toujours tous les droits, indépendamment de ses rôles). - Sinon, additionne (OR bit-à-bit) les
permissionsde chaque rôle dansmember.roles. - Si le résultat contient le flag
ADMINISTRATOR, renvoieALL_PERMISSIONS(bypass complet). - 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ètre | Type | Requis | Description |
|---|---|---|---|
permission | bigint | Oui | Le flag à vérifier — voir PermissionFlags. |
Retour : boolean.
import { PermissionFlags } from "bloumechat";
if (member.hasPermission(PermissionFlags.KICK_MEMBERS)) {
console.log("Ce membre peut exclure des utilisateurs.");
}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ètre | Type | Requis | Description |
|---|---|---|---|
reason | string | Non | Conservé 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.
await member.kick("Non-respect du règlement.");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é).
ban(options?: { reason?: string; deleteHistory?: "none" | "1d" | "7d" | "14d" | "30d" }): Promise<void>| Paramètre | Type | Requis | Description |
|---|---|---|---|
options.reason | string | Non | Motif du bannissement, enregistré dans le journal d'audit. |
options.deleteHistory | "none" | "1d" | "7d" | "14d" | "30d" | Non | Fenê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.
await member.ban({ reason: "Spam répété", deleteHistory: "7d" });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.
edit(data: { roles?: string[]; nickname?: string | null }): Promise<void>| Paramètre | Type | Requis | Description |
|---|---|---|---|
data.roles | string[] | Non | Liste complète des identifiants de rôles à assigner — remplace l'ensemble actuel, ce n'est pas une fusion. |
data.nickname | string | null | Non | Nouveau 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.
await member.edit({ roles: ["ROLE_ID_1", "ROLE_ID_2"], nickname: "Le Boss" });await member.edit({ roles: ["ROLE_ID_1", "ROLE_ID_2"], nickname: "Le Boss" });setNickname(nickname: string | null): Promise<void>
Raccourci pour edit({ nickname }).
| Paramètre | Type | Requis | Description |
|---|---|---|---|
nickname | string | null | Oui | Le nouveau surnom, ou null pour réinitialiser au nom d'utilisateur par défaut. |
await member.setNickname("Champion 🏆");
await member.setNickname(null); // retire le surnomawait 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ètre | Type | Requis | Description |
|---|---|---|---|
roleId | string | Oui | L'identifiant public du rôle à ajouter. |
Retour : Promise<void>.
await member.addRole(vipRole.id);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ètre | Type | Requis | Description |
|---|---|---|---|
roleId | string | Oui | L'identifiant public du rôle à retirer. |
Retour : Promise<void>.
await member.removeRole(vipRole.id);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ètre | Type | Requis | Description |
|---|---|---|---|
roleIdOrName | string | Oui | Un 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).
if (member.hasRole("Modérateur")) { /* ... */ }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ètre | Type | Requis | Description |
|---|---|---|---|
content | string | EmbedBuilder | { content?, embeds?, replyToId? } | Oui | Le contenu du message. |
Retour : Promise<Message> — le message envoyé dans le DM.
await member.send("Merci de respecter le règlement du serveur !");await member.send("Merci de respecter le règlement du serveur !");Exemple complet
Système de rôle automatique basé sur l'ancienneté :
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);
});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 etfetch()/fetchAll(). - Guide Permissions — calcul complet incluant les surcharges de salon/catégorie.
- Référence API — Voix —
client.voiceStates, le cache qui alimentemember.voice.
