Preskočiť na hlavný obsah
Vývojári Živé aktualizácie

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

  1. Uchovaj si callback URL

    Každý príspevok cez webhook a každá požiadavka príkazu prichádza s callback_url pre danú správu.

    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 na aktualizáciu

    Pošli nový stav. Karta sa zmení na mieste u všetkých.

    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 na vymazanie

    Telo požiadavky netreba.

    bash
    curl -X DELETE "$CALLBACK_URL"

Aktualizácia správy

Pošli JSON metódou PUT na callback_url. Posielaj len to, čo chceš zmeniť.

PoleTypČo robí
message_containerobjectNová karta. Pozri karty správ.
actionsarrayNové tlačidlá. "actions": [] ich odoberie všetky; ak pole vynecháš, zostanú.
contentstringNový text.
title, description, color, loader, ...stringSkratka: polia karty na najvyššej úrovni sa za teba zabalia do karty.
Nový 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

StavKódVýznam
200{"success": true}Prijaté. Aktualizácia nasleduje hneď potom.
400MISSING_FIELDSV tele nie je nič na aktualizáciu.
400INVALID_BODYTelo nie je platný JSON.
400kód tlačidlaS tlačidlom niečo nie je v poriadku, pozri tlačidlá.
401INVALID_TOKENURL nie je platná.
404TOKEN_NOT_FOUNDPlatnosť URL vypršala alebo sa už použila na vymazanie správy.
502PUBLISH_FAILEDAktualizá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).

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' }]
});

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:

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: {}
UdalosťKedyDáta
actionNiekto stlačil tlačidlo.action_id a uložené tlačidlo v action s jeho payload
reactionReakcia bola pridaná alebo odstránená.emoji a action: add, remove alebo removeall
replyNiekto na správu odpovedal.content odpovede
expiredStream sa zatvára. Posiela sa ako pomenovaná udalosť.Žiadne
Udalosti sa neukladajú na neskôr. Otvor stream hneď, ako máš URL: čo sa stane predtým, ako sa pripojíš, sa neodošle. Každá udalosť nesie aj 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

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

Kde ho získaš

Odkiaľ pochádzaOtvorený na
Príspevok cez webhook s tlačidlami10 minút, alebo hodinu s "sse_event_extended_timeout": true
Každá požiadavka príkazu10 minút

Chyby

StavKódVýznam
401INVALID_TOKENToken v URL je nesprávny.
404NOT_FOUNDPlatnosť streamu vypršala alebo nikdy neexistoval.

Tvor ďalej