chatterbot 2.0.0.pre → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
 - data/.github/workflows/ci.yml +19 -0
 - data/Gemfile +9 -17
 - data/README.markdown +27 -34
 - data/Rakefile +2 -18
 - data/bin/chatterbot-register +6 -2
 - data/chatterbot.gemspec +11 -12
 - data/docs/Gemfile +3 -0
 - data/docs/README.md +3 -0
 - data/docs/_config.yml +37 -0
 - data/docs/_includes/footer.html +3 -0
 - data/docs/_includes/header.html +4 -0
 - data/docs/_includes/navigation.html +23 -0
 - data/docs/_layouts/default.html +98 -0
 - data/docs/_layouts/page.html +11 -0
 - data/docs/_posts/.gitkeep +0 -0
 - data/docs/_site/Gemfile +3 -0
 - data/docs/_site/advanced.html +465 -0
 - data/docs/_site/configuration.html +436 -0
 - data/docs/_site/contributing.html +414 -0
 - data/docs/_site/css/main.css +58 -0
 - data/docs/_site/css/syntax.css +61 -0
 - data/docs/_site/deploying.html +451 -0
 - data/docs/_site/examples.html +559 -0
 - data/docs/_site/features.html +496 -0
 - data/docs/_site/images/01-create-application.png +0 -0
 - data/docs/_site/images/02-application-permissions.png +0 -0
 - data/docs/_site/images/03-mobile-number.png +0 -0
 - data/docs/_site/images/04-access-token.png +0 -0
 - data/docs/_site/index.html +461 -0
 - data/docs/_site/javascripts/main.js +1 -0
 - data/docs/_site/other-tools.html +419 -0
 - data/docs/_site/params.json +1 -0
 - data/docs/_site/rdoc.html +409 -0
 - data/docs/_site/setup.html +491 -0
 - data/docs/_site/stylesheets/pygment_trac.css +68 -0
 - data/docs/_site/stylesheets/stylesheet.css +247 -0
 - data/docs/_site/tut.html +402 -0
 - data/docs/_site/twitter-docs.html +409 -0
 - data/docs/_site/walkthrough.html +447 -0
 - data/docs/advanced.md +62 -0
 - data/docs/basics.md +12 -0
 - data/docs/bin/jekyll-page +109 -0
 - data/docs/configuration.md +32 -0
 - data/docs/contributing.md +14 -0
 - data/docs/css/main.css +58 -0
 - data/docs/css/syntax.css +61 -0
 - data/docs/deploying.md +47 -0
 - data/docs/examples.md +120 -0
 - data/docs/features.md +88 -0
 - data/docs/images/01-create-application.png +0 -0
 - data/docs/images/02-application-permissions.png +0 -0
 - data/docs/images/03-mobile-number.png +0 -0
 - data/docs/images/04-access-token.png +0 -0
 - data/docs/index.md +69 -0
 - data/docs/javascripts/main.js +1 -0
 - data/docs/other-tools.md +17 -0
 - data/docs/params.json +1 -0
 - data/docs/rdoc.md +6 -0
 - data/docs/setup.md +84 -0
 - data/docs/stylesheets/pygment_trac.css +68 -0
 - data/docs/stylesheets/stylesheet.css +247 -0
 - data/docs/tips.md +22 -0
 - data/docs/tut.md +6 -0
 - data/docs/twitter-docs.md +6 -0
 - data/docs/walkthrough.md +46 -0
 - data/ext/mkrf_conf.rb +28 -0
 - data/lib/chatterbot.rb +0 -1
 - data/lib/chatterbot/bot.rb +7 -63
 - data/lib/chatterbot/client.rb +6 -12
 - data/lib/chatterbot/config.rb +2 -2
 - data/lib/chatterbot/config_manager.rb +7 -1
 - data/lib/chatterbot/dsl.rb +20 -47
 - data/lib/chatterbot/home_timeline.rb +1 -2
 - data/lib/chatterbot/search.rb +26 -3
 - data/lib/chatterbot/skeleton.rb +1 -3
 - data/lib/chatterbot/tweet.rb +14 -3
 - data/lib/chatterbot/ui.rb +88 -20
 - data/lib/chatterbot/version.rb +1 -1
 - data/spec/bot_spec.rb +2 -77
 - data/spec/client_spec.rb +2 -6
 - data/spec/config_manager_spec.rb +6 -5
 - data/spec/config_spec.rb +4 -1
 - data/spec/dsl_spec.rb +10 -35
 - data/spec/fixtures/update_with_media.png +0 -0
 - data/spec/search_spec.rb +40 -1
 - data/spec/spec_helper.rb +1 -4
 - data/spec/tweet_spec.rb +75 -38
 - data/templates/skeleton.txt +26 -56
 - metadata +84 -141
 - data/.document +0 -5
 - data/.travis.yml +0 -8
 - data/examples/streaming_bot.rb +0 -48
 - data/examples/tweet_logger.rb +0 -68
 - data/lib/chatterbot/streaming.rb +0 -60
 - data/spec/streaming_spec.rb +0 -170
 
    
        data/docs/advanced.md
    ADDED
    
    | 
         @@ -0,0 +1,62 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            layout: page
         
     | 
