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
Bewaar de callback-URL
Elke post via een webhook en elk request voor een commando komt met een
callback_urlvoor dat bericht.bashBODY='{"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 om bij te werken
Stuur de nieuwe stand. De kaart verandert voor iedereen op dezelfde plek.
bashcurl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \ -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'DELETE om te verwijderen
Geen body nodig.
bashcurl -X DELETE "$CALLBACK_URL"
Een bericht bijwerken
PUT JSON naar de callback_url. Stuur alleen wat je wilt veranderen.
| Veld | Type | Wat het doet |
|---|---|---|
message_container | object | De nieuwe kaart. Zie berichtkaarten. |
actions | array | Nieuwe knoppen. "actions": [] haalt ze allemaal weg; laat je het veld weg, dan blijven ze staan. |
content | string | Nieuwe tekst. |
title, description, color, loader, ... | string | Verkorte vorm: kaartvelden op het hoogste niveau worden voor je in een kaart gezet. |
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
| Status | Code | Betekenis |
|---|---|---|
200 | {"success": true} | Geaccepteerd. De update volgt direct daarna. |
400 | MISSING_FIELDS | Niets om bij te werken in de body. |
400 | INVALID_BODY | De body is geen geldige JSON. |
400 | een knopcode | Er klopt iets niet aan een knop, zie knoppen. |
401 | INVALID_TOKEN | De URL is niet geldig. |
404 | TOKEN_NOT_FOUND | De URL is verlopen of is gebruikt om het bericht te verwijderen. |
502 | PUBLISH_FAILED | De 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).
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:
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: {}| Event | Wanneer | Data |
|---|---|---|
action | Er is een knop ingedrukt. | action_id, en de opgeslagen knop in action met zijn payload |
reaction | Er is een reactie toegevoegd of verwijderd. | emoji, en action: add, remove of removeall |
reply | Iemand heeft op het bericht geantwoord. | De content van het antwoord |
expired | De stream gaat dicht. Verstuurd als benoemd event. | Geen |
message_id, wie het deed (member_guid, member) en wanneer (ts). Een commentaarregel elke 20 seconden houdt de verbinding open.Luisteren in 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 krijgt | Open voor |
|---|---|
| Een webhookpost met knoppen | 10 minuten, of een uur met "sse_event_extended_timeout": true |
| Elk request voor een commando | 10 minuten |
Fouten
| Status | Code | Betekenis |
|---|---|---|
401 | INVALID_TOKEN | Het token in de URL klopt niet. |
404 | NOT_FOUND | De stream is verlopen of heeft nooit bestaan. |