---
title: "Actualizări live: modifică mesajele mssgs după postare"
description: "Actualizează sau șterge un mesaj mssgs după postare prin callback URL, arată progresul cu un loader și urmărește live răspunsuri, reacții și butoane."
canonical: https://docs.mss.gs/ro/live-updates
language: ro
---

# Actualizează mesajele live

Un mesaj nu trebuie să rămână așa cum a fost postat. Arată progresul cât timp rulează o sarcină, înlocuiește loaderul cu rezultatul, scoate butoanele după ce cineva a decis sau șterge mesajul. Toată lumea din canal vede schimbarea imediat.

## Ce poți face

- **Actualizează cardul** Schimbă textul, culoarea și butoanele, pe loc.

- **Arată progresul** Un loader care trece prin pași, apoi rezultatul.

- **Șterge-l** Elimină un mesaj când nu mai este valabil.

- **Ascultă-l** Răspunsuri, reacții și apăsări de butoane la mesajul tău, live.

În aplicație

Postat cu un loader

Actualizat: pasul 2 din 3

#### Deploy finalizat

Actualizat: gata, cu un buton

Un singur mesaj, actualizat de două ori prin callback URL-ul său. Nimeni nu vede trei mesaje, ci doar unul care se schimbă.

- [Start rapid](#quick-start)

- [Actualizare](#update)

- [Progres](#progress)

- [Ștergere](#delete)

- [Ascultare](#stream)

## Start rapid

### Păstrează callback URL-ul

Fiecare postare prin [webhook](https://docs.mss.gs/ro/webhooks) și fiecare cerere de [comandă](https://docs.mss.gs/ro/commands) vine cu un callback_url pentru acel mesaj.

```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 pentru actualizare

Trimite noua stare. Cardul se schimbă pe loc pentru toată lumea.

```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 pentru ștergere

Nu e nevoie de body.

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

## Actualizarea unui mesaj

Trimite JSON prin PUT la callback_url . Trimite doar ce vrei să schimbi.

| Câmp | Tip | Ce face |
| --- | --- | --- |
| message_container | object | Noul card. Vezi [cardurile de mesaj](https://docs.mss.gs/ro/bots). |
| actions | array | Butoane noi. "actions": [] le elimină pe toate; dacă lași câmpul deoparte, ele rămân. |
| content | string | Text nou. |
| title , description , color , loader , ... | string | Prescurtare: câmpurile de card de la nivelul de sus sunt împachetate automat într-un card. |

### Răspunsuri

| Status | Cod | Înseamnă |
| --- | --- | --- |
| 200 | {"success": true} | Acceptat. Actualizarea urmează imediat. |
| 400 | MISSING_FIELDS | Nu e nimic de actualizat în body. |
| 400 | INVALID_BODY | Body-ul nu este JSON valid. |
| 400 | un cod de buton | Ceva nu e în regulă cu un buton, vezi [butoanele](https://docs.mss.gs/ro/buttons). |
| 401 | INVALID_TOKEN | URL-ul nu este valid. |
| 404 | TOKEN_NOT_FOUND | URL-ul a expirat sau a fost folosit pentru a șterge mesajul. |
| 502 | PUBLISH_FAILED | Actualizarea nu a putut fi livrată. Încearcă din nou. |

### Cât timp funcționează

30 de minute din momentul în care mesajul a fost postat sau comanda a fost folosită. O actualizare nu prelungește acest timp. Ștergerea mesajului consumă URL-ul. Prin actualizare nu se pot adăuga fișiere.

## Afișarea progresului

Postează un card cu un loader, actualizează-i subtextul pe măsură ce sarcina avansează și încheie cu rezultatul. Loaderul este un spinner cu un rând de text și un rând mai mic sub el ( 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' }]
});
```

## Ștergerea unui mesaj

Trimite DELETE la callback_url și mesajul dispare pentru toată lumea. După aceea, URL-ul nu mai poate fi folosit.

## Ascultarea unui mesaj

Un stream_url este un flux live (Server-Sent Events) cu tot ce se întâmplă la mesajul tău. Deschide-l și evenimentele sosesc pe măsură ce au loc, fiecare ca un rând JSON data: al cărui type spune ce este:

```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: {}
```

| Eveniment | Când | Date |
| --- | --- | --- |
| action | A fost apăsat un buton. | action_id și butonul salvat în action , cu payload -ul lui |
| reaction | A fost adăugată sau eliminată o reacție. | emoji și action : add, remove sau removeall |
| reply | Cineva a răspuns la mesaj. | content -ul răspunsului |
| expired | Fluxul se închide. Trimis ca eveniment cu nume. | Niciuna |

### Ascultarea în 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();
});
```

### De unde primești unul

| De unde provine | Deschis timp de |
| --- | --- |
| O postare prin webhook cu butoane | 10 minute sau o oră cu "sse_event_extended_timeout": true |
| Fiecare cerere de comandă | 10 minute |

### Erori

| Status | Cod | Înseamnă |
| --- | --- | --- |
| 401 | INVALID_TOKEN | Tokenul din URL este greșit. |
| 404 | NOT_FOUND | Fluxul a expirat sau nu a existat niciodată. |

## Construiește mai departe
