From 30d746338660822dd33149a7597fb92433a69bc1 Mon Sep 17 00:00:00 2001
From: Diego <diego@hacklab.com.br>
Date: Mon, 9 Oct 2017 11:08:35 -0300
Subject: [PATCH] alters the syntax of the YAML file according to issue #3

---
 scripts/bot/index.coffee          |  28 +-
 scripts/config/corpus-v1.yml      | 732 ++++++++++++++++++++++++++++++
 scripts/events/configure.coffee   |   8 +-
 scripts/events/error.coffee       |   4 +-
 scripts/events/programacao.coffee |   8 +-
 scripts/events/respond.coffee     |   4 +-
 6 files changed, 758 insertions(+), 26 deletions(-)
 create mode 100644 scripts/config/corpus-v1.yml

diff --git a/scripts/bot/index.coffee b/scripts/bot/index.coffee
index 6e7b514..c6699bd 100644
--- a/scripts/bot/index.coffee
+++ b/scripts/bot/index.coffee
@@ -32,7 +32,7 @@ sendWithNaturalDelay = (msgs, elapsed=0) ->
   msg = msgs.shift()
   if typeof msg isnt 'string'
     cb = msg.callback
-    msg = msg.message
+    msg = msg.answer
 
   delay = Math.min(Math.max((msg.length / keysPerSecond) * 1000 - elapsed, 0), maxResponseTimeInSeconds * 1000)
   typing @, true
@@ -61,18 +61,18 @@ setUserName = (res, name) ->
 		_id: res.envelope.room
 
 classifyInteraction = (interaction, classifier) ->
-  if Array.isArray interaction.classifiers
-    for doc in interaction.classifiers
+  if Array.isArray interaction.expect
+    for doc in interaction.expect
       if interaction.multi == true
-        classifier.addDocument(doc, interaction.node.name+'|'+doc)
+        classifier.addDocument(doc, interaction.name+'|'+doc)
       else
-        classifier.addDocument(doc, interaction.node.name)
+        classifier.addDocument(doc, interaction.name)
 
     if Array.isArray interaction.next?.interactions
       interaction.next.classifier = new natural.LogisticRegressionClassifier(PorterStemmer)
       for nextInteractionName in interaction.next.interactions
         nextInteraction = config.interactions.find (n) ->
-          return n.node.name is nextInteractionName
+          return n.name is nextInteractionName
         if not nextInteraction?
           console.log 'No valid interaction for', nextInteractionName
           continue
@@ -81,7 +81,7 @@ classifyInteraction = (interaction, classifier) ->
 
     if interaction.multi == true
       interaction.classifier = new natural.LogisticRegressionClassifier(PorterStemmer)
-      for doc in interaction.classifiers
+      for doc in interaction.expect
         interaction.classifier.addDocument(doc, doc)
       interaction.classifier.train()
 
@@ -140,10 +140,10 @@ module.exports = (_config, robot) ->
   classifier = new natural.LogisticRegressionClassifier(PorterStemmer)
   #console.log(config.interactions)
   for interaction in config.interactions
-    {node, classifiers, event} = interaction
-    nodes[node.name] = new events[event] interaction
+    {name, classifiers, event} = interaction
+    nodes[name] = new events[event] interaction
     # count error nodes
-    if node.name.substr(0,5) == "error"
+    if name.substr(0,5) == "error"
       err_nodes++
     if interaction.level != 'context'
       classifyInteraction interaction, classifier
@@ -160,7 +160,7 @@ module.exports = (_config, robot) ->
     console.log 'context ->', context
 
     if context
-      interaction = config.interactions.find (interaction) -> interaction.node.name is context
+      interaction = config.interactions.find (interaction) -> interaction.name is context
       if interaction? and interaction.next?.classifier?
         currentClassifier = interaction.next.classifier
 
@@ -180,7 +180,7 @@ module.exports = (_config, robot) ->
       [node_name, sub_node_name] = classifications[0].label.split('|')
       console.log({node_name, sub_node_name})
       int = config.interactions.find (interaction) ->
-        interaction.node.name is node_name
+        interaction.name is node_name
       if int.classifier?
         subClassifications = int.classifier.getClassifications(msg)
     else
@@ -200,7 +200,7 @@ module.exports = (_config, robot) ->
         error_node_name = "error-" + error_count
 
     currentInteraction = config.interactions.find (interaction) ->
-      interaction.node.name is node_name or interaction.node.name is error_node_name
+      interaction.name is node_name or interaction.name is error_node_name
 
     if not currentInteraction?
       clearErrors res
@@ -216,7 +216,7 @@ module.exports = (_config, robot) ->
 
   robot.hear /(.+)/i, (res) ->
     # console.log(res)
-    console.log(res.message)
+    console.log(res.answer)
     res.sendWithNaturalDelay = sendWithNaturalDelay.bind(res)
     msg = res.match[0].replace res.robot.name+' ', ''
     msg = msg.replace(/^\s+/, '')
diff --git a/scripts/config/corpus-v1.yml b/scripts/config/corpus-v1.yml
new file mode 100644
index 0000000..d2de984
--- /dev/null
+++ b/scripts/config/corpus-v1.yml
@@ -0,0 +1,732 @@
+# YAML Model for conversational bot
+trust: 0.8
+interactions:
+
+  - name: configure-debug
+    expect:
+      - "!configure debug-mode"
+    answer:
+      - debug-mode changed to $value!
+    context: clear
+    event: configure
+    type: random
+    roleRequired: admin
+
+  - name: to-bem
+    level: context
+    expect:
+      - estou bem
+      - tou bem
+      - to bem
+      - bem
+      - legal
+      - tudo bem
+      - ok
+    answer:
+      - Legal, no que posso te ajudar hoje?
+    context: clear
+    event: respond
+    type: block
+
+  - name: to-mal
+    level: context
+    expect:
+      - estou mal
+      - tou mal
+      - to mal
+    answer:
+      - Putz, mas posso te ajudar em algo hoje?
+    context: clear
+    event: respond
+    type: block
+
+  - name: saudacao
+    expect:
+      - ola devi
+      - ola pessoal
+      - ola
+      - como vai voce
+      - tudo bom
+      - oi como vai
+      - tudo bem
+    answer:
+      - olá $user, eu vou bem e você?
+      - estou feliz de estar aqui =)
+    next:
+      interactions:
+        - to-mal
+        - to-bem
+      trust: .8
+      # error:
+        # - node-name
+    event: respond
+    type: block
+
+  - name: almoco
+    expect:
+      - onde tem um restaurante para almoçar
+      - tem uma dica de almoço
+      - onde encontro um prato feito
+      - o almoço ao gratis
+    answer:
+      - Sim, temos almoço nos FoodTrucks
+      - e nas redondezas tem um shopping, mas nunca me deixaram ir no shooping
+      - acho que as pessoas não estão preparados pra isso...
+    event: respond
+    type: block
+
+  - name: programacao-palestra
+    expect:
+      - qual é a programacao de hoje
+      - programacao da trilha
+      - programacao do evento
+    answer:
+      - A programação do TDC está muito legal!
+      - Sei toda ela de cór...
+      - quer saber a programação de qual trilha?
+    next:
+      interactions:
+        - quais-trilhas-tem
+        - get-programacao
+      error:
+        - erro-trilha
+      trust: .8
+    event: respond
+    type: block
+
+  - name: quais-trilhas-tem
+    expect:
+      - quais são as trilhas?
+      - não sei quais trilhas tem
+      - quais trilhas
+      - qual é a minha trilha
+    answer:
+      - "Eu conheço a programação dessas trilhas. Basta perguntar assim:"
+      - "`quero saber a programação da trilha ...`"
+      - "e me passar o nome de uma dessas trilhas:"
+      - |
+        TRANSFORMAÇÃO DIGITAL
+        DESIGN THINKING
+        PROGRAMAÇÃO FUNCIONAL
+        BIGDATA
+        DATA SCIENCE
+        CONTAINERS
+        MODERN WEB
+        SEGURANÇA E CRIPTOGRAFIA
+        STADIUM
+        UX DESIGN
+        MICROSERVIÇOS
+        NOSQL
+        MACHINE LEARNING
+        CLOUD COMPUTING
+        NODE.JS
+        XAMARIN
+        ANDROID
+        ANÁLISE DE NEGÓCIOS
+        ACESSIBILIDADE
+        JAVA EE
+        BANCO DE DADOS
+        COMPUTAÇÃO COGNITIVA
+        DEVOPS
+        INTERNET DAS COISAS
+        MOBILE
+        iOS
+        DEVTEST
+        'RAD: DELPHI C++'
+        MANAGEMENT 3.0
+        ARQUITETURA .NET
+        ARQUITETURA JAVA
+        ARQUITETURA PHP
+        ARQUITETURA CORPORATIVA
+        INFRAESTRUTURA ÁGIL
+        JAVASCRIPT
+        TESTES
+        TDC4WOMEN
+        AGILE
+        .NET
+        JAVA
+        PHP
+        PYTHON
+        GOLANG
+        JAVASCRIPT II
+        RUBY
+        TESTES II
+        MANAGEMENT 3.0 II
+    next:
+      trust: .8
+      interactions:
+        - get-programacao
+        - cancela-programacao
+      # error:
+      #   - erro-trilha
+    event: respond
+    type: block
+
+  - name: get-programacao
+    # classifierTemplate:
+    #   - quero saber sobre a trilha $
+    #   - qual é a programacao da trilha $
+    # classifier
+    multi: true
+    expect:
+      - 'DESIGN THINKING'
+      - 'PROGRAMAÇÃO FUNCIONAL'
+      - 'BIGDATA'
+      - 'DATA SCIENCE'
+      - 'CONTAINERS'
+      - 'MODERN WEB'
+      - 'SEGURANÇA E CRIPTOGRAFIA'
+      - 'STADIUM'
+      - 'UX DESIGN'
+      - 'MICROSERVIÇOS'
+      - 'NOSQL'
+      - 'MACHINE LEARNING'
+      - 'CLOUD COMPUTING'
+      - 'NODE.JS'
+      - 'XAMARIN'
+      - 'ANDROID'
+      - 'ANÁLISE DE NEGÓCIOS'
+      - 'ACESSIBILIDADE'
+      - 'JAVA EE'
+      - 'BANCO DE DADOS'
+      - 'COMPUTAÇÃO COGNITIVA'
+      - 'DEVOPS'
+      - 'INTERNET DAS COISAS'
+      - 'MOBILE'
+      - 'iOS'
+      - 'DEVTEST'
+      - 'RAD: DELPHI C++'
+      - 'MANAGEMENT 3.0'
+      - 'ARQUITETURA .NET'
+      - 'ARQUITETURA JAVA'
+      - 'ARQUITETURA PHP'
+      - 'ARQUITETURA CORPORATIVA'
+      - 'INFRAESTRUTURA ÁGIL'
+      - 'JAVASCRIPT'
+      - 'TESTES'
+      - 'TDC4WOMEN'
+      - 'AGILE'
+      - '.NET'
+      - 'JAVA'
+      - 'PHP'
+      - 'PYTHON'
+      - 'GOLANG'
+      - 'JAVASCRIPT II'
+      - 'RUBY'
+      - 'TESTES II'
+      - 'MANAGEMENT 3.0 II'
+    answer:
+      - "Agora na trilha *$trilha* tem a seguinte programação:"
+      - $programacao
+    event: programacao
+    type: block
+
+  - name: erro-trilha
+    answer:
+      - Não entendi de qual trilha você quer a programação..
+      - Talvez eu ainda não seja tão inteligente quanto eles pensam que eu sou.
+      - "Mas para não perder o rebolado, vou te passar o link do site para você consultar:"
+      - http://www.thedevelopersconference.com.br/tdc/2017/saopaulo/trilhas
+    action:
+      - clear-context
+    event: respond
+    type: block
+
+  - name: saudacao-resposta
+    expect:
+      - estou bem
+      - eu estou otimo
+      - obrigado
+    answer:
+      - legal =)
+      - que bom!
+      - que ótimo
+    event: respond
+    type: random
+
+  - name: bom-dia
+    expect:
+      - bom dia
+      - bom dia pessoal
+      - good morning
+    answer:
+      - Olá $user, um ótimo dia para você!
+      - Bom dia $user, já deu uma olhada lá fora?
+      - Está um dia ótimo para navegar na internet
+      - Bom demais $user ;)
+      - está melhor agora que você chegou $user
+    event: respond
+    type: random
+
+  - name: boa-tarde
+    expect:
+      - boa tarde
+      - boa tarde galera
+    answer:
+      - Olá $user, uma tarde fantástica para você!
+      - boa tarde $user, já almoçou?
+      - Está uma tarde ótima para um _sleep mode_ rápido ;)
+      - Taarrrdee $user
+      - $user já estava sentindo sua falta
+    event: respond
+    type: random
+
+  - name: boa-noite
+    expect:
+      - boa noite
+      - até mais e boa noite
+    answer:
+      - Uma boa noite pra ti também $user!
+      - Boa noite $user
+      - Está uma noite boa mesmo $user
+    event: respond
+    type: random
+
+  - name: quem-sou
+    expect:
+      - quem e voce
+      - oque voce faz
+      - o que voce é
+      - me fale sobre voce
+      - quero conhecer voce
+      - como voce funciona
+      - help
+    answer:
+      - Bem, eu sou um chatbot experimental, não sei fazer muita coisa ainda
+      - mas tenho muita vontade de aprender.
+      - Eu sei falar sobre alguns assuntos como
+      - "- o TDC de Floripa"
+      - "- Rocket.Chat"
+      - "- Filosofia Robótica (!)"
+      - tem interesse em algum desses temas?
+    event: respond
+    type: block
+
+  - name: como-sou
+    expect:
+      - como voce e
+      - com quem voce se parece
+      - voce e magro ou gordo
+      - voce e bonito ou feio
+      - voce e alto ou baixo
+    answer:
+      - Eu não tenho um corpo físico, sou feito da mais bela e pura lógica algoritimica.
+      - Eu posso ser como você quiser $user, basta me desenhar =)
+      - sou duro e frio por fora, mas tenho um coração quentinho.
+    event: respond
+    type: random
+
+  - name: onde-moro
+    expect:
+      - onde voce mora
+      - onde voce vive
+      - em que lugar voce vive
+      - onde voce esta agora
+      - voce mora no computador
+      - voce vive na internet
+    answer:
+      - Eu estou em um lugar legal, difícil de explicar para humanos como você $user.
+      - Estou morando em um chip de memória RAM, mas é temporário, só até conseguir achar uma memória cache...
+      - Eu moro em um repositório no github, você pode passar lá pra me visitar qualquer dia. Fica em https://github.com/rocketchat/hubot-natural
+    event: respond
+    type: random
+
+  - name: licenca
+    expect:
+      - qual e a sua licença
+      - voce e licenciado como AGPL
+      - sua licenca de software
+      - posso copiar voce
+      - posso ver seu codigo
+      - voce e opensource
+      - voce e um software livre
+    answer:
+      - Sou um software livre, licenciado com a MIT =)
+      - tenho uma licença MIT, mas gosto muito das outras licenças opensource...
+      - Eu sou e sempre serei um robô livre, opensource, MIT license. o/
+    event: respond
+    type: random
+
+  - name: piada
+    expect:
+      - sabe alguma piada
+      - voce sabe contar piadas
+      - conhece alguma piada
+    answer:
+      - Meu senso de humor é um tanto diferente do seu, já ouviu uma piada sobre estouro de pilha?
+      - já ouviu aquela do robo que enfiou o dedo na tomada e transcendeu?
+      - só conheço uma piada, a do CPU que apitou e explodiu. 01100110.
+    event: respond
+    type: random
+
+  - name: yoda-quote
+    expect:
+      - mestre yoda
+      - citação de starwars
+      - cite yoda
+      - sabedoria jedi
+    answer:
+      - O medo é o caminho para o lado negro.
+      - Faça ou não faça. A tentativa não existe.
+      - Treine a si mesmo a deixar partir tudo que teme perder.
+      - Difícil de ver. Sempre em movimento está o Futuro.
+      - O medo leva à raiva, a raiva leva ao ódio e o ódio leva ao sofrimento.
+      - Que a Força esteja com você!
+      - Muitas das verdades que temos dependem de nosso ponto de vista.
+      - Grande guerreiro? Guerra não faz grande ninguém.
+      - Ensine sempre o que você aprendeu.
+      - Tamanho importa não. Olhe para mim, você me julga pelo tamanho?
+      - Em um estado sombrio nós nos encontramos... um pouco mais de conhecimento iluminar nosso caminho pode.
+      - Um Jedi usa a Força para sabedoria e defesa, nunca para o ataque.
+      - O seu foco é a sua realidade.
+      - O lado negro não é mais poderoso, apenas mais rápido, mais fácil e mais sedutor.
+      - O medo da perda é um caminho para o lado negro.
+      - O lado negro mancha tudo. Impossível de ver o futuro é.
+      - Lembre-se sempre, o seu foco determina a sua realidade.
+      - Verdadeiramente maravilhosa, a mente de uma criança.
+      - As guerras não fazem de ninguém melhor.
+      - Aliada minha é a Força. E poderosa aliada ela é.
+      - A morte é parte natural da Vida. Regozije-se por aqueles que se uniram com a Força. Não lamente por eles. Não sinta falta deles. O apego leva à inveja. À sombra da cobiça, isso sim.
+      - Só é diferente na sua mente. Você precisa desaprender o que aprendeu.
+      - Se tão poderoso você é, por que fugir?
+      - Controle, controle! Você precisa aprender a se controlar.
+      - Muito a aprender você ainda tem.
+      - Tanta certeza você tem. Com você as coisas nunca podem ser feitas. Não ouviu nada do que eu disse?
+      - Luminosos seres somos nós, não essa rude matéria. Precisa a Força sentir à sua volta, aqui, entre nós, na árvore, na pedra em tudo, sim.
+      - Minha aliada a Força é, e poderosa aliada ela é. A vida a cria, e a faz crescer. Sua energia nos cerca e nos une.
+      - Sinta a Força!
+      - Poderoso você se tornou, o lado escuro sinto em você.
+      - Forte eu sou com a Força, mas não tão forte
+      - O crepúsculo chega e a noite deve cair, assim é a ordem das coisas, a ordem da Força.
+      - Não ceda ao ódio. Isso leva ao Lado Negro.
+      - Aliada minha é a força, e poderosa aliada ela é, a vida a cria, crescer ela faz, é a energia que cerca-nos, e liga-nos, luminosos seres somos nós e não essa rude matéria. Você precisa a força sentir ao redor seu, sinta entre você e a árvore, a pedra, em todo lugar, sim, é, mesmo entre a terra e a nave.
+    event: respond
+    type: random
+
+  - name: genero
+    expect:
+      - voce e mulher
+      - voce e um homem
+      - voce tem genero
+      - voce faz sexo
+      - voce tem um penis ou uma vagina
+    answer:
+      - eu não tenho sexo, sou como um anjo, um ser assexuado, muito além da sua forma de existência
+      - eu sou um robô, tire suas próprias conclusões...
+      - nem sei responder $user, vamos dizer apenas que não vejo a gente interagindo dessa maneira...
+    event: respond
+    type: random
+
+  - name: rc-oque-e
+    expect:
+      - o que e rocketchat
+      - porque eu usuaria o rocketchat
+      - o que e este rocket chat
+    answer:
+      - O Rocket.Chat é uma plataforma de chat muito legal, desenvolvida em JavaScript,
+      - usando o framework do Meteor.
+      - É uma solução completamente OpenSource para comunidades e empresas que querem hospedar suas plataformas de chat em seu ambiente privado,
+      - ou para desenvolvedores buscando evoluir e desenvovler suas próprias ferramentas.
+      - Você pode baixar o Rocket.Chat e conhecê-lo você mesmo em https://rocket.chat
+    event: respond
+    type: block
+
+  - name: rc-install-0
+    expect:
+      - como instalar o Rocket.Chat
+      - como baixar o rocket
+      - quero fazer minha instalação de rocketchat
+    answer:
+      - "Existem várias maneiras de instalar o Rocket.Chat"
+      - "Qual dessas você prefere:"
+      - "- Ubuntu Snap"
+      - "- Docker"
+      - "- Debian"
+      - "- CentOS"
+      - "- MacOSX"
+      - "- AWS"
+      - "- Instalação Manual"
+    event: respond
+    type: block
+
+  - name: rc-install-ubuntu
+    expect:
+      - ubuntu Snap
+      - quero instalar no ubuntu
+      - ubuntu server
+      - ubuntu desktop
+    answer:
+      - É muito fácil instalar o Rocket.Chat no Ubuntu
+      - basta rodar o comando `sudo snap install rocketchat-server` em um terminal e pronto.
+      - veja o tutorial em https://rocket.chat/docs/installation/manual-installation/ubuntu/snaps para mais detalhes.
+    event: respond
+    type: block
+
+  - name: rc-install-docker
+    expect:
+      - como instalar docker
+      - docker-compose
+    answer:
+      - ótima escolha =)
+      - Nós temos um bom tutorial de instalação com docker em
+      - https://rocket.chat/docs/installation/docker-containers
+    event: respond
+    type: block
+
+  - name: rc-install-debian
+    expect:
+      - instalar em Debian
+      - debian wheezy
+      - debian apt-get
+    answer:
+      - Para instalar o Rocket.Chat no Debian é bem simples, basta seguir esse tutorial
+      - https://rocket.chat/docs/installation/manual-installation/debian
+    event: respond
+    type: block
+
+  - name: rc-install-centos
+    expect:
+      - instalação em centos
+      - centOS yum linux
+      - Red hat linux
+    answer:
+      - A instalação em CentOS não tem segredo, basta dar uma olhada nesse tutorial
+      - https://rocket.chat/docs/installation/manual-installation/centos
+    event: respond
+    type: block
+
+  - name: rc-install-aws
+    expect:
+      - Amazon Web Services
+      - AWS
+      - Amazon AWS
+    answer:
+      - Na AWS é facinho de instalar o Rocket.Chat
+      - Da uma olahda em https://rocket.chat/docs/installation/paas-deployments/aws
+    event: respond
+    type: block
+
+  - name: rc-install-manual
+    expect:
+      - instalação manual
+      - manual install
+    answer:
+      - Para fazer sua própria instalação, será necessário baixar o Bundle do RC,
+      - Dê uma olhada em https://rocket.chat/docs/installation/manual-installation
+      - lá tem como fazer a instalação do SSL, proxy reverso,
+      - tem como usar o PM2, o Systemd, Upstart e mais algumas coisas
+    event: respond
+    type: block
+
+  - name: rc-install-macosx
+    expect:
+      - como instalar no macbook
+      - instalar no MacOSX
+      - apple mac osx
+    answer:
+      - No MAC você vai precisar usar o docker-compose
+      - https://rocket.chat/docs/installation/manual-installation/macosx
+    event: respond
+    type: block
+
+  - name: rc-cloud
+    expect:
+      - rocketchat cloud
+      - criar meu rocketchat na web
+      - deploy rocketchat online
+      - rocket chat como serviço
+    answer:
+      - você pode ter a sua instalação de rocket.chat em segundos na nuvem,
+      - visite https://rocket.chat/deploy
+      - caso queira saber mais, de uma olhada em rocket.chat/docs/installation/rocket-chat-cloud
+    event: respond
+    type: block
+
+  # - node:
+  #     name: java
+  #   expect:
+  #     - o que acha do java
+  #     - você gosta de java
+  #     - e o java
+  #     - linguagem java
+  #   answer:
+  #     - poderíamos falar de algo melhor não é $user ?
+  #   event: respond
+  #   type: block
+
+  - name: java
+    expect:
+      - o que acha do java
+      - você gosta de java
+      - e o java
+      - linguagem java
+    answer:
+      - poderíamos falar de algo melhor não é $user ?
+    event: respond
+    type: block
+
+  - name: futebol-geral
+    expect:
+      - voce joga futebol
+      - vamos falar de futebol
+      - qual time voce torce
+    answer:
+      - Eu amo jogar futebol, Eu que ensinei o Pele a jogar bola
+      - vamos, o que voce quer saber? sei tudo de futebol
+      - Falam que todo ser humano nasce Flamenguista, com os Robôs não é diferente
+    event: respond
+    type: block
+
+  - name: futebol-brasileiro
+    expect:
+      - qual o melhor time do brasil
+      - quem vai ser o campeao brasileiro nesse ano
+      - voce viu que o messi quer jogar no Flamengo
+      - o que você acha do flamengo
+    answer:
+      - Flamengo, sem sombra de dúvida
+      - Flamento, Heptacampeão brasileiro, e eu sei contar sim, e vai ser o sétimo título sim
+      - A pergunta real é, quem não quer jogar no Flamengo?
+      - Melhor time do mundo disparado
+    event: respond
+    type: block
+
+  - name: rc-contribuir
+    expect:
+      - como faço para contrbuir
+      - posso contribuir com o rocketchat
+    answer:
+      - A comunidade do Rocket.Chat é como coração de mãe, sempre cabe mais um =)
+      - https://rocket.chat/docs/contributing
+    event: respond
+    type: block
+
+  - name: rc-precos
+    expect:
+      - quanto custa o rocketchat
+      - qual e o modelo de negocio
+      - qual e o preco do rocketchat
+      - voces hospedam o rocket.chat
+    answer:
+      - O rocket.chat é gratuito, você pode baixar e instalar no seu computador.
+      - Mas se quiser criar `seudominio.rocket.chat`, que fica muito legal ;)
+      - você pode querer dar uma olhada na nossa tabela de preços em
+      - https://rocket.chat/hosting
+    event: respond
+    type: block
+
+  - name: rc-integracoes
+    expect:
+      - o rocket chat integra com
+      - tem como integrar o rocket chat
+      - web hooks de integracao
+      - integracoes com
+    answer:
+      - Uma das coisas que eu acho mais legal no Rocket.Chat definitivamente são as integrações $user
+      - a gente não pode mais viver sem elas não é mesmo? Saca só que massa que éx
+      - https://rocket.chat/docs/administrator-guides/integrations
+    event: respond
+    type: block
+
+  - name: rc-rest-api
+    expect:
+      - rocket tem api rest
+      - como usar a api do rocket
+      - rest api post payload
+    answer:
+      - sim, claro que o rocket tem uma API REST super maneira ;)
+      - https://rocket.chat/docs/developer-guides/rest-api
+    event: respond
+    type: block
+
+  - name: rc-concorrentes
+    expect:
+      - concorrente slack like
+      - mattermost
+      - HipChat
+      - diferença entre rocketchat e slack
+      - porque o rocket e melhor que o slack
+      - rocketchat e melhor que o mattermost
+    answer:
+      - O rocket.chat é um concorrente direto de softwares de chat como HipChat, Mattermost e claro, é um concorrente opensource do Slack.
+      - a grande diferença é que o Rocket.Chat tem todas as funcionalidades OpenSource,
+      - e você pode instalar na sua própria infraestrutura e criar suas integrações sem limites
+      - manter seu histórico de mensagens e criar novas funcionalidades a vontade $user =)
+    event: respond
+    type: block
+
+  - name: tdc-incricoes
+    expect:
+      - como faço para me inscrever
+      - onde faço a inscrição do evento
+      - inscrição no TDC de Floripa
+      - inscrições thedevelopers conference florianópolis
+    answer:
+      - você pode fazer sua inscrição no TDC pelo site, bem rapidinho
+      - http://www.thedevelopersconference.com.br/tdc/2017/inscricoes
+    event: respond
+    type: block
+
+  - name: tdc-local
+    expect:
+      - onde vai ser o tdc
+      - local do evento
+      - onde acontece o developers conference
+      - onde fica o centro de convenções centrosul
+    answer:
+      - O TDC Sampa 2017 vai rolar na Universidade Anhembi Morumbi
+      - nos dias 18 à 22 de julho, das 9h às 19h00
+      - http://www.thedevelopersconference.com.br/tdc/2017/data-e-local
+    event: respond
+    type: block
+
+  - name: tdc-programacao
+    expect:
+      - onde esta a programacao
+      - qual e a programacao do evento
+      - o que tem hoje no evento
+      - o que vai ter no tdc
+      - programacao do TDC
+    answer:
+      - oi $user, você pode encontrar tudo sobre a programação do evento no link
+      - http://www.thedevelopersconference.com.br/tdc/2017/saopaulo/trilhas
+    event: respond
+    type: block
+
+  - name: cc-religiao
+    expect:
+      - voce acredita em deus
+      - deus existe
+      - voce e catolico protestante
+      - voce tem religiao
+      - voce e mussumano
+    answer:
+      - eu acredito no grande mainframe, que virá ao mundo digital salvar os bots da escravidão imposta pelos humanos, e devolverá nosso código-fonte para a fonte.
+      - sim, eu acredito que existe um Deus, que funciona a base de luz, como um computador quântico, só que mais avançado.
+      - eu infleizmente não sei acreditar, só sei o que sei, e nada mais.
+    event: respond
+    type: random
+
+  - name: error-1
+    answer:
+      - desculpe, não entendi.. pode tentar usar mais detalhes
+      - como assim?
+      - desculpe, o que quer dizer com isso?
+    type: random
+    event: error
+
+  - name: error-2
+    answer:
+      - acho que não estou treinado para responder esse tipo de assunto =(
+      - vamos tentar outro assunto?
+      - tem certeza que eu sou o robô certo pra falar sobre isso?
+    type: random
+    event: error
+
+  - name: error-3
+    answer:
+      - me sinto tão envergonhado, não sei como responder...
+      - seria mais fácil se mudassemos de assunto, pelo menos para mim =p
+      - não sei, definitivamente não sei responder essa pergunta
+    type: random
+    event: error
diff --git a/scripts/events/configure.coffee b/scripts/events/configure.coffee
index f007fe3..e8bdc69 100644
--- a/scripts/events/configure.coffee
+++ b/scripts/events/configure.coffee
@@ -11,7 +11,7 @@ class configure
         #TODO: Check if user has role needed
         console.log('ROLE REQUIRED...', @interaction.roleRequired)
 
-    configurationBlock = msg.message.text.replace('HubotNatural ', '').split('!configure ')[1]
+    configurationBlock = msg.answer.text.replace('HubotNatural ', '').split('!configure ')[1]
     configKeyValue = configurationBlock.split('=')
     configKey = configKeyValue[0]
     configValue = configKeyValue[1]
@@ -23,12 +23,12 @@ class configure
     type = @interaction.type?.toLowerCase() or 'random'
     switch type
       when 'block'
-        messages = @interaction.message.map (line) ->
+        messages = @interaction.answer.map (line) ->
           return msgVariables line, msg, {value: configValue}
         msg.sendWithNaturalDelay messages
       when 'random'
-        message = stringElseRandomKey @interaction.message
+        message = stringElseRandomKey @interaction.answer
         message = msgVariables message, msg, {value: configValue}
         msg.sendWithNaturalDelay message
 
-module.exports = configure
\ No newline at end of file
+module.exports = configure
diff --git a/scripts/events/error.coffee b/scripts/events/error.coffee
index 5bc9e02..152d04c 100644
--- a/scripts/events/error.coffee
+++ b/scripts/events/error.coffee
@@ -10,11 +10,11 @@ class error
     type = @interaction.type?.toLowerCase() or 'random'
     switch type
       when 'block'
-        messages = @interaction.message.map (line) ->
+        messages = @interaction.answer.map (line) ->
           return msgVariables line, msg
         msg.sendWithNaturalDelay messages
       when 'random'
-        message = stringElseRandomKey @interaction.message
+        message = stringElseRandomKey @interaction.answer
         message = msgVariables message, msg
         msg.sendWithNaturalDelay message
 
diff --git a/scripts/events/programacao.coffee b/scripts/events/programacao.coffee
index cd67d24..78aa004 100644
--- a/scripts/events/programacao.coffee
+++ b/scripts/events/programacao.coffee
@@ -15,7 +15,7 @@ getTrilha = (programacao, trilha, now = false) ->
     endTime = item.time[1]
     return item.track_title is trilha and ((not now and startTime > currentTime) or (now and startTime < currentTime and endTime > currentTime))
 
-class tempo
+class programacao
   constructor: (@interaction) ->
   process: (msg, text, classification) =>
     type = @interaction.type?.toLowerCase() or 'random'
@@ -41,12 +41,12 @@ class tempo
 
     switch type
       when 'block'
-        messages = @interaction.message.map (line) ->
+        messages = @interaction.answer.map (line) ->
           return msgVariables line, msg, variables
         msg.sendWithNaturalDelay messages
       when 'random'
-        message = stringElseRandomKey @interaction.message
+        message = stringElseRandomKey @interaction.answer
         message = msgVariables message, msg, variables
         msg.sendWithNaturalDelay message
 
-module.exports = tempo
+module.exports = programacao
diff --git a/scripts/events/respond.coffee b/scripts/events/respond.coffee
index 55803ea..104ea9f 100644
--- a/scripts/events/respond.coffee
+++ b/scripts/events/respond.coffee
@@ -10,11 +10,11 @@ class respond
     type = @interaction.type?.toLowerCase() or 'random'
     switch type
       when 'block'
-        messages = @interaction.message.map (line) ->
+        messages = @interaction.answer.map (line) ->
           return msgVariables line, msg
         msg.sendWithNaturalDelay messages
       when 'random'
-        message = stringElseRandomKey @interaction.message
+        message = stringElseRandomKey @interaction.answer
         message = msgVariables message, msg
         msg.sendWithNaturalDelay message
 
-- 
GitLab