| 
      
 3 
     | 
    
         
            +
            title: "Advanced Features"
         
     | 
| 
      
 4 
     | 
    
         
            +
            category: doc
         
     | 
| 
      
 5 
     | 
    
         
            +
            ---
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            Direct Client Access
         
     | 
| 
      
 8 
     | 
    
         
            +
            --------------------
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            If you want to do something not provided directly by Chatterbot, you
         
     | 
| 
      
 11 
     | 
    
         
            +
            have access to an instance of Twitter::Client provided by the
         
     | 
| 
      
 12 
     | 
    
         
            +
            **client** method. In theory, you can do something like this in your
         
     | 
| 
      
 13 
     | 
    
         
            +
            bot to unfollow users who DM you:
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                client.direct_messages_received(:since_id => since_id).each do |m|
         
     | 
| 
      
 16 
     | 
    
         
            +
                    client.unfollow(m.user.name)
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            Storing Config in the Database
         
     | 
| 
      
 20 
     | 
    
         
            +
            ------------------------------
         
     | 
| 
      
 21 
     | 
    
         
            +
            Sometimes it is preferable to store the authorization credentials for
         
     | 
| 
      
 22 
     | 
    
         
            +
            your bot in a database.
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            Chatterbot can manage configurations that are stored in the database,
         
     | 
| 
      
 25 
     | 
    
         
            +
            but to do this you will need to specify how to connect to the
         
     | 
| 
      
 26 
     | 
    
         
            +
            database. You can do this by specifying the connection string
         
     | 
| 
      
 27 
     | 
    
         
            +
            either in one of the global config files by setting
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            ```
         
     | 
| 
      
 30 
     | 
    
         
            +
            :db_uri:mysql://username:password@host/database
         
     | 
| 
      
 31 
     | 
    
         
            +
            ```
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            Or you can specify the connection on the command-line by using the
         
     | 
| 
      
 34 
     | 
    
         
            +
            --db="db_uri" configuration option. Any calls to the database are
         
     | 
| 
      
 35 
     | 
    
         
            +
            handled by the Sequel gem, and MySQL and Sqlite should work. The DB
         
     | 
| 
      
 36 
     | 
    
         
            +
            URI should be in the form of
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                mysql://username:password@host/database
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            see http://sequel.rubyforge.org/rdoc/files/doc/opening_databases_rdoc.html
         
     | 
| 
      
 41 
     | 
    
         
            +
            for details.
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            Logging Tweets to the Database
         
     | 
| 
      
 45 
     | 
    
         
            +
            ------------------------------
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            Chatterbot can log tweet activity to a database if desired. This can
         
     | 
| 
      
 48 
     | 
    
         
            +
            be handy for archival purposes, or for tracking what's going on with
         
     | 
| 
      
 49 
     | 
    
         
            +
            your bot.
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            If you've configured your bot for database access, you can store a
         
     | 
| 
      
 52 
     | 
    
         
            +
            tweet to the database by calling the `log` method like this:
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            ```
         
     | 
| 
      
 55 
     | 
    
         
            +
            search "chatterbot" do |tweet|
         
     | 
| 
      
 56 
     | 
    
         
            +
                log tweet
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
      
 58 
     | 
    
         
            +
            ```
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            See `Chatterbot::Logging` for details on this.
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
    
        data/docs/basics.md
    ADDED
    
    
| 
         @@ -0,0 +1,109 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'date'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            options = {
         
     | 
| 
      
 7 
     | 
    
         
            +
                # Expects to be in the bin/ sub-directory by default
         
     | 
| 
      
 8 
     | 
    
         
            +
                :path => File.dirname(File.dirname(__FILE__))
         
     | 
| 
      
 9 
     | 
    
         
            +
            }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            parser = OptionParser.new do |opt|
         
     | 
| 
      
 12 
     | 
    
         
            +
                opt.banner = 'usage: jekyll-page TITLE CATEGORY [FILENAME] [OPTIONS]'
         
     | 
| 
      
 13 
     | 
    
         
            +
                opt.separator ''
         
     | 
| 
      
 14 
     | 
    
         
            +
                opt.separator 'Options'
         
     | 
