Перейти до основного вмісту
Розробникам Оновлення наживо

Оновлюйте повідомлення наживо

Повідомлення не мусить залишатися таким, яким його опублікували. Показуйте поступ, поки виконується завдання, замініть індикатор завантаження результатом, приберіть кнопки, щойно хтось ухвалив рішення, або видаліть повідомлення. Усі в каналі бачать зміну одразу.

Що можна зробити

  • Оновлюйте карткуЗмінюйте текст, колір і кнопки на місці.
  • Показуйте поступІндикатор завантаження, що проходить кроки, а потім результат.
  • ВидаляйтеПриберіть повідомлення, щойно воно стане неактуальним.
  • СлухайтеВідповіді, реакції й натискання кнопок на вашому повідомленні наживо.

У застосунку

Опубліковано з індикатором завантаження

Оновлено: крок 2 з 3

Оновлено: готово, з кнопкою

Одне повідомлення, двічі оновлене через його callback URL. Ніхто не бачить трьох повідомлень, лише одне, що змінюється.

Швидкий старт

  1. Збережіть callback URL

    Кожна публікація через вебхук і кожен запит команди містить callback_url для цього повідомлення.

    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 для оновлення

    Надішліть новий стан. Картка зміниться на місці для всіх.

    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 для видалення

    Тіло не потрібне.

    bash
    curl -X DELETE "$CALLBACK_URL"

Оновлення повідомлення

Надішліть JSON методом PUT на callback_url. Передавайте лише те, що хочете змінити.

ПолеТипЩо робить
message_containerobjectНова картка. Див. картки повідомлень.
actionsarrayНові кнопки. "actions": [] прибирає їх усі; якщо поле не передати, вони залишаться.
contentstringНовий текст.
title, description, color, loader, ...stringСкорочення: поля картки на верхньому рівні автоматично загортаються в картку.
Новий message_container замінює стару картку повністю: поле, яке ви не передали, зникає. Зберігаються лише її тип, ім’я та аватар. Тож щоразу надсилайте повну картку.

Відповіді

СтатусКодЗначення
200{"success": true}Прийнято. Оновлення надійде одразу слідом.
400MISSING_FIELDSУ тілі немає що оновлювати.
400INVALID_BODYТіло не є коректним JSON.
400код кнопкиЩось не так із кнопкою, див. кнопки.
401INVALID_TOKENURL недійсний.
404TOKEN_NOT_FOUNDСтрок дії URL минув, або його використали для видалення повідомлення.
502PUBLISH_FAILEDНе вдалося доставити оновлення. Спробуйте знову.

Скільки він діє

30 хвилин від моменту публікації повідомлення або використання команди. Оновлення не продовжує цей строк. Видалення повідомлення вичерпує URL. Через оновлення не можна додавати файли.

Показ поступу

Опублікуйте картку з індикатором завантаження, оновлюйте її додатковий рядок у міру виконання завдання й завершіть результатом. Індикатор завантаження це спінер із рядком і меншим рядком під ним (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' }]
});

Видалення повідомлення

Надішліть DELETE на callback_url, і повідомлення зникне для всіх. Після цього URL використати знову не можна.

Прослуховування повідомлення

stream_url це потік наживо (Server-Sent Events) того, що відбувається з вашим повідомленням. Відкрийте його, і події надходитимуть у міру того, як усе відбувається, кожна як JSON-рядок data:, чий type каже, що це:

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: {}
ПодіяКолиДані
actionНатиснуто кнопку.action_id, а також збережена кнопка в action з її payload
reactionДодано або прибрано реакцію.emoji, а також action: add, remove або removeall
replyХтось відповів на повідомлення.content відповіді
expiredПотік закривається. Надсилається як іменована подія.Немає
Події не зберігаються на потім. Відкривайте потік, щойно отримаєте URL: те, що сталося до підключення, не надсилається. Кожна подія також містить message_id, хто це зробив (member_guid, member) і коли (ts). Рядок-коментар кожні 20 секунд підтримує з’єднання відкритим.

Прослуховування в 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();
});

Де його отримати

Звідки беретьсяВідкритий
Публікація через вебхук із кнопками10 хвилин або година з "sse_event_extended_timeout": true
Кожен запит команди10 хвилин

Помилки

СтатусКодЗначення
401INVALID_TOKENТокен в URL неправильний.
404NOT_FOUNDСтрок дії потоку минув, або його ніколи не існувало.

Що далі