---
title: "Posodobitve v živo: spreminjaj sporočila mssgs po objavi"
description: "Posodobi ali izbriši sporočilo mssgs po objavi prek njegovega callback URL-ja, pokaži napredek z indikatorjem in v živo spremljaj odgovore, reakcije in gumbe."
canonical: https://docs.mss.gs/sl/live-updates
language: sl
---

# Posodabljaj sporočila v živo

Ni nujno, da sporočilo ostane tako, kot je bilo objavljeno. Pokaži napredek, medtem ko opravilo teče, zamenjaj indikator nalaganja z rezultatom, odstrani gumbe, ko se je kdo odločil, ali sporočilo izbriši. Vsi v kanalu spremembo vidijo takoj.

## Kaj lahko narediš

- **Posodobi kartico** Spremeni besedilo, barvo in gumbe, kar na istem mestu.

- **Pokaži napredek** Indikator nalaganja, ki gre skozi korake, nato pa rezultat.

- **Izbriši ga** Odstrani sporočilo, ko ne drži več.

- **Prisluhni mu** Odgovori, reakcije in pritiski gumbov na tvojem sporočilu, v živo.

V aplikaciji

Objavljeno z indikatorjem nalaganja

Posodobljeno: korak 2 od 3

#### Namestitev končana

Posodobljeno: končano, z gumbom

Eno sporočilo, dvakrat posodobljeno prek njegovega callback URL-ja. Nihče ne vidi treh sporočil, le eno, ki se spreminja.

- [Hiter začetek](#quick-start)

- [Posodobitev](#update)

- [Napredek](#progress)

- [Brisanje](#delete)

- [Poslušanje](#stream)

## Hiter začetek

### Shrani callback URL

Vsaka objava prek [webhooka](https://docs.mss.gs/sl/webhooks) in vsaka zahteva [ukaza](https://docs.mss.gs/sl/commands) prinese callback_url za to sporočilo.

```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 posodobitev

Pošlji novo stanje. Kartica se spremeni na mestu, za vse.

```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 odstranitev

Telo ni potrebno.

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

## Posodobi sporočilo

Pošlji JSON z metodo PUT na callback_url . Pošlji samo tisto, kar želiš spremeniti.

| Polje | Tip | Kaj naredi |
| --- | --- | --- |
| message_container | object | Nova kartica. Glej [kartice sporočil](https://docs.mss.gs/sl/bots). |
| actions | array | Novi gumbi. "actions": [] jih odstrani vse; če polje izpustiš, ostanejo. |
| content | string | Novo besedilo. |
| title , description , color , loader , ... | string | Okrajšava: polja kartice na najvišji ravni se samodejno zavijejo v kartico. |

### Odgovori

| Status | Koda | Pomen |
| --- | --- | --- |
| 200 | {"success": true} | Sprejeto. Posodobitev sledi takoj zatem. |
| 400 | MISSING_FIELDS | V telesu ni ničesar za posodobitev. |
| 400 | INVALID_BODY | Telo ni veljaven JSON. |
| 400 | koda gumba | Z gumbom je nekaj narobe, glej [gumbe](https://docs.mss.gs/sl/buttons). |
| 401 | INVALID_TOKEN | URL ni veljaven. |
| 404 | TOKEN_NOT_FOUND | URL je potekel ali pa je bil uporabljen za brisanje sporočila. |
| 502 | PUBLISH_FAILED | Posodobitve ni bilo mogoče dostaviti. Poskusi znova. |

### Kako dolgo deluje

30 minut od trenutka, ko je bilo sporočilo objavljeno ali je bil ukaz uporabljen. Posodobitev tega časa ne podaljša. Z izbrisom sporočila se URL porabi. Datotek s posodobitvijo ni mogoče dodati.

## Pokaži napredek

Objavi kartico z indikatorjem nalaganja, med potekom opravila posodabljaj njeno podbesedilo in končaj z rezultatom. Indikator je vrtavka z vrstico besedila in manjšo vrstico pod njo ( 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' }]
});
```

## Izbriši sporočilo

Pošlji DELETE na callback_url in sporočilo izgine za vse. URL-ja potem ni več mogoče uporabiti.

## Prisluhni sporočilu

stream_url je tok v živo (Server-Sent Events) vsega, kar se dogaja s tvojim sporočilom. Odpri ga in dogodki prihajajo sproti, vsak kot vrstica JSON data: , katere type pove, za kaj gre:

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

| Dogodek | Kdaj | Podatki |
| --- | --- | --- |
| action | Nekdo je pritisnil gumb. | action_id in shranjeni gumb v action z njegovim payload |
| reaction | Reakcija je bila dodana ali odstranjena. | emoji in action : add, remove ali removeall |
| reply | Nekdo je odgovoril na sporočilo. | content odgovora |
| expired | Tok se zapira. Poslano kot poimenovan dogodek. | Brez |

### Poslušanje v 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();
});
```

### Kje ga dobiš

| Od kod pride | Odprt |
| --- | --- |
| Objava prek webhooka z gumbi | 10 minut ali eno uro z "sse_event_extended_timeout": true |
| Vsaka zahteva ukaza | 10 minut |

### Napake

| Status | Koda | Pomen |
| --- | --- | --- |
| 401 | INVALID_TOKEN | Token v URL-ju je napačen. |
| 404 | NOT_FOUND | Tok je potekel ali pa ni nikoli obstajal. |

## Gradi naprej
