Ga naar hoofdinhoud
Developers Live-updates

Berichten live bijwerken

Een bericht hoeft niet te blijven zoals het is gepost. Toon voortgang terwijl een taak loopt, vervang een loader door het resultaat, haal de knoppen weg zodra iemand heeft gekozen, of verwijder het. Iedereen in het kanaal ziet de wijziging meteen.

Wat je kunt doen

  • De kaart bijwerkenVerander de tekst, de kleur en de knoppen, op dezelfde plek.
  • Voortgang tonenEen loader die stap voor stap verder gaat, en dan het resultaat.
  • Het verwijderenHaal een bericht weg zodra het niet meer klopt.
  • Ernaar luisterenAntwoorden, reacties en knopdrukken op je bericht, live.

In de app

Gepost met een loader

Bijgewerkt: stap 2 van 3

Bijgewerkt: klaar, met een knop

Eén bericht, twee keer bijgewerkt via de callback-URL. Niemand ziet drie berichten, alleen één dat verandert.

Snel aan de slag

  1. Bewaar de callback-URL

    Elke post via een webhook en elk request voor een commando komt met een callback_url voor dat bericht.

    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-..."}
  2. PUT om bij te werken

    Stuur de nieuwe stand. De kaart verandert voor iedereen op dezelfde plek.

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

    Geen body nodig.

    bash
    curl -X DELETE "$CALLBACK_URL"

Een bericht bijwerken

PUT JSON naar de callback_url. Stuur alleen wat je wilt veranderen.

VeldTypeWat het doet
message_containerobjectDe nieuwe kaart. Zie berichtkaarten.
actionsarrayNieuwe knoppen. "actions": [] haalt ze allemaal weg; laat je het veld weg, dan blijven ze staan.
contentstringNieuwe tekst.
title, description, color, loader, ...stringVerkorte vorm: kaartvelden op het hoogste niveau worden voor je in een kaart gezet.
Een nieuwe message_container vervangt de oude kaart in zijn geheel: een veld dat je weglaat, is weg. Alleen het type, de naam en de avatar blijven behouden. Stuur dus elke keer de volledige kaart.

Antwoorden

StatusCodeBetekenis
200{"success": true}Geaccepteerd. De update volgt direct daarna.
400MISSING_FIELDSNiets om bij te werken in de body.
400INVALID_BODYDe body is geen geldige JSON.
400een knopcodeEr klopt iets niet aan een knop, zie knoppen.
401INVALID_TOKENDe URL is niet geldig.
404TOKEN_NOT_FOUNDDe URL is verlopen of is gebruikt om het bericht te verwijderen.
502PUBLISH_FAILEDDe update kon niet worden afgeleverd. Probeer het opnieuw.

Hoe lang het werkt

30 minuten vanaf het moment dat het bericht is gepost, of dat het commando is gebruikt. Bijwerken verlengt dat niet. Het bericht verwijderen maakt de URL op. Via een update kun je geen bestanden toevoegen.

Voortgang tonen

Post een kaart met een loader, werk de subtekst bij terwijl de taak vordert, en eindig met het resultaat. De loader is een spinner met een regel en een kleinere regel eronder (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' }]
});

Een bericht verwijderen

Stuur DELETE naar de callback_url en het bericht is voor iedereen weg. Daarna kun je de URL niet meer gebruiken.

Naar een bericht luisteren

Een stream_url is een live stream (Server-Sent Events) van wat er op je bericht gebeurt. Open hem en events komen binnen zodra ze gebeuren, elk als een JSON-regel data: waarvan het type zegt wat het is:

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: {}
EventWanneerData
actionEr is een knop ingedrukt.action_id, en de opgeslagen knop in action met zijn payload
reactionEr is een reactie toegevoegd of verwijderd.emoji, en action: add, remove of removeall
replyIemand heeft op het bericht geantwoord.De content van het antwoord
expiredDe stream gaat dicht. Verstuurd als benoemd event.Geen
Events worden niet bewaard. Open de stream zodra je de URL hebt: wat er gebeurt voordat je verbindt, wordt niet verstuurd. Elk event bevat ook de message_id, wie het deed (member_guid, member) en wanneer (ts). Een commentaarregel elke 20 seconden houdt de verbinding open.

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

Waar je er een krijgt

Waar je hem krijgtOpen voor
Een webhookpost met knoppen10 minuten, of een uur met "sse_event_extended_timeout": true
Elk request voor een commando10 minuten

Fouten

StatusCodeBetekenis
401INVALID_TOKENHet token in de URL klopt niet.
404NOT_FOUNDDe stream is verlopen of heeft nooit bestaan.

Verder bouwen