---
title: "Ažuriranja uživo: mijenjaj mssgs poruke nakon slanja"
description: "Ažuriraj ili izbriši mssgs poruku nakon slanja preko njezinog callback URL-a, prikaži napredak loaderom i prati odgovore, reakcije i gumbe uživo."
canonical: https://docs.mss.gs/hr/live-updates
language: hr
---

# Ažuriraj poruke uživo

Poruka ne mora ostati onakva kakva je objavljena. Prikaži napredak dok posao traje, zamijeni loader rezultatom, ukloni gumbe kad netko odluči ili je izbriši. Svi u kanalu odmah vide promjenu.

## Što možeš napraviti

- **Ažuriraj karticu** Promijeni tekst, boju i gumbe na istom mjestu.

- **Prikaži napredak** Loader koji prolazi kroz korake, a zatim rezultat.

- **Izbriši je** Ukloni poruku kad više ne vrijedi.

- **Slušaj je** Odgovori, reakcije i pritisci gumba na tvojoj poruci, uživo.

U aplikaciji

Objavljena s loaderom

Ažurirana: korak 2 od 3

#### Deploy je završen

Ažurirana: gotovo, s gumbom

Jedna poruka, dvaput ažurirana preko svog callback URL-a. Nitko ne vidi tri poruke, samo jednu koja se mijenja.

- [Brzi početak](#quick-start)

- [Ažuriranje](#update)

- [Napredak](#progress)

- [Brisanje](#delete)

- [Slušanje](#stream)

## Brzi početak

### Sačuvaj callback URL

Svaka objava putem [webhooka](https://docs.mss.gs/hr/webhooks) i svaki zahtjev [naredbe](https://docs.mss.gs/hr/commands) dolazi s callback_url za tu poruku.

```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 za ažuriranje

Pošalji novo stanje. Kartica se mijenja na istom mjestu za sve.

```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 za uklanjanje

Tijelo zahtjeva nije potrebno.

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

## Ažuriranje poruke

Pošalji JSON metodom PUT na callback_url . Šalji samo ono što želiš promijeniti.

| Polje | Tip | Što radi |
| --- | --- | --- |
| message_container | object | Nova kartica. Pogledaj [kartice poruka](https://docs.mss.gs/hr/bots). |
| actions | array | Novi gumbi. "actions": [] uklanja sve; ako polje izostaviš, gumbi ostaju. |
| content | string | Novi tekst. |
| title , description , color , loader , ... | string | Skraćeni oblik: polja kartice na najvišoj razini automatski se pakiraju u karticu. |

### Odgovori

| Status | Kôd | Značenje |
| --- | --- | --- |
| 200 | {"success": true} | Prihvaćeno. Ažuriranje slijedi odmah nakon toga. |
| 400 | MISSING_FIELDS | U tijelu zahtjeva nema ničega za ažuriranje. |
| 400 | INVALID_BODY | Tijelo zahtjeva nije ispravan JSON. |
| 400 | kôd gumba | Nešto nije u redu s gumbom, pogledaj [gumbe](https://docs.mss.gs/hr/buttons). |
| 401 | INVALID_TOKEN | URL nije ispravan. |
| 404 | TOKEN_NOT_FOUND | URL je istekao ili je iskorišten za brisanje poruke. |
| 502 | PUBLISH_FAILED | Ažuriranje nije moglo biti isporučeno. Pokušaj ponovno. |

### Koliko dugo radi

30 minuta od trenutka kad je poruka objavljena ili kad je naredba upotrijebljena. Ažuriranje ne produljuje taj rok. Brisanjem poruke URL se troši. Kroz ažuriranje ne možeš dodavati datoteke.

## Prikaz napretka

Objavi karticu s loaderom, ažuriraj njezin podtekst kako posao napreduje i završi rezultatom. Loader je spinner s jednim retkom teksta i manjim retkom ispod njega ( 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' }]
});
```

## Brisanje poruke

Pošalji DELETE na callback_url i poruka nestaje za sve. Nakon toga URL se više ne može koristiti.

## Slušanje poruke

stream_url je stream uživo (Server-Sent Events) onoga što se događa s tvojom porukom. Otvori ga i događaji stižu čim se dogode, svaki kao JSON redak data: čiji type govori o čemu je riječ:

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

| Događaj | Kada | Podaci |
| --- | --- | --- |
| action | Pritisnut je gumb. | action_id te spremljeni gumb u action s njegovim payload |
| reaction | Reakcija je dodana ili uklonjena. | emoji te action : add, remove ili removeall |
| reply | Netko je odgovorio na poruku. | content odgovora |
| expired | Stream se zatvara. Šalje se kao imenovani događaj. | Nema |

### Slušanje u JavaScriptu

```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();
});
```

### Gdje ga dobivaš

| Odakle dolazi | Otvoren |
| --- | --- |
| Objava putem webhooka s gumbima | 10 minuta ili sat vremena uz "sse_event_extended_timeout": true |
| Svaki zahtjev naredbe | 10 minuta |

### Pogreške

| Status | Kôd | Značenje |
| --- | --- | --- |
| 401 | INVALID_TOKEN | Token u URL-u nije ispravan. |
| 404 | NOT_FOUND | Stream je istekao ili nikad nije postojao. |

## Nastavi graditi
