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
Păstrează callback URL-ul
Fiecare postare prin webhook și fiecare cerere de comandă vine cu un
callback_urlpentru acel mesaj.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 pentru actualizare
Trimite noua stare. Cardul se schimbă pe loc pentru toată lumea.
bashcurl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \ -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'DELETE pentru ștergere
Nu e nevoie de body.
bashcurl -X DELETE "$CALLBACK_URL"
Actualizarea unui mesaj
Trimite JSON prin PUT la callback_url. Trimite doar ce vrei să schimbi.
| Câmp | Tip | Ce face |
|---|---|---|
message_container | object | Noul card. Vezi cardurile de mesaj. |
actions | array | Butoane noi. "actions": [] le elimină pe toate; dacă lași câmpul deoparte, ele rămân. |
content | string | Text nou. |
title, description, color, loader, ... | string | Prescurtare: câmpurile de card de la nivelul de sus sunt împachetate automat într-un card. |
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
| Status | Cod | Înseamnă |
|---|---|---|
200 | {"success": true} | Acceptat. Actualizarea urmează imediat. |
400 | MISSING_FIELDS | Nu e nimic de actualizat în body. |
400 | INVALID_BODY | Body-ul nu este JSON valid. |
400 | un cod de buton | Ceva nu e în regulă cu un buton, vezi butoanele. |
401 | INVALID_TOKEN | URL-ul nu este valid. |
404 | TOKEN_NOT_FOUND | URL-ul a expirat sau a fost folosit pentru a șterge mesajul. |
502 | PUBLISH_FAILED | Actualizarea 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).
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:
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: {}| Eveniment | Când | Date |
|---|---|---|
action | A fost apăsat un buton. | action_id și butonul salvat în action, cu payload-ul lui |
reaction | A fost adăugată sau eliminată o reacție. | emoji și action: add, remove sau removeall |
reply | Cineva a răspuns la mesaj. | content-ul răspunsului |
expired | Fluxul se închide. Trimis ca eveniment cu nume. | Niciuna |
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
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 provine | Deschis timp de |
|---|---|
| O postare prin webhook cu butoane | 10 minute sau o oră cu "sse_event_extended_timeout": true |
| Fiecare cerere de comandă | 10 minute |
Erori
| Status | Cod | Înseamnă |
|---|---|---|
401 | INVALID_TOKEN | Tokenul din URL este greșit. |
404 | NOT_FOUND | Fluxul a expirat sau nu a existat niciodată. |