Hoppa till huvudinnehållet
Utvecklare Liveuppdateringar

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

  1. Spara callback-URL:en

    Varje inlägg från en webhook och varje anrop från ett kommando kommer med en callback_url för just det meddelandet.

    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 för att uppdatera

    Skicka det nya läget. Kortet ändras på plats för alla.

    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 för att ta bort

    Ingen body behövs.

    bash
    curl -X DELETE "$CALLBACK_URL"

Uppdatera ett meddelande

Gör en PUT med JSON till callback_url. Skicka bara det du vill ändra.

FältTypVad det gör
message_containerobjectDet nya kortet. Se meddelandekort.
actionsarrayNya knappar. "actions": [] tar bort alla; utelämnar du fältet behålls de.
contentstringNy text.
title, description, color, loader, ...stringKortform: kortfält på översta nivån slås in i ett kort åt dig.
En ny 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

StatusKodBetydelse
200{"success": true}Mottaget. Uppdateringen följer direkt efter.
400MISSING_FIELDSInget att uppdatera i bodyn.
400INVALID_BODYBodyn är inte giltig JSON.
400en knappkodNågot är fel med en knapp, se knappar.
401INVALID_TOKENURL:en är inte giltig.
404TOKEN_NOT_FOUNDURL:en har gått ut eller har använts för att radera meddelandet.
502PUBLISH_FAILEDUppdateringen 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).

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

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:

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: {}
HändelseNärData
actionEn knapp trycktes.action_id, och den sparade knappen i action med dess payload
reactionEn reaktion lades till eller togs bort.emoji, och action: add, remove eller removeall
replyNågon svarade på meddelandet.Svarets content
expiredStrömmen stängs. Skickas som en namngiven händelse.Inget
Händelser sparas inte till senare. Öppna strömmen så snart du har URL:en: det som händer innan du ansluter skickas inte. Varje händelse har också 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

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 knappar10 minuter, eller en timme med "sse_event_extended_timeout": true
Varje kommandoanrop10 minuter

Fel

StatusKodBetydelse
401INVALID_TOKENToken i URL:en är fel.
404NOT_FOUNDStrömmen har gått ut eller har aldrig funnits.

Bygg vidare