Google Chat: только первая карта ответа приходит для всех кнопок из виджета - PullRequest
0 голосов
/ 20 апреля 2020

Я развернул Google ChatBot. Я создал следующий виджет с 3 кнопками, методы


function testwidgetData()
{

var RESHEADER = {
  header: {
    title : 'ChatBot',
    subtitle : 'Test widget',
    imageUrl : 'https://sites.google.com/a/abc.jpg'
  }
  };
  var widgets = [
    {
      textParagraph: {
        text: '<b>Test widget</b>'
      }
      },
             {
                  "keyValue": {
                    "content": 'Input one',
                    "contentMultiline": true,
                    "button": {
                      "textButton": {
                        "text": "One",
                        "onClick": {
                          action: 
                          {
                            actionMethodName: 'testAction',
                            parameters: [{key: 'entities',value:  "one"}]
                          }
                        }
                      }
                    }
                  }
                },
                   {
                  "keyValue": {
                    "content": 'Input Two',
                    "contentMultiline": true,
                    "button": {
                      "textButton": {
                        "text": "Two",
                        "onClick": {
                          action: 
                          {
                            actionMethodName: 'testAction2',
                            parameters: [{key: 'entities',value:  "Two"}]
                          }
                        }
                      }
                    }
                  }
                },
                    {
                  "keyValue": {
                    "content": 'Input Third',
                    "contentMultiline": true,
                    "button": {
                      "textButton": {
                        "text": "Third",
                        "onClick": {
                          action: 
                          {
                            actionMethodName: 'testAction3',
                            parameters: [{key: 'entities',value:  "Third"}]
                          }
                        }
                      }
                    }
                  }
                }
    ];

   return {
        "actionResponse":{
          "type": "NEW_MESSAGE"
        },
        cards: [RESHEADER, {
          sections: [{
            widgets: widgets
          }]
        }]
      };
}

testAction обрабатываются в onCardClick, как показано ниже,

function onCardClick(event) {
if(event.action.actionMethodName === 'testAction')
  {
          return createUserInformationResponseWidget('Your selected option is : '+event.action.parameters[0].value);
  }
  else if(event.action.actionMethodName === 'testAction2')
  {
          return createUserInformationResponseWidget('Your selected option is2 : '+event.action.parameters[0].value);
  }
  else if(event.action.actionMethodName === 'testAction3')
  {
          return createUserInformationResponseWidget('Your selected option is3 : '+event.action.parameters[0].value);
  }
}

createUserInformationResponseWidget, как показано ниже

function createUserInformationResponseWidget(response)
{
  var RESHEADER = {
  header: {
    title : 'Chatbot',
    subtitle : 'Action Performed Successfully!!!',
    imageUrl : 'https://sites.google.com/right-png-1.png'
  }
  };

    var widgets = [{
      textParagraph: {
        text: '<b>'+response+'</b>'
      }
    }];

    return {
      cards: [RESHEADER, {
        sections: [{
          widgets: widgets
        }]
      }]
    };
}

Мой вопрос: При нажатии кнопки действия я получаю ответное сообщение только для первой нажатой кнопки - другие операции выполняются без какого-либо успеха / ответа об ошибке. Если я сначала нажимаю кнопку «Три», а затем получаю ответ «3», «Один» и «Два» не работают, и наоборот для всех кнопок.

1 Ответ

0 голосов
/ 21 апреля 2020

При создании пользовательских карточек с кнопками, которые будут выполнять определенное действие, вы должны определить функцию onCardClick(event) таким образом, она будет получать обратный вызов, когда пользователь нажимает кнопку.

The * Значение 1004 *, передаваемое вашей функции, будет иметь тип CARD_CLICKED, оно будет содержать соответствующую информацию для обработки действия, выполняемого пользователем. Например, если у вас более одной кнопки, вы должны использовать action.actionMethodName, чтобы определить, какая кнопка была нажата, а затем вызвать функцию, связанную с этим действием. Это пример кода:

/**
 * Responds to a CARD_CLICKED event triggered in Hangouts Chat.
 *
 * @param event the event object from Hangouts Chat
 * @return JSON-formatted response
 */
function onCardClick(event) {
  var message = "";
  var reason = event.action.parameters[0].value;
  if (event.action.actionMethodName == "testAction") {
    message = testFunction(reason);
  } else if (event.action.actionMethodName == "testAction2") {
   message = testFunction(reason);
  } else if (event.action.actionMethodName == "testAction3") {
    message = testFunction(reason);
  }
  return message;
}

function testFunction(reason) {
  return {
    "actionResponse": { "type": "NEW_MESSAGE" },
    "cards": [{
      "sections": [{
        "widgets": [{
          "textParagraph": { "text": "TEST" }
         },  {
               "buttons": [{
        "textButton": {
          "text": "Set vacation in Gmail",
          "onClick": {
            "action": {
              "actionMethodName": "testAction",
              "parameters": [{
                "key": "reason",
                "value": reason
              }]
            }
          }
        }
      }, {
        "textButton": {
          "text": "Block out day in Calendar",
          "onClick": {
            "action": {
              "actionMethodName": "testAction2",
                "parameters": [{
                  "key": "reason",
                  "value": reason
                }]
            }
          }
        }
      }, {
        "textButton": {
          "text": "TEST",
          "onClick": {
            "action": {
              "actionMethodName": "testAction3",
                "parameters": [{
                  "key": "reason",
                  "value": reason
                }]
            }
          }
        }
      }]
        }]
      }]
    }]
  };
}

Если вы хотите отправить обновление или новое сообщение . Вы должны указать это, установив actionResponse.type как UPDATE_MESSAGE или NEW_MESSAGE таким образом, что у вас будет создан новый виджет.

Документы

...