> ## Documentation Index
> Fetch the complete documentation index at: https://www.chapterjs.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Modération et serveur

> Réagir aux bannissements, aux entrées du journal d’audit, aux invitations, aux emojis, aux événements programmés, aux fils, aux présences et aux changements du serveur

Quand quelqu’un est banni, les événements `banAdd` tournent :

```ts src/events/log.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { event } from 'chapterjs';

export default event({
  name: 'banAdd',
  async run({ user, guild }) {
    const channel = guild.systemChannelId ? guild.channels.get(guild.systemChannelId) : undefined;
    if (!channel?.isTextBased()) return;
    await channel.send(`${user.username} a été banni de ${guild.name}.`);
  },
});
```

C’est tout. Les événements de cette page se produisent tous sur les serveurs : `guild` est toujours là, et aucun n’a d’options.

> [!NOTE]
>
> Chaque événement de cette page, avec ce qu’il donne, est dans la [référence](https://www.chapterjs.org/fr/reference/events.md#guildupdate).

## Modération

`banAdd` tourne quand quelqu’un est banni, `banRemove` quand un bannissement est levé ; les deux donnent `user` et `guild`. Un membre banni quitte aussi le serveur, donc un fichier de `memberLeave` tourne aussi.

Pour savoir **qui** a banni, expulsé ou changé quelque chose, écoutez le journal d’audit : `auditLogEntryCreate` tourne pour chaque entrée que Discord y ajoute, et la donne sous forme d’[`AuditLogEntry`](https://www.chapterjs.org/fr/reference/data#auditlogentry). Discord ne l’envoie qu’à un bot qui a la permission `ViewAuditLog`.

```ts src/events/kicks.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { AuditLogEvent, event } from 'chapterjs';

export default event({
  name: 'auditLogEntryCreate',
  run({ entry, guild }) {
    if (entry.actionType !== AuditLogEvent.MemberKick) return;
    console.log(`${entry.userId} a expulsé ${entry.targetId} de ${guild.name} : ${entry.reason ?? 'sans raison'}`);
  },
});
```

Les valeurs de `actionType` sont celles de [`AuditLogEvent`](https://www.chapterjs.org/fr/reference/enums#auditlogevent).

## Le serveur, ses emojis et ses invitations

* `guildUpdate` tourne quand le serveur change (nom, icône, paramètres), avec `guild` tel qu’il est maintenant.
* `emojiCreate`, `emojiUpdate` et `emojiDelete` tournent pour chaque emoji ajouté, modifié ou retiré. `emojiDelete` donne l’emoji tel qu’il était.
* `inviteCreate` donne la nouvelle [`Invite`](https://www.chapterjs.org/fr/reference/invite) et le salon où elle mène ; `inviteDelete` le code d’une invitation supprimée ou expirée. Discord ne les envoie qu’à un bot qui a la permission `ManageChannels` sur ce salon.

```ts src/events/log.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { event } from 'chapterjs';

export default event({
  name: 'inviteCreate',
  run({ invite }) {
    console.log(`${invite.inviter?.username ?? 'Quelqu’un'} a créé ${invite.url} pour #${invite.channel?.name}`);
  },
});
```

## Événements programmés

`scheduledEventCreate`, `scheduledEventUpdate` et `scheduledEventDelete` donnent le [`ScheduledEvent`](https://www.chapterjs.org/fr/reference/data#scheduledevent). `scheduledEventUserAdd` et `scheduledEventUserRemove` tournent quand quelqu’un se dit intéressé, ou ne l’est plus.

```ts src/events/announce.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { event, timestamp } from 'chapterjs';

export default event({
  name: 'scheduledEventCreate',
  async run({ scheduledEvent, guild }) {
    const channel = guild.systemChannelId ? guild.channels.get(guild.systemChannelId) : undefined;
    if (!channel?.isTextBased()) return;
    const start = timestamp(new Date(scheduledEvent.scheduledStartTime));
    await channel.send(`Nouvel événement : **${scheduledEvent.name}**, ${start}.`);
  },
});
```

## Fils

Un fil créé, modifié ou supprimé est un salon : [`channelCreate`, `channelUpdate` et `channelDelete`](https://www.chapterjs.org/fr/reference/events#channelcreate) tournent pour lui. Qui est dans un fil a deux événements à lui : `threadMemberJoin` (avec `thread` et `member`) et `threadMemberLeave` (avec `thread` et `userId` ; `member` quand le bot s’en souvient), tous deux avec `guild`.

```ts src/events/hello.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { event } from 'chapterjs';

export default event({
  name: 'threadMemberJoin',
  async run({ thread, member }) {
    await thread.send(`Bienvenue dans le fil, ${member.displayName} !`);
  },
});
```

Ils ont besoin du **Server Members Intent** : sans lui, Discord ne dit que quand votre bot lui-même rejoint un fil.

## Présences

`presenceUpdate` tourne quand le statut ou l’activité de quelqu’un change : en ligne, absent, en train de jouer. `presence` a les champs d’une [`UserPresence`](https://www.chapterjs.org/fr/reference/data#userpresence) (`status`, `activities`, `clientStatus`), plus à qui elle est : `userId`, et `user` et `member` quand le bot les connaît.

```ts src/events/games.ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import { event } from 'chapterjs';

export default event({
  name: 'presenceUpdate',
  run({ presence }) {
    const { userId, user } = presence;
    const game = presence.activities.find(activity => activity.type === 0);
    if (game) console.log(`${user?.username ?? userId} joue à ${game.name}`);
  },
});
```

Il a besoin du **Presence Intent**, privilégié, et Discord l’envoie souvent : une fois pour chaque serveur que votre bot partage avec cette personne, à chaque changement. N’ajoutez un tel fichier que quand votre bot en a vraiment besoin.

## Intents

Chaque groupe d’événements a son intent, et ChapterJS ne demande que ceux dont vos fichiers ont besoin :

| Événements | Intent | Privilégié |
| - | - | - |
| `banAdd`, `banRemove`, `auditLogEntryCreate` | `GUILD_MODERATION` | Non |
| `emojiCreate`, `emojiUpdate`, `emojiDelete` | `GUILD_EXPRESSIONS` | Non |
| `inviteCreate`, `inviteDelete` | `GUILD_INVITES` | Non |
| `scheduledEvent…` | `GUILD_SCHEDULED_EVENTS` | Non |
| `guildUpdate` | `GUILDS` | Non |
| `threadMemberJoin`, `threadMemberLeave` | `GUILD_MEMBERS` | Server Members Intent |
| `presenceUpdate` | `GUILD_PRESENCES` | Presence Intent |

> [card] [Référence des événements](https://www.chapterjs.org/fr/reference/events.md#guildupdate)
>
> Chaque champ de chaque événement.

> [card] [Guild](https://www.chapterjs.org/fr/reference/guild.md)
>
> Tout ce qu’a un serveur, et ce que votre bot peut en faire.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.