Ενημέρωσε μηνύματα ζωντανά
Ένα μήνυμα δεν χρειάζεται να μείνει όπως δημοσιεύτηκε. Δείξε την πρόοδο όσο τρέχει μια εργασία, βάλε το αποτέλεσμα στη θέση του loader, βγάλε τα κουμπιά μόλις κάποιος αποφασίσει ή διάγραψέ το. Όλοι στο κανάλι βλέπουν την αλλαγή αμέσως.
Τι μπορείς να κάνεις
- Ενημέρωσε την κάρταΆλλαξε το κείμενο, το χρώμα και τα κουμπιά, επί τόπου.
- Δείξε την πρόοδοΈνας loader που περνά από βήματα και μετά το αποτέλεσμα.
- Διάγραψέ τοΑφαίρεσε ένα μήνυμα όταν δεν ισχύει πια.
- Άκουσέ τοΑπαντήσεις, αντιδράσεις και πατήματα κουμπιών στο μήνυμά σου, ζωντανά.
Στην εφαρμογή
Δημοσιεύτηκε με loader
Ενημερώθηκε: βήμα 2 από 3
Ενημερώθηκε: ολοκληρώθηκε, με κουμπί
Ένα μήνυμα, ενημερωμένο δύο φορές μέσω του callback URL του. Κανείς δεν βλέπει τρία μηνύματα, μόνο ένα που αλλάζει.
Γρήγορο ξεκίνημα
Κράτα το callback URL
Κάθε δημοσίευση από webhook και κάθε αίτημα εντολής έρχεται με ένα
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 για αφαίρεση
Δεν χρειάζεται body.
bashcurl -X DELETE "$CALLBACK_URL"
Ενημέρωση μηνύματος
Στείλε JSON με PUT στο callback_url. Στείλε μόνο ό,τι θέλεις να αλλάξεις.
| Πεδίο | Τύπος | Τι κάνει |
|---|---|---|
message_container | object | Η νέα κάρτα. Δες τις κάρτες μηνυμάτων. |
actions | array | Νέα κουμπιά. Το "actions": [] τα αφαιρεί όλα. Αν παραλείψεις το πεδίο, μένουν ως έχουν. |
content | string | Νέο κείμενο. |
title, description, color, loader, ... | string | Συντόμευση: τα πεδία κάρτας στο ανώτερο επίπεδο τυλίγονται αυτόματα σε κάρτα για σένα. |
message_container αντικαθιστά ολόκληρη την παλιά κάρτα: ένα πεδίο που παραλείπεις χάνεται. Μεταφέρονται μόνο ο τύπος, το όνομα και το avatar της. Γι’ αυτό στέλνε κάθε φορά ολόκληρη την κάρτα.Αποκρίσεις
| Status | Κωδικός | Σημασία |
|---|---|---|
200 | {"success": true} | Έγινε δεκτό. Η ενημέρωση ακολουθεί αμέσως μετά. |
400 | MISSING_FIELDS | Δεν υπάρχει τίποτα για ενημέρωση στο body. |
400 | INVALID_BODY | Το body δεν είναι έγκυρο JSON. |
400 | κωδικός κουμπιού | Κάτι δεν πάει καλά με ένα κουμπί, δες τα κουμπιά. |
401 | INVALID_TOKEN | Το URL δεν είναι έγκυρο. |
404 | TOKEN_NOT_FOUND | Το URL έληξε ή χρησιμοποιήθηκε για να διαγραφεί το μήνυμα. |
502 | PUBLISH_FAILED | Η ενημέρωση δεν μπόρεσε να παραδοθεί. Δοκίμασε ξανά. |
Πόσο διαρκεί
30 λεπτά από τη στιγμή που δημοσιεύτηκε το μήνυμα ή χρησιμοποιήθηκε η εντολή. Η ενημέρωση δεν παρατείνει αυτόν τον χρόνο. Η διαγραφή του μηνύματος καταναλώνει το URL. Δεν μπορείς να προσθέσεις αρχεία μέσω ενημέρωσης.
Δείξε την πρόοδο
Δημοσίευσε μια κάρτα με loader, ενημέρωνε το δευτερεύον κείμενό της όσο προχωρά η εργασία και τελείωσε με το αποτέλεσμα. Ο loader είναι ένας δείκτης φόρτωσης με μια γραμμή κειμένου και μια μικρότερη από κάτω (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();
});Πού το παίρνεις
| Από πού προέρχεται | Ανοιχτό για |
|---|---|
| Δημοσίευση webhook με κουμπιά | 10 λεπτά, ή μία ώρα με "sse_event_extended_timeout": true |
| Κάθε αίτημα εντολής | 10 λεπτά |
Σφάλματα
| Status | Κωδικός | Σημασία |
|---|---|---|
401 | INVALID_TOKEN | Το token στο URL είναι λάθος. |
404 | NOT_FOUND | Η ροή έληξε ή δεν υπήρξε ποτέ. |