Slack button response back to dialogflow to trigger followup intent fullfillment - dialogflow-es

In my case I am creating a slack chat bot using dialogflow. On saying "Hi" to the bot, it responds with 3 buttons out of which user has to chose. Based on the choice made the subsequent intent has to be triggered.
I am able to create buttons in slack chat bot but cant able to get the selection back to dialogflow and trigger the desired intent.
Sample code:
function welcome (agent) {
agent.add( new Payload(agent.SLACK, {
"text":'Welcome ',
"attachments": [
{
"text": "Please choose any of the following options",
"actions": [
{`enter code here`
"name": "General Enquiries",
"type": "button",
"text": "General Enquiries",
"value": "General Enquiries"
},
{
"name": "Account Related Queries",
"type": "button",
"text": "Account Related Queries",
"value": "Account Related Queries"
},
{
"name": "Complaints",
"type": "button",
"text": "Complaints",
"value": "Complaints"
}
]
}
]
}) );
}
function accountQueries (agent){
agent.add('Hi buddy');
}
function Complaints (agent){
agent.add('Hi teddy');
}
let intentMap = new Map();
intentMap.set(WELCOME_INTENT, welcome);
intentMap.set(ACCOUNT_RELATED_QUERIES, accountQueries);
intentMap.set(COMPLAINTS, Complaints);
agent.handleRequest(intentMap);

Related

Google chat custom cards using dialogflow fulfilment webhook

I am trying to integrate DialogFlow bot with Hangouts Chat (for G Suite). I have enabled the integration on DialogFlow and the basic intents are working fine.
In order to perform backend operations using fulfillment, I have created a firebase cloud function and added this as the webhook URL on DialogFlow fulfillment page.
I have written the cloud function code to identify the intent, and to generate the Webhook response format for a simple text response. This is working, and I am seeing the firestore data being modified in response to the intent.
However for a more complicated intent, I wish to use more of the dynamic card based response that Chat offers. In order to achieve this, I have looked at the documentation for dialogflow card response.
I saw this following code at https://cloud.google.com/dialogflow/docs/integrations/hangouts. When I paste this into the dialogflow intent editor UI under hangouts custom payload (after disabling webhook integration), it works
{
"hangouts": {
"header": {
"title": "Pizza Bot Customer Support",
"subtitle": "pizzabot#example.com",
"imageUrl": "..."
},
"sections": [{
"widgets": [{
"keyValue": {
"icon": "TRAIN",
"topLabel": "Order No.",
"content": "12345"
}
},
{
"keyValue": {
"topLabel": "Status",
"content": "In Delivery"
}
}]
},
{
"header": "Location",
"widgets": [{
"image": {
"imageUrl": "https://dummyimage.com/600x400/000/fff"
}
}]
},
{
"header": "Buttons - i could leave the header out",
"widgets": [{
"buttons": [{
"textButton": {
"text": "OPEN ORDER",
"onClick": {
"openLink": {
"url": "https://example.com/orders/..."
}
}
}
}]
}]
}]
}
}
This is exactly what I need, but I need this response from the webhook. I'm not getting the correct response format to map between the two.
When I try to integrate the same code with the webhook, I am not getting any reply on hangouts chat. When I check the history section on dialogflow UI, here is the response structure as mentioned in Raw interaction log
{
"queryText": "<redacted>",
"parameters": {},
"intent": {
"id": "<redacted>",
"displayName": "<redacted>",
"priority": 500000,
"webhookState": "WEBHOOK_STATE_ENABLED"
},
"intentDetectionConfidence": 1,
"diagnosticInfo": {
"webhook_latency_ms": 284
},
"languageCode": "en",
"slotfillingMetadata": {
"allRequiredParamsPresent": true
},
"id": "<redacted>",
"sessionId": "<redacted>",
"timestamp": "2020-07-30T12:05:29.094Z",
"source": "agent",
"webhookStatus": {
"webhookUsed": true,
"webhookPayload": {
"hangouts": {
"header": {
"subtitle": "pizzabot#example.com",
"title": "Pizza Bot Customer Support",
"imageUrl": "..."
},
"sections": [
{
"widgets": [
{
"keyValue": {
"content": "12345",
"topLabel": "Order No.",
"icon": "TRAIN"
}
},
{
"keyValue": {
"topLabel": "Status",
"content": "In Delivery"
}
}
]
},
{
"widgets": [
{
"image": {
"imageUrl": "https://dummyimage.com/600x400/000/fff"
}
}
],
"header": "Location"
},
{
"widgets": [
{
"buttons": [
{
"textButton": {
"text": "OPEN ORDER",
"onClick": {
"openLink": {
"url": "https://example.com/orders/..."
}
}
}
}
]
}
],
"header": "Buttons - i could leave the header out"
}
]
}
},
"webhookStatus": {
"message": "Webhook execution successful"
}
},
"agentEnvironmentId": {
"agentId": "<redacted>",
"cloudProjectId": "<redacted>"
}
}
I also found this link on chat docs which explains how to show an interactive card based UI https://developers.google.com/hangouts/chat/how-tos/cards-onclick. However I'm not able to understand how to integrate the same with the webhook.
UPDATE
I have followed a tutorial at https://www.leeboonstra.com/Bots/custom-payloads-rich-cards-dialogflow/ and was able to get the card response to show up using the sample code they mention. It is using this deprecated library (https://github.com/dialogflow/dialogflow-fulfillment-nodejs). Here is the code for that to work,
let payload = new Payload("hangouts", json, {
rawPayload: true,
sendAsMessage: true,
});
agent.add(payload);
Here the json variable should be the previous JSON structure I have mentioned. So now, I'm able to map to the correct response format using the deprecated API. However, I'm not able to get the button to send the right response to the back end. Here is the buttons field that I modified from the previous json,
"buttons": [
{
"textButton": {
"text": "Click Me",
"onClick": {
"action": {
"actionMethodName": "snooze",
"parameters": [
{
"key": "time",
"value": "1 day"
},
{
"key": "id",
"value": "123456"
}
]
}
}
}
}
]
As far as I know, responding to a Google Chat (formerly Hangouts Chat) button isn't possible when using the direct Dialogflow integration.
The problem is that the button response can be sent one of two ways:
An event will be sent back to the bot code indicating the click.
Using the onClick.openLink.url property, as most of your test show.
This will take the person clicking it to the URL in question. But once there, you're taken out of the bot flow.
However, the documentation for the Hangouts Chat integration with Dialogflow doesn't provide any information about how this event is passed to Dialogflow, and the last time I tested it - it isn't.
You can write your own integration using Google Chat's API on something like Cloud Functions or Apps Script and have your script call Dialogflow's Detect Intent API to determine what Intent would be triggered by the user (and determine replies or call the webhook for additional processing). Under this scheme, you can choose how to handle the onClick event. Making your own integration also provides you a way to do Incoming Webhooks, which isn't possible when using the Dialogflow integration.

postback users action in hangout chat bot

I am trying to ask users feedback on bot responses however it's not working or no response
Steps-
I created an intent with custom payload as follows
created a new intent where I have entered user says as "Yes" which is of type postback & payload as "Yes"
My logic is-
When users click on Yes button,
postback as Yes is sent as user query to dialogflow.com
where there is an intent which matches user says with Yes & sends a response back.
{
"hangouts": {
"attachment": {
"type": "template",
"payload": {
"template_type": "button",
"text": "Was this article helpful?",
"buttons": [
{
"type": "postback",
"payload": "Yes",
"title": "Yes"
},
{
"type": "postback",
"payload": "NO",
"title": "No"
}
]
}
}
}
}

Does Google Dialogflow custom payloads have a Call Function in Telegram?

I had integrated Dialogflow in both Facebook Messenger & Telegram. In FB messenger, when a user press a button, it will opens the user's phone dialing pad and calls the number. Here's the code:
//FB Messenger code
{
"facebook": {
"attachment": {
"type": "template",
"payload": {
"template_type": "button",
"text": "Sorry but I didn't quite catch that. If it's urgent, do give us a call instead. Thanks!",
"buttons": [
{
"type": "phone_number",
"title": "Call Us",
"payload": "+60123456789"
}
]
}
}
}
}
How to i do this in Telegram?? Thanks

Dialogflow Fulfillment LINE custom payload

I am creating Dialogflow fulfillment webhook and use https://github.com/dialogflow/dialogflow-fulfillment-nodejs
I want to use quick reply in LINE and use Suggestion, but it is not working as I want it like this quick reply. Then I decide to try Custom Payload, but it is not working.
My code is like this
function testQuickReplyHandler(agent) {
let payload = {
"messages": [
{
"type": "text",
"text": "Select your favorite food category or send me your location!",
"quickReply": {
"items": [
{
"type": "action",
"action": {
"type": "message",
"label": "Sushi",
"text": "Sushi"
}
},
{
"type": "action",
"action": {
"type": "message",
"label": "Tempura",
"text": "Tempura"
}
},
{
"type": "action",
"action": {
"type": "location",
"label": "Send location"
}
}
]
}
}
]};
agent.add(new Payload('LINE', payload));
}
Am I missing something? I also try removing "messages" field, but also not working
agent.add(new Payload('LINE', payload)); => agent.add(new Payload(agent.ACTIONS_ON_GOOGLE, payload));
Or any payload you like

Unable to get telegram inline buttons to work

I was working with MS Bot framework and wanted to display some inline buttons on telegram after going through the documentation and some related questions i wrote the following but after session.send(temp) I'm not getting any buttons on the channel.
var temp = {
"type": "Message",
"from": { "channelID":"telegram", "address": session.message.from.id},
"to": { "channelID":"telegram", "address": session.message.to.id},
"conversationId": session.message.conversationId,
"channelData": {
"method": "editMessageReplyMarkup",
"parameters": {
"message_id": session.message.id,
"reply_markup": {
"inline_keyboard": [
[{"text": "Show me more options", "callback_data": "next"}],
[{"text": "Start a new search", "callback_data": "quit"}]
]
}
}
}
};
session.send(temp);
Buttons are supported natively in BotFramework so you don't need to use ChannelData. (See Docs)
"buttons":
[
{
"type": "imBack",
"title": "Show me more options",
"value": "next"
},
{
"type": "imBack",
"title": "Start a new search",
"value": "quit"
}
]
If you did want to achieve this through channelData, you must stringify the value of the reply_markup field, e.g.:
"reply_markup": JSON.stringify({
"inline_keyboard": [
[{"text": "Show me more options", "callback_data": "next"}],
[{"text": "Start a new search", "callback_data": "quit"}]
]
})

Resources