Σχεδίασε κάρτες μηνυμάτων
Ό,τι δημοσιεύει ένα bot, είτε από webhook, είτε ως απάντηση σε εντολή, είτε ως ενημέρωση μετά από πάτημα κουμπιού, είναι κάρτα. Μια καλή κάρτα λέει με μια ματιά τι συνέβη: μια χρωματιστή άκρη, ένας τίτλος, μια κατάσταση και από κάτω οι λεπτομέρειες.
Τι μπορείς να κάνεις
- Δείξε μια κατάστασηΜια χρωματιστή ένδειξη όπως Open, Merged ή Passing, με τις γραμμές που προστέθηκαν και αφαιρέθηκαν.
- Παράθεσε τις λεπτομέρειεςΓραμμές με ετικέτα και τιμή που τα μέλη αντιγράφουν με ένα πάτημα.
- Γράψε σε markdownΈντονα, inline κώδικας, μπλοκ κώδικα, παραθέσεις και πλαίσια ελέγχου.
- Δείξε ότι δουλεύειςΈνα spinner όσο το bot σου σκέφτεται, και μετά ο συλλογισμός του πίσω από έναν διακόπτη.
Στην εφαρμογή
Τέσσερις κάρτες όπως τις βλέπουν τα μέλη. Η καθεμία είναι λίγες γραμμές JSON.
Η ανατομία μιας κάρτας
Τα μέρη μιας κάρτας, από πάνω προς τα κάτω. Παράλειψε ό,τι δεν χρειάζεσαι: μια κάρτα μόνο με τίτλο είναι εντάξει.
- Κεφαλίδα«Message from» και ένα όνομα: το όνομα του webhook ή, σε απάντηση εντολής, το όνομα της κοινότητάς σου. Μια απάντηση μπορεί να προσθέσει ένα
badge, όπως το αποθετήριο. - Τίτλος και κατάστασηΤο
title, που γίνεται σύνδεσμος όταν ορίσειςtitle_url, με την ένδειξηstatusδίπλα του. - ΥπότιτλοςΜια δεύτερη γραμμή με έντονα, το
sub_title. - ΠεριγραφήΤο κυρίως κείμενο, σε markdown.
- ΠεδίαΓραμμές με ετικέτα και τιμή, με κουμπί αντιγραφής.
- ΥποσέλιδοΗ ώρα, και οι γραμμές που προστέθηκαν και αφαιρέθηκαν, αν τις στείλεις.
{
"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
}
}Όλα τα πεδία
Αυτά μπαίνουν στο message_container. Μια κάρτα χρειάζεται περιγραφή ή loader. Τα πεδία με τη σήμανση «Απαντήσεις σε εντολές» παραλείπονται όταν δημοσιεύεις μέσω webhook.
| Πεδίο | Τύπος | Τι κάνει |
|---|---|---|
type | string | embed_message (η προεπιλογή) ή system_message. |
badge | string | Ένα μικρό σήμα μετά το όνομα στην κεφαλίδα, όπως acme/web. Απαντήσεις σε εντολές |
avatar_url | string | Μια εικόνα πάνω από το εικονίδιο της κάρτας. |
color | string | Το χρώμα της άκρης. Δες τα χρώματα παρακάτω. |
title | string | Η πρώτη γραμμή, με έντονα. |
title_url | string | Κάνει τον τίτλο σύνδεσμο. |
sub_title | string | Μια δεύτερη γραμμή με έντονα, κάτω από τον τίτλο. |
description | string | Το κυρίως κείμενο, σε markdown. |
fields | array | [{ "field": "…", "value": "…" }]: γραμμές με ετικέτα και τιμή. |
image_url, image_base64 | string | Μια εικόνα στην κάρτα. |
images | array | [{ "image_url": "…" }]: μια συλλογή από πολλές εικόνες. |
status | object ή string | Μια χρωματιστή ένδειξη δίπλα στον τίτλο. Δες παρακάτω. Απαντήσεις σε εντολές |
additions, deletions, files_changed | number | Στατιστικά diff στο υποσέλιδο. Απαντήσεις σε εντολές |
loader, loader_text, loader_sub_text | boolean, string | Ένα spinner αντί για το κυρίως κείμενο. |
thinking | string | Συλλογισμός πίσω από έναν διακόπτη Show thinking. Απαντήσεις σε εντολές |
thinking καταλαβαίνουν markdown: **bold**, _italic_, ~~strike~~, `inline code`, μπλοκ κώδικα ανάμεσα σε τριπλά backticks, > quotes, πλαίσια ελέγχου - [x], @mentions και :emoji:.Κατάσταση και στατιστικά diff
Μια ένδειξη κατάστασης λέει την ιστορία πριν διαβάσει κανείς το κείμενο. Βρίσκεται δίπλα στον τίτλο ή, όταν δεν υπάρχει τίτλος, στο υποσέλιδο. Τα στατιστικά diff εμφανίζονται δίπλα στην ώρα. Και τα δύο λειτουργούν σε απαντήσεις εντολών, και τα χρησιμοποιεί η έτοιμη ενσωμάτωση GitHub. Ένα webhook τα παραλείπει.
{
"message_container": {
"color": "red",
"title": "Build failed on main",
"status": { "label": "Failing", "color": "red" },
"description": "`search.test.js`: 2 of 212 tests failed."
}
}| Πεδίο | Τύπος | Τι κάνει |
|---|---|---|
status | object ή string | Ένα σκέτο string είναι η ετικέτα: "status": "Open". |
status.label | string | Το κείμενο της ένδειξης. Χωρίς αυτό δεν υπάρχει ένδειξη. |
status.color | string | green, purple, red, orange, yellow, blue ή gray. |
status.icon | string | Ένα προαιρετικό εικονίδιο από την παρακάτω λίστα. |
additions | number | Γραμμές που προστέθηκαν, εμφανίζονται ως πράσινο +86. |
deletions | number | Γραμμές που αφαιρέθηκαν, εμφανίζονται ως κόκκινο -12. |
files_changed | number | Αρχεία που άλλαξαν, εμφανίζονται ως 3 files. |
Εικονίδια
| Τιμή | Εικονίδιο | Τυπική χρήση |
|---|---|---|
pull_request | git-pull-request | Άνοιξε ένα pull request |
pull_request_closed | git-pull-request-closed | Έκλεισε χωρίς merge |
merge, merged | git-merge | Έγινε merge |
commit | git-commit | Ένα commit που έγινε push |
issue | circle-dot | Άνοιξε ένα issue |
issue_closed | circle-check | Έκλεισε ένα issue |
check | circle-check | Τα τεστ πέρασαν, μια εργασία ολοκληρώθηκε με επιτυχία |
Μια αντιστοίχιση που δουλεύει για το GitHub
Η έτοιμη ενσωμάτωση GitHub χρησιμοποιεί αυτές τις τιμές. Αντίγραψέ τες για τα δικά σου εργαλεία.
| Συμβάν | Ετικέτα | Χρώμα | Εικονίδιο |
|---|---|---|---|
| Άνοιξε pull request | Open | green | pull_request |
| Πρόχειρο (draft) | Draft | gray | pull_request |
| Έγινε merge | Merged | purple | merged |
| Έκλεισε χωρίς merge | Closed | red | pull_request_closed |
| Άνοιξε issue | Open | green | issue |
| Έκλεισε issue | Closed | purple | issue_closed |
| Έγινε push ενός commit | Commit | gray | commit |
| Τα τεστ πέρασαν | Passing | green | check |
| Τα τεστ απέτυχαν | Failing | red | κανένα |
Loader και συλλογισμός
Για ό,τι παίρνει λίγο χρόνο, όπως μια απάντηση AI ή μια μεγάλη εργασία, δημοσίευσε πρώτα μια κάρτα με spinner και μετά αντικατάστησέ τη με το αποτέλεσμα. Ο loader λειτουργεί σε webhooks και σε απαντήσεις εντολών. Σε απάντηση εντολής μπορείς επίσης να βάλεις τον συλλογισμό του μοντέλου στο thinking: τα μέλη βλέπουν έναν διακόπτη Show thinking αντί για έναν τοίχο κειμένου.
Πρώτα: ο loader
Μετά: η απάντηση, με τον συλλογισμό διπλωμένο
{
"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…"
}
}| Πεδίο | Τύπος | Τι κάνει |
|---|---|---|
loader | boolean | Το true δείχνει το spinner αντί για το κυρίως κείμενο. |
loader_text | string | Η γραμμή δίπλα στο spinner, όπως «Σκέφτομαι…». |
loader_sub_text | string | Μια μικρότερη γραμμή από κάτω. |
thinking | string | Διπλωμένος συλλογισμός κάτω από την περιγραφή, σε markdown. |
Για να αντικαταστήσεις τον loader με την απάντηση, ενημέρωσε το μήνυμα με μια νέα κάρτα χωρίς loader. Πώς γίνεται θα το βρεις στις ζωντανές ενημερώσεις.
Μεγάλες περιγραφές
Μια περιγραφή μπορεί να φτάσει τα 50.000 bytes. Μετά τα πρώτα 1.000, τα μέλη βλέπουν την αρχή και ένα κουμπί Show more που φορτώνει τα υπόλοιπα, ώστε μια μεγάλη αναφορά να μην πλημμυρίζει το κανάλι.
Μηνύματα συστήματος
Όρισε "type": "system_message" για μια ανακοίνωση αντί για ανάρτηση bot: παράθυρα συντήρησης, αλλαγές κανόνων, ό,τι μιλά εκ μέρους της ίδιας της κοινότητας. Δέχεται τα ίδια πεδία και κουμπιά.
{
"message_container": {
"type": "system_message",
"color": "orange",
"title": "Maintenance tonight",
"description": "The build servers are down from 22:00 to 23:00."
}
}Χρώματα
Το χρώμα της άκρης είναι το πιο γρήγορο σήμα σε μια κάρτα. Χρησιμοποίησε το ίδιο χρώμα για το ίδιο είδος είδησης, κάθε φορά.
| Χρώμα | Χρησιμοποίησέ το για |
|---|---|
green | Επιτυχία: πέρασε, έγινε deploy, ολοκληρώθηκε |
red | Αποτυχία: απέτυχε, εκτός λειτουργίας, απορρίφθηκε |
orange | Μια προειδοποίηση που θέλει μια ματιά |
yellow | Αναμονή για κάποιον: εγκρίσεις, ερωτήσεις |
blue | Πληροφορία, η προεπιλογή |
purple | Συμβάντα κώδικα ή κάτι ξεχωριστό |
Φτιάξε το embed σου
Επεξεργάσου τα πεδία ή το JSON payload: τα δύο μένουν συγχρονισμένα. Η προεπισκόπηση δείχνει το μήνυμα ακριβώς όπως θα εμφανιστεί σε ένα κανάλι. Αυτό είναι το πραγματικό body του webhook. Αντίγραψέ το όταν όλα δείχνουν σωστά.