Uppdatera meddelanden live
Ett meddelande behöver inte stanna som det postades. Visa förloppet medan ett jobb körs, byt ett laddningskort mot resultatet, ta bort knapparna när någon har bestämt sig, eller radera det. Alla i kanalen ser ändringen direkt.
Det här kan du göra
- Uppdatera kortetÄndra texten, färgen och knapparna, på plats.
- Visa förloppetEn laddningsindikator som går igenom steg, och sedan resultatet.
- Radera detTa bort ett meddelande när det inte längre stämmer.
- Lyssna på detSvar, reaktioner och knapptryck på ditt meddelande, live.
I appen
Postat med en laddningsindikator
Uppdaterat: steg 2 av 3
Uppdaterat: klart, med en knapp
Ett meddelande, uppdaterat två gånger via sin callback-URL. Ingen ser tre meddelanden, bara ett som ändras.
Snabbstart
Spara callback-URL:en
Varje inlägg från en webhook och varje anrop från ett kommando kommer med en
callback_urlför just det meddelandet.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 för att uppdatera
Skicka det nya läget. Kortet ändras på plats för alla.
bashcurl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \ -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'DELETE för att ta bort
Ingen body behövs.
bashcurl -X DELETE "$CALLBACK_URL"
Uppdatera ett meddelande
Gör en PUT med JSON till callback_url. Skicka bara det du vill ändra.
| Fält | Typ | Vad det gör |
|---|---|---|
message_container | object | Det nya kortet. Se meddelandekort. |
actions | array | Nya knappar. "actions": [] tar bort alla; utelämnar du fältet behålls de. |
content | string | Ny text. |
title, description, color, loader, ... | string | Kortform: kortfält på översta nivån slås in i ett kort åt dig. |
message_container ersätter det gamla kortet i sin helhet: ett fält som du utelämnar försvinner. Bara typen, namnet och avataren följer med. Skicka därför hela kortet varje gång.Svar
| Status | Kod | Betydelse |
|---|---|---|
200 | {"success": true} | Mottaget. Uppdateringen följer direkt efter. |
400 | MISSING_FIELDS | Inget att uppdatera i bodyn. |
400 | INVALID_BODY | Bodyn är inte giltig JSON. |
400 | en knappkod | Något är fel med en knapp, se knappar. |
401 | INVALID_TOKEN | URL:en är inte giltig. |
404 | TOKEN_NOT_FOUND | URL:en har gått ut eller har använts för att radera meddelandet. |
502 | PUBLISH_FAILED | Uppdateringen kunde inte levereras. Försök igen. |
Hur länge den fungerar
30 minuter från det att meddelandet postades eller kommandot användes. En uppdatering förlänger inte tiden. När meddelandet raderas är URL:en förbrukad. Filer kan inte läggas till via en uppdatering.
Visa förloppet
Posta ett kort med en laddningsindikator, uppdatera undertexten allteftersom jobbet går framåt och avsluta med resultatet. Laddningsindikatorn är en spinner med en rad och en mindre rad under den (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' }]
});Radera ett meddelande
Skicka DELETE till callback_url så försvinner meddelandet för alla. URL:en kan inte användas igen efteråt.
Lyssna på ett meddelande
En stream_url är en liveström (Server-Sent Events) av det som händer på ditt meddelande. Öppna den så kommer händelserna när de sker, var och en som en JSON-rad data: vars type säger vad det är:
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: {}| Händelse | När | Data |
|---|---|---|
action | En knapp trycktes. | action_id, och den sparade knappen i action med dess payload |
reaction | En reaktion lades till eller togs bort. | emoji, och action: add, remove eller removeall |
reply | Någon svarade på meddelandet. | Svarets content |
expired | Strömmen stängs. Skickas som en namngiven händelse. | Inget |
message_id, vem som gjorde det (member_guid, member) och när (ts). En kommentarsrad var 20:e sekund håller anslutningen öppen.Lyssna i 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();
});Var du får en
| Var den kommer ifrån | Öppen i |
|---|---|
| Ett webhook-inlägg med knappar | 10 minuter, eller en timme med "sse_event_extended_timeout": true |
| Varje kommandoanrop | 10 minuter |
Fel
| Status | Kod | Betydelse |
|---|---|---|
401 | INVALID_TOKEN | Token i URL:en är fel. |
404 | NOT_FOUND | Strömmen har gått ut eller har aldrig funnits. |