├── CONTRIBUTING.md ├── src ├── Modulo-2 │ ├── olaMundoBot.js │ ├── conversacaoBot.js │ ├── olaMundo.js │ └── conversacao.js ├── Modulo-3 │ ├── saudacao.js │ ├── saudacaoUserData.js │ ├── perguntarIdioma.js │ └── timeCoracao.js └── Modulo-4 │ ├── promptsConfirm.js │ ├── promptsChoice.js │ ├── waterfallDialog.js │ └── entrevistaPrompts.js ├── package.json ├── LICENSE ├── LICENSE.md ├── .gitignore └── README.md /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | 1. Fork it! 4 | 2. Create your feature branch: `git checkout -b my-new-feature` 5 | 3. Commit your changes: `git commit -m 'Add some feature'` 6 | 4. Push to the branch: `git push origin my-new-feature` 7 | 8 | *Remember that we have a pre-push hook with steps that analyzes and prevents mistakes.* 9 | 10 | **After your pull request is merged**, you can safely delete your branch. -------------------------------------------------------------------------------- /src/Modulo-2/olaMundoBot.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Arquivo: olaMundoBot.js 3 | * Data: 18/02/2018 4 | * Descrição: Desenvolvimento de um Bot via Console. 5 | * Author: Glaucia Lemos 6 | * 7 | */ 8 | 9 | var builder = require('botbuilder'); 10 | 11 | //Aqui estou criando um conector para usar o Bot via Console: 12 | var connector = new builder.ConsoleConnector().listen(); 13 | var bot = new builder.UniversalBot(connector); 14 | 15 | //Aqui nós vamos criar o nosso diálogo para o nosso bot: 16 | bot.dialog('/', [ 17 | function(session) { 18 | session.send('Olá Glaucia!!!'); 19 | } 20 | ]); 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/Modulo-2/conversacaoBot.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Arquivo: conversacaoBot.js 3 | * Data: 17/03/2018 4 | * Descrição: Desenvolvimento de um Bot usando Dialog via Console. 5 | * Author: Glaucia Lemos 6 | * 7 | */ 8 | 9 | const builder = require('botbuilder'); 10 | 11 | const connector = new builder.ConsoleConnector().listen(); 12 | const bot = new builder.UniversalBot(connector); 13 | 14 | bot.dialog('/', [ 15 | (session) => { 16 | builder.Prompts.text(session, 'Oi! Tudo bem?'); 17 | }, 18 | 19 | (session) => { 20 | builder.Prompts.text(session, 'Qual é o seu nome?'); 21 | }, 22 | 23 | (session, results) => { 24 | let msg = results.response; 25 | session.send(`Oi ${msg}! Em que posso ajudar?`); 26 | } 27 | ]); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hands-on-bots-node", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/glaucia86/hands-on-bots-node.git" 12 | }, 13 | "keywords": [ 14 | "botbuilder", 15 | "bots", 16 | "chatbots", 17 | "botbuilder-samples", 18 | "bot-framework", 19 | "node.js" 20 | ], 21 | "author": "Glaucia Lemos", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/glaucia86/hands-on-bots-node/issues" 25 | }, 26 | "homepage": "https://github.com/glaucia86/hands-on-bots-node#readme", 27 | "dependencies": { 28 | "botbuilder": "^3.14.1", 29 | "restify": "^7.1.1" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Modulo-2/olaMundo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Arquivo: olaMundoBot.js 3 | * Data: 18/02/2018 4 | * Descrição: Desenvolvimento de um Bot via Bot Emulator. 5 | * Author: Glaucia Lemos 6 | * 7 | */ 8 | 9 | var restify = require('restify'); 10 | var builder = require('botbuilder'); 11 | 12 | //Configuração do Server via Restify: 13 | var server = restify.createServer(); 14 | server.listen(process.env.port || process.env.PORT || 3978, function() { 15 | console.log('%s Aplicação está executando na porta %s', server.name, server.url); 16 | }); 17 | 18 | //Criação do chat connector para comunicar com o serviço do Bot Framework: 19 | var connector = new builder.ChatConnector({ 20 | appId:'', 21 | appPassword: '' 22 | }); 23 | 24 | //Endpoint para executar as mensagens para os usuários via Bot Emulator: 25 | server.post("/api/messages", connector.listen()); 26 | 27 | //Aqui entra os nossos diálogos: 28 | var bot = new builder.UniversalBot(connector, function(session) { 29 | session.send("Você disse: %s", session.message.text); 30 | }); 31 | 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Glaucia Lemos 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License 2 | SPDX short identifier: MIT 3 | 4 | Further resources on the MIT License 5 | Copyright 2018 - Glaucia Lemos 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | .DS_Store 61 | 62 | .vscode -------------------------------------------------------------------------------- /src/Modulo-2/conversacao.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Arquivo: conversacaoBot.js 3 | * Data: 17/03/2018 4 | * Descrição: Desenvolvimento de um Bot usando Dialog via Emulator 5 | * Author: Glaucia Lemos 6 | * 7 | */ 8 | 9 | const restify = require("restify"); 10 | const builder = require("botbuilder"); 11 | 12 | //Configuração do Server via restify: 13 | const server = restify.createServer(); 14 | server.listen(process.env.port || process.env.PORT || 3978, () => { 15 | console.log("%s Aplicação executando na porta %s", server.name, server.url); 16 | }); 17 | 18 | const connector = new builder.ChatConnector({ 19 | appId: "", 20 | appPassword: "" 21 | }); 22 | 23 | //Endpoint para executar as mensagens para o usuário: 24 | server.post("api/messages", connector.listen()); 25 | 26 | const bot = new builder.UniversalBot(connector); 27 | 28 | //Bloco de Diálogos 29 | bot.dialog("/", [ 30 | session => { 31 | builder.Prompts.text(session, "Olá! Tudo bem?"); 32 | }, 33 | 34 | session => { 35 | builder.Prompts.text(session, "Como você se chama?"); 36 | }, 37 | 38 | (session, results) => { 39 | let msg = results.response; 40 | session.send(`Oi ${msg}! Em que posso ajudar?`); 41 | } 42 | ]); 43 | -------------------------------------------------------------------------------- /src/Modulo-3/saudacao.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Arquivo: saudacao.js 4 | * Data: 26/03/2018 5 | * Descrição: Desenvolvimento de um Bot que solicita nome de usuário com uma 6 | * mensagem de saudação! Usando os conceitos do método: beginDialog' 7 | * Author: Glaucia Lemos 8 | * Link (Documentação - Dialog): https://goo.gl/2KHPph 9 | * 10 | */ 11 | 12 | const restify = require('restify'); 13 | const builder = require('botbuilder'); 14 | 15 | // Configuração do Server via Restify: 16 | const server = restify.createServer(); 17 | server.listen(process.env.port || process.env.PORT || 3978, () => { 18 | console.log('%s Aplicação executando na porta %s', server.name, server.url); 19 | }); 20 | 21 | // Criação do chat connector para comunicar com o serviço do Bot Framework: 22 | const connector = new builder.ChatConnector({ 23 | appId: '', 24 | appPassword: '' 25 | }); 26 | 27 | // Endpoint para executar as mensagens para os usuários: 28 | server.post('api/messages', connector.listen()); 29 | 30 | const bot = new builder.UniversalBot(connector); 31 | 32 | // Bloco de Dialogs: 33 | bot.dialog('/', [ 34 | session => { 35 | session.beginDialog('/saudacao'); 36 | } 37 | ]); 38 | 39 | bot.dialog('/saudacao', [ 40 | session => { 41 | builder.Prompts.text(session, 'Oi! Qual é o seu nome?'); 42 | }, 43 | (session, results) => { 44 | let msg = results.response; 45 | session.endDialog(`Oi! ${msg}!`); 46 | } 47 | ]); -------------------------------------------------------------------------------- /src/Modulo-3/saudacaoUserData.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Arquivo: saudacaoUserData.js 4 | * Data: 26/03/2018 5 | * Descrição: Desenvolvimento de um Bot que solicita nome de usuário com uma 6 | * mensagem de saudação! (Conceitos de Armazenamento de Dados: 'userData') 7 | * Author: Glaucia Lemos 8 | * 9 | * LINK: https://docs.microsoft.com/pt-br/azure/bot-service/nodejs/bot-builder-nodejs-state 10 | * 11 | * 12 | */ 13 | 14 | const restify = require("restify"); 15 | const builder = require("botbuilder"); 16 | 17 | // Configuração do Server via Restify: 18 | const server = restify.createServer(); 19 | server.listen(process.env.port || process.env.PORT || 3978, () => { 20 | console.log("%s Aplicação executando na porta %s", server.name, server.url); 21 | }); 22 | 23 | // Criação do chat connector para comunicar com o serviço do Bot Framework: 24 | const connector = new builder.ChatConnector({ 25 | appId: "", 26 | appPassword: "" 27 | }); 28 | 29 | // Endpoint para executar as mensagens para os usuários: 30 | server.post("api/messages", connector.listen()); 31 | 32 | const bot = new builder.UniversalBot(connector); 33 | 34 | // Bloco de Dialogs: 35 | bot.dialog('/', [ 36 | (session, results, next) => { 37 | if (!session.userData.nome) { 38 | builder.Prompts.text(session, 'Olá! Tudo bem? Qual é o seu nome?') 39 | } else { 40 | next(); 41 | } 42 | }, 43 | 44 | (session, results) => { 45 | if (results.response) { 46 | let msg = results.response; 47 | session.userData.nome = msg; 48 | } 49 | 50 | session.send(`Olá! ${session.userData.nome}!`); 51 | } 52 | ]); 53 | -------------------------------------------------------------------------------- /src/Modulo-4/promptsConfirm.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Arquivo: promptsConfirm.js 4 | * Data: 26/04/2018 5 | * Descrição: Desenvolvimento de um Bot onde será utilizado o recurso do 'Prompts.confirm' 6 | * Author: Glaucia Lemos 7 | * Link (Documentação - Dialog): 8 | * 9 | */ 10 | 11 | const restify = require("restify"); 12 | const builder = require("botbuilder"); 13 | 14 | // Configuração do Server via Restify: 15 | const server = restify.createServer(); 16 | server.listen(process.env.port || process.env.PORT || 3978, () => { 17 | console.log("%s Aplicação executando na porta %s", server.name, server.url); 18 | }); 19 | 20 | // Criação do chat connector para comunicar com o serviço do Bot Framework: 21 | const connector = new builder.ChatConnector({ 22 | appId: "", 23 | appPassword: "" 24 | }); 25 | 26 | // Endpoint para executar as mensagens para os usuários 27 | server.post("/api/messages", connector.listen()); 28 | 29 | const bot = new builder.UniversalBot(connector); 30 | 31 | bot.dialog('/', [ 32 | session => { 33 | builder.Prompts.text(session, "Olá! Qual é o seu nome?"); 34 | }, 35 | 36 | (session, results) => { 37 | let nome = results.response; 38 | session.send(`Oi! ${nome}. Seja Bem-Vindo(a) a Lanchonete XYZ`); 39 | 40 | session.beginDialog('/pedido'); 41 | } 42 | ]); 43 | 44 | bot.dialog('/pedido', [ 45 | session => { 46 | builder.Prompts.text(session, "Qual é o seu pedido?"); 47 | }, 48 | 49 | (session, results) => { 50 | let pedido = results.response; 51 | session.send(`Okay! Você pediu: ${pedido}!`); 52 | 53 | builder.Prompts.confirm(session, "Gostaria de finalizar o seu pedido?", { listStyle: builder.ListStyle.button }) 54 | }, 55 | 56 | session => { 57 | session.endDialog("Okay! Estaremos entregando o seu pedido em breve!"); 58 | } 59 | ]); -------------------------------------------------------------------------------- /src/Modulo-3/perguntarIdioma.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Arquivo: perguntarIdioma.js 4 | * Data: 26/03/2018 5 | * Descrição: Desenvolvimento de um Bot que solicita nome de usuário com uma 6 | * mensagem de saudação! (Conceitos de Armazenamento de Dados: 'dialogData') 7 | * Author: Glaucia Lemos 8 | * 9 | * LINK: https://docs.microsoft.com/pt-br/azure/bot-service/nodejs/bot-builder-nodejs-state 10 | * 11 | * 12 | */ 13 | 14 | const restify = require("restify"); 15 | const builder = require("botbuilder"); 16 | 17 | // Configuração do Server via Restify: 18 | const server = restify.createServer(); 19 | server.listen(process.env.port || process.env.PORT || 3978, () => { 20 | console.log("%s Aplicação executando na porta %s", server.name, server.url); 21 | }); 22 | 23 | // Criação do chat connector para comunicar com o serviço do Bot Framework: 24 | const connector = new builder.ChatConnector({ 25 | appId: "", 26 | appPassword: "" 27 | }); 28 | 29 | // Endpoint para executar as mensagens para os usuários: 30 | server.post("api/messages", connector.listen()); 31 | 32 | const bot = new builder.UniversalBot(connector); 33 | 34 | // Bloco de Dialogs: 35 | bot.dialog('/', [ 36 | session => { 37 | builder.Prompts.text(session, 'Oi! Tudo bem? Qual é o seu nome?'); 38 | }, 39 | 40 | (session, results) => { 41 | session.userData.nome = results.response; 42 | session.send(`Olá! ${session.userData.nome}`); 43 | 44 | session.beginDialog('/perguntarIdioma'); 45 | } 46 | ]); 47 | 48 | bot.dialog('/perguntarIdioma', [ 49 | session => { 50 | builder.Prompts.text(session, 'Qual é o idioma que você sabe falar?'); 51 | }, 52 | 53 | (session, results) => { 54 | session.dialogData.idioma = results.response; 55 | 56 | session.endDialog(`Ótimo **${session.userData.nome}**, você sabe falar o idioma 57 | **${session.dialogData.idioma}**.`); 58 | } 59 | ]); 60 | 61 | 62 | -------------------------------------------------------------------------------- /src/Modulo-3/timeCoracao.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Arquivo: olaMundoBot.js 4 | * Data: 23/04/2018 5 | * Descrição: Desenvolvimento de um Bot via Bot Emulator. 6 | * Author: Glaucia Lemos 7 | * 8 | * 9 | */ 10 | 11 | var restify = require('restify'); 12 | var builder = require('botbuilder'); 13 | 14 | // Configuração do Server via Restify: 15 | var server = restify.createServer(); 16 | server.listen(process.env.port || process.env.PORT || 3978, function() { 17 | console.log('%s Aplicação está executando na porta %s', server.name, server.url); 18 | }); 19 | 20 | // Criação do chat connector para comunicar com o serviço do Bot Framework: 21 | var connector = new builder.ChatConnector({ 22 | appId:'', 23 | appPassword: '' 24 | }); 25 | 26 | //Endpoint para executar as mensagens para os usuários via Bot Emulator: 27 | server.post("/api/messages", connector.listen()); 28 | 29 | const bot = new builder.UniversalBot(connector); 30 | 31 | // Bloco de Dialogs: 32 | bot.dialog("/", [ 33 | session => { 34 | builder.Prompts.text(session, "Oi! Qual é o seu nome?"); 35 | }, 36 | 37 | (session, results) => { 38 | let nome = results.response; 39 | session.send(`Oi! ${nome}`); 40 | 41 | session.beginDialog("/perguntarTimeCoracao"); 42 | } 43 | ]); 44 | 45 | bot.dialog("/perguntarTimeCoracao", [ 46 | session => { 47 | builder.Prompts.text(session, "Qual é o seu time de Futebol do Coração?"); 48 | }, 49 | 50 | (session, results) => { 51 | let timeCoracao = results.response; 52 | session.endDialog(`Vamos torcer no Campeonato Brasileiro para o time do **${timeCoracao}** em 2018!`); 53 | 54 | session.beginDialog("/perguntarLugarPreferido"); 55 | } 56 | ]); 57 | 58 | bot.dialog("/perguntarLugarPreferido", [ 59 | session => { 60 | builder.Prompts.text(session, "Qual é o seu lugar preferido?"); 61 | }, 62 | 63 | (session, results) => { 64 | let lugar = results.response; 65 | session.endDialog(`Amamos o **${lugar}**! É simplesmente uma cidade muito bonita!`); 66 | } 67 | ]); 68 | -------------------------------------------------------------------------------- /src/Modulo-4/promptsChoice.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Arquivo: promptsChoice.js 4 | * Data: 26/04/2018 5 | * Descrição: Desenvolvimento de um Bot onde será utilizado o recurso do 'Prompts.choice' 6 | * Author: Glaucia Lemos 7 | * Link (Documentação - Dialog (Prompts)): 8 | * 9 | */ 10 | 11 | const restify = require("restify"); 12 | const builder = require("botbuilder"); 13 | 14 | // Configuração do Server via Restify: 15 | const server = restify.createServer(); 16 | server.listen(process.env.port || process.env.PORT || 3978, () => { 17 | console.log("%s Aplicação executando na porta %s", server.name, server.url); 18 | }); 19 | 20 | // Criação do chat connector para comunicar com o serviço do Bot Framework: 21 | const connector = new builder.ChatConnector({ 22 | appId: "", 23 | appPassword: "" 24 | }); 25 | 26 | // Endpoint para executar as mensagens para os usuários 27 | server.post("/api/messages", connector.listen()); 28 | 29 | const bot = new builder.UniversalBot(connector); 30 | 31 | bot.dialog('/', [ 32 | session => { 33 | builder.Prompts.text(session, "Olá! Qual é o seu nome?"); 34 | }, 35 | 36 | (session, results) => { 37 | session.userData.nome = results.response; 38 | builder.Prompts.number(session, `Oi ${session.userData.nome}, quanto tempo que você trabalha com programação?`); 39 | }, 40 | 41 | (session, results) => { 42 | session.userData.anosExperienciaProgramacao = results.response; 43 | builder.Prompts.choice(session, "Qual é a sua linguagem de programação predileta?", 44 | "TypeScript | JavaScript | C# | Node.Js | Java | Python | Ruby", 45 | { listStyle: builder.ListStyle.button } 46 | ); 47 | }, 48 | 49 | (session, results) => { 50 | session.userData.linguagem = results.response.entity; 51 | session.endConversation('Ah... Beleza ' 52 | + session.userData.nome + '. Você tem trabalhado com programação por ' 53 | + session.userData.anosExperienciaProgramacao + ' anos e curte programar com ' 54 | + session.userData.linguagem 55 | ); 56 | } 57 | ]); -------------------------------------------------------------------------------- /src/Modulo-4/waterfallDialog.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Arquivo: waterfallDialog.js 4 | * Data: 20/05/2018 5 | * Descrição: Desenvolvimento de um Bot que simula uma reserva de um restaurante. 6 | * Author: Glaucia Lemos 7 | * 8 | * Links (Manipulação de Waterfalls): 9 | * 10 | */ 11 | 12 | const restify = require("restify"); 13 | const builder = require("botbuilder"); 14 | 15 | // Configuração do Server via Restify: 16 | const server = restify.createServer(); 17 | server.listen(process.env.port || process.env.PORT || 3978, () => { 18 | console.log("%s Aplicação executando na porta %s", server.name, server.url); 19 | }); 20 | 21 | // Criação do chat connector para comunicar com o serviço do Bot Framework: 22 | const connector = new builder.ChatConnector({ 23 | appId: "", 24 | appPassword: "" 25 | }); 26 | 27 | // Endpoint para executar as mensagens para os usuários 28 | server.post("/api/messages", connector.listen()); 29 | 30 | const inMemoryStorage = new builder.MemoryBotStorage(); 31 | 32 | const bot = new builder.UniversalBot(connector, [ 33 | (session) => { 34 | session.send("Seja Bem-Vindo(a) ao Restaurante Praias do Rio"); 35 | builder.Prompts.time(session, "Por favor, informa a data e hora da reserva (ex.: 20 de Maio às 20h)"); 36 | }, 37 | 38 | (session, results) => { 39 | session.dialogData.dataReserva = builder.EntityRecognizer.resolveTime([results.response]); 40 | builder.Prompts.number(session, "Para quantas pessoas necessitará para a reserva?"); 41 | }, 42 | 43 | (session, results) => { 44 | session.dialogData.quantidadePessoas = results.response; 45 | builder.Prompts.text(session, "Em nome de quem gostaria de fazer a reserva?"); 46 | }, 47 | 48 | (session, results) => { 49 | session.dialogData.nomeReserva = results.response; 50 | 51 | // Vamos exibir as informações digitadas pelo usuário: 52 | session.send(`Reserva Confirmada. Segue os detalhes da Reserva: 53 |
Dia/Hora: **${ session.dialogData.dataReserva }** 54 |
Quantidade de Pessoas: **${ session.dialogData.quantidadePessoas }** 55 |
Nome da Reserva: **${ session.dialogData.nomeReserva }**`); 56 | session.endDialog(); 57 | } 58 | ]).set('storage', inMemoryStorage); -------------------------------------------------------------------------------- /src/Modulo-4/entrevistaPrompts.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Arquivo: entrevistaPrompts.js 4 | * Data: 26/04/2018 5 | * Descrição: Desenvolvimento de um Bot onde será utilizado diferentes tipos de Prompts. 6 | * Author: Glaucia Lemos 7 | * Link (Documentação - Dialog (Prompts)): 8 | * 9 | */ 10 | 11 | const restify = require("restify"); 12 | const builder = require("botbuilder"); 13 | 14 | // Configuração do Server via Restify: 15 | const server = restify.createServer(); 16 | server.listen(process.env.port || process.env.PORT || 3978, () => { 17 | console.log("%s Aplicação executando na porta %s", server.name, server.url); 18 | }); 19 | 20 | // Criação do chat connector para comunicar com o serviço do Bot Framework: 21 | const connector = new builder.ChatConnector({ 22 | appId: "", 23 | appPassword: "" 24 | }); 25 | 26 | // Endpoint para executar as mensagens para os usuários 27 | server.post("/api/messages", connector.listen()); 28 | 29 | const bot = new builder.UniversalBot(connector); 30 | 31 | bot.dialog('/', [ 32 | (session, results, next) => { 33 | builder.Prompts.text(session, 'Olá! Qual é o seu nome?'); 34 | }, 35 | 36 | (session, results) => { 37 | session.dialogData.nome = results.response; 38 | builder.Prompts.text(session, `Oi ${session.dialogData.nome}. Qual é a sua profissão?`); 39 | }, 40 | 41 | (session, results) => { 42 | session.dialogData.profissao = results.response; 43 | builder.Prompts.number(session, `${session.dialogData.nome} quantos anos você tem?`); 44 | }, 45 | 46 | (session, results) => { 47 | session.dialogData.idade = results.response; 48 | builder.Prompts.time(session, `Você pode informar que horas são agora?`); 49 | }, 50 | 51 | (session, results) => { 52 | session.dialogData.horaAtual = builder.EntityRecognizer.resolveTime([results.response]); 53 | builder.Prompts.confirm(session, `Você deseja ver o seu questionário?`, { listStyle: builder.ListStyle.button }); 54 | }, 55 | 56 | (session, results) => { 57 | if (results.response) { 58 | session.endDialog(`Os detalhes do seu questionário foi: 59 |
Nome: **${session.dialogData.nome}** 60 |
Profissão: **${session.dialogData.profissao}** 61 |
Idade: **${session.dialogData.idade}** 62 |
Hora Atual: **${session.dialogData.horaAtual}**`); 63 | } else { 64 | session.endDialog("Até a próxima! Tchau!") 65 | } 66 | } 67 | ]); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hands On: Bots + Node.Js - Microsoft Bot Framework v.3 (Glaucia Lemos) 2 | 3 |

4 | 5 |

6 | 7 | Repositório responsável pelos códigos desenvolvidos das vídeos aulas inerentes a nova série do meu canal do Youtube! 8 | Essas vídeos aulas servirão também de material de apoio para a Maratona Bots que está ocorrendo no site: **[TI Capacitacion](https://ticapacitacion.com/curso/botspt/)** 9 | 10 | Todo o conteúdo desenvolvido aqui, estão destinados a linguagem Node.Js. Caso queira aprender a desenvolver um Bot usando C#, acompanhe as vídeos aulas da Maratona Bots! 11 | 12 | Porém, estarei desenvolvendo as demos relacionadas aos códigos inerentes a Node.Js da Maratona Bots. Estarei diferenciando os códigos e vídeos da maratona via link do próprio repositório em questão e destacando nas grids também. 13 | 14 | # Recursos Utilizados no Desenvolvimento: :rocket: 15 | 16 | Para realizar as demos dessa série, se faz necessário instalar os seguintes programas: 17 | 18 | * Visual Studio Code - [DOWNLOAD AQUI](https://code.visualstudio.com/?WT.mc_id=javascript-0000-gllemos) 19 | * Node.JS - [DOWNLOAD AQUI](https://nodejs.org/en/) 20 | * Microsoft Bot Framework Emulator - [DOWNLOAD AQUI](https://github.com/Microsoft/BotFramework-Emulator/releases 21 | ) 22 | * Instalar a versão Python 2.x - [DOWNLOAD AQUI](https://www.python.org/downloads/) 23 | * Instalar globalmente o node-gyp - [DOCUMENTAÇÃO PARA INSTALAÇÃO DE MANEIRA CORRETA AQUI](https://github.com/nodejs/node-gyp) 24 | 25 | * Cadastro no site LUIS: https://www.luis.ai/ 26 | * Cadastro no site Azure: https://azure.microsoft.com/services/bot-service/?WT.mc_id=javascript-0000-gllemos 27 | 28 | OBS.: Quando seguir o passo da instalação do **node-gyp** é de suma importância que façam o seguinte: 29 | 30 | **Passo 1:** criar manualmente o arquivo **binding.gyp** dentro do diretório do node_modules do appData, conforme o exemplo abaixo: 31 | 32 | ``` 33 | 34 | > C:\users\UserName\appdata\roaming\npm\node_modules\node-gyp 35 | 36 | ``` 37 | 38 | **Passo 2:** incluir no arquivo **binding.gyp** o seguinte bloco de código e salve: 39 | 40 | ``` 41 | 42 | { 43 | "targets": [{ 44 | "target_name": "binding", 45 | "sources": [ "build/Release/binding.node" ] 46 | }] 47 | } 48 | 49 | ``` 50 | 51 | **Passo 3:** feito isso, agore execute os seguintes comandos abaixo, dentro do mesmo diretório do appData: 52 | 53 | ``` 54 | 55 | > node-gyp configure 56 | 57 | ``` 58 | 59 | ``` 60 | 61 | > node-gyp configure --msvs_version=2015 62 | 63 | ``` 64 | 65 | ``` 66 | 67 | > node-gyp build 68 | 69 | ``` 70 | 71 | Seguindo todos esses passos, vocês estará para pronta para instalar as depedências do projeto na pasta do projeto! ;) 72 | 73 | ## Atualização da Instalação (node-gyp) 11/2018: 74 | 75 | Devido a nova versão do Node.js, houve mudanças significativas inerente aos passos acima para a instalação do pacote **node-gyp**. 76 | Após a versão 10.x do Node.js bastam seguir os seguintes passos: 77 | 78 | 1º - Desinstale da sua máquina o Node.js 79 | 80 | 2º - Exclua a pasta **npm** localizada no AppData: (remove manualmente): 81 | 82 | ``` 83 | C:\Users\\AppData\Roaming\npm directory was not deleted. 84 | ``` 85 | 86 | 3º - Reinstale a última versão do Node.js 10.x: [https://nodejs.org/en/](https://nodejs.org/en) 87 | 88 | 4º - Abre agora o prompt de comando como administrador e execute o comando abaixo: 89 | 90 | ``` 91 | > npm install npm@latest -g 92 | ``` 93 | 94 | 5º - E finalmente, instale globalmente o pacote **node-gyp** no prompt de comando como adminstrador: 95 | 96 | ``` 97 | > npm install -g node-gyp 98 | ``` 99 | 100 | Depois de seguir esses passos, vá até o local onde está o projeto e digite o comando: 101 | 102 | ``` 103 | > npm install 104 | ``` 105 | 106 | O problema será resolvido! :) 107 | 108 | ## O que Preciso Saber para prosseguir na série?! 109 | 110 | * **Ter noções de JavaScript:** 111 | - Desvendando a linguagem JavaScript (Rodrigo Branas): [AQUI](https://www.youtube.com/playlist?list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc) 112 | 113 | 114 | * **Ter noções de Node.js:** 115 | - Tutorial: CRUD API RESTful com: Node + Express + MongoDb (Glaucia Lemos): [AQUI](https://www.youtube.com/playlist?list=PLb2HQ45KP0WstF2TXsreWRv-WUr5tqzy1) 116 | 117 | - Curso: Criando APIs com NodeJs (Baltaio): [AQUI](https://www.youtube.com/playlist?list=PLHlHvK2lnJndvvycjBqQAbgEDqXxKLoqn) 118 | 119 | 120 | 121 | ## Demos Relacionadas ao Hands on (Node.JS): 122 | 123 | | Módulo | Aula | Código | Link (Vídeo Demo) | 124 | |---|---|---|---| 125 | | Módulo 2 | Aula 03 | [Código](https://goo.gl/ac3FNV) | [Aula 03](https://goo.gl/WwScdc) | 126 | | Módulo 2 | Aula 04 | [Código](https://goo.gl/iV6vmY) | [Aula 04](https://goo.gl/KQX529) | 127 | | Módulo 2 | Aula 06 | [Código](https://goo.gl/31dBjr) | [Aula 06](https://youtu.be/ChuDIMqRSFc) | 128 | | Módulo 2 | Aula 07 | [Código](https://goo.gl/Sp1m7F) | [Aula 07](https://youtu.be/-pB48tj_9_w) | 129 | | Módulo 3 | Aula 09 | [Código](https://goo.gl/KtHNB3) | [Aula 09](https://youtu.be/sj_XvMzhiGw) | 130 | | Módulo 3 | Aula 10 | [Código](https://goo.gl/uB2pzn) | [Aula 10](https://youtu.be/5uJlHwbXZok) | 131 | | Módulo 3 | Aula 12 | [Código](https://goo.gl/L2ZkKq) | [Aula 12](https://youtu.be/yC831Q_BabI) | 132 | | Módulo 3 | Aula 13 | [Código](https://goo.gl/1YaqzN) | [Aula 13](https://youtu.be/AQFGpiB5MKY) | 133 | | Módulo 4 | Aula 15 | [Código](https://goo.gl/Kvsgiv) | [Aula 15](https://youtu.be/lj_bl8j4NRg) | 134 | | Módulo 4 | Aula 16 | [Código](https://goo.gl/KRv872) | [Aula 16](https://youtu.be/tLc02AQY4sg) | 135 | | Módulo 4 | Aula 17 | [Código](https://goo.gl/Tcwcam) | [Aula 17](https://youtu.be/urXta04b73U) | 136 | 137 | 138 | ## Demos Relacionadas a Maratona Bots (Node.JS): 139 | 140 | 141 | | Módulo | Lição | Código | Link (Vídeo Demo) | 142 | |---|---|---|---| 143 | | Exercícios Módulo 2 | Lições: 2 & 3 | [Código](https://goo.gl/KLXxH8) | [Módulo 2](https://goo.gl/tUaTgD) | 144 | | Exercícios Módulo 3 | Lições: 1-5 | [Código](https://goo.gl/LeYgyb) | [Módulo 3](https://goo.gl/4411Cw) | 145 | | Exercícios Módulo 4 | Lições: 1-5 | [Código](https://goo.gl/DefmZ9) | [Módulo 4](https://goo.gl/ujHciH) | 146 | | Exercícios Módulo 5 | Lições: | [Código]() | [Módulo 5](https://goo.gl/5xWbSq) | 147 | 148 | ## Conteúdo da Série: Hands On: Bots + Node.Js - Microsoft BOT Framework (* em desenvolvimento) 149 | 150 | - **Módulo 01: Breve Introdução sobre Bots** 151 | * [Aula 01 - Breve Introdução sobre Bots](https://youtu.be/ziHcgSZ7j0Q) 152 | 153 | - **Módulo 02: Desenvolvendo o meu primeiro Bot!** 154 | * [Aula 02 - Preparando o Ambiente de Desenvolvimento](https://youtu.be/jR9Tm0pT37M) 155 | * [Aula 03 - Desenvolvendo Bot via Console](https://youtu.be/rrKGqLYfKZE) 156 | * [Aula 04 - Desenvolvendo Bot via Bot Emulator](https://youtu.be/UJasDmv_ZYA) 157 | * [Aula 05 - Conceitos Chaves do Bot Builder SDK em Node.Js](https://youtu.be/Wd6lQqq54MQ) 158 | * [Aula 06 - Demo: Bot com Connector & Dialog via Console](https://youtu.be/ChuDIMqRSFc) 159 | * [Aula 07 - Demo: Bot com Connector & Dialog via Emulator](https://youtu.be/-pB48tj_9_w) 160 | 161 | - **Módulo 03: Bots Conversam?! Sim Senhor!** 162 | * [Aula 08 - Conceitos sobre Dialogs (Teoria)](https://youtu.be/LmEtrYgOAEA) 163 | * [Aula 09 - Demo: Uso do método 'beginDialog'](https://youtu.be/sj_XvMzhiGw) 164 | * [Aula 10 - Demo: Uso do método 'endDialog'](https://youtu.be/5uJlHwbXZok) 165 | * [Aula 11 - Armazenamento de Dados em Dialogs (Teoria)](https://youtu.be/rq_8GJ34YMQ) 166 | * [Aula 12 - Demo: Uso da propriedade 'userData'](https://youtu.be/yC831Q_BabI) 167 | * [Aula 13 - Demo: Uso da propriedade 'dialogData'](https://youtu.be/AQFGpiB5MKY) 168 | 169 | - **Módulo 04: (em desenvolvimento)** 170 | * [Aula 14 - Conceitos sobre Tipos de Prompts (Teoria)](https://youtu.be/88qWfHEsBDU) 171 | * [Aula 15 - Demo: Uso de 'Prompts.confirm'](https://youtu.be/lj_bl8j4NRg) 172 | * [Aula 16 - Demo: Uso de 'Prompts.choice'](https://youtu.be/tLc02AQY4sg) 173 | * [Aula 17 - Demo: Uso de Diferentes Tipos de Prompts](https://youtu.be/urXta04b73U) 174 | * [Aula 18 - Demo: Fluxo de Conversação: Waterfalls](https://youtu.be/YnwxjFJuowE) 175 | * [Aula 19 - ]() 176 | 177 | 178 | **aulas em desenvolvimento** 179 | 180 | ## Algumas Observações Importantes!!! :fire: 181 | 182 | **p.s.:As aulas procurarei estar enviando o maior número possível. Como estou fazendo o Hands on e ao mesmo tempo desenvolvendo as demos em vídeo em Node.Js da Maratona Bots, leva-se um tempo para editar e enviar vídeos. Assim que, peço que aguardem por novas vídeos aulas.** 183 | 184 | **p.s.2: Quando tiver algum tema que não ficou compreensível a todos, estarei explicando via README.md. Com o propósito de criar uma documentação sobre o assunto para Node.** 185 | 186 | ## Quer Propor Melhorias no Código? Façam Pull Request!!! 187 | 188 | Caso queiram que eu implemente algo no código, abram uma [**ISSUE**](https://github.com/glaucia86/hands-on-bots-node/issues) nesse repositório. Assim, todos poderão colaborar para o melhor desenvolvimento desse repositório. E sintam-se à vontade em fazer Pull Requests!! 189 | 190 | 191 | Espero que possam gostar das vídeos aulas dessa nova série no meu canal!!! Não esqueçam de dar uma :star: no repositório e claro: Apreciem sem moderação!! :heart: :heart: :heart: 192 | 193 |

194 | 195 |

196 | 197 | 198 | --------------------------------------------------------------------------------