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ıç
Callback URL’sini sakla
Her webhook gönderisi ve her komut isteği, o mesaj için bir
callback_urlile gelir.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-..."}Güncellemek için PUT
Yeni durumu gönder. Kart herkes için yerinde değişir.
bashcurl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \ -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'Kaldırmak için DELETE
Gövde gerekmez.
bashcurl -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.
| Alan | Tür | Ne yapar |
|---|---|---|
message_container | object | Yeni kart. Bkz. mesaj kartları. |
actions | array | Yeni düğmeler. "actions": [] hepsini kaldırır; alanı hiç göndermezsen düğmeler kalır. |
content | string | Yeni metin. |
title, description, color, loader, ... | string | Kısayol: en üst düzeyde gönderilen kart alanları senin için bir karta sarılır. |
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
| Durum | Kod | Anlamı |
|---|---|---|
200 | {"success": true} | Kabul edildi. Güncelleme hemen ardından gelir. |
400 | MISSING_FIELDS | Gövdede güncellenecek bir şey yok. |
400 | INVALID_BODY | Gövde geçerli bir JSON değil. |
400 | bir düğme kodu | Bir düğmede sorun var, bkz. düğmeler. |
401 | INVALID_TOKEN | URL geçerli değil. |
404 | TOKEN_NOT_FOUND | URL’nin süresi doldu ya da mesajı silmek için kullanıldı. |
502 | PUBLISH_FAILED | Gü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).
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:
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: {}| Olay | Ne zaman | Veri |
|---|---|---|
action | Bir düğmeye basıldı. | action_id ve action içinde, payload’ıyla birlikte saklanan düğme |
reaction | Bir tepki eklendi ya da kaldırıldı. | emoji ve action: add, remove ya da removeall |
reply | Biri mesaja yanıt verdi. | Yanıtın content alanı |
expired | Akış kapanıyor. Adlandırılmış bir olay olarak gönderilir. | Yok |
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
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 gelir | Açık kalma süresi |
|---|---|
| Düğmeli bir webhook gönderisi | 10 dakika ya da "sse_event_extended_timeout": true ile bir saat |
| Her komut isteği | 10 dakika |
Hatalar
| Durum | Kod | Anlamı |
|---|---|---|
401 | INVALID_TOKEN | URL’deki token yanlış. |
404 | NOT_FOUND | Akışın süresi doldu ya da hiç var olmadı. |