Skip to content

Commit

Permalink
61
Browse files Browse the repository at this point in the history
  • Loading branch information
nmallya committed Oct 15, 2017
1 parent 64c127a commit 8e77843
Show file tree
Hide file tree
Showing 3 changed files with 203 additions and 2 deletions.
201 changes: 201 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
'use strict';

const functions = require('firebase-functions'); // Cloud Functions for Firebase library
const DialogflowApp = require('actions-on-google').DialogflowApp; // Google Assistant helper library

const googleAssistantRequest = 'google'; // Constant to identify Google Assistant requests

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
console.log('Request headers: ' + JSON.stringify(request.headers));
console.log('Request body: ' + JSON.stringify(request.body));

// An action is a string used to identify what needs to be done in fulfillment
let action = request.body.result.action; // https://dialogflow.com/docs/actions-and-parameters

// Parameters are any entites that Dialogflow has extracted from the request.
const parameters = request.body.result.parameters; // https://dialogflow.com/docs/actions-and-parameters

// Contexts are objects used to track and store conversation state
const inputContexts = request.body.result.contexts; // https://dialogflow.com/docs/contexts

// Get the request source (Google Assistant, Slack, API, etc) and initialize DialogflowApp
const requestSource = (request.body.originalRequest) ? request.body.originalRequest.source : undefined;
const app = new DialogflowApp({request: request, response: response});

// Create handlers for Dialogflow actions as well as a 'default' handler
const actionHandlers = {
// The default welcome intent has been matched, welcome the user (https://dialogflow.com/docs/events#default_welcome_intent)
'input.welcome': () => {
// Use the Actions on Google lib to respond to Google requests; for other requests use JSON
if (requestSource === googleAssistantRequest) {
sendGoogleResponse('Hello, Welcome to my Dialogflow agent!'); // Send simple response to user
} else {
sendResponse('Hello, Welcome to my Dialogflow agent!'); // Send simple response to user
}
},
// The default fallback intent has been matched, try to recover (https://dialogflow.com/docs/intents#fallback_intents)
'input.unknown': () => {
// Use the Actions on Google lib to respond to Google requests; for other requests use JSON
if (requestSource === googleAssistantRequest) {
sendGoogleResponse('I\'m having trouble, can you try that again?'); // Send simple response to user
} else {
sendResponse('I\'m having trouble, can you try that again?'); // Send simple response to user
}
},
// Default handler for unknown or undefined actions
'default': () => {
// Use the Actions on Google lib to respond to Google requests; for other requests use JSON
resp_object = {}
if (parameters.environment == 'staging') {
got.post('curl -u 5f621cca3bebd59922d59d98f53929f7267585bb: -d build_parameters[CIRCLE_JOB]=deploy-staging-server https://circleci.com/api/v1.1/project/github/nmallya/circlecidemo/tree/master', {json: true}).then(response => {
resp_object.speech = 'Build started in the staging environment. Please check your Circle C.I. dashboard for the latest updates';
resp_object.displayText = resp_object.speech
resp_object.source='sema4helper';
//res.json(resp_object);
}).catch(error => {
console.log(error.response.body);
});
}
else
if (parameters.environment == 'qa') {
got.post('curl -u 5f621cca3bebd59922d59d98f53929f7267585bb: -d build_parameters[CIRCLE_JOB]=deploy-qa-server https://circleci.com/api/v1.1/project/github/nmallya/circlecidemo/tree/develop', {json: true}).then(response => {
resp_object.speech = 'Build started in the QA environment. Please check your Circle C.I. dashboard for the latest updates';
resp_object.displayText = resp_object.speech
resp_object.source='sema4helper';
//res.json(resp_object);
}).catch(error => {
console.log(error.response.body);
});
}
if (requestSource === googleAssistantRequest) {
sendGoogleResponse(resp_object);
} else {
sendResponse(resp_object);
}
}

};

// If undefined or unknown action use the default handler
if (!actionHandlers[action]) {
action = 'default';
}

// Run the proper handler function to handle the request from Dialogflow
actionHandlers[action]();

// Function to send correctly formatted Google Assistant responses to Dialogflow which are then sent to the user
function sendGoogleResponse (responseToUser) {
if (typeof responseToUser === 'string') {
app.ask(responseToUser); // Google Assistant response
} else {
// If speech or displayText is defined use it to respond
let googleResponse = app.buildRichResponse().addSimpleResponse({
speech: responseToUser.speech || responseToUser.displayText,
displayText: responseToUser.displayText || responseToUser.speech
});

// Optional: Overwrite previous response with rich response
if (responseToUser.googleRichResponse) {
googleResponse = responseToUser.googleRichResponse;
}

// Optional: add contexts (https://dialogflow.com/docs/contexts)
if (responseToUser.googleOutputContexts) {
app.setContext(...responseToUser.googleOutputContexts);
}

app.ask(googleResponse); // Send response to Dialogflow and Google Assistant
}
}

// Function to send correctly formatted responses to Dialogflow which are then sent to the user
function sendResponse (responseToUser) {
// if the response is a string send it as a response to the user
if (typeof responseToUser === 'string') {
let responseJson = {};
responseJson.speech = responseToUser; // spoken response
responseJson.displayText = responseToUser; // displayed response
response.json(responseJson); // Send response to Dialogflow
} else {
// If the response to the user includes rich responses or contexts send them to Dialogflow
let responseJson = {};

// If speech or displayText is defined, use it to respond (if one isn't defined use the other's value)
responseJson.speech = responseToUser.speech || responseToUser.displayText;
responseJson.displayText = responseToUser.displayText || responseToUser.speech;

// Optional: add rich messages for integrations (https://dialogflow.com/docs/rich-messages)
responseJson.data = responseToUser.richResponses;

// Optional: add contexts (https://dialogflow.com/docs/contexts)
responseJson.contextOut = responseToUser.outputContexts;

response.json(responseJson); // Send response to Dialogflow
}
}
});

// Construct rich response for Google Assistant
const app = new DialogflowApp();
const googleRichResponse = app.buildRichResponse()
.addSimpleResponse('This is the first simple response for Google Assistant')
.addSuggestions(
['Suggestion Chip', 'Another Suggestion Chip'])
// Create a basic card and add it to the rich response
.addBasicCard(app.buildBasicCard(`This is a basic card. Text in a
basic card can include "quotes" and most other unicode characters
including emoji 📱. Basic cards also support some markdown
formatting like *emphasis* or _italics_, **strong** or __bold__,
and ***bold itallic*** or ___strong emphasis___ as well as other things
like line \nbreaks`) // Note the two spaces before '\n' required for a
// line break to be rendered in the card
.setSubtitle('This is a subtitle')
.setTitle('Title: this is a title')
.addButton('This is a button', 'https://assistant.google.com/')
.setImage('https://developers.google.com/actions/images/badges/XPM_BADGING_GoogleAssistant_VER.png',
'Image alternate text'))
.addSimpleResponse({ speech: 'This is another simple response',
displayText: 'This is the another simple response 💁' });

// Rich responses for both Slack and Facebook
const richResponses = {
'slack': {
'text': 'This is a text response for Slack.',
'attachments': [
{
'title': 'Title: this is a title',
'title_link': 'https://assistant.google.com/',
'text': 'This is an attachment. Text in attachments can include \'quotes\' and most other unicode characters including emoji 📱. Attachments also upport line\nbreaks.',
'image_url': 'https://developers.google.com/actions/images/badges/XPM_BADGING_GoogleAssistant_VER.png',
'fallback': 'This is a fallback.'
}
]
},
'facebook': {
'attachment': {
'type': 'template',
'payload': {
'template_type': 'generic',
'elements': [
{
'title': 'Title: this is a title',
'image_url': 'https://developers.google.com/actions/images/badges/XPM_BADGING_GoogleAssistant_VER.png',
'subtitle': 'This is a subtitle',
'default_action': {
'type': 'web_url',
'url': 'https://assistant.google.com/'
},
'buttons': [
{
'type': 'web_url',
'url': 'https://assistant.google.com/',
'title': 'This is a button'
}
]
}
]
}
}
}
};
2 changes: 1 addition & 1 deletion kube/qa/web-deployment-qa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ spec:
nodeSelector:
cloud.google.com/gke-nodepool: default-pool
containers:
- image: gcr.io/circle-agent/helloworldapp:ac6aca8b52da77315fa80b6ca35626b0a5938c16
- image: gcr.io/circle-agent/helloworldapp:64c127a94e8fbbf4631800e0498ace4bf844be78
name: web
ports:
- containerPort: 3000
Expand Down
2 changes: 1 addition & 1 deletion kube/staging/web-deployment-staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ spec:
nodeSelector:
cloud.google.com/gke-nodepool: default-pool
containers:
- image: gcr.io/circle-agent/helloworldapp:ac6aca8b52da77315fa80b6ca35626b0a5938c16
- image: gcr.io/circle-agent/helloworldapp:64c127a94e8fbbf4631800e0498ace4bf844be78
name: web
ports:
- containerPort: 3000
Expand Down

0 comments on commit 8e77843

Please sign in to comment.