| 
      
 15 
     | 
    
         
            +
                opt.on('-e', '--edit', 'Edit the page') do |edit|
         
     | 
| 
      
 16 
     | 
    
         
            +
                    options[:edit] = true
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
                opt.on('-l', '--link', 'Relink pages') do |link|
         
     | 
| 
      
 19 
     | 
    
         
            +
                    options[:link] = true
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
                opt.on('-p PATH', '--path PATH', String, 'Path to project root') do |path|
         
     | 
| 
      
 22 
     | 
    
         
            +
                    options[:path] = path
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
                opt.separator ''
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            parser.parse!
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            title = ARGV[0]
         
     | 
| 
      
 30 
     | 
    
         
            +
            category = ARGV[1]
         
     | 
| 
      
 31 
     | 
    
         
            +
            filename = ARGV[2]
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            # Resolve any relative links
         
     | 
| 
      
 34 
     | 
    
         
            +
            BASE_DIR = File.expand_path(options[:path])
         
     | 
| 
      
 35 
     | 
    
         
            +
            POSTS_DIR = "#{BASE_DIR}/_posts"
         
     | 
| 
      
 36 
     | 
    
         
            +
            PAGES_DIR = "#{BASE_DIR}/_pages"
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            # Ensure the _posts directory exists (we are in the correct directory)
         
     | 
| 
      
 39 
     | 
    
         
            +
            if not Dir.exists?(POSTS_DIR)
         
     | 
| 
      
 40 
     | 
    
         
            +
                puts "#{POSTS_DIR} directory does not exists"
         
     | 
| 
      
 41 
     | 
    
         
            +
                exit
         
     | 
| 
      
 42 
     | 
    
         
            +
            end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            # Create _pages directory if it doesn't exist
         
     | 
| 
      
 45 
     | 
    
         
            +
            if not Dir.exists?(PAGES_DIR)
         
     | 
| 
      
 46 
     | 
    
         
            +
                Dir.mkdir(PAGES_DIR)
         
     | 
| 
      
 47 
     | 
    
         
            +
            end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
            if options[:link]
         
     | 
| 
      
 50 
     | 
    
         
            +
                Dir.foreach(POSTS_DIR) do |name|
         
     | 
| 
      
 51 
     | 
    
         
            +
                    next if name[0] == '.'
         
     | 
| 
      
 52 
     | 
    
         
            +
                    nodate = name[/\d{4}-\d{2}-\d{2}-(?<rest>.*)/, 'rest']
         
     | 
| 
      
 53 
     | 
    
         
            +
                    if File.symlink?("#{PAGES_DIR}/#{nodate}")
         
     | 
| 
      
 54 
     | 
    
         
            +
                        File.delete("#{PAGES_DIR}/#{nodate}")
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
                    abspath = File.absolute_path("#{POSTS_DIR}/#{name}")
         
     | 
| 
      
 57 
     | 
    
         
            +
                    File.symlink(abspath, "#{PAGES_DIR}/#{nodate}")
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
            end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            if not title or not category
         
     | 
| 
      
 62 
     | 
    
         
            +
                # This flag can be used by itself, exit silently if no arguments
         
     | 
| 
      
 63 
     | 
    
         
            +
                # are defined
         
     | 
| 
      
 64 
     | 
    
         
            +
                if not options[:link]
         
     | 
| 
      
 65 
     | 
    
         
            +
                    puts parser
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
                exit
         
     | 
| 
      
 68 
     | 
    
         
            +
            end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            if not filename
         
     | 
| 
      
 71 
     | 
    
         
            +
                filename = title.downcase.gsub(/[^a-z0-9\s]/, '').gsub(/\s+/, '-')
         
     | 
| 
      
 72 
     | 
    
         
            +
            end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            today=Date.today().strftime('%F')
         
     | 
| 
      
 75 
     | 
    
         
            +
            now=DateTime.now().strftime('%F %T')
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
            filepath = "#{POSTS_DIR}/#{today}-#{filename}.md"
         
     | 
| 
      
 78 
     | 
    
         
            +
            symlink = "#{PAGES_DIR}/#{filename}.md"
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            if File.exists?(filepath)
         
     | 
| 
      
 81 
     | 
    
         
            +
                puts "File #{filepath} already exists"
         
     | 
| 
      
 82 
     | 
    
         
            +
                exit
         
     | 
| 
      
 83 
     | 
    
         
            +
            end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
            content = <<END
         
     | 
| 
      
 86 
     | 
    
         
            +
            ---
         
     | 
| 
      
 87 
     | 
    
         
            +
            layout: page
         
     | 
| 
      
 88 
     | 
    
         
            +
            title: \"#{title}\"
         
     | 
| 
      
 89 
     | 
    
         
            +
            category: #{category}
         
     | 
| 
      
 90 
     | 
    
         
            +
            date: #{now}
         
     | 
| 
      
 91 
     | 
    
         
            +
            ---
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
            END
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
            File.open(filepath, 'w') do |file|
         
     | 
| 
      
 97 
     | 
    
         
            +
                file.puts content
         
     | 
| 
      
 98 
     | 
    
         
            +
            end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
            File.symlink(File.absolute_path(filepath), symlink)
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
            if options[:edit]
         
     | 
| 
      
 103 
     | 
    
         
            +
                if not ENV['EDITOR']
         
     | 
| 
      
 104 
     | 
    
         
            +
                    puts 'No $EDITOR variable set'
         
     | 
| 
      
 105 
     | 
    
         
            +
                    exit
         
     | 
| 
      
 106 
     | 
    
         
            +
                end
         
     | 
| 
      
 107 
     | 
    
         
            +
                puts ENV['EDITOR']
         
     | 
| 
      
 108 
     | 
    
         
            +
                exec("#{ENV['EDITOR']} #{filename}")
         
     | 
| 
      
 109 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            layout: page
         
     | 
| 
      
 3 
     | 
    
         
            +
            title: "Configuration"
         
     | 
| 
      
 4 
     | 
    
         
            +
            category: doc
         
     | 
| 
      
 5 
     | 
    
         
            +
            ---
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            You will need to store some information for your bot. This includes
         
     | 
| 
      
 8 
     | 
    
         
            +
            the OAuth credentials, timestamps, etc.  Chatterbot offers a whole
         
     | 
| 
      
 9 
     | 
    
         
            +
            bunch of different methods of storing the config for your bot:
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            1. Your credentials can be stored as variables in the script itself.
         
     | 
| 
      
 12 
     | 
    
         
            +
               If you generate a bot via `chatterbot-register`, the file will have
         
     | 
| 
      
 13 
     | 
    
         
            +
               these variables specified. However, if your bot source code is
         
     | 
| 
      
 14 
     | 
    
         
            +
               going to be public, you should NOT do this. Anyone who has your
         
     | 
| 
      
 15 
     | 
    
         
            +
               credentials can do nasty things with your Twitter account. Also, if
         
     | 
| 
      
 16 
     | 
    
         
            +
               your bot is using replies or searches, chatterbot will need to
         
     | 
| 
      
 17 
     | 
    
         
            +
               track some state information, and that data will be written to a
         
     | 
| 
      
 18 
     | 
    
         
            +
               YAML file.
         
     | 
| 
      
 19 
     | 
    
         
            +
            2. In a YAML file with the same name as the bot, so if you have
         
     | 
| 
      
 20 
     | 
    
         
            +
               botname.rb or a Botname class, store your config in botname.yaml.
         
     | 
| 
      
 21 
     | 
    
         
            +
               `chatterbot-register` will also create this file. If you are using
         
     | 
| 
      
 22 
     | 
    
         
            +
               git or another source code control system, you should **NOT** store
         
     | 
| 
      
 23 
     | 
    
         
            +
               this file! It will be updated every time your bots run.
         
     | 
| 
      
 24 
     | 
    
         
            +
            3. In a global config file at `/etc/chatterbot.yml` -- values stored here
         
     | 
| 
      
 25 
     | 
    
         
            +
               will apply to any bots you run.
         
     | 
| 
      
 26 
     | 
    
         
            +
            4. In another global config file specified in the environment variable
         
     | 
| 
      
 27 
     | 
    
         
            +
               `'chatterbot_config'`.
         
     | 
| 
      
 28 
     | 
    
         
            +
            5. In a `global.yml` file in the same directory as your bot.  This
         
     | 
| 
      
 29 
     | 
    
         
            +
               gives you the ability to have a global configuration file, but keep
         
     | 
| 
      
 30 
     | 
    
         
            +
               it with your bots if desired.
         
     | 
| 
      
 31 
     | 
    
         
            +
            6. In a database.  You can read more about this on the [Advanced
         
     | 
| 
      
 32 
     | 
    
         
            +
               Features](advanced.html) page
         
     | 
| 
         @@ -0,0 +1,14 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            layout: page
         
     | 
| 
      
 3 
     | 
    
         
            +
            title: "Contributing"
         
     | 
| 
      
 4 
     | 
    
         
            +
            category: dev
         
     | 
| 
      
 5 
     | 
    
         
            +
            ---
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            Bug fixes, features, etc are eagerly welcomed. Since this code is
         
     | 
| 
      
 8 
     | 
    
         
            +
            being used to run current Twitter bots, any changes need to maintain
         
     | 
| 
      
 9 
     | 
    
         
            +
            compatibility. If there are bugs or things you would like to improve,
         
     | 
| 
      
 10 
     | 
    
         
            +
            fork the project and hack away. I'll pull anything back that makes
         
     | 
| 
      
 11 
     | 
    
         
            +
            sense if requested.
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
    
        data/docs/css/main.css
    ADDED
    
    | 
         @@ -0,0 +1,58 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            body {
         
     | 
| 
      
 2 
     | 
    
         
            +
                font-weight: 400;
         
     | 
| 
      
 3 
     | 
    
         
            +
                text-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);
         
     | 
| 
      
 4 
     | 
    
         
            +
            }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            pre, code {
         
     | 
| 
      
 7 
     | 
    
         
            +
                border: none;
         
     | 
| 
      
 8 
     | 
    
         
            +
                border-radius: 0;
         
     | 
| 
      
 9 
     | 
    
         
            +
                background-color: #f9f9f9;
         
     | 
| 
      
 10 
     | 
    
         
            +
                font-size: 0.85em;
         
     | 
| 
      
 11 
     | 
    
         
            +
            }
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            pre {
         
     | 
| 
      
 14 
     | 
    
         
            +
                font-size: 1em;
         
     | 
| 
      
 15 
     | 
    
         
            +
            }
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            code {
         
     | 
| 
      
 18 
     | 
    
         
            +
                color: inherit;
         
     | 
| 
      
 19 
     | 
    
         
            +
            }
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            #header {
         
     | 
| 
      
 22 
     | 
    
         
            +
                border-bottom: 1px solid #eee;
         
     | 
| 
      
 23 
     | 
    
         
            +
                margin-bottom: 20px;
         
     | 
| 
      
 24 
     | 
    
         
            +
            }
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            #header a:hover {
         
     | 
| 
      
 27 
     | 
    
         
            +
                text-decoration: none;
         
     | 
| 
      
 28 
     | 
    
         
            +
            }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            #footer {
         
     | 
| 
      
 31 
     | 
    
         
            +
                margin: 20px 0;
         
     | 
| 
      
 32 
     | 
    
         
            +
                font-size: 0.85em;
         
     | 
| 
      
 33 
     | 
    
         
            +
                color: #999;
         
     | 
| 
      
 34 
     | 
    
         
            +
                text-align: center;
         
     | 
| 
      
 35 
     | 
    
         
            +
            }
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            #content > .page-header:first-child {
         
     | 
| 
      
 38 
     | 
    
         
            +
                margin-top: 0;
         
     | 
| 
      
 39 
     | 
    
         
            +
            }
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            #content > .page-header:first-child h2 {
         
     | 
| 
      
 42 
     | 
    
         
            +
                margin-top: 0;
         
     | 
| 
      
 43 
     | 
    
         
            +
            }
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            #navigation {
         
     | 
| 
      
 47 
     | 
    
         
            +
                font-size: 0.9em;
         
     | 
| 
      
 48 
     | 
    
         
            +
            }
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            #navigation li a {
         
     | 
| 
      
 51 
     | 
    
         
            +
                padding-left: 10px;
         
     | 
| 
      
 52 
     | 
    
         
            +
                padding-right: 10px;
         
     | 
| 
      
 53 
     | 
    
         
            +
            }
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            #navigation .nav-header {
         
     | 
| 
      
 56 
     | 
    
         
            +
                padding-left: 0;
         
     | 
| 
      
 57 
     | 
    
         
            +
                padding-right: 0;
         
     | 
| 
      
 58 
     | 
    
         
            +
            }
         
     | 
    
        data/docs/css/syntax.css
    ADDED
    
    | 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            .highlight .hll { background-color: #ffffcc }
         
     | 
| 
      
 2 
     | 
    
         
            +
            .highlight  { background: #ffffff; }
         
     | 
| 
      
 3 
     | 
    
         
            +
            .highlight .c { color: #888888 } /* Comment */
         
     | 
| 
      
 4 
     | 
    
         
            +
            .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
         
     | 
| 
      
 5 
     | 
    
         
            +
            .highlight .k { color: #008800; font-weight: bold } /* Keyword */
         
     | 
| 
      
 6 
     | 
    
         
            +
            .highlight .cm { color: #888888 } /* Comment.Multiline */
         
     | 
| 
      
 7 
     | 
    
         
            +
            .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
         
     | 
| 
      
 8 
     | 
    
         
            +
            .highlight .c1 { color: #888888 } /* Comment.Single */
         
     | 
| 
      
 9 
     | 
    
         
            +
            .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
         
     | 
| 
      
 10 
     | 
    
         
            +
            .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
         
     | 
| 
      
 11 
     | 
    
         
            +
            .highlight .ge { font-style: italic } /* Generic.Emph */
         
     | 
| 
      
 12 
     | 
    
         
            +
            .highlight .gr { color: #aa0000 } /* Generic.Error */
         
     | 
| 
      
 13 
     | 
    
         
            +
            .highlight .gh { color: #333333 } /* Generic.Heading */
         
     | 
| 
      
 14 
     | 
    
         
            +
            .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
         
     | 
| 
      
 15 
     | 
    
         
            +
            .highlight .go { color: #888888 } /* Generic.Output */
         
     | 
| 
      
 16 
     | 
    
         
            +
            .highlight .gp { color: #555555 } /* Generic.Prompt */
         
     | 
| 
      
 17 
     | 
    
         
            +
            .highlight .gs { font-weight: bold } /* Generic.Strong */
         
     | 
| 
      
 18 
     | 
    
         
            +
            .highlight .gu { color: #666666 } /* Generic.Subheading */
         
     | 
| 
      
 19 
     | 
    
         
            +
            .highlight .gt { color: #aa0000 } /* Generic.Traceback */
         
     | 
| 
      
 20 
     | 
    
         
            +
            .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
         
     | 
| 
      
 21 
     | 
    
         
            +
            .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
         
     | 
| 
      
 22 
     | 
    
         
            +
            .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
         
     | 
| 
      
 23 
     | 
    
         
            +
            .highlight .kp { color: #008800 } /* Keyword.Pseudo */
         
     | 
| 
      
 24 
     | 
    
         
            +
            .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
         
     | 
| 
      
 25 
     | 
    
         
            +
            .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
         
     | 
| 
      
 26 
     | 
    
         
            +
            .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
         
     | 
| 
      
 27 
     | 
    
         
            +
            .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
         
     | 
| 
      
 28 
     | 
    
         
            +
            .highlight .na { color: #336699 } /* Name.Attribute */
         
     | 
| 
      
 29 
     | 
    
         
            +
            .highlight .nb { color: #003388 } /* Name.Builtin */
         
     | 
| 
      
 30 
     | 
    
         
            +
            .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
         
     | 
| 
      
 31 
     | 
    
         
            +
            .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
         
     | 
| 
      
 32 
     | 
    
         
            +
            .highlight .nd { color: #555555 } /* Name.Decorator */
         
     | 
| 
      
 33 
     | 
    
         
            +
            .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
         
     | 
| 
      
 34 
     | 
    
         
            +
            .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
         
     | 
| 
      
 35 
     | 
    
         
            +
            .highlight .nl { color: #336699; font-style: italic } /* Name.Label */
         
     | 
| 
      
 36 
     | 
    
         
            +
            .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
         
     | 
| 
      
 37 
     | 
    
         
            +
            .highlight .py { color: #336699; font-weight: bold } /* Name.Property */
         
     | 
| 
      
 38 
     | 
    
         
            +
            .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
         
     | 
| 
      
 39 
     | 
    
         
            +
            .highlight .nv { color: #336699 } /* Name.Variable */
         
     | 
| 
      
 40 
     | 
    
         
            +
            .highlight .ow { color: #008800 } /* Operator.Word */
         
     | 
| 
      
 41 
     | 
    
         
            +
            .highlight .w { color: #bbbbbb } /* Text.Whitespace */
         
     | 
| 
      
 42 
     | 
    
         
            +
            .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
         
     | 
| 
      
 43 
     | 
    
         
            +
            .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
         
     | 
| 
      
 44 
     | 
    
         
            +
            .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
         
     | 
| 
      
 45 
     | 
    
         
            +
            .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
         
     | 
| 
      
 46 
     | 
    
         
            +
            .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
         
     | 
| 
      
 47 
     | 
    
         
            +
            .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
         
     | 
| 
      
 48 
     | 
    
         
            +
            .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
         
     | 
| 
      
 49 
     | 
    
         
            +
            .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
         
     | 
| 
      
 50 
     | 
    
         
            +
            .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
         
     | 
| 
      
 51 
     | 
    
         
            +
            .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
         
     | 
| 
      
 52 
     | 
    
         
            +
            .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
         
     | 
| 
      
 53 
     | 
    
         
            +
            .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
         
     | 
| 
      
 54 
     | 
    
         
            +
            .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
         
     | 
| 
      
 55 
     | 
    
         
            +
            .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
         
     | 
| 
      
 56 
     | 
    
         
            +
            .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
         
     | 
| 
      
 57 
     | 
    
         
            +
            .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
         
     | 
| 
      
 58 
     | 
    
         
            +
            .highlight .vc { color: #336699 } /* Name.Variable.Class */
         
     | 
| 
      
 59 
     | 
    
         
            +
            .highlight .vg { color: #dd7700 } /* Name.Variable.Global */
         
     | 
| 
      
 60 
     | 
    
         
            +
            .highlight .vi { color: #3333bb } /* Name.Variable.Instance */
         
     | 
| 
      
 61 
     | 
    
         
            +
            .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
         
     | 
    
        data/docs/deploying.md
    ADDED
    
    | 
         @@ -0,0 +1,47 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            layout: page
         
     | 
| 
      
 3 
     | 
    
         
            +
            title: "Running your Bot"
         
     | 
| 
      
 4 
     | 
    
         
            +
            category: doc
         
     | 
| 
      
 5 
     | 
    
         
            +
            ---
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            There's a couple ways of running your bot:
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            Manually
         
     | 
| 
      
 10 
     | 
    
         
            +
            --------
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            Run it on the command-line whenever you like. Whee!
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            Cron
         
     | 
| 
      
 16 
     | 
    
         
            +
            ----
         
     | 
| 
      
 17 
     | 
    
         
            +
            Run it via cron.  Here's an example of running a bot every two minutes
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                */2 * * * * . ~/.bash_profile; cd /path/to/bot/;  ./bot.rb
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            Looping
         
     | 
| 
      
 22 
     | 
    
         
            +
            -------
         
     | 
| 
      
 23 
     | 
    
         
            +
            Run it as a background process.  Just put the guts of your bot in a loop like this:
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            ```rb
         
     | 
| 
      
 26 
     | 
    
         
            +
            loop do
         
     | 
| 
      
 27 
     | 
    
         
            +
              search "twitter" do |tweet|
         
     | 
| 
      
 28 
     | 
    
         
            +
                # here you could do something with a tweet
         
     | 
| 
      
 29 
     | 
    
         
            +
                # if you want to retweet
         
     | 
| 
      
 30 
     | 
    
         
            +
                retweet(tweet[:id])
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              replies do |tweet|
         
     | 
| 
      
 34 
     | 
    
         
            +
                # do stuff
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              # explicitly update our config
         
     | 
| 
      
 38 
     | 
    
         
            +
              update_config
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              sleep 60
         
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
| 
      
 42 
     | 
    
         
            +
            ```
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            **NOTE:** You need to call `update_config` to update the last tweet your script
         
     | 
| 
      
 45 
     | 
    
         
            +
            has processed -- if you don't have this call, you will get duplicate
         
     | 
| 
      
 46 
     | 
    
         
            +
            tweets.
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
    
        data/docs/examples.md
    ADDED
    
    | 
         @@ -0,0 +1,120 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            layout: page
         
     | 
| 
      
 3 
     | 
    
         
            +
            title: "Examples"
         
     | 
| 
      
 4 
     | 
    
         
            +
            category: tut
         
     | 
| 
      
 5 
     | 
    
         
            +
            ---
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            Here's a couple examples of working bots.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            @echoes_bot
         
     | 
| 
      
 10 
     | 
    
         
            +
            -----------
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            This is a working bot. It responds to any mentions with the incoming
         
     | 
| 
      
 13 
     | 
    
         
            +
            text:
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            <blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/muffinista">@muffinista</a> hello there!</p>— Echo Echo (@echoes_bot) <a href="https://twitter.com/echoes_bot/status/515166110950256640">September 25, 2014</a></blockquote>
         
     | 
| 
      
 16 
     | 
    
         
            +
            <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            Here's the code. This is right out of the git repo for chatterbot:
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            ```
         
     | 
| 
      
 21 
     | 
    
         
            +
            ## This is a very simple working example of a bot you can build with
         
     | 
| 
      
 22 
     | 
    
         
            +
            ## chatterbot. It looks for mentions of '@echoes_bot' (the twitter
         
     | 
| 
      
 23 
     | 
    
         
            +
            ## handle the bot uses), and sends replies with the name switched to
         
     | 
| 
      
 24 
     | 
    
         
            +
            ## the handle of the sending user
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            #
         
     | 
| 
      
 27 
     | 
    
         
            +
            # require the dsl lib to include all the methods you see below.
         
     | 
| 
      
 28 
     | 
    
         
            +
            #
         
     | 
| 
      
 29 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 30 
     | 
    
         
            +
            require 'chatterbot/dsl'
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            puts "Loading echoes_bot.rb"
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            ##
         
     | 
| 
      
 35 
     | 
    
         
            +
            ## If I wanted to exclude some terms from triggering this bot, I would list them here.
         
     | 
| 
      
 36 
     | 
    
         
            +
            ## For now, we'll block URLs to keep this from being a source of spam
         
     | 
| 
      
 37 
     | 
    
         
            +
            ##
         
     | 
| 
      
 38 
     | 
    
         
            +
            exclude "http://"
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            blacklist "mean_user, private_user"
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            puts "checking for replies to me"
         
     | 
| 
      
 43 
     | 
    
         
            +
            replies do |tweet|
         
     | 
| 
      
 44 
     | 
    
         
            +
              # replace the incoming username with #USER#, which will be replaced
         
     | 
| 
      
 45 
     | 
    
         
            +
              # with the handle of the user who tweeted us by the
         
     | 
| 
      
 46 
     | 
    
         
            +
              # replace_variables helper
         
     | 
| 
      
 47 
     | 
    
         
            +
              src = tweet.text.gsub(/@echoes_bot/, "#USER#")  
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              # send it back!
         
     | 
| 
      
 50 
     | 
    
         
            +
              reply src, tweet
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
      
 52 
     | 
    
         
            +
            ```
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            @SpaceJamCheck
         
     | 
| 
      
 56 
     | 
    
         
            +
            --------------
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            This is another working bot. It checks the website for the movie Space
         
     | 
| 
      
 59 
     | 
    
         
            +
            Jam to see if it is still online (it does this by using the spacejam
         
     | 
| 
      
 60 
     | 
    
         
            +
            gem), and tweets the results of that check.
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            ```
         
     | 
| 
      
 64 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 67 
     | 
    
         
            +
            require 'bundler/setup'
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
            require 'chatterbot/dsl'
         
     | 
| 
      
 70 
     | 
    
         
            +
            require 'spacejam'
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
            #
         
     | 
| 
      
 73 
     | 
    
         
            +
            # this is the script for the twitter bot SpaceJamCheck
         
     | 
| 
      
 74 
     | 
    
         
            +
            # generated on 2013-11-04 16:24:46 -0500
         
     | 
| 
      
 75 
     | 
    
         
            +
            #
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
            consumer_key 'key'
         
     | 
| 
      
 78 
     | 
    
         
            +
            consumer_secret 'secret'
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            secret 'secret'
         
     | 
| 
      
 81 
     | 
    
         
            +
            token 'token'
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            check_url = "http://www2.warnerbros.com/spacejam/movie/jam.htm"
         
     | 
| 
      
 85 
     | 
    
         
            +
            check_string = "<title>Space Jam</title>"
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
            uptime_messages = [
         
     | 
| 
      
 88 
     | 
    
         
            +
                               "Hooray! Space Jam is still online!",
         
     | 
| 
      
 89 
     | 
    
         
            +
                               "It's #{Time.now.year} and the Space Jam website is still online",
         
     | 
| 
      
 90 
     | 
    
         
            +
                               "In case you were worried, Space Jam is still online",
         
     | 
| 
      
 91 
     | 
    
         
            +
                               "Looks like the Space Jam website is still there",
         
     | 
| 
      
 92 
     | 
    
         
            +
                               "Yes",
         
     | 
| 
      
 93 
     | 
    
         
            +
                               "Yep",
         
     | 
| 
      
 94 
     | 
    
         
            +
                               "Still Kickin",
         
     | 
| 
      
 95 
     | 
    
         
            +
                               "The Space Jam website is still online",
         
     | 
| 
      
 96 
     | 
    
         
            +
                               "Still Online"
         
     | 
| 
      
 97 
     | 
    
         
            +
                              ]
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            downtime_messages = [
         
     | 
| 
      
 100 
     | 
    
         
            +
                                 "Hmm, looks like Space Jam isn't online. Hopefully it's a fluke ;("
         
     | 
| 
      
 101 
     | 
    
         
            +
                                ]
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
            x = Spacejam::HTTPCheck.new(url:check_url, body:check_string)
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
            # pick a random tweet according to the website status
         
     | 
| 
      
 107 
     | 
    
         
            +
            result = if x.online?
         
     | 
| 
      
 108 
     | 
    
         
            +
              uptime_messages
         
     | 
| 
      
 109 
     | 
    
         
            +
            else
         
     | 
| 
      
 110 
     | 
    
         
            +
              downtime_messages
         
     | 
| 
      
 111 
     | 
    
         
            +
            end.sample
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
            # add a timestamp. this helps to prevent duplicate tweet issues
         
     | 
| 
      
 114 
     | 
    
         
            +
            result << " (#{Time.now.utc})"
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
            # tweet it out!
         
     | 
| 
      
 117 
     | 
    
         
            +
            tweet result
         
     | 
| 
      
 118 
     | 
    
         
            +
            ```
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
             
     |