Aktualizuj správy naživo
Správa nemusí zostať taká, aká bola odoslaná. Ukáž priebeh, kým úloha beží, vymeň loader za výsledok, odober tlačidlá, keď už niekto rozhodol, alebo ju vymaž. Všetci v kanáli uvidia zmenu okamžite.
Čo s tým môžeš robiť
- Aktualizuj kartuZmeň text, farbu aj tlačidlá priamo na mieste.
- Ukáž priebehLoader, ktorý prechádza jednotlivými krokmi, a potom výsledok.
- Vymaž juOdstráň správu, keď už neplatí.
- Počúvaj juOdpovede, reakcie a stlačenia tlačidiel na tvojej správe, naživo.
V aplikácii
Odoslaná s loaderom
Aktualizovaná: krok 2 z 3
Aktualizovaná: hotovo, s tlačidlom
Jedna správa, dvakrát aktualizovaná cez jej callback URL. Nikto nevidí tri správy, iba jednu, ktorá sa mení.
Rýchly štart
Uchovaj si callback URL
Každý príspevok cez webhook a každá požiadavka príkazu prichádza s
callback_urlpre danú sprá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 na aktualizáciu
Pošli nový stav. Karta sa zmení na mieste u všetkých.
bashcurl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \ -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'DELETE na vymazanie
Telo požiadavky netreba.
bashcurl -X DELETE "$CALLBACK_URL"
Aktualizácia správy
Pošli JSON metódou PUT na callback_url. Posielaj len to, čo chceš zmeniť.
| Pole | Typ | Čo robí |
|---|---|---|
message_container | object | Nová karta. Pozri karty správ. |
actions | array | Nové tlačidlá. "actions": [] ich odoberie všetky; ak pole vynecháš, zostanú. |
content | string | Nový text. |
title, description, color, loader, ... | string | Skratka: polia karty na najvyššej úrovni sa za teba zabalia do karty. |
message_container nahradí starú kartu celú: pole, ktoré vynecháš, zmizne. Zachová sa iba jej typ, názov a avatar. Preto vždy posielaj celú kartu.Odpovede
| Stav | Kód | Význam |
|---|---|---|
200 | {"success": true} | Prijaté. Aktualizácia nasleduje hneď potom. |
400 | MISSING_FIELDS | V tele nie je nič na aktualizáciu. |
400 | INVALID_BODY | Telo nie je platný JSON. |
400 | kód tlačidla | S tlačidlom niečo nie je v poriadku, pozri tlačidlá. |
401 | INVALID_TOKEN | URL nie je platná. |
404 | TOKEN_NOT_FOUND | Platnosť URL vypršala alebo sa už použila na vymazanie správy. |
502 | PUBLISH_FAILED | Aktualizáciu sa nepodarilo doručiť. Skús to znova. |
Ako dlho funguje
30 minút od chvíle, keď bola správa odoslaná alebo keď bol príkaz použitý. Aktualizácia túto dobu nepredĺži. Vymazaním správy sa URL spotrebuje. Cez aktualizáciu sa nedajú pridať súbory.
Ukáž priebeh
Pošli kartu s loaderom, aktualizuj jej podtext, ako úloha napreduje, a skonči výsledkom. Loader je spinner s riadkom textu a menším riadkom 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' }]
});Vymazanie správy
Pošli DELETE na callback_url a správa zmizne u všetkých. URL sa potom už nedá znova použiť.
Počúvanie správy
stream_url je živý stream (Server-Sent Events) toho, čo sa deje s tvojou správou. Otvor ho a udalosti prichádzajú hneď, ako nastanú, každá ako JSON riadok data:, ktorého type hovorí, o čo ide:
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: {}| Udalosť | Kedy | Dáta |
|---|---|---|
action | Niekto stlačil tlačidlo. | action_id a uložené tlačidlo v action s jeho payload |
reaction | Reakcia bola pridaná alebo odstránená. | emoji a action: add, remove alebo removeall |
reply | Niekto na správu odpovedal. | content odpovede |
expired | Stream sa zatvára. Posiela sa ako pomenovaná udalosť. | Žiadne |
message_id, kto ju vyvolal (member_guid, member) a kedy (ts). Riadok komentára každých 20 sekúnd udržiava spojenie otvorené.Počúvanie v JavaScripte
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ískaš
| Odkiaľ pochádza | Otvorený na |
|---|---|
| Príspevok cez webhook s tlačidlami | 10 minút, alebo hodinu s "sse_event_extended_timeout": true |
| Každá požiadavka príkazu | 10 minút |
Chyby
| Stav | Kód | Význam |
|---|---|---|
401 | INVALID_TOKEN | Token v URL je nesprávny. |
404 | NOT_FOUND | Platnosť streamu vypršala alebo nikdy neexistoval. |