Vai al contenuto principale
Sviluppatori Card dei messaggi

Progetta le card dei messaggi

Tutto ciò che un bot pubblica, da un webhook, da una risposta a un comando o dall’aggiornamento di un pulsante, è una card. Una buona card dice cosa è successo in un colpo d’occhio: un bordo colorato, un titolo, uno stato, i dettagli sotto.

Cosa puoi fare

  • Mostra uno statoUna pillola colorata come Aperta, Unita o Superata, con le righe aggiunte e rimosse.
  • Elenca i dettagliRighe di etichetta e valore che i membri possono copiare con un tocco.
  • Scrivi in markdownGrassetto, codice inline, blocchi di codice, citazioni e caselle di spunta.
  • Mostra che stai lavorandoUno spinner mentre il tuo bot pensa, e poi il suo ragionamento dietro un interruttore.

Nell'app

Quattro card come le vedono i membri. Ognuna è qualche riga di JSON.

Anatomia di una card

Le parti di una card, dall’alto in basso. Ometti ciò che non ti serve: anche una card con il solo titolo va bene.

  1. Intestazione“Messaggio da” e un nome: il nome del webhook, o il nome della tua community per la risposta a un comando. Una risposta può aggiungere un badge, come il repository.
  2. Titolo e statoIl title, un link se imposti title_url, con accanto la pillola status.
  3. SottotitoloUna seconda riga in grassetto, sub_title.
  4. DescrizioneIl corpo, in markdown.
  5. CampiRighe di etichetta e valore, con un pulsante per copiare.
  6. Piè di paginaL’orario, e le righe aggiunte e rimosse se le invii.
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
  }
}

Tutti i campi

Vanno in message_container. Una card ha bisogno di una descrizione, o di un loader. I campi segnati “risposte ai comandi” vengono scartati quando pubblichi tramite un webhook.

CampoTipoCosa fa
typestringembed_message (predefinito) o system_message.
badgestringUn piccolo chip dopo il nome nell’intestazione, come acme/web. Risposte ai comandi
avatar_urlstringUn’immagine sopra l’icona della card.
colorstringIl colore del bordo. Vedi i colori più sotto.
titlestringLa prima riga, in grassetto.
title_urlstringTrasforma il titolo in un link.
sub_titlestringUna seconda riga in grassetto sotto il titolo.
descriptionstringIl corpo, in markdown.
fieldsarray[{ "field": "…", "value": "…" }]: righe di etichetta e valore.
image_url, image_base64stringUn’immagine sulla card.
imagesarray[{ "image_url": "…" }]: una galleria di più immagini.
statusobject o stringUna pillola colorata accanto al titolo. Vedi più sotto. Risposte ai comandi
additions, deletions, files_changednumberStatistiche diff nel piè di pagina. Risposte ai comandi
loader, loader_text, loader_sub_textboolean, stringUno spinner al posto del corpo.
thinkingstringIl ragionamento dietro un interruttore Mostra il ragionamento. Risposte ai comandi
La descrizione e thinking capiscono il markdown: **bold**, _italic_, ~~strike~~, `inline code`, blocchi di codice delimitati, > quotes, caselle di spunta - [x], @menzioni e :emoji:.

Stato e statistiche diff

Una pillola di stato racconta la storia prima che qualcuno legga il testo. Sta accanto al titolo, o nel piè di pagina quando non c’è un titolo; le statistiche diff compaiono accanto all’orario. Entrambe funzionano nelle risposte ai comandi, e l’integrazione GitHub inclusa le usa. Un webhook le scarta.

json
{
  "message_container": {
    "color": "red",
    "title": "Build failed on main",
    "status": { "label": "Failing", "color": "red" },
    "description": "`search.test.js`: 2 of 212 tests failed."
  }
}
CampoTipoCosa fa
statusobject o stringUna semplice stringa è l’etichetta: "status": "Open".
status.labelstringIl testo della pillola. Senza, la pillola non c’è.
status.colorstringgreen, purple, red, orange, yellow, blue o gray.
status.iconstringUn’icona facoltativa, dall’elenco qui sotto.
additionsnumberRighe aggiunte, mostrate in verde come +86.
deletionsnumberRighe rimosse, mostrate in rosso come -12.
files_changednumberFile toccati, mostrati come 3 files.

