Ana içeriğe geç
Geliştiriciler Canlı güncellemeler

Mesajları canlı güncelle

Bir mesajın gönderildiği gibi kalması gerekmez. Bir iş çalışırken ilerlemeyi göster, yükleme göstergesinin yerine sonucu koy, biri karar verdikten sonra düğmeleri kaldır ya da mesajı sil. Kanaldaki herkes değişikliği anında görür.

Neler yapabilirsin

  • Kartı güncelleMetni, rengi ve düğmeleri yerinde değiştir.
  • İlerlemeyi gösterAdım adım ilerleyen bir yükleme göstergesi, ardından sonuç.
  • SilArtık doğru olmayan bir mesajı kaldır.
  • DinleMesajına gelen yanıtlar, tepkiler ve düğme basışları, canlı.

Uygulamada

Yükleme göstergesiyle gönderildi

Güncellendi: adım 2/3

Güncellendi: bitti, düğmeyle

Callback URL’si üzerinden iki kez güncellenen tek bir mesaj. Kimse üç mesaj görmez, yalnızca değişen tek bir mesaj görür.

Hızlı başlangıç

  1. Callback URL’sini sakla

    Her webhook gönderisi ve her komut isteği, o mesaj için bir callback_url ile gelir.

    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. Güncellemek için PUT

    Yeni durumu gönder. Kart herkes için yerinde değişir.

    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. Kaldırmak için DELETE

    Gövde gerekmez.

    bash
    curl -X DELETE "$CALLBACK_URL"

Bir mesajı güncelle

callback_url adresine PUT ile JSON gönder. Yalnızca değiştirmek istediğini gönder.

AlanTürNe yapar
message_containerobjectYeni kart. Bkz. mesaj kartları.
actionsarrayYeni düğmeler. "actions": [] hepsini kaldırır; alanı hiç göndermezsen düğmeler kalır.
contentstringYeni metin.
title, description, color, loader, ...stringKısayol: en üst düzeyde gönderilen kart alanları senin için bir karta sarılır.
Yeni bir message_container eski kartın tamamının yerini alır: göndermediğin bir alan kaybolur. Yalnızca kartın türü, adı ve avatarı korunur. Bu yüzden her seferinde kartın tamamını gönder.

Yanıtlar

DurumKodAnlamı
200{"success": true}Kabul edildi. Güncelleme hemen ardından gelir.
400MISSING_FIELDSGövdede güncellenecek bir şey yok.
400INVALID_BODYGövde geçerli bir JSON değil.
400bir düğme koduBir düğmede sorun var, bkz. düğmeler.
401INVALID_TOKENURL geçerli değil.
404TOKEN_NOT_FOUNDURL’nin süresi doldu ya da mesajı silmek için kullanıldı.
502PUBLISH_FAILEDGüncelleme iletilemedi. Tekrar dene.

Ne kadar süre çalışır

Mesajın gönderildiği ya da komutun kullanıldığı andan itibaren 30 dakika. Güncellemek bu süreyi uzatmaz. Mesajı silmek URL’yi tüketir. Bir güncellemeyle dosya eklenemez.

İlerlemeyi göster

Yükleme göstergeli bir kart gönder, iş ilerledikçe alt metnini güncelle ve sonuçla bitir. Yükleme göstergesi, bir satır ve altında daha küçük bir satır bulunan dönen bir simgedir (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' }]
});

Bir mesajı sil

callback_url adresine DELETE gönder, mesaj herkes için kaybolur. URL bundan sonra tekrar kullanılamaz.

Bir mesajı dinle

stream_url, mesajında olup bitenlerin canlı bir akışıdır (Server-Sent Events). Aç, olaylar gerçekleştikçe gelsin; her biri, type alanı ne olduğunu söyleyen bir JSON data: satırıdı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: {}
OlayNe zamanVeri
actionBir düğmeye basıldı.action_id ve action içinde, payload’ıyla birlikte saklanan düğme
reactionBir tepki eklendi ya da kaldırıldı.emoji ve action: add, remove ya da removeall
replyBiri mesaja yanıt verdi.Yanıtın content alanı
expiredAkış kapanıyor. Adlandırılmış bir olay olarak gönderilir.Yok
Olaylar sonrası için saklanmaz. URL eline geçer geçmez akışı aç: bağlanmadan önce olanlar gönderilmez. Her olay ayrıca message_id’yi, kimin yaptığını (member_guid, member) ve ne zaman yaptığını (ts) taşır. Her 20 saniyede bir gelen bir yorum satırı bağlantıyı açık tutar.

JavaScript’te dinlemek

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

Nereden alırsın

Nereden gelirAçık kalma süresi
Düğmeli bir webhook gönderisi10 dakika ya da "sse_event_extended_timeout": true ile bir saat
Her komut isteği10 dakika

Hatalar

DurumKodAnlamı
401INVALID_TOKENURL’deki token yanlış.
404NOT_FOUNDAkışın süresi doldu ya da hiç var olmadı.

Geliştirmeye devam et