Messaggio Dinamico

chat_dynamic è di gran lunga il tipo di messaggio più complesso e flessibile nel formato monk. Può essere utilizzato per inviare un messaggio che chiede al destinatario di allegare un video, un contatto, una posizione, di scegliere un intervallo di date, o di selezionare una o più opzioni in un elenco, e molte altre opzioni.

L’uso principale è per i bot, che possono utilizzare questo tipo di messaggio per richiedere e ottenere informazioni specifiche e “vincolate” dall’utente.

I client che lo supportano completamente adatteranno automaticamente la loro interfaccia utente e mostreranno i widget / campi di input corretti per permettere all’utente di rispondere alla richiesta chat_dynamic.

Può incorporare altri tipi di messaggi, in particolare chat_text, chat_html e chat_image in vari punti, ad esempio come “etichette” dei pulsanti o come messaggi che il client dovrebbe inviare automaticamente quando viene scelta l’opzione relativa.

Questo è il formato generale di un payload di “richiesta” chat_dynamic:

request chat_dynamic payload format
{
  content: Content[]
  layout: {
    location: 'in' | 'out'
    selectionMode: 'none' | 'button' | 'multiple' | 'input'
    orientation: 'auto' | 'vertical' | 'horizontal'
  }
  inputData: {
    // A questo livello può essere presente solo uno dei due parametri, interaction o choice
    interaction: Interaction
    choice: {
      modeBeforeSubmit: 'none' | 'inputBlock' | 'inputHide' | 'autocomplete'
      visibilityAfterSubmit: 'none' | 'block' | 'hide'
      maxSelectable: int
      minSelectable: int
      submit: Content[]
      list: Choice[]
    }
  }
}

Il messaggio di risposta a un dinamico generalmente presenta l’array di string selectedChoices a cui interno presenta tutti i commands associati alle scelte selezionate dall’utente. Questo è il formato generale di un payload di “risposta” chat_dynamic payload:

response chat_dynamic payload format
{
  selectedChoices: string[]
  content: Content[]
}
L’oggetto layout definisce il messaggio dell’interfaccia utente e fornisce i seguenti parametri:
  • location: serve per mostrare il contenuto all’interno in o all’esterno out della bubble di chat.

  • selectionMode: serve per capire il tipo di selezione: none nessuna, button singola scelta, multiple risposta multipla, input azione specifica.

  • orientation: serve per gestire la disposizione dei pulsanti (qualora fossero presenti): di default è auto, oppure possono essere vertical o horizontal.

Gli oggetti Choice, Content e Interaction sono spiegati nelle sezioni sotto. Sono vincolati alla richiesta del messaggio e dipendono dal parametro selectionMode:

Se il valore di selectionMode è:
  • input: inputData ha interaction, mai la choice, e il tipo di interaction non può mai essere send_message perché quello è presente solo con selection mode button.

  • button: inputData ha la choice, mai interaction.

  • multiple: inputData ha la choice, mai interaction; in questa modalità la choice presenta anche il pulsante submit per l’invio e i due parametri di configurazione maxSelectable e minSelectable per gestire il numero di risposte selezionabili.

  • none: non è presente inputData.

Content

Come detto in precedenza, chat_dynamic può incorporare gli altri tipi di messaggi il tutto tramite l’oggetto Content. Il formato dell’oggetto è lo stesso del formato payload del tipo di messaggio, con l’aggiunta del valore type (che normalmente si troverebbe al di fuori di arguments).

Content format
{
  // uno degli altri tipi di messaggi personalizzati
  type: string
  // tutti gli arguments presenti nel tipo di messaggio utilizzato
  arguments.param1: ...
  arguments.param2: ...
}

Per esempio, il Content per un Messaggio Immagine è:

chat_image Content
{
  "type": "chat_image",
  "filename": "image.png",
  "url": "https://xmpp-svil.monksoftware.it/api/v1/attachments/pictures/image.png",
  "thumbUrl": "https://xmpp-svil.monksoftware.it/api/v1/attachments/pictures/thumb_image.png",
  "caption": "Caption dell'immagine"
}

Choice

Ogni Choice è una possibile opzione “selezionabile” di un chat_dynamic message. A seconda del selectionMode, è possibile selezionare più di una opzione. I parametri presenti nella choice sono i seguenti:

  • modeBeforeSubmit: serve a definire lo stato del campo inputText quando viene visualizzato questo messaggio:

    • none il campo inputText resta invariato.

    • inputBlock: disabilita il campo di inserimento testo e l’invio dei messaggi.

    • inputHide: nasconde il campo di inserimento testo.

    • autocomplete: mantiene il campo inputText abilitato, ma limita l’inserimento alle sole opzioni disponibili nella lista list, impedendo l’inserimento di valori arbitrari.

  • visibilityAfterSubmit: serve a definire l’azione da compiere una volta soddisfatta la choice: none non fa nulla, per cui si possono selezionare nuovamente i pulsanti; block disabilita i pulsanti; hide nasconde i pulsanti.

  • maxSelectable: indica il numero massimo di scelte possibili (è presente solo per selectionMode multiple).

  • minSelectable: indica il numero minimo di scelte possibili (è presente solo per selectionMode multiple).

  • submit: il pulsante per l’invio delle opzioni scelte (è presente solo per selectionMode multiple).

  • list: la lista dei pulsanti.

Choice format
 {
   // la chiave che identifica la scelta, sarà inviata
   // all'interno delle "selectedChoices" in risposta al messaggio dinamico
   command: string
   // La scelta mostrata all'utente: non necessariamente testo,
   // potrebbe essere un'immagine, un video, un audio, o in generale
   // qualsiasi altro messaggio personalizzato incorporabile, e persino
   // una combinazione di questi (es. immagine + html)
   content: Content
   // L'interazione da eseguire se questa scelta viene selezionata dall'utente
   interaction: Interaction
 }

Interaction

Le Interactions descrivono come il client dovrebbe ottenere una risposta dall’utente. Alcune interazioni sono automatiche e non richiedono alcun input da parte dell’utente, mentre altre richiedono che il client mostri un widget specifico all’utente per scegliere un valore. Il formato generale di una Interaction è il seguente:

Interaction format
{
  // Tipologia di interaction
  type: InteractionType
  // Messaggi da inviare una volta completata l'interazione
  content: Content[]
  // opzioni aggiuntive su come acquisire e formattare l'input dell'utente
  // ogni tipo di interazione ha il proprio set di opzioni possibili (opzionale)
  options: InteractionOption
}

Ogni tipo di interazione ha il proprio set di opzioni: ad esempio, un’interazione input_date può avere delle opzioni per limitare l’intervallo delle date consentite.

Tutti i tipi di interazione e i relativi set di opzioni sono dettagliati nei seguenti documenti:

Esempio

Ora che abbiamo tutti i pezzi, possiamo esaminare un esempio completo di chat_dynamic. In questo esempio, viene chiesto all’utente di inviare la propria patente di guida, scattando una foto o caricando un PDF.

 <message to="bob@wfp" id="51c9b72c-f2f1-4e8d-927b-33401065cf0f-211610484933107" type="chat">
    <thread>9e036646-48a9-477d-a165-6feaea487c76</thread>
    <body>{
       "arguments": {
            "content": [
              {
                "type": "chat_text",
                "text": "Please attach your driver's license, either take a picture or upload a PDF file."
              },
              {
                "type": "chat_text",
                "text": "You can also listen to these audio instructions."
              },
              {
                "type": "chat_audio",
                "url": "https://mysite.com/audio_instructions_license_upload.mp3",
                "filename": "audio_instructins_license_upload.mp3"
              }
            ],
            "layout": {
              "location": "in",
              "selectionMode": "button",
              "orientation": "vertical"
            },
            "inputData": {
              "choice": {
                "visibilityAfterSubmit": "none",
                "list": [
                  {
                    "command": "license_picture",
                    "content": [
                      {
                        "type": "chat_text",
                        "text": "Take a picture"
                      }
                    ],
                    "interaction": {
                      "type": "take_image",
                      "options": {
                          "acceptedFormat": ["png", "jpg"]
                      }
                    }
                  },
                  {
                    "command": "license_pdf",
                    "content": [
                      {
                        "type": "chat_text",
                        "text": "Upload PDF"
                      }
                    ],
                    "interaction": {
                      "type": "take_document",
                      "options": {
                          "acceptedFormat": ["pdf"]
                      }
                    }
                  }
                ]
              }
            }
           "data": {
             "apiVersion": 3,
             "appVersion": "0.0.1",
             "os": "android",
             "token": "token",
             "useChatDynamic": true
           }
         },
         "chat_type": "chat",
         "creation_date": "2024-10-14T17:54:40.8070000Z",
         "domain": "chat",
         "identifier": "0b6685ba-7118-4a1d-84ba-138f328ec54e-211610540337024",
         "language": "eng",
         "type": "chat_dynamic",
         "version": "1.0"
       } 
    </body>
 </message>

Esempi Aggiuntivi

Il messaggio chat_dynamic è complesso, sotto ci sono esempi aggiuntivi così da vedere tutte le possibilità offerte da questo tipo di messaggio: