Μετάβαση στο κύριο περιεχόμενο
Προγραμματιστές Ζωντανές ενημερώσεις

Ενημέρωσε μηνύματα ζωντανά

Ένα μήνυμα δεν χρειάζεται να μείνει όπως δημοσιεύτηκε. Δείξε την πρόοδο όσο τρέχει μια εργασία, βάλε το αποτέλεσμα στη θέση του loader, βγάλε τα κουμπιά μόλις κάποιος αποφασίσει ή διάγραψέ το. Όλοι στο κανάλι βλέπουν την αλλαγή αμέσως.

Τι μπορείς να κάνεις

  • Ενημέρωσε την κάρταΆλλαξε το κείμενο, το χρώμα και τα κουμπιά, επί τόπου.
  • Δείξε την πρόοδοΈνας loader που περνά από βήματα και μετά το αποτέλεσμα.
  • Διάγραψέ τοΑφαίρεσε ένα μήνυμα όταν δεν ισχύει πια.
  • Άκουσέ τοΑπαντήσεις, αντιδράσεις και πατήματα κουμπιών στο μήνυμά σου, ζωντανά.

Στην εφαρμογή

Δημοσιεύτηκε με loader

Ενημερώθηκε: βήμα 2 από 3

Ενημερώθηκε: ολοκληρώθηκε, με κουμπί

Ένα μήνυμα, ενημερωμένο δύο φορές μέσω του callback URL του. Κανείς δεν βλέπει τρία μηνύματα, μόνο ένα που αλλάζει.

Γρήγορο ξεκίνημα

  1. Κράτα το callback URL

    Κάθε δημοσίευση από webhook και κάθε αίτημα εντολής έρχεται με ένα callback_url για εκείνο το μήνυμα.

    bash
    BODY='{"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-..."}
  2. PUT για ενημέρωση

    Στείλε τη νέα κατάσταση. Η κάρτα αλλάζει επί τόπου για όλους.

    bash
    curl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \
      -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'
  3. DELETE για αφαίρεση

    Δεν χρειάζεται body.

    bash
    curl -X DELETE "$CALLBACK_URL"

Ενημέρωση μηνύματος

Στείλε JSON με PUT στο callback_url. Στείλε μόνο ό,τι θέλεις να αλλάξεις.

ΠεδίοΤύποςΤι κάνει
message_containerobjectΗ νέα κάρτα. Δες τις κάρτες μηνυμάτων.
actionsarrayΝέα κουμπιά. Το "actions": [] τα αφαιρεί όλα. Αν παραλείψεις το πεδίο, μένουν ως έχουν.
contentstringΝέο κείμενο.
title, description, color, loader, ...stringΣυντόμευση: τα πεδία κάρτας στο ανώτερο επίπεδο τυλίγονται αυτόματα σε κάρτα για σένα.
Ένα νέο message_container αντικαθιστά ολόκληρη την παλιά κάρτα: ένα πεδίο που παραλείπεις χάνεται. Μεταφέρονται μόνο ο τύπος, το όνομα και το avatar της. Γι’ αυτό στέλνε κάθε φορά ολόκληρη την κάρτα.

Αποκρίσεις

StatusΚωδικόςΣημασία
200{"success": true}Έγινε δεκτό. Η ενημέρωση ακολουθεί αμέσως μετά.
400MISSING_FIELDSΔεν υπάρχει τίποτα για ενημέρωση στο body.
400INVALID_BODYΤο body δεν είναι έγκυρο JSON.
400κωδικός κουμπιούΚάτι δεν πάει καλά με ένα κουμπί, δες τα κουμπιά.
401INVALID_TOKENΤο URL δεν είναι έγκυρο.
404TOKEN_NOT_FOUNDΤο URL έληξε ή χρησιμοποιήθηκε για να διαγραφεί το μήνυμα.
502PUBLISH_FAILEDΗ ενημέρωση δεν μπόρεσε να παραδοθεί. Δοκίμασε ξανά.

Πόσο διαρκεί

30 λεπτά από τη στιγμή που δημοσιεύτηκε το μήνυμα ή χρησιμοποιήθηκε η εντολή. Η ενημέρωση δεν παρατείνει αυτόν τον χρόνο. Η διαγραφή του μηνύματος καταναλώνει το URL. Δεν μπορείς να προσθέσεις αρχεία μέσω ενημέρωσης.

Δείξε την πρόοδο

Δημοσίευσε μια κάρτα με loader, ενημέρωνε το δευτερεύον κείμενό της όσο προχωρά η εργασία και τελείωσε με το αποτέλεσμα. Ο loader είναι ένας δείκτης φόρτωσης με μια γραμμή κειμένου και μια μικρότερη από κάτω (loader_text, loader_sub_text).

javascript
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 που λέει τι είναι:

sse
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Η ροή κλείνει. Στέλνεται ως συμβάν με όνομα.Κανένα
Τα συμβάντα δεν αποθηκεύονται για αργότερα. Άνοιξε τη ροή μόλις έχεις το URL: ό,τι συμβεί πριν συνδεθείς δεν στέλνεται. Κάθε συμβάν φέρει επίσης το message_id, ποιος το έκανε (member_guid, member) και πότε (ts). Μια γραμμή σχολίου κάθε 20 δευτερόλεπτα κρατά τη σύνδεση ανοιχτή.

Ακρόαση σε JavaScript

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ΚωδικόςΣημασία
401INVALID_TOKENΤο token στο URL είναι λάθος.
404NOT_FOUNDΗ ροή έληξε ή δεν υπήρξε ποτέ.

Συνέχισε να φτιάχνεις