Přeskočit na hlavní obsah
Vývojáři Živé aktualizace

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

  1. Uschovej si callback URL

    Každý příspěvek z webhooku a každý požadavek příkazu přichází s callback_url pro danou zprá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 pro aktualizaci

    Pošli nový stav. Karta se všem změní přímo na místě.

    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 pro smazání

    Tělo požadavku není potřeba.

    bash
    curl -X DELETE "$CALLBACK_URL"

Aktualizace zprávy

Pošli JSON metodou PUT na callback_url. Posílej jen to, co chceš změnit.

PoleTypCo dělá
message_containerobjectNová karta. Viz karty zpráv.
actionsarrayNová tlačítka. "actions": [] odebere všechna; když pole vynecháš, zůstanou.
contentstringNový text.
title, description, color, loader, ...stringZkratka: pole karty na nejvyšší úrovni se za tebe zabalí do karty.
Nový 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

StavKódVýznam
200{"success": true}Přijato. Aktualizace proběhne hned poté.
400MISSING_FIELDSV těle požadavku není nic k aktualizaci.
400INVALID_BODYTělo požadavku není platný JSON.
400kód tlačítkaNěco není v pořádku s tlačítkem, viz tlačítka.
401INVALID_TOKENURL není platná.
404TOKEN_NOT_FOUNDPlatnost URL vypršela nebo už byla použita ke smazání zprávy.
502PUBLISH_FAILEDAktualizaci 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).

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

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:

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: {}
UdálostKdyData
actionNěkdo stiskl tlačítko.action_id a uložené tlačítko v action s jeho payload
reactionReakce byla přidána nebo odebrána.emoji a action: add, remove nebo removeall
replyNěkdo na zprávu odpověděl.content odpovědi
expiredStream se zavírá. Posílá se jako pojmenovaná událost.Žádná
Události se neukládají na později. Otevři stream, jakmile máš URL: co se stane, než se připojíš, se nepošle. Každá událost nese také 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

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ískáš

Odkud pocházíOtevřený po dobu
Příspěvek z webhooku s tlačítky10 minut, nebo hodinu s "sse_event_extended_timeout": true
Každý požadavek příkazu10 minut

Chyby

StavKódVýznam
401INVALID_TOKENToken v URL je chybný.
404NOT_FOUNDPlatnost streamu vypršela nebo nikdy neexistoval.

Tvoř dál