Last active
July 28, 2017 17:01
-
-
Save jazzedge/84ded7b463be66684c88ad3fca501c12 to your computer and use it in GitHub Desktop.
Bot - Full Example: Synchronous remote file GET using promises
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 'use strict'; | |
| // 01. Include required files | |
| require('dotenv-extended').load(); | |
| var restify = require('restify'); | |
| var builder = require('botbuilder'); | |
| // 02. Setup Restify Server | |
| var server = restify.createServer(); | |
| // 03. Configure listen for messages | |
| server.listen(process.env.PORT || 3978, function() | |
| { | |
| console.log('%s listening to %s', server.name, server.url); | |
| }); | |
| // 04. Create chat bot | |
| var connector = new builder.ChatConnector | |
| ({ | |
| appId: process.env.MICROSOFT_APP_ID, | |
| appPassword: process.env.MICROSOFT_APP_PASSWORD | |
| }); | |
| // 05. Listen for messages | |
| server.post('/api/messages', connector.listen()); | |
| // 06. Serve static files | |
| server.get(/.*/, restify.serveStatic({ | |
| directory: __dirname, | |
| 'default': 'index.html' | |
| })); | |
| var html = 'HTML'; | |
| // 01. Root Dialog | |
| var bot = new builder.UniversalBot(connector, [ | |
| (session, args, next) => { | |
| session.send("Hello"); | |
| next(); | |
| }, | |
| (session, args, next) =>{ | |
| session.send("Going Async..."); | |
| session.beginDialog('async'); // Call the Asynchronous demo dialog that does an https: GET lookup | |
| } | |
| ]); | |
| bot.dialog('async', [ | |
| function (session, results, next) { | |
| session.sendTyping(); // Give a visual indication that the system is responding. Note: this disappears after a couple of seconds | |
| html = getContent('https://newapi.enfield.gov.uk/address-search/postcode/EN1%201AA') // Make the GET call. This could take a while, or not. | |
| .then((html) => { // Once a response is received, you enter into this section (or the catch section if there is an error) | |
| console.log('JSON', html); // Display the result on the console to prove it's arrived. Then delay moving on for 20 seconds | |
| setTimeout(function() { // Add a delay just to show that you don't go to the next step in the waterfall until this section is reached | |
| session.send('Succeeding out of the async dialog...' + html); | |
| next(); | |
| },20000); //Give it 20 seconds just to prove that next | |
| }) | |
| .catch((err) => { | |
| console.error('OOPS:',err) | |
| session.send('Erroring out of the async dialog...'); | |
| }); | |
| }, | |
| function(session, results) | |
| { | |
| session.endDialog('Now we are out!'); // You should arrive here 20 seconds after the data is shown on the console. = Synchronous GET !!! | |
| } | |
| ]); | |
| function getContent(url) { | |
| // return new pending promise | |
| return new Promise((resolve, reject) => { | |
| // select http or https module, depending on reqested url | |
| const lib = url.startsWith('https') ? require('https') : require('http'); | |
| const request = lib.get(url, (response) => { | |
| // handle http errors | |
| console.log("Response code:", response.statusCode); | |
| if (response.statusCode < 200 || response.statusCode > 299) { | |
| reject(new Error('Failed to load page, status code: ' + response.statusCode)); | |
| } | |
| // temporary data holder | |
| const body = []; | |
| // on every content chunk, push it to the data array | |
| response.on('data', (chunk) => body.push(chunk)); | |
| // we are done, resolve promise with those joined chunks | |
| response.on('end', () => resolve(body.join(''))); | |
| }); | |
| // handle connection errors of the request | |
| request.on('error', (err) => reject('Chips' + err)) | |
| }) | |
| }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment