Aktualizuj zprávy živě
Zpráva nemusí zůstat taková, jakou jsi ji odeslal. Ukaž průběh, dokud úloha běží, vyměň loader za výsledek, odeber tlačítka, jakmile se někdo rozhodl, nebo zprávu smaž. Všichni v kanálu vidí změnu okamžitě.
Co s tím můžeš dělat
- Aktualizuj kartuZměň text, barvu i tlačítka přímo na místě.
- Ukaž průběhLoader, který prochází jednotlivými kroky, a pak výsledek.
- Smaž jiOdstraň zprávu, jakmile už neplatí.
- Poslouchej jiOdpovědi, reakce a stisky tlačítek u tvé zprávy, živě.
V aplikaci
Odesláno s loaderem
Aktualizováno: krok 2 ze 3
Aktualizováno: hotovo, s tlačítkem
Jedna zpráva, dvakrát aktualizovaná přes svou callback URL. Nikdo nevidí tři zprávy, jen jednu, která se mění.
Rychlý start
Uschovej si callback URL
Každý příspěvek z webhooku a každý požadavek příkazu přichází s
callback_urlpro danou zprávu.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 pro aktualizaci
Pošli nový stav. Karta se všem změní přímo na místě.
bashcurl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \ -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'DELETE pro smazání
Tělo požadavku není potřeba.
bashcurl -X DELETE "$CALLBACK_URL"
Aktualizace zprávy
Pošli JSON metodou PUT na callback_url. Posílej jen to, co chceš změnit.
| Pole | Typ | Co dělá |
|---|---|---|
message_container | object | Nová karta. Viz karty zpráv. |
actions | array | Nová tlačítka. "actions": [] odebere všechna; když pole vynecháš, zůstanou. |
content | string | Nový text. |
title, description, color, loader, ... | string | Zkratka: pole karty na nejvyšší úrovni se za tebe zabalí do karty. |
message_container nahradí starou kartu jako celek: pole, které vynecháš, zmizí. Přenese se jen její typ, název a avatar. Proto pokaždé posílej celou kartu.Odpovědi
| Stav | Kód | Význam |
|---|---|---|
200 | {"success": true} | Přijato. Aktualizace proběhne hned poté. |
400 | MISSING_FIELDS | V těle požadavku není nic k aktualizaci. |
400 | INVALID_BODY | Tělo požadavku není platný JSON. |
400 | kód tlačítka | Něco není v pořádku s tlačítkem, viz tlačítka. |
401 | INVALID_TOKEN | URL není platná. |
404 | TOKEN_NOT_FOUND | Platnost URL vypršela nebo už byla použita ke smazání zprávy. |
502 | PUBLISH_FAILED | Aktualizaci se nepodařilo doručit. Zkus to znovu. |
Jak dlouho funguje
30 minut od chvíle, kdy byla zpráva odeslána nebo příkaz použit. Aktualizace tuto dobu neprodlužuje. Smazáním zprávy se URL spotřebuje. Soubory přes aktualizaci přidat nelze.
Ukázání průběhu
Pošli kartu s loaderem, s postupem úlohy aktualizuj její podtext a skonči výsledkem. Loader je točící se kolečko s řádkem textu a menším řádkem pod ním (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' }]
});Smazání zprávy
Pošli DELETE na callback_url a zpráva všem zmizí. Tu URL pak už nelze znovu použít.
Poslech zprávy
stream_url je živý stream (Server-Sent Events) toho, co se děje s tvou zprávou. Otevři ho a události přicházejí, jak se dějí, každá jako řádek JSON data:, jehož type říká, o co jde:
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: {}| Událost | Kdy | Data |
|---|---|---|
action | Někdo stiskl tlačítko. | action_id a uložené tlačítko v action s jeho payload |
reaction | Reakce byla přidána nebo odebrána. | emoji a action: add, remove nebo removeall |
reply | Někdo na zprávu odpověděl. | content odpovědi |
expired | Stream se zavírá. Posílá se jako pojmenovaná událost. | Žádná |
message_id, kdo to udělal (member_guid, member) a kdy (ts). Řádek s komentářem každých 20 sekund udržuje spojení otevřené.Poslech v JavaScriptu
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();
});Kde ho získáš
| Odkud pochází | Otevřený po dobu |
|---|---|
| Příspěvek z webhooku s tlačítky | 10 minut, nebo hodinu s "sse_event_extended_timeout": true |
| Každý požadavek příkazu | 10 minut |
Chyby
| Stav | Kód | Význam |
|---|---|---|
401 | INVALID_TOKEN | Token v URL je chybný. |
404 | NOT_FOUND | Platnost streamu vypršela nebo nikdy neexistoval. |