Przejdź do treści głównej
Deweloperzy Karty wiadomości

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.

  1. 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.
  2. Tytuł i statustitle, który staje się linkiem, gdy ustawisz title_url, z pigułką status obok.
  3. PodtytułDruga pogrubiona linia, sub_title.
  4. OpisTreść, w markdownie.
  5. PolaWiersze z etykietą i wartością, z przyciskiem kopiowania.
  6. StopkaGodzina oraz dodane i usunięte linie, jeśli je wyślesz.
json
{
  "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.

PoleTypCo robi
typestringembed_message (domyślnie) albo system_message.
badgestringMała plakietka za nazwą w nagłówku, np. acme/web. Odpowiedzi na komendy
avatar_urlstringObraz nałożony na ikonę karty.
colorstringKolor krawędzi. Zobacz kolory niżej.
titlestringPogrubiona pierwsza linia.
title_urlstringZamienia tytuł w link.
sub_titlestringDruga pogrubiona linia pod tytułem.
descriptionstringTreść, w markdownie.
fieldsarray[{ "field": "…", "value": "…" }]: wiersze z etykietą i wartością.
image_url, image_base64stringObraz na karcie.
imagesarray[{ "image_url": "…" }]: galeria kilku obrazów.
statusobject lub stringKolorowa pigułka obok tytułu. Zobacz niżej. Odpowiedzi na komendy
additions, deletions, files_changednumberStatystyki diffu w stopce. Odpowiedzi na komendy
loader, loader_text, loader_sub_textboolean, stringSpinner zamiast treści.
thinkingstringRozumowanie ukryte za przełącznikiem Show thinking. Odpowiedzi na komendy
Opis i 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.

json
{
  "message_container": {
    "color": "red",
    "title": "Build failed on main",
    "status": { "label": "Failing", "color": "red" },
    "description": "`search.test.js`: 2 of 212 tests failed."
  }
}
PoleTypCo robi
statusobject lub stringZwykły string jest etykietą: "status": "Open".
status.labelstringTekst pigułki. Bez niego nie ma pigułki.
status.colorstringgreen, purple, red, orange, yellow, blue albo gray.
status.iconstringOpcjonalna ikona z listy poniżej.
additionsnumberDodane linie, pokazywane jako zielone +86.
deletionsnumberUsunięte linie, pokazywane jako czerwone -12.
files_changednumberZmienione pliki, pokazywane jako 3 files.

Ikony

WartośćIkonaTypowe użycie
pull_requestgit-pull-requestOtwarto pull request
pull_request_closedgit-pull-request-closedZamknięto bez scalania
merge, mergedgit-mergeScalono
commitgit-commitWypchnięty commit
issuecircle-dotOtwarto issue
issue_closedcircle-checkZamknięto issue
checkcircle-checkTesty 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.

ZdarzenieEtykietaKolorIkona
Otwarto pull requestOpengreenpull_request
SzkicDraftgraypull_request
ScalonoMergedpurplemerged
Zamknięto bez scalaniaClosedredpull_request_closed
Otwarto issueOpengreenissue
Zamknięto issueClosedpurpleissue_closed
Wypchnięto commitCommitgraycommit
Testy przeszłyPassinggreencheck
Testy nie przeszłyFailingredbrak

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.

assistant
System
Message from Assistant
Myślę…Czytam ostatnie 50 wiadomości

Najpierw: loader

assistant
System
Message from Assistant

maya: kiedy jest standup?

Standup jest o 09:30, w #daily.
Sprawdzono przypięte wiadomości i cykliczne wydarzenie w #daily.

Potem: odpowiedź, rozumowanie zwinięte

json
{
  "message_container": {
    "type": "embed_message",
    "color": "blue",
    "loader": true,
    "loader_text": "Thinking…",
    "loader_sub_text": "Reading the last 50 messages"
  }
}
json
{
  "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…"
  }
}
PoleTypCo robi
loaderbooleantrue pokazuje spinner zamiast treści.
loader_textstringLinia obok spinnera, np. „Myślę…”.
loader_sub_textstringMniejsza linia pod nią.
thinkingstringZwinię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.

json
{
  "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.

KolorDo czego
greenSukces: testy przeszły, wdrożone, gotowe
redPorażka: błąd, awaria, odrzucone
orangeOstrzeżenie, któremu trzeba się przyjrzeć
yellowCzeka na kogoś: akceptacje, pytania
blueInformacja, domyślny
purpleZdarzenia 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.

Szablony
Przyciski
Podgląd
Body webhooka

Buduj dalej