---
title: "Mises à jour en direct : modifier un message mssgs publié"
description: "Modifie ou supprime un message mssgs publié via son URL de callback, affiche une progression et écoute réponses, réactions et appuis sur un flux en direct."
canonical: https://mss.gs/fr/docs/live-updates
language: fr
---

# Mettre à jour des messages en direct

Un message n’a pas à rester tel qu’il a été publié. Affiche la progression pendant qu’une tâche tourne, remplace un chargement par le résultat, retire les boutons une fois que quelqu’un a décidé, ou supprime-le. Tout le monde dans le salon voit le changement aussitôt.

## Ce que vous pouvez faire

- **Mettre à jour la carte** Change le texte, la couleur et les boutons, sur place.

- **Afficher la progression** Un chargement qui passe par des étapes, puis le résultat.

- **Le supprimer** Retire un message quand il n’est plus vrai.

- **L’écouter** Les réponses, réactions et appuis sur les boutons de ton message, en direct.

Dans l'app

Publiée avec un chargement

Mise à jour : étape 2 sur 3

#### Déploiement terminé

Mise à jour : terminée, avec un bouton

Un seul message, mis à jour deux fois via son URL de callback. Personne ne voit trois messages, seulement un qui change.

- [Démarrage rapide](#quick-start)

- [Mettre à jour](#update)

- [Afficher la progression](#progress)

- [Supprimer](#delete)

- [Écouter](#stream)

## Démarrage rapide

### Garde l’URL de callback

Chaque publication par [webhook](https://mss.gs/fr/docs/webhooks) et chaque requête de [commande](https://mss.gs/fr/docs/commands) arrive avec une callback_url pour ce message.

```bash
BODY='{"message_container": {"color": "blue", "loader": true, "loader_text": "Deploying…"}}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$MSSGS_WEBHOOK_SECRET" | sed 's/^.* //')

curl -X POST "$MSSGS_WEBHOOK_URL" -H "Content-Type: application/json" \
  -H "X-Mssgs-Signature: sha256=$SIG" -d "$BODY"

# {"success": true, "message_id": "...", "callback_url": "https://mss.gs/api/v1/trigger-callback/8f14e45f-..."}
```

### PUT pour mettre à jour

Envoie le nouvel état. La carte change sur place pour tout le monde.

```bash
curl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \
  -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'
```

### DELETE pour supprimer

Aucun corps nécessaire.

```bash
curl -X DELETE "$CALLBACK_URL"
```

## Mettre à jour un message

Envoie du JSON en PUT à la callback_url . N’envoie que ce que tu veux changer.

| Champ | Type | Ce qu’il fait |
| --- | --- | --- |
| message_container | object | La nouvelle carte. Voir [cartes de message](https://mss.gs/fr/docs/bots). |
| actions | array | De nouveaux boutons. "actions": [] les retire tous ; sans le champ, ils sont conservés. |
| content | string | Un nouveau texte. |
| title , description , color , loader , ... | string | Raccourci : les champs de carte placés au premier niveau sont regroupés dans une carte pour toi. |

### Réponses

| Statut | Code | Signification |
| --- | --- | --- |
| 200 | {"success": true} | Acceptée. La mise à jour suit juste après. |
| 400 | MISSING_FIELDS | Rien à mettre à jour dans le corps. |
| 400 | INVALID_BODY | Le corps n’est pas du JSON valide. |
| 400 | un code de bouton | Un bouton pose problème, voir [boutons](https://mss.gs/fr/docs/buttons). |
| 401 | INVALID_TOKEN | L’URL n’est pas valide. |
| 404 | TOKEN_NOT_FOUND | L’URL a expiré ou a servi à supprimer le message. |
| 502 | PUBLISH_FAILED | La mise à jour n’a pas pu être livrée. Réessaie. |

### Combien de temps elle fonctionne

30 minutes à partir du moment où le message a été publié, ou où la commande a été utilisée. Une mise à jour ne prolonge pas ce délai. Supprimer le message rend l’URL inutilisable. Une mise à jour ne permet pas d’ajouter des fichiers.

## Afficher la progression

Publie une carte avec un chargement, mets à jour sa ligne secondaire à mesure que la tâche avance, et termine sur le résultat. Le chargement est un indicateur qui tourne, avec une ligne et une ligne plus petite en dessous ( loader_text , loader_sub_text ).

```javascript
const { callback_url } = await post({
  message_container: { color: 'blue', loader: true, loader_text: 'Deploying…', loader_sub_text: 'Step 1 of 3: building' }
});

const update = (body) => {
  return fetch(callback_url, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
};

await build();
await update({ message_container: { color: 'blue', loader: true, loader_text: 'Deploying…', loader_sub_text: 'Step 2 of 3: running migrations' } });

await migrate();
await update({
  message_container: { color: 'green', title: 'Deploy complete', description: 'v2.1 is live on production.' },
  actions: [{ type: 'url:https://ci.example.com/deploys/218', text: 'View logs', color: 'green' }]
});
```

## Supprimer un message

Envoie DELETE à la callback_url et le message disparaît pour tout le monde. L’URL ne peut plus servir ensuite.

## Écouter un message

Une stream_url est un flux en direct (Server-Sent Events) de ce qui se passe sur ton message. Ouvre-la et les événements arrivent au fur et à mesure, chacun sous forme de ligne JSON data: dont le type indique de quoi il s’agit :

```sse
curl -N "$STREAM_URL"

data: {"type": "reaction", "message_id": "...", "emoji": ":tada:", "action": "add", "member_guid": "...", "member": {...}, "ts": 1790000000000}

data: {"type": "action", "message_id": "...", "action_id": "approve", "action": {"id": "approve", "payload": {"deploy": 218}, ...}, "member_guid": "...", "member": {...}, "ts": 1790000004200}

data: {"type": "reply", "message_id": "...", "content": "Ship it!", "member_guid": "...", "member": {...}, "ts": 1790000009800}

event: expired
data: {}
```

| Événement | Quand | Données |
| --- | --- | --- |
| action | Un bouton a été pressé. | action_id , et le bouton stocké dans action avec son payload |
| reaction | Une réaction a été ajoutée ou retirée. | emoji , et action : add, remove ou removeall |
| reply | Quelqu’un a répondu au message. | Le content de la réponse |
| expired | Le flux se ferme. Envoyé comme événement nommé. | Aucune |

### Écouter en JavaScript

```javascript
const events = new EventSource(streamUrl);

// Every event arrives as a plain message; its kind is in "type".
events.onmessage = (e) => {
  const ev = JSON.parse(e.data);
  if ((ev.type === 'action') && (ev.action_id === 'approve')) {
    startDeploy(ev.action.payload.deploy);
  }
};

// The one named event: the stream is closing.
events.addEventListener('expired', () => {
  events.close();
});
```

### Où en obtenir une

| D’où elle vient | Ouverte pendant |
| --- | --- |
| Une publication par webhook avec des boutons | 10 minutes, ou une heure avec "sse_event_extended_timeout": true |
| Chaque requête de commande | 10 minutes |

### Erreurs

| Statut | Code | Signification |
| --- | --- | --- |
| 401 | INVALID_TOKEN | Le jeton dans l’URL est faux. |
| 404 | NOT_FOUND | Le flux a expiré ou n’a jamais existé. |

## Continuer