Icone

ValoreIconaUso tipico
pull_requestgit-pull-requestUna pull request aperta
pull_request_closedgit-pull-request-closedChiusa senza merge
merge, mergedgit-mergeUnita
commitgit-commitUn commit inviato
issuecircle-dotUna issue aperta
issue_closedcircle-checkUna issue chiusa
checkcircle-checkTest superati, un job riuscito

Una mappatura che funziona per GitHub

L’integrazione GitHub inclusa usa queste; copiale per i tuoi strumenti.

EventoEtichettaColoreIcona
Pull request apertaOpengreenpull_request
BozzaDraftgraypull_request
UnitaMergedpurplemerged
Chiusa senza mergeClosedredpull_request_closed
Issue apertaOpengreenissue
Issue chiusaClosedpurpleissue_closed
Commit inviatoCommitgraycommit
Test superatiPassinggreencheck
Test fallitiFailingrednessuna

Loader e ragionamento

Per tutto ciò che richiede un momento, come una risposta dell’IA o un lavoro lungo, pubblica prima una card con uno spinner, poi sostituiscila con il risultato. Il loader funziona dai webhook e dalle risposte ai comandi. In una risposta a un comando puoi anche mettere il ragionamento del modello in thinking: i membri vedono un interruttore Mostra il ragionamento invece di un muro di testo.

assistant
System
Messaggio da Assistant
Sto pensando…Leggo gli ultimi 50 messaggi

Prima: il loader

assistant
System
Messaggio da Assistant

maya: a che ora è lo standup?

Lo standup è alle 09:30, in #daily.
Ho controllato i messaggi fissati e l’evento ricorrente in #daily.

Poi: la risposta, con il ragionamento ripiegato

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…"
  }
}
CampoTipoCosa fa
loaderbooleantrue mostra lo spinner al posto del corpo.
loader_textstringLa riga accanto allo spinner, come “Sto pensando…”.
loader_sub_textstringUna riga più piccola sotto.
thinkingstringRagionamento ripiegato sotto la descrizione, in markdown.

Per sostituire il loader con la risposta, aggiorna il messaggio con una nuova card che omette loader. Come si fa è spiegato in aggiornamenti live.

Descrizioni lunghe

Una descrizione può arrivare a 50.000 byte. Oltre i primi 1.000, i membri vedono l’inizio e un pulsante Mostra di più che carica il resto, così un report lungo non inonda il canale.

Messaggi di sistema

Imposta "type": "system_message" per un avviso invece che per un post del bot: finestre di manutenzione, cambi di regole, tutto ciò che parla a nome della community stessa. Accetta gli stessi campi e pulsanti.

json
{
  "message_container": {
    "type": "system_message",
    "color": "orange",
    "title": "Maintenance tonight",
    "description": "The build servers are down from 22:00 to 23:00."
  }
}

Colori

Il colore del bordo è il segnale più rapido su una card. Usa lo stesso colore per lo stesso tipo di notizia, ogni volta.

ColoreUsalo per
greenSuccesso: superato, distribuito, fatto
redFallimento: fallito, offline, rifiutato
orangeUn avviso che merita un’occhiata
yellowIn attesa di qualcuno: approvazioni, domande
blueInformazione, il colore predefinito
purpleEventi del codice, o qualcosa di speciale

Crea il tuo embed

Modifica i campi o il payload JSON. Restano sempre sincronizzati. Guarda il messaggio apparire esattamente come in un canale. Questo è il vero body del webhook; copialo quando ti convince.

Modelli
Pulsanti
Anteprima
Body del webhook

Continua a costruire