Projektuj karty wiadomości
Wszystko, co publikuje bot, czy to z webhooka, w odpowiedzi na komendę, czy w aktualizacji po naciśnięciu przycisku, jest kartą. Dobra karta mówi na pierwszy rzut oka, co się stało: kolorowa krawędź, tytuł, status, a pod spodem szczegóły.
Co możesz z tym zrobić
- Pokaż statusKolorowa pigułka, np. Open, Merged albo Passing, z liczbą dodanych i usuniętych linii.
- Wypisz szczegółyWiersze z etykietą i wartością, które członkowie kopiują jednym dotknięciem.
- Pisz w markdowniePogrubienie, kod inline, bloki kodu, cytaty i pola wyboru.
- Pokaż, że pracujeszSpinner, gdy bot myśli, a potem jego rozumowanie ukryte za przełącznikiem.
W aplikacji
Cztery karty tak, jak widzą je członkowie. Każda to kilka linii JSON-a.
Budowa karty
Części karty, od góry do dołu. Pomiń to, czego nie potrzebujesz: karta z samym tytułem też jest w porządku.
- Nagłówek„Message from” i nazwa: nazwa webhooka albo, przy odpowiedzi na komendę, nazwa twojej społeczności. Odpowiedź może dodać
badge, np. repozytorium. - Tytuł i status
title, który staje się linkiem, gdy ustawisztitle_url, z pigułkąstatusobok. - PodtytułDruga pogrubiona linia,
sub_title. - OpisTreść, w markdownie.
- PolaWiersze z etykietą i wartością, z przyciskiem kopiowania.
- StopkaGodzina oraz dodane i usunięte linie, jeśli je wyślesz.
{
"message_container": {
"type": "embed_message",
"badge": "acme/web",
"color": "purple",
"title": "Pull request #212 opened",
"title_url": "https://github.com/acme/web/pull/212",
"status": { "label": "Open", "color": "green", "icon": "pull_request" },
"sub_title": "Faster search in the channel list",
"description": "Search now runs **per keystroke** with a 120 ms debounce.",
"fields": [
{ "field": "Author", "value": "maya" },
{ "field": "Reviewers", "value": "dani, sam" }
],
"additions": 86,
"deletions": 12,
"files_changed": 3
}
}Wszystkie pola
Te pola trafiają do message_container. Karta potrzebuje opisu albo loadera. Pola oznaczone jako „Odpowiedzi na komendy” są pomijane, gdy publikujesz przez webhook.
| Pole | Typ | Co robi |
|---|---|---|
type | string | embed_message (domyślnie) albo system_message. |
badge | string | Mała plakietka za nazwą w nagłówku, np. acme/web. Odpowiedzi na komendy |
avatar_url | string | Obraz nałożony na ikonę karty. |
color | string | Kolor krawędzi. Zobacz kolory niżej. |
title | string | Pogrubiona pierwsza linia. |
title_url | string | Zamienia tytuł w link. |
sub_title | string | Druga pogrubiona linia pod tytułem. |
description | string | Treść, w markdownie. |
fields | array | [{ "field": "…", "value": "…" }]: wiersze z etykietą i wartością. |
image_url, image_base64 | string | Obraz na karcie. |
images | array | [{ "image_url": "…" }]: galeria kilku obrazów. |
status | object lub string | Kolorowa pigułka obok tytułu. Zobacz niżej. Odpowiedzi na komendy |
additions, deletions, files_changed | number | Statystyki diffu w stopce. Odpowiedzi na komendy |
loader, loader_text, loader_sub_text | boolean, string | Spinner zamiast treści. |
thinking | string | Rozumowanie ukryte za przełącznikiem Show thinking. Odpowiedzi na komendy |
thinking rozumieją markdown: **bold**, _italic_, ~~strike~~, `inline code`, bloki kodu w potrójnych backtickach, > quotes, pola wyboru - [x], @wzmianki i :emoji:.Status i statystyki diffu
Pigułka statusu opowiada historię, zanim ktokolwiek przeczyta tekst. Stoi obok tytułu albo, gdy tytułu nie ma, w stopce; statystyki diffu pojawiają się obok godziny. Jedno i drugie działa w odpowiedziach na komendy i korzysta z nich wbudowana integracja z GitHubem. Webhook je pomija.
{
"message_container": {
"color": "red",
"title": "Build failed on main",
"status": { "label": "Failing", "color": "red" },
"description": "`search.test.js`: 2 of 212 tests failed."
}
}| Pole | Typ | Co robi |
|---|---|---|
status | object lub string | Zwykły string jest etykietą: "status": "Open". |
status.label | string | Tekst pigułki. Bez niego nie ma pigułki. |
status.color | string | green, purple, red, orange, yellow, blue albo gray. |
status.icon | string | Opcjonalna ikona z listy poniżej. |
additions | number | Dodane linie, pokazywane jako zielone +86. |
deletions | number | Usunięte linie, pokazywane jako czerwone -12. |
files_changed | number | Zmienione pliki, pokazywane jako 3 files. |
Ikony
| Wartość | Ikona | Typowe użycie |
|---|---|---|
pull_request | git-pull-request | Otwarto pull request |
pull_request_closed | git-pull-request-closed | Zamknięto bez scalania |
merge, merged | git-merge | Scalono |
commit | git-commit | Wypchnięty commit |
issue | circle-dot | Otwarto issue |
issue_closed | circle-check | Zamknięto issue |
check | circle-check | Testy przeszły, zadanie zakończyło się sukcesem |
Mapowanie, które sprawdza się dla GitHuba
Wbudowana integracja z GitHubem używa tych wartości; skopiuj je do własnych narzędzi.
| Zdarzenie | Etykieta | Kolor | Ikona |
|---|---|---|---|
| Otwarto pull request | Open | green | pull_request |
| Szkic | Draft | gray | pull_request |
| Scalono | Merged | purple | merged |
| Zamknięto bez scalania | Closed | red | pull_request_closed |
| Otwarto issue | Open | green | issue |
| Zamknięto issue | Closed | purple | issue_closed |
| Wypchnięto commit | Commit | gray | commit |
| Testy przeszły | Passing | green | check |
| Testy nie przeszły | Failing | red | brak |
Loader i rozumowanie
Przy wszystkim, co chwilę trwa, jak odpowiedź AI czy długie zadanie, najpierw opublikuj kartę ze spinnerem, a potem zastąp ją wynikiem. Loader działa w webhookach i odpowiedziach na komendy. W odpowiedzi na komendę możesz też umieścić rozumowanie modelu w thinking: członkowie zobaczą przełącznik Show thinking zamiast ściany tekstu.
Najpierw: loader
Potem: odpowiedź, rozumowanie zwinięte
{
"message_container": {
"type": "embed_message",
"color": "blue",
"loader": true,
"loader_text": "Thinking…",
"loader_sub_text": "Reading the last 50 messages"
}
}{
"message_container": {
"type": "embed_message",
"color": "blue",
"sub_title": "maya: when is the standup?",
"description": "Standup is at **09:30**, in #daily.",
"thinking": "Checked the pinned messages and the recurring event in #daily…"
}
}| Pole | Typ | Co robi |
|---|---|---|
loader | boolean | true pokazuje spinner zamiast treści. |
loader_text | string | Linia obok spinnera, np. „Myślę…”. |
loader_sub_text | string | Mniejsza linia pod nią. |
thinking | string | Zwinięte rozumowanie pod opisem, w markdownie. |
Aby zamienić loader na odpowiedź, zaktualizuj wiadomość nową kartą bez loader. Jak to zrobić, opisujemy w aktualizacjach na żywo.
Długie opisy
Opis może mieć do 50 000 bajtów. Po pierwszych 1000 członkowie widzą początek i przycisk Show more, który wczytuje resztę, więc długi raport nie zalewa kanału.
Wiadomości systemowe
Ustaw "type": "system_message" dla komunikatu zamiast posta bota: przerw serwisowych, zmian zasad i wszystkiego, co mówi w imieniu samej społeczności. Przyjmuje te same pola i przyciski.
{
"message_container": {
"type": "system_message",
"color": "orange",
"title": "Maintenance tonight",
"description": "The build servers are down from 22:00 to 23:00."
}
}Kolory
Kolor krawędzi to najszybszy sygnał na karcie. Używaj zawsze tego samego koloru dla tego samego rodzaju wiadomości.
| Kolor | Do czego |
|---|---|
green | Sukces: testy przeszły, wdrożone, gotowe |
red | Porażka: błąd, awaria, odrzucone |
orange | Ostrzeżenie, któremu trzeba się przyjrzeć |
yellow | Czeka na kogoś: akceptacje, pytania |
blue | Informacja, domyślny |
purple | Zdarzenia w kodzie albo coś wyjątkowego |
Zbuduj swój embed
Edytuj pola albo payload JSON: jedno i drugie zmienia się razem. Podgląd pokazuje wiadomość dokładnie tak, jak pojawi się na kanale. To prawdziwe body webhooka; skopiuj je, kiedy wszystko się zgadza.