In this article I will show to how integrate simple commands (intents) into your bot to then integrate with an external service.
Introduction
In previous articles we have looked at how to create a sample Azure bot and in this article we will be looking into how “intents” work. The microsoft documentation on dialogIntents can be found here (for the node bot).
URL Shortener
In an effort to learn more about running a node service in Azure, Azure SQL and to help brand some of my tweets a little better I created my own little URL shortening service running at https://marky.co. The details are not so important for this article but I took the Coligo.io article on create a node url shortner with Mongo and modified it to work with Azure SQL instead of Mongo. The service is called very simply by POSTing the appropriate parameters at the appropriate service on my website. What is returned is a shortened URL. Simple process really.
IntentDialog
“The IntentDialog class lets you listen for the user to say a specific keyword or phrase. We call this intent detection because you are attempting to determine what the user is intending to do. IntentDialogs are useful for building more open ended bots that support natural language style understanding.”
So in a sense I am looking at this as an opportunity to treat my bot as a CLI client for my own laziness. While the “intent” is to allow for natural language understanding I want to look at it as an opportunity to make my bot into a monkey butler of sorts. Do my work for me, I am lazy (or productive).
I am not a fan of CLI in the programming world. Not being a historically Unix kinda guy, never had to and I prefer a point and click tooling approach to things like git and Azure CLI. That said, this is not programming – this is bots 😉
Setting up your dialogIntent to listen for -sh
The following code snippets is the basis for my simple bot connector – listen for the “-sh ” command then take the following argument and process it.
The http module is used for the communication with the shortener service. Once the response is returned from the service the shortened URL is sent back to the user. The process is simple and the intent of this is just to show an example of how to use a command in a bot to make it do something.
"use strict"; var builder = require("botbuilder"); var botbuilder_azure = require("botbuilder-azure"); var azure = require('azure-storage'); var http = require('http'); var data = ""; var options = { host: 'marky.co', port: '80', path: thepath, method: 'POST', headers: { 'secret': theSercretKeyWhichStopsBots, 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' } }; var dotenv = require('dotenv').config(); var useEmulator = (process.env.NODE_ENV == 'development'); var connector = useEmulator ? new builder.ChatConnector({ appId: process.env['MicrosoftAppId'], appPassword: process.env['MicrosoftAppPassword'] }) : new botbuilder_azure.BotServiceConnector({ appId: process.env['MicrosoftAppId'], appPassword: process.env['MicrosoftAppPassword'], stateEndpoint: process.env['BotStateEndpoint'], openIdMetadata: process.env['BotOpenIdMetadata'] }); var bot = new builder.UniversalBot(connector); var intents = new builder.IntentDialog(); bot.dialog('/', intents); intents.matches(/-sh /i, function (session, args) { var input = args.matched.input //input will be in the format "-sh http://www.xomino.com" //better validation would probably be appropriate at some point //split the input into "-sh" and theURL data="url="+input.split(" ")[1]; //match the POST length to the incoming URL options.headers['Content-Length'] = data.length session.sendTyping(); //...typing var req = http.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) { session.send('Your short URL is: '+JSON.parse(chunk).shortUrl); }); }); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); // write data to request body req.write(data); req.end(); }); intents.onDefault(function (session, args, next) { session.send("I'm sorry "+session.dialogData.name+". I didn't understand."); }); if (useEmulator) { var restify = require('restify'); var server = restify.createServer(); server.listen(3978, function() { console.log('test bot endpont at http://localhost:3978/api/messages'); }); server.post('/api/messages', connector.listen()); } else { module.exports = { default: connector.listen() } }
Using this code I can start to use my bot as a URL shortener rather than having to go to my website and post the URL into a form.
Note – in case you were curious this does not work in the Skype client itself because a URL is automagically transformed into something else for preview. Ah well that’s not quite the point really 🙂
Conclusion
In this article we have see that using the bot IntentDialog class we are able to listen for predetermined commands which will then allow it to take input, act on that input and return an answer. In this case a URL shortener is a simple application but it would be much more useful if I could securely look into my enterprise and extract information relating to my business……