---
title: "Liveuppdateringar: ändra mssgs-meddelanden efter att de postats"
description: "Uppdatera eller radera ett mssgs-meddelande via dess callback-URL, visa förloppet med ett laddningskort och lyssna live på svar, reaktioner och knapptryck."
canonical: https://mss.gs/sv/docs/live-updates
language: sv
---

# Uppdatera meddelanden live

Ett meddelande behöver inte stanna som det postades. Visa förloppet medan ett jobb körs, byt ett laddningskort mot resultatet, ta bort knapparna när någon har bestämt sig, eller radera det. Alla i kanalen ser ändringen direkt.

## Det här kan du göra

- **Uppdatera kortet** Ändra texten, färgen och knapparna, på plats.

- **Visa förloppet** En laddningsindikator som går igenom steg, och sedan resultatet.

- **Radera det** Ta bort ett meddelande när det inte längre stämmer.

- **Lyssna på det** Svar, reaktioner och knapptryck på ditt meddelande, live.

I appen

Postat med en laddningsindikator

Uppdaterat: steg 2 av 3

#### Deployen är klar

Uppdaterat: klart, med en knapp

Ett meddelande, uppdaterat två gånger via sin callback-URL. Ingen ser tre meddelanden, bara ett som ändras.

- [Snabbstart](#quick-start)

- [Uppdatera](#update)

- [Visa förloppet](#progress)

- [Radera](#delete)

- [Lyssna](#stream)

## Snabbstart

### Spara callback-URL:en

Varje inlägg från en [webhook](https://mss.gs/sv/docs/webhooks) och varje anrop från ett [kommando](https://mss.gs/sv/docs/commands) kommer med en callback_url för just det meddelandet.

```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 för att uppdatera

Skicka det nya läget. Kortet ändras på plats för alla.

```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 för att ta bort

Ingen body behövs.

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

## Uppdatera ett meddelande

Gör en PUT med JSON till callback_url . Skicka bara det du vill ändra.

| Fält | Typ | Vad det gör |
| --- | --- | --- |
| message_container | object | Det nya kortet. Se [meddelandekort](https://mss.gs/sv/docs/bots). |
| actions | array | Nya knappar. "actions": [] tar bort alla; utelämnar du fältet behålls de. |
| content | string | Ny text. |
| title , description , color , loader , ... | string | Kortform: kortfält på översta nivån slås in i ett kort åt dig. |

### Svar

| Status | Kod | Betydelse |
| --- | --- | --- |
| 200 | {"success": true} | Mottaget. Uppdateringen följer direkt efter. |
| 400 | MISSING_FIELDS | Inget att uppdatera i bodyn. |
| 400 | INVALID_BODY | Bodyn är inte giltig JSON. |
| 400 | en knappkod | Något är fel med en knapp, se [knappar](https://mss.gs/sv/docs/buttons). |
| 401 | INVALID_TOKEN | URL:en är inte giltig. |
| 404 | TOKEN_NOT_FOUND | URL:en har gått ut eller har använts för att radera meddelandet. |
| 502 | PUBLISH_FAILED | Uppdateringen kunde inte levereras. Försök igen. |

### Hur länge den fungerar

30 minuter från det att meddelandet postades eller kommandot användes. En uppdatering förlänger inte tiden. När meddelandet raderas är URL:en förbrukad. Filer kan inte läggas till via en uppdatering.

## Visa förloppet

Posta ett kort med en laddningsindikator, uppdatera undertexten allteftersom jobbet går framåt och avsluta med resultatet. Laddningsindikatorn är en spinner med en rad och en mindre rad under den ( 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' }]
});
```

## Radera ett meddelande

Skicka DELETE till callback_url så försvinner meddelandet för alla. URL:en kan inte användas igen efteråt.

## Lyssna på ett meddelande

En stream_url är en liveström (Server-Sent Events) av det som händer på ditt meddelande. Öppna den så kommer händelserna när de sker, var och en som en JSON-rad data: vars type säger vad det är:

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

| Händelse | När | Data |
| --- | --- | --- |
| action | En knapp trycktes. | action_id , och den sparade knappen i action med dess payload |
| reaction | En reaktion lades till eller togs bort. | emoji , och action : add, remove eller removeall |
| reply | Någon svarade på meddelandet. | Svarets content |
| expired | Strömmen stängs. Skickas som en namngiven händelse. | Inget |

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

### Var du får en

| Var den kommer ifrån | Öppen i |
| --- | --- |
| Ett webhook-inlägg med knappar | 10 minuter, eller en timme med "sse_event_extended_timeout": true |
| Varje kommandoanrop | 10 minuter |

### Fel

| Status | Kod | Betydelse |
| --- | --- | --- |
| 401 | INVALID_TOKEN | Token i URL:en är fel. |
| 404 | NOT_FOUND | Strömmen har gått ut eller har aldrig funnits. |

## Bygg vidare
