Siirry pääsisältöön
Kehittäjät Live-päivitykset

Päivitä viestejä livenä

Viestin ei tarvitse jäädä sellaiseksi kuin se julkaistiin. Näytä edistyminen työn aikana, vaihda latausilmaisin tulokseen, poista painikkeet, kun joku on tehnyt päätöksen, tai poista koko viesti. Kaikki kanavalla näkevät muutoksen heti.

Mitä voit tehdä

  • Päivitä korttiMuuta tekstiä, väriä ja painikkeita paikallaan.
  • Näytä edistyminenLatausilmaisin, joka etenee vaihe vaiheelta, ja sitten tulos.
  • Poista viestiPoista viesti, kun se ei enää pidä paikkaansa.
  • Kuuntele viestiäViestiisi tulevat vastaukset, reaktiot ja painikkeiden painallukset livenä.

Sovelluksessa

Julkaistu latausilmaisimella

Päivitetty: vaihe 2/3

Päivitetty: valmis, painikkeen kanssa

Yksi viesti, päivitetty kahdesti callback-URL:n kautta. Kukaan ei näe kolmea viestiä, vain yhden, joka muuttuu.

Pika-aloitus

  1. Säilytä callback-URL

    Jokaisen webhook-julkaisun ja jokaisen komennon pyynnön mukana tulee kyseisen viestin callback_url.

    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 päivittää

    Lähetä uusi tila. Kortti muuttuu paikallaan kaikille.

    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 poistaa

    Bodya ei tarvita.

    bash
    curl -X DELETE "$CALLBACK_URL"

Päivitä viesti

Lähetä JSON PUT-pyynnöllä callback_url-osoitteeseen. Lähetä vain se, mitä haluat muuttaa.

KenttäTyyppiMitä se tekee
message_containerobjectUusi kortti. Katso viestikortit.
actionsarrayUudet painikkeet. "actions": [] poistaa ne kaikki; jos jätät kentän pois, ne säilyvät.
contentstringUusi teksti.
title, description, color, loader, ...stringLyhennys: ylätason korttikentät kääritään korttiin puolestasi.
Uusi message_container korvaa vanhan kortin kokonaan: kenttä, jonka jätät pois, katoaa. Vain kortin tyyppi, nimi ja avatar säilyvät. Lähetä siis koko kortti joka kerta.

Vastaukset

TilaKoodiMerkitys
200{"success": true}Hyväksytty. Päivitys seuraa heti perään.
400MISSING_FIELDSBodyssa ei ole mitään päivitettävää.
400INVALID_BODYBody ei ole kelvollista JSONia.
400painikkeen koodiJossakin painikkeessa on vikaa, katso painikkeet.
401INVALID_TOKENURL ei ole kelvollinen.
404TOKEN_NOT_FOUNDURL on vanhentunut, tai sillä on jo poistettu viesti.
502PUBLISH_FAILEDPäivitystä ei voitu toimittaa. Yritä uudelleen.

Kuinka kauan se toimii

30 minuuttia siitä hetkestä, kun viesti julkaistiin tai komentoa käytettiin. Päivittäminen ei pidennä aikaa. Viestin poistaminen käyttää URL:n loppuun. Tiedostoja ei voi lisätä päivityksellä.

Näytä edistyminen

Julkaise kortti latausilmaisimella, päivitä sen alariviä työn edetessä ja päätä tulokseen. Latausilmaisin on pyörivä kuvake, jonka vieressä on rivi ja sen alla pienempi rivi (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' }]
});

Poista viesti

Lähetä DELETE callback_url-osoitteeseen, niin viesti katoaa kaikilta. URL:ää ei voi käyttää sen jälkeen uudelleen.

Kuuntele viestiä

stream_url on reaaliaikainen virta (Server-Sent Events) siitä, mitä viestissäsi tapahtuu. Avaa se, niin tapahtumat saapuvat sitä mukaa kuin niitä tapahtuu, kukin JSON-muotoisena data:-rivinä, jonka type kertoo, mistä on kyse:

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: {}
TapahtumaMilloinData
actionPainiketta painettiin.action_id sekä tallennettu painike kentässä action ja sen payload
reactionReaktio lisättiin tai poistettiin.emoji sekä action: add, remove tai removeall
replyJoku vastasi viestiin.Vastauksen content
expiredVirta sulkeutuu. Lähetetään nimettynä tapahtumana.Ei mitään
Tapahtumia ei tallenneta myöhempää varten. Avaa virta heti, kun saat URL:n: mitä tapahtuu ennen kuin yhdistät, sitä ei lähetetä. Jokaisessa tapahtumassa on myös message_id, tekijä (member_guid, member) ja ajankohta (ts). Kommenttirivi 20 sekunnin välein pitää yhteyden auki.

Kuuntelu JavaScriptillä

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

Mistä saat virran

Mistä se tuleeAuki
Painikkeellinen webhook-julkaisu10 minuuttia, tai tunti asetuksella "sse_event_extended_timeout": true
Jokainen komentopyyntö10 minuuttia

Virheet

TilaKoodiMerkitys
401INVALID_TOKENURL:n token on väärä.
404NOT_FOUNDVirta on vanhentunut tai sitä ei ole koskaan ollut.

Jatka rakentamista