Sari la conținutul principal
Dezvoltatori Actualizări live

Actualizează mesajele live

Un mesaj nu trebuie să rămână așa cum a fost postat. Arată progresul cât timp rulează o sarcină, înlocuiește loaderul cu rezultatul, scoate butoanele după ce cineva a decis sau șterge mesajul. Toată lumea din canal vede schimbarea imediat.

Ce poți face

  • Actualizează cardulSchimbă textul, culoarea și butoanele, pe loc.
  • Arată progresulUn loader care trece prin pași, apoi rezultatul.
  • Șterge-lElimină un mesaj când nu mai este valabil.
  • Ascultă-lRăspunsuri, reacții și apăsări de butoane la mesajul tău, live.

În aplicație

Postat cu un loader

Actualizat: pasul 2 din 3

Actualizat: gata, cu un buton

Un singur mesaj, actualizat de două ori prin callback URL-ul său. Nimeni nu vede trei mesaje, ci doar unul care se schimbă.

Start rapid

  1. Păstrează callback URL-ul

    Fiecare postare prin webhook și fiecare cerere de comandă vine cu un callback_url pentru acel mesaj.

    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 pentru actualizare

    Trimite noua stare. Cardul se schimbă pe loc pentru toată lumea.

    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 pentru ștergere

    Nu e nevoie de body.

    bash
    curl -X DELETE "$CALLBACK_URL"

Actualizarea unui mesaj

Trimite JSON prin PUT la callback_url. Trimite doar ce vrei să schimbi.

CâmpTipCe face
message_containerobjectNoul card. Vezi cardurile de mesaj.
actionsarrayButoane noi. "actions": [] le elimină pe toate; dacă lași câmpul deoparte, ele rămân.
contentstringText nou.
title, description, color, loader, ...stringPrescurtare: câmpurile de card de la nivelul de sus sunt împachetate automat într-un card.
Un message_container nou înlocuiește vechiul card în întregime: un câmp pe care îl lași deoparte dispare. Se păstrează doar tipul, numele și avatarul. Așa că trimite de fiecare dată cardul complet.

Răspunsuri

StatusCodÎnseamnă
200{"success": true}Acceptat. Actualizarea urmează imediat.
400MISSING_FIELDSNu e nimic de actualizat în body.
400INVALID_BODYBody-ul nu este JSON valid.
400un cod de butonCeva nu e în regulă cu un buton, vezi butoanele.
401INVALID_TOKENURL-ul nu este valid.
404TOKEN_NOT_FOUNDURL-ul a expirat sau a fost folosit pentru a șterge mesajul.
502PUBLISH_FAILEDActualizarea nu a putut fi livrată. Încearcă din nou.

Cât timp funcționează

30 de minute din momentul în care mesajul a fost postat sau comanda a fost folosită. O actualizare nu prelungește acest timp. Ștergerea mesajului consumă URL-ul. Prin actualizare nu se pot adăuga fișiere.

Afișarea progresului

Postează un card cu un loader, actualizează-i subtextul pe măsură ce sarcina avansează și încheie cu rezultatul. Loaderul este un spinner cu un rând de text și un rând mai mic sub el (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' }]
});

Ștergerea unui mesaj

Trimite DELETE la callback_url și mesajul dispare pentru toată lumea. După aceea, URL-ul nu mai poate fi folosit.

Ascultarea unui mesaj

Un stream_url este un flux live (Server-Sent Events) cu tot ce se întâmplă la mesajul tău. Deschide-l și evenimentele sosesc pe măsură ce au loc, fiecare ca un rând JSON data: al cărui type spune ce este:

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: {}
EvenimentCândDate
actionA fost apăsat un buton.action_id și butonul salvat în action, cu payload-ul lui
reactionA fost adăugată sau eliminată o reacție.emoji și action: add, remove sau removeall
replyCineva a răspuns la mesaj.content-ul răspunsului
expiredFluxul se închide. Trimis ca eveniment cu nume.Niciuna
Evenimentele nu sunt păstrate pentru mai târziu. Deschide fluxul imediat ce ai URL-ul: ce se întâmplă înainte să te conectezi nu se trimite. Fiecare eveniment conține și message_id, cine a făcut acțiunea (member_guid, member) și când (ts). Un rând de comentariu la fiecare 20 de secunde ține conexiunea deschisă.

Ascultarea în JavaScript

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

De unde primești unul

De unde provineDeschis timp de
O postare prin webhook cu butoane10 minute sau o oră cu "sse_event_extended_timeout": true
Fiecare cerere de comandă10 minute

Erori

StatusCodÎnseamnă
401INVALID_TOKENTokenul din URL este greșit.
404NOT_FOUNDFluxul a expirat sau nu a existat niciodată.

Construiește mai departe