codelab

Codelab: Crear un bot para Slack sobre Google Cloud Platform

Un codelab realizado en el Google IO Extended en La Paz el 11 de junio 2016.

Guía

1. Google Cloud Platform

2. Slack Team

3. Google Cloud Shell

  • gcloud auth list
  • gcloud config list project
  • gcloud config set compute/zone us-central1-f

4. Código de ejemplo

  • git clone https://github.com/googlecodelabs/cloud-slack-bot.git
  • cd cloud-slack-bot/start

5. Slack bot

6. La App

  • npm install
  • nano kittenbot.js
  • node kittenbot.js

7. Primera modificación

var Botkit = require('botkit')

var controller = Botkit.slackbot({debug: false})
controller
  .spawn({
    token: 'your-slack-token' // Edit this line!
  })
  .startRTM(function (err) {
    if (err) {
      throw new Error(err)
    }
  })

controller.hears(
  ['hola'], ['direct_message', 'direct_mention', 'mention'],
  function (bot, message) { bot.reply(message, 'Miauuu. :smile_cat:') })

Gist en GitHub

8. Segunda modificación

// INICIO CONVERSACIÓN
var maxCats = 20
var catEmojis = [
  ':smile_cat:',
  ':smiley_cat:',
  ':joy_cat:',
  ':heart_eyes_cat:',
  ':smirk_cat:',
  ':kissing_cat:',
  ':scream_cat:',
  ':crying_cat_face:',
  ':pouting_cat:',
  ':cat:',
  ':cat2:',
  ':leopard:',
  ':lion_face:',
  ':tiger:',
  ':tiger2:'
]

controller.hears(
  ['gato', 'gatos', 'gatito', 'gatitos'],
  ['ambient', 'direct_message', 'direct_mention', 'mention'],
  function (bot, message) {
    bot.startConversation(message, function (err, convo) {
      if (err) {
        console.log(err)
        return
      }
      convo.ask('¿Quiéres que te envie gatitos? Dime SI o NO.', [
        {
          pattern: bot.utterances.yes,
          callback: function (response, convo) {
            convo.say('¡Genial!')
            convo.ask('¿Cuantos?', [
              {
                pattern: '[0-9]+',
                callback: function (response, convo) {
                  var numCats =
                  parseInt(response.text.replace(/[^0-9]/g, ''), 10)
                  if (numCats === 0) {
                    convo.say({
                      'text': 'Lo siento pero yo no puedo enviarte cero gatos. ' +
                        'Toma un perro. :dog:',
                      'attachments': [
                        {
                          'fallback': 'Chihuahua Bubbles - https://youtu.be/s84dBopsIe4',
                          'text': '<https://youtu.be/s84dBopsIe4|' +
                            'Chihuahua Bubbles>!'
                        }
                      ]
                    })
                  } else if (numCats > maxCats) {
                    convo.say('Lo siento, ' + numCats + ' es muchos gatos.')
                  } else {
                    var catMessage = ''
                    for (var i = 0; i < numCats; i++) {
                      catMessage = catMessage +
                      catEmojis[Math.floor(Math.random() * catEmojis.length)]
                    }
                    convo.say(catMessage)
                  }
                  convo.next()
                }
              },
              {
                default: true,
                callback: function (response, convo) {
                  convo.say(
                    "Mmmmm no te entiendo. Ingresa un número, por favor.")
                  convo.repeat()
                  convo.next()
                }
              }
            ])
            convo.next()
          }
        },
        {
          pattern: bot.utterances.no,
          callback: function (response, convo) {
            convo.say('Bueno, quizás luego.')
            convo.next()
          }
        },
        {
          default: true,
          callback: function (response, convo) {
            // Repeat the question.
            convo.repeat()
            convo.next()
          }
        }
      ])
    })
  })
  // FIN CONVERSACIÓN

Código