> ## 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.

# Message

> Un message envoyé dans un salon : ce qu’il contient, et comment y répondre, le modifier, y réagir, l’épingler et démarrer un fil depuis lui

Un `Message` est un message envoyé dans un salon. Vous en obtenez un depuis les [événements sur les messages](https://www.chapterjs.org/fr/events/messages.md), depuis ce que renvoient `send()` et `reply()`, et depuis `fetchMessage()` et `fetchMessages()` sur un salon.

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import type { Message } from 'chapterjs';

async function onPing(message: Message) {
  if (!message.isFromUser) return; // ignore les bots, les webhooks et les messages système
  if (message.content !== '!ping') return;

  const reply = await message.reply('Pong !');
  await reply.react('🏓');
}
```

> [!NOTE]
>
> Comment envoyer, modifier et lire des messages est dans [Envoyer des messages](https://www.chapterjs.org/fr/messages.md) ; tout ce qu’acceptent `reply()` et `edit()` est dans [Options des messages](https://www.chapterjs.org/fr/reference/message-options.md).

> [!WARNING]
>
> `content`, `embeds` et `attachments` sont vides pour les messages des autres sauf si le **Message Content Intent** est activé pour votre bot. Les messages qui mentionnent le bot, et les messages privés, ont toujours leur contenu.

## Propriétés

**id** `Snowflake`

L’identifiant unique que Discord lui a donné.

**createdAt** `Date`

Quand il a été créé : un identifiant Discord contient sa date de création.

**author** `User`

Qui a écrit le message.

**mentions** `readonly User[]`

Les utilisateurs mentionnés dans le message.

**channelId** `Snowflake`

L’identifiant du salon du message.

**guildId** `Snowflake | null`

L’identifiant du serveur ; `null` pour un message privé.

**channel** `TextBasedChannel | null`

Le salon du message, quand il est connu.

**guild** `Guild | null`

Le serveur du message ; `null` pour un message privé.

**member** `GuildMember | null`

L’auteur en tant que membre du serveur, quand il est connu.

**content** `string`

Le texte du message. Vide quand le bot n’a pas le droit de le lire : lire les messages des autres demande le Message Content Intent.

**type** `MessageType`

La sorte de message, sous forme de valeur de [`MessageType`](https://www.chapterjs.org/fr/reference/enums#messagetype) (un message normal, une réponse, un avis d’arrivée...).

**editedAt** `Date | null`

Quand le message a été modifié pour la dernière fois ; `null` quand il ne l’a jamais été.

**pinned** `boolean`

Si le message est épinglé.

**tts** `boolean`

Si le message a été lu à voix haute.

**embeds** `Embed[]`

Les embeds du message. Chaque entrée est un [`Embed`](https://www.chapterjs.org/fr/reference/message-options#embed).

**attachments** `Attachment[]`

Les fichiers joints au message. Chaque entrée est un [`Attachment`](https://www.chapterjs.org/fr/reference/data#attachment).

**reactions** `Reaction[]`

Les réactions sur le message, une entrée par emoji. Chaque entrée est une [`Reaction`](https://www.chapterjs.org/fr/reference/data#reaction).

**mentionsEveryone** `boolean`

Si le message mentionne @everyone ou @here.

**mentionedRoleIds** `readonly Snowflake[]`

Les identifiants des rôles mentionnés dans le message.

**flags** `MessageFlagName[]`

Les drapeaux du message, par nom (`Ephemeral`, `SuppressEmbeds`...).

**webhookId** `Snowflake | null`

L’identifiant du webhook qui a envoyé le message, quand c’en est un.

**repliedMessageId** `Snowflake | null`

L’identifiant du message auquel celui-ci répond, quand c’est une réponse.

**isFromUser** `boolean`

Si une personne l’a écrit : pas un bot, un webhook ou Discord lui-même.

**url** `string`

Le lien qui ouvre le message dans Discord.

## Helpers

Ils lisent ce que le bot sait déjà : ils n’envoient jamais de requête.

### toJSON()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
toJSON(): object
```

Les données de Discord sous forme d’objet simple, avec des noms en camelCase.

## Lire depuis Discord

### fetch()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
fetch(): Promise<Message>
```

Demande à Discord la dernière version du message.

[Documentation de Discord](https://docs.discord.com/developers/resources/message#get-channel-message)

### fetchReactionUsers()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
fetchReactionUsers(emoji: EmojiInput, options?: { limit?: number; after?: Snowflake }): Promise<User[]>
```

Les utilisateurs qui ont réagi avec un emoji (100 au plus par appel).

[Documentation de Discord](https://docs.discord.com/developers/resources/message#get-reactions)

## Actions

### reply()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
reply(message: MessageInput): Promise<Message>
```

Répond au message, dans le même salon. Ce qu’elle accepte est un [`MessageInput`](https://www.chapterjs.org/fr/reference/message-options#messageinput).

[Documentation de Discord](https://docs.discord.com/developers/resources/message#create-message)

### edit()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
edit(message: string | MessageEditOptions): Promise<Message>
```

Modifie le message. Seuls le contenu, les embeds, les composants et les fichiers d’un message écrit par le bot peuvent changer. Les options sont un [`MessageEditOptions`](https://www.chapterjs.org/fr/reference/message-options#messageeditoptions).

[Documentation de Discord](https://docs.discord.com/developers/resources/message#edit-message)

### delete()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
delete(reason?: string): Promise<void>
```

Supprime le message.

[Documentation de Discord](https://docs.discord.com/developers/resources/message#delete-message)

### react()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
react(emoji: EmojiInput): Promise<void>
```

Ajoute une réaction du bot au message.

[Documentation de Discord](https://docs.discord.com/developers/resources/message#create-reaction)

### removeReaction()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
removeReaction(emoji: EmojiInput, user?: Snowflake | { id: Snowflake }): Promise<void>
```

Retire une réaction : celle du bot, ou celle de l’utilisateur donné.

[Documentation de Discord](https://docs.discord.com/developers/resources/message#delete-user-reaction)

### clearReactions()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
clearReactions(emoji?: EmojiInput): Promise<void>
```

Retire toutes les réactions du message, ou toutes celles d’un emoji.

[Documentation de Discord](https://docs.discord.com/developers/resources/message#delete-all-reactions)

### pin()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
pin(reason?: string): Promise<void>
```

Épingle le message dans son salon.

[Documentation de Discord](https://docs.discord.com/developers/resources/message#pin-message)

### unpin()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
unpin(reason?: string): Promise<void>
```

Désépingle le message.

[Documentation de Discord](https://docs.discord.com/developers/resources/message#unpin-message)

### crosspost()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
crosspost(): Promise<Message>
```

Publie un message d’un salon d’annonces vers les serveurs qui le suivent.

[Documentation de Discord](https://docs.discord.com/developers/resources/message#crosspost-message)

### startThread()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
startThread(
  options: { name: string; autoArchiveDuration?: number; rateLimitPerUser?: number | null },
  reason?: string
): Promise<ThreadChannel>
```

Démarre un fil depuis le message.

**name** `string` *required*

Le nom du fil, de 1 à 100 caractères.

**autoArchiveDuration** `number`

Au bout de combien de minutes sans activité le fil quitte la liste des salons : 60, 1440, 4320 ou 10080.

**rateLimitPerUser** `number | null`

Combien de secondes un membre attend entre deux messages (0 à 21600).

[Documentation de Discord](https://docs.discord.com/developers/resources/channel#start-thread-from-message)

## Attendre

Elles attendent ce qui suit sur le message, tant que votre bot tourne : un redémarrage termine l’attente. Comment les utiliser est dans le [guide](https://www.chapterjs.org/fr/waiting.md).

### waitForClick()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
waitForClick(options?: WaitForClickOptions): Promise<Click | null>
```

Attend un clic sur un bouton ou un menu de ce message : d’une personne (`from`), n’importe qui par défaut. Donne le clic, auquel répondre avec `click.interaction`, ou `null` quand `within` (une minute par défaut) est passé avant. Un clic pris ici n’exécute pas le `run` du bouton ; un bouton qui n’est qu’attendu n’en a pas besoin. Un redémarrage du bot termine l’attente.

### waitForReaction()

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
waitForReaction(options?: WaitForReactionOptions): Promise<WaitedReaction | null>
```

Attend une réaction ajoutée à ce message : d’une personne (`from`), celle de n’importe qui sauf un bot par défaut, avec un emoji (`emoji`), n’importe lequel par défaut. La donne, ou `null` quand `within` (une minute par défaut) est passé avant. Un redémarrage du bot termine l’attente.

## Types

### GuildMessage

Un message d’un serveur : son serveur est connu. C’est ce que donnent les événements sur les messages pour ce qui se passe sur un serveur.

**guildId** `Snowflake`

L’identifiant du serveur.

**guild** `Guild`

Le serveur du message.

**channel** `GuildTextBasedChannel`

Le salon du message.

### MemberMessage

Un message écrit sur un serveur par un de ses membres : ni un message privé ni le message d’un webhook. C’est ce que donnent les événements sur les messages par défaut. Il a tout ce qu’a `GuildMessage`, et :

**member** `GuildMember`

L’auteur en tant que membre du serveur.

### PrivateMessage

Un message privé, pour un fichier qui reçoit les deux sortes (`{ where: 'both' }`) : il n’y a pas de serveur, ce qui permet de le distinguer d’un `GuildMessage`.

**guildId** `null`

Pas de serveur : c’est un message privé.

**guild** `null`

Pas de serveur : c’est un message privé.

**member** `null`

Pas de membre : l’auteur est `author`.

**channel** `DMChannel | null`

La conversation privée, quand le bot la connaît.

### DmMessage

Un message privé, pour un fichier qui ne reçoit que ceux-là (`{ where: 'dm' }`) : rien qui concerne un serveur n’existe dessus. `guildId`, `guild` et `member` ne sont même pas proposés par votre éditeur.

**channel** `DMChannel | null`

La conversation privée, quand le bot la connaît.

Vous n’avez besoin de ces noms que pour typer une fonction à vous :

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
import type { MemberMessage } from 'chapterjs';

export function xpFor(message: MemberMessage): number {
  return message.member.roles.length + message.content.length;
}
```

### EmojiInput

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
type EmojiInput = string | { id?: Snowflake | null; name?: string | null }
```

Un emoji avec lequel réagir : un emoji standard (`"👍"`), ou un emoji personnalisé. Les méthodes qui en prennent un acceptent :

* un emoji standard : `'👍'`
* un emoji personnalisé tel que l’écrit Discord : `'<:name:123456789012345678>'` (ou `'<a:name:…>'` quand il est animé)
* un emoji personnalisé sous forme d’objet : `{ id: '123456789012345678', name: 'name' }`, ou un [`GuildEmoji`](https://www.chapterjs.org/fr/reference/emoji)

Un texte vide est refusé avant tout envoi :

```text theme={"theme":{"light":"github-light","dark":"vesper"}}
The emoji is empty: pass one like "👍".
```

### MessageFlagName

```ts theme={"theme":{"light":"github-light","dark":"vesper"}}
type MessageFlagName = keyof typeof MessageFlags
```

Le nom d’un drapeau d’un message : une clé de [`MessageFlags`](https://www.chapterjs.org/fr/reference/enums#messageflags). C’est ce que liste `flags`.

### WaitForClickOptions

Ce que prend `waitForClick()`.

**from** `PersonInput`

Seulement un clic de cette personne. N’importe qui par défaut. Un [`PersonInput`](https://www.chapterjs.org/fr/reference/channels#personinput).

**within** `Duration`

Combien de temps attendre : `'30s'`, `'2m'`. Une minute par défaut.

### Click

Un clic sur un bouton ou un menu d’un message, tel que le donne `waitForClick()`.

**interaction** `ComponentInteraction`

Le clic lui-même : répondez-y comme dans le `run` d’un bouton, avec `update()`, `reply()` ou `deferUpdate()`. Sans réponse dans les 2 secondes, le bot ne change rien à l’écran pour vous (`deferUpdate()`).

**user** `User`

Qui a cliqué.

**member** `GuildMember | null`

Qui a cliqué, en tant que membre du serveur ; `null` en message privé.

**name** `string`

Le nom du bouton ou du menu : le nom de son export.

**data** `Readonly\<Record\<string, string | number | boolean\>\>`

Les données que porte le bouton ou le menu.

**values** `readonly string[]`

Ce qui a été choisi dans un menu : les valeurs d’un menu de textes, les identifiants des personnes, rôles ou salons des autres. Vide pour un bouton.

**is** `(component: ButtonDeclaration\<never\> | SelectDeclaration\<never\>) =\> boolean`

Si c’est ce bouton ou ce menu.

### WaitForReactionOptions

Ce que prend `waitForReaction()`.

**from** `PersonInput`

Seulement une réaction de cette personne. N’importe qui sauf un bot par défaut.

**emoji** `string`

Seulement cet emoji : un emoji standard (`'👍'`), ou un emoji personnalisé par son nom, son identifiant ou tel que Discord l’écrit (`'<:party:123>'`).

**within** `Duration`

Combien de temps attendre : `'30s'`, `'2m'`. Une minute par défaut.

### WaitedReaction

Une réaction ajoutée à un message, telle que la donne `waitForReaction()`.

**emoji** `ReactionEmoji`

L’emoji.

**user** `User`

Qui a réagi.

**member** `GuildMember | null`

Qui a réagi, en tant que membre du serveur ; `null` en message privé.

### Ailleurs

* [`Attachment`](https://www.chapterjs.org/fr/reference/data#attachment) et [`Reaction`](https://www.chapterjs.org/fr/reference/data#reaction) : les entrées de `attachments` et `reactions`.
* [`Embed`](https://www.chapterjs.org/fr/reference/message-options#embed) : les entrées de `embeds`, et ce que vous envoyez.
* [`MessageInput`](https://www.chapterjs.org/fr/reference/message-options#messageinput) et [`MessageEditOptions`](https://www.chapterjs.org/fr/reference/message-options#messageeditoptions) : ce que prennent `reply()` et `edit()`.


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