Оновлюйте повідомлення наживо
Повідомлення не мусить залишатися таким, яким його опублікували. Показуйте поступ, поки виконується завдання, замініть індикатор завантаження результатом, приберіть кнопки, щойно хтось ухвалив рішення, або видаліть повідомлення. Усі в каналі бачать зміну одразу.
Що можна зробити
- Оновлюйте карткуЗмінюйте текст, колір і кнопки на місці.
- Показуйте поступІндикатор завантаження, що проходить кроки, а потім результат.
- ВидаляйтеПриберіть повідомлення, щойно воно стане неактуальним.
- СлухайтеВідповіді, реакції й натискання кнопок на вашому повідомленні наживо.
У застосунку
Опубліковано з індикатором завантаження
Оновлено: крок 2 з 3
Оновлено: готово, з кнопкою
Одне повідомлення, двічі оновлене через його callback URL. Ніхто не бачить трьох повідомлень, лише одне, що змінюється.
Швидкий старт
Збережіть callback URL
Кожна публікація через вебхук і кожен запит команди містить
callback_urlдля цього повідомлення.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 для оновлення
Надішліть новий стан. Картка зміниться на місці для всіх.
bashcurl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \ -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'DELETE для видалення
Тіло не потрібне.
bashcurl -X DELETE "$CALLBACK_URL"
Оновлення повідомлення
Надішліть JSON методом PUT на callback_url. Передавайте лише те, що хочете змінити.
| Поле | Тип | Що робить |
|---|---|---|
message_container | object | Нова картка. Див. картки повідомлень. |
actions | array | Нові кнопки. "actions": [] прибирає їх усі; якщо поле не передати, вони залишаться. |
content | string | Новий текст. |
title, description, color, loader, ... | string | Скорочення: поля картки на верхньому рівні автоматично загортаються в картку. |
message_container замінює стару картку повністю: поле, яке ви не передали, зникає. Зберігаються лише її тип, ім’я та аватар. Тож щоразу надсилайте повну картку.Відповіді
| Статус | Код | Значення |
|---|---|---|
200 | {"success": true} | Прийнято. Оновлення надійде одразу слідом. |
400 | MISSING_FIELDS | У тілі немає що оновлювати. |
400 | INVALID_BODY | Тіло не є коректним JSON. |
400 | код кнопки | Щось не так із кнопкою, див. кнопки. |
401 | INVALID_TOKEN | URL недійсний. |
404 | TOKEN_NOT_FOUND | Строк дії URL минув, або його використали для видалення повідомлення. |
502 | PUBLISH_FAILED | Не вдалося доставити оновлення. Спробуйте знову. |
Скільки він діє
30 хвилин від моменту публікації повідомлення або використання команди. Оновлення не продовжує цей строк. Видалення повідомлення вичерпує URL. Через оновлення не можна додавати файли.
Показ поступу
Опублікуйте картку з індикатором завантаження, оновлюйте її додатковий рядок у міру виконання завдання й завершіть результатом. Індикатор завантаження це спінер із рядком і меншим рядком під ним (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' }]
});Видалення повідомлення
Надішліть DELETE на callback_url, і повідомлення зникне для всіх. Після цього URL використати знову не можна.
Прослуховування повідомлення
stream_url це потік наживо (Server-Sent Events) того, що відбувається з вашим повідомленням. Відкрийте його, і події надходитимуть у міру того, як усе відбувається, кожна як JSON-рядок data:, чий type каже, що це:
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 | Потік закривається. Надсилається як іменована подія. | Немає |
message_id, хто це зробив (member_guid, member) і коли (ts). Рядок-коментар кожні 20 секунд підтримує з’єднання відкритим.Прослуховування в 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 хвилин |
Помилки
| Статус | Код | Значення |
|---|---|---|
401 | INVALID_TOKEN | Токен в URL неправильний. |
404 | NOT_FOUND | Строк дії потоку минув, або його ніколи не існувало. |