chatterbot 0.7.1 → 0.9.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 +4 -4
- data/.travis.yml +1 -1
- data/Gemfile +7 -5
- data/README.markdown +1 -1
- data/Rakefile +8 -0
- data/bin/chatterbot-blacklist +2 -0
- data/bin/chatterbot-register +2 -0
- data/bin/chatterbot-status +2 -0
- data/chatterbot.gemspec +6 -6
- data/examples/streaming_bot.rb +42 -0
- data/lib/chatterbot.rb +16 -1
- data/lib/chatterbot/blacklist.rb +3 -1
- data/lib/chatterbot/bot.rb +4 -0
- data/lib/chatterbot/client.rb +21 -26
- data/lib/chatterbot/config.rb +26 -30
- data/lib/chatterbot/db.rb +2 -0
- data/lib/chatterbot/dsl.rb +117 -3
- data/lib/chatterbot/favorite.rb +23 -0
- data/lib/chatterbot/followers.rb +9 -0
- data/lib/chatterbot/helpers.rb +3 -1
- data/lib/chatterbot/logging.rb +4 -3
- data/lib/chatterbot/profile.rb +40 -0
- data/lib/chatterbot/reply.rb +10 -2
- data/lib/chatterbot/retweet.rb +10 -4
- data/lib/chatterbot/search.rb +12 -6
- data/lib/chatterbot/skeleton.rb +6 -0
- data/lib/chatterbot/streaming.rb +67 -0
- data/lib/chatterbot/streaming_handler.rb +96 -0
- data/lib/chatterbot/tweet.rb +2 -0
- data/lib/chatterbot/ui.rb +2 -1
- data/lib/chatterbot/utils.rb +11 -0
- data/lib/chatterbot/version.rb +1 -1
- data/spec/blacklist_spec.rb +24 -23
- data/spec/bot_spec.rb +12 -0
- data/spec/client_spec.rb +36 -32
- data/spec/config_spec.rb +135 -85
- data/spec/db_spec.rb +5 -5
- data/spec/dsl_spec.rb +74 -27
- data/spec/favorite_spec.rb +34 -0
- data/spec/followers_spec.rb +32 -11
- data/spec/helpers_spec.rb +25 -20
- data/spec/logging_spec.rb +16 -15
- data/spec/profile_spec.rb +65 -0
- data/spec/reply_spec.rb +24 -24
- data/spec/retweet_spec.rb +17 -9
- data/spec/search_spec.rb +26 -26
- data/spec/skeleton_spec.rb +6 -6
- data/spec/spec_helper.rb +44 -32
- data/spec/streaming_handler_spec.rb +78 -0
- data/spec/streaming_spec.rb +172 -0
- data/spec/tweet_spec.rb +18 -18
- data/spec/utils_spec.rb +29 -0
- data/specs.watchr +1 -13
- metadata +27 -16
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d6cc3315231e205c177354dd5673822215379086
         | 
| 4 | 
            +
              data.tar.gz: d4b0c0bb2d9ce6d2aa3d06ab17250a43868f1050
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2a8a816511a450286f76f0a7e7650c57fda15d9fcf58492473883402253997817a450e55d586858612acf2cf05741afc76567af25c319c7aea1ba0279f4359de
         | 
| 7 | 
            +
              data.tar.gz: a66dc9d98fa5f1b40270ac88231b7849a13861a97b565ed0a40f1e582bbae93ef19daf804ce7ae629bd9f3ab06b2db236fea15e3092d1449014d4106edcd782e
         | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    | @@ -8,16 +8,18 @@ gemspec | |
| 8 8 | 
             
            # Add dependencies to develop your gem here.
         | 
| 9 9 | 
             
            # Include everything needed to run rake, tests, features, etc.
         | 
| 10 10 | 
             
            group :development do
         | 
| 11 | 
            -
              gem 'simplecov', :require => false, :group => :test
         | 
| 11 | 
            +
              #gem 'simplecov', :require => false, :group => :test
         | 
| 12 12 |  | 
| 13 | 
            -
              gem "shoulda", ">= 0"
         | 
| 14 | 
            -
              gem "rspec"
         | 
| 15 | 
            -
              gem "rake"
         | 
| 13 | 
            +
              #gem "shoulda", ">= 0"
         | 
| 14 | 
            +
              #gem "rspec"
         | 
| 15 | 
            +
              #gem "rake"
         | 
| 16 16 | 
             
              #gem "twitter", "~> 4.4.0"
         | 
| 17 17 |  | 
| 18 | 
            -
              gem "watchr"
         | 
| 18 | 
            +
              #gem "watchr"
         | 
| 19 19 | 
             
            end
         | 
| 20 20 |  | 
| 21 | 
            +
            gem "pry"
         | 
| 22 | 
            +
             | 
| 21 23 | 
             
            #
         | 
| 22 24 | 
             
            # couple extra gems for testing db connectivity
         | 
| 23 25 | 
             
            #
         | 
    
        data/README.markdown
    CHANGED
    
    | @@ -217,7 +217,7 @@ your bot: | |
| 217 217 | 
             
               it with your bots if desired.
         | 
| 218 218 | 
             
            6. In a database.  You can store your configuration in a DB, and then
         | 
| 219 219 | 
             
               specify the connection string either in one of the global config
         | 
| 220 | 
            -
               files | 
| 220 | 
            +
               files by setting `:db_uri: postgres://username:password@host/database`, or on the command-line by using the `--db="db_uri"`
         | 
| 221 221 | 
             
               configuration option.  Any calls to the database are handled by the
         | 
| 222 222 | 
             
               Sequel gem, and MySQL and Sqlite should work.  The DB URI should
         | 
| 223 223 | 
             
               be in the form of `mysql://username:password@host/database` -- see
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -24,3 +24,11 @@ Rake::RDocTask.new do |rdoc| | |
| 24 24 | 
             
              rdoc.rdoc_dir = 'rdoc'
         | 
| 25 25 | 
             
              rdoc.title = "'chatterbot #{Chatterbot::VERSION}'"
         | 
| 26 26 | 
             
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            task :console do
         | 
| 29 | 
            +
              require 'irb'
         | 
| 30 | 
            +
              require 'irb/completion'
         | 
| 31 | 
            +
              require 'chatterbot' # You know what to do.
         | 
| 32 | 
            +
              ARGV.clear
         | 
| 33 | 
            +
              IRB.start
         | 
| 34 | 
            +
            end
         | 
    
        data/bin/chatterbot-blacklist
    CHANGED
    
    
    
        data/bin/chatterbot-register
    CHANGED
    
    
    
        data/bin/chatterbot-status
    CHANGED
    
    
    
        data/chatterbot.gemspec
    CHANGED
    
    | @@ -27,17 +27,17 @@ Gem::Specification.new do |s| | |
| 27 27 | 
             
              else
         | 
| 28 28 | 
             
                s.add_development_dependency(%q<redcarpet>, [">= 0"])
         | 
| 29 29 | 
             
              end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
              s.add_runtime_dependency(%q<oauth>, [">= 0"])
         | 
| 32 | 
            -
              s.add_runtime_dependency(%q<twitter>, [" | 
| 30 | 
            +
             | 
| 31 | 
            +
              s.add_runtime_dependency(%q<oauth>, [">= 0.4.7"])
         | 
| 32 | 
            +
              s.add_runtime_dependency(%q<twitter>, ["5.8.0"])
         | 
| 33 33 | 
             
              s.add_runtime_dependency(%q<launchy>, [">= 2.1.2"])
         | 
| 34 34 | 
             
              s.add_development_dependency(%q<yard>, [">= 0"])
         | 
| 35 35 | 
             
              s.add_development_dependency(%q<shoulda>, [">= 0"])
         | 
| 36 36 | 
             
              s.add_development_dependency(%q<rake>, [">= 0"])
         | 
| 37 | 
            -
              s.add_development_dependency(%q<rspec>, [" | 
| 38 | 
            -
              s.add_development_dependency(%q<rspec-mocks>, [" | 
| 37 | 
            +
              s.add_development_dependency(%q<rspec>, ["~> 3.0.0"])
         | 
| 38 | 
            +
              s.add_development_dependency(%q<rspec-mocks>, ["~> 3.0.2"])
         | 
| 39 39 | 
             
              s.add_development_dependency(%q<rdoc>, [">= 0"])
         | 
| 40 40 | 
             
              s.add_development_dependency(%q<simplecov>, [">= 0"])
         | 
| 41 | 
            -
              s.add_development_dependency(%q< | 
| 41 | 
            +
              s.add_development_dependency(%q<observr>, [">= 0"])
         | 
| 42 42 | 
             
            end
         | 
| 43 43 |  | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ## This is a very simple working example of a bot using the streaming
         | 
| 4 | 
            +
            ## API. It's basically a copy of echoes_bot.rb, just using streaming.
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # require the dsl lib to include all the methods you see below.
         | 
| 8 | 
            +
            #
         | 
| 9 | 
            +
            require 'rubygems'
         | 
| 10 | 
            +
            require 'chatterbot/dsl'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            consumer_secret 'foo'
         | 
| 13 | 
            +
            secret 'bar'
         | 
| 14 | 
            +
            token 'biz'
         | 
| 15 | 
            +
            consumer_key 'bam'
         | 
| 16 | 
            +
             | 
| 17 | 
            +
             | 
| 18 | 
            +
            puts "Loading echoes_bot.rb using the streaming API"
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            exclude "http://", "https://"
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            blacklist "mean_user, private_user"
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            streaming do
         | 
| 25 | 
            +
              favorited do |user, tweet|
         | 
| 26 | 
            +
                reply "@#{user.screen_name} thanks for the fave!", tweet
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              followed do |user|
         | 
| 30 | 
            +
                tweet "@#{user.screen_name} just followed me!"
         | 
| 31 | 
            +
                follow user
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              replies do |tweet|
         | 
| 35 | 
            +
                favorite tweet
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                puts "It's a tweet!"
         | 
| 38 | 
            +
                src = tweet.text.gsub(/@echoes_bot/, "#USER#")  
         | 
| 39 | 
            +
                reply src, tweet
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| 42 | 
            +
             | 
    
        data/lib/chatterbot.rb
    CHANGED
    
    | @@ -28,6 +28,8 @@ end | |
| 28 28 | 
             
            #
         | 
| 29 29 | 
             
            # the big kahuna!
         | 
| 30 30 | 
             
            module Chatterbot
         | 
| 31 | 
            +
              @@from_helper = false
         | 
| 32 | 
            +
             | 
| 31 33 | 
             
              #
         | 
| 32 34 | 
             
              # load in our assorted modules
         | 
| 33 35 | 
             
              def self.load
         | 
| @@ -40,13 +42,26 @@ module Chatterbot | |
| 40 42 | 
             
                require "chatterbot/search"
         | 
| 41 43 | 
             
                require "chatterbot/tweet"
         | 
| 42 44 | 
             
                require "chatterbot/retweet"
         | 
| 45 | 
            +
                require "chatterbot/favorite"
         | 
| 46 | 
            +
                require "chatterbot/profile"
         | 
| 43 47 | 
             
                require "chatterbot/reply"
         | 
| 48 | 
            +
                require "chatterbot/streaming"
         | 
| 49 | 
            +
                require "chatterbot/streaming_handler"
         | 
| 44 50 | 
             
                require "chatterbot/followers"
         | 
| 45 | 
            -
                require "chatterbot/helpers" | 
| 51 | 
            +
                require "chatterbot/helpers"
         | 
| 52 | 
            +
                require "chatterbot/utils"
         | 
| 46 53 |  | 
| 47 54 | 
             
                require "chatterbot/bot"
         | 
| 48 55 | 
             
              end
         | 
| 49 56 |  | 
| 57 | 
            +
              def self.from_helper=(x)
         | 
| 58 | 
            +
                @@from_helper = x
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def self.from_helper
         | 
| 62 | 
            +
                @@from_helper
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
              
         | 
| 50 65 | 
             
              require 'chatterbot/version'
         | 
| 51 66 |  | 
| 52 67 | 
             
              # Return a directory with the project libraries.
         | 
    
        data/lib/chatterbot/blacklist.rb
    CHANGED
    
    | @@ -29,6 +29,9 @@ module Chatterbot | |
| 29 29 | 
             
                #
         | 
| 30 30 | 
             
                # Is this tweet from a user on our blacklist?
         | 
| 31 31 | 
             
                def on_blacklist?(s)
         | 
| 32 | 
            +
                  puts s.inspect
         | 
| 33 | 
            +
                  puts blacklist.inspect
         | 
| 34 | 
            +
             | 
| 32 35 | 
             
                  search = (s.respond_to?(:user) ? from_user(s) : s).downcase
         | 
| 33 36 | 
             
                  blacklist.any? { |b| search.include?(b.downcase) } ||
         | 
| 34 37 | 
             
                    on_global_blacklist?(search)
         | 
| @@ -52,7 +55,6 @@ module Chatterbot | |
| 52 55 |  | 
| 53 56 | 
             
                  # make sure we don't have an @ at the beginning of the username
         | 
| 54 57 | 
             
                  user.gsub!(/^@/, "")
         | 
| 55 | 
            -
             | 
| 56 58 | 
             
                  debug "adding #{user} to blacklist"
         | 
| 57 59 |  | 
| 58 60 | 
             
                  db[:blacklist].insert({ :user => user, :created_at => Time.now }) # 
         | 
    
        data/lib/chatterbot/bot.rb
    CHANGED
    
    | @@ -3,12 +3,16 @@ module Chatterbot | |
| 3 3 | 
             
              #
         | 
| 4 4 | 
             
              # primary Bot object, includes all the other modules
         | 
| 5 5 | 
             
              class Bot
         | 
| 6 | 
            +
                include Utils
         | 
| 6 7 | 
             
                include Blacklist
         | 
| 8 | 
            +
                include Streaming
         | 
| 7 9 | 
             
                include Config
         | 
| 8 10 | 
             
                include Logging
         | 
| 9 11 | 
             
                include Search
         | 
| 10 12 | 
             
                include Tweet
         | 
| 13 | 
            +
                include Profile
         | 
| 11 14 | 
             
                include Retweet
         | 
| 15 | 
            +
                include Favorite
         | 
| 12 16 | 
             
                include Reply
         | 
| 13 17 | 
             
                include Followers
         | 
| 14 18 | 
             
                include UI
         | 
    
        data/lib/chatterbot/client.rb
    CHANGED
    
    | @@ -6,39 +6,34 @@ module Chatterbot | |
| 6 6 | 
             
              # routines for connecting to Twitter and validating the bot
         | 
| 7 7 | 
             
              #
         | 
| 8 8 | 
             
              module Client
         | 
| 9 | 
            -
                attr_accessor :screen_name, :client, :search_client
         | 
| 9 | 
            +
                attr_accessor :screen_name, :client, :streaming_client, :search_client
         | 
| 10 10 |  | 
| 11 11 | 
             
                #
         | 
| 12 12 | 
             
                # the main interface to the Twitter API
         | 
| 13 13 | 
             
                #
         | 
| 14 14 | 
             
                def client
         | 
| 15 | 
            -
                  @client ||= Twitter::Client.new(
         | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
                                                  )
         | 
| 15 | 
            +
                  @client ||= Twitter::REST::Client.new(
         | 
| 16 | 
            +
                                                       :consumer_key => client_params[:consumer_key],
         | 
| 17 | 
            +
                                                       :consumer_secret => client_params[:consumer_secret],
         | 
| 18 | 
            +
                                                       :access_token => client_params[:token],
         | 
| 19 | 
            +
                                                       :access_token_secret => client_params[:secret]
         | 
| 20 | 
            +
                                                       )
         | 
| 22 21 | 
             
                end
         | 
| 23 22 |  | 
| 24 | 
            -
                 | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
                  # return client
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                  # @search_client ||= Twitter::Client.new(
         | 
| 34 | 
            -
                  #                                 :endpoint => base_url,
         | 
| 35 | 
            -
                  #                                 :consumer_key => client_params[:consumer_key],
         | 
| 36 | 
            -
                  #                                 :consumer_secret => client_params[:consumer_secret],
         | 
| 37 | 
            -
                  #                                 :oauth_token => client_params[:token],
         | 
| 38 | 
            -
                  #                                 :oauth_token_secret => client_params[:secret]
         | 
| 39 | 
            -
                  #                                 )
         | 
| 23 | 
            +
                def streaming_client
         | 
| 24 | 
            +
                  @streaming_client ||= Twitter::Streaming::Client.new(
         | 
| 25 | 
            +
                                                                       :consumer_key => client_params[:consumer_key],
         | 
| 26 | 
            +
                                                                       :consumer_secret => client_params[:consumer_secret],
         | 
| 27 | 
            +
                                                                       :access_token => client_params[:token],
         | 
| 28 | 
            +
                                                                       :access_token_secret => client_params[:secret]
         | 
| 29 | 
            +
                                                                       )
         | 
| 40 30 | 
             
                end
         | 
| 41 31 |  | 
| 32 | 
            +
                def reset!
         | 
| 33 | 
            +
                  config[:since_id] = 0
         | 
| 34 | 
            +
                  config[:since_id_reply] = 0
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                
         | 
| 42 37 | 
             
                #
         | 
| 43 38 | 
             
                # reset the since_id for this bot to the highest since_id we can
         | 
| 44 39 | 
             
                # get, by running a really open search and updating config with
         | 
| @@ -55,7 +50,7 @@ module Chatterbot | |
| 55 50 | 
             
                #
         | 
| 56 51 | 
             
                def reset_since_id_reply
         | 
| 57 52 | 
             
                  config[:tmp_since_id_reply] = 0
         | 
| 58 | 
            -
                  result = client. | 
| 53 | 
            +
                  result = client.mentions_timeline.max_by(&:id)
         | 
| 59 54 | 
             
                  update_since_id_reply(result)
         | 
| 60 55 | 
             
                end
         | 
| 61 56 |  | 
| @@ -179,7 +174,7 @@ module Chatterbot | |
| 179 174 |  | 
| 180 175 | 
             
                    rescue OAuth::Unauthorized => e
         | 
| 181 176 | 
             
                      display_oauth_error
         | 
| 182 | 
            -
                       | 
| 177 | 
            +
                      warn e.inspect
         | 
| 183 178 | 
             
                      return false
         | 
| 184 179 | 
             
                    end
         | 
| 185 180 | 
             
                  end
         | 
    
        data/lib/chatterbot/config.rb
    CHANGED
    
    | @@ -4,7 +4,9 @@ module Chatterbot | |
| 4 4 | 
             
              # routines for storing config information for the bot
         | 
| 5 5 | 
             
              module Config  
         | 
| 6 6 | 
             
                attr_accessor :config
         | 
| 7 | 
            -
             | 
| 7 | 
            +
             | 
| 8 | 
            +
                MAX_TWEET_ID = 9223372036854775807
         | 
| 9 | 
            +
             | 
| 8 10 | 
             
                #
         | 
| 9 11 | 
             
                # the entire config for the bot, loaded from YAML files and the DB if applicable
         | 
| 10 12 | 
             
                def config
         | 
| @@ -75,7 +77,7 @@ module Chatterbot | |
| 75 77 | 
             
                def verbose?
         | 
| 76 78 | 
             
                  config[:verbose] || false
         | 
| 77 79 | 
             
                end
         | 
| 78 | 
            -
             | 
| 80 | 
            +
               
         | 
| 79 81 | 
             
                #
         | 
| 80 82 | 
             
                # destination for log entries
         | 
| 81 83 | 
             
                def log_dest
         | 
| @@ -127,7 +129,10 @@ module Chatterbot | |
| 127 129 | 
             
                end
         | 
| 128 130 |  | 
| 129 131 | 
             
                def max_id_from(s)
         | 
| 130 | 
            -
                   | 
| 132 | 
            +
                  # don't use max_id if it's this ridiculous number
         | 
| 133 | 
            +
                  # @see https://dev.twitter.com/issues/1300
         | 
| 134 | 
            +
                  sorted = s.reject { |t| !t || t.id == MAX_TWEET_ID }.max { |a, b| a.id <=> b.id }
         | 
| 135 | 
            +
                  sorted && sorted.id
         | 
| 131 136 | 
             
                end
         | 
| 132 137 |  | 
| 133 138 | 
             
                #
         | 
| @@ -135,7 +140,7 @@ module Chatterbot | |
| 135 140 | 
             
                # unless it is lower thant what we have already
         | 
| 136 141 | 
             
                #
         | 
| 137 142 | 
             
                def update_since_id_reply(tweet)
         | 
| 138 | 
            -
                  return if tweet.nil? or tweet.class != Twitter::Tweet
         | 
| 143 | 
            +
                  return if tweet.nil? or tweet.class != Twitter::Tweet || tweet.id == MAX_TWEET_ID
         | 
| 139 144 |  | 
| 140 145 | 
             
                  tmp_id = tweet.id
         | 
| 141 146 |  | 
| @@ -147,29 +152,17 @@ module Chatterbot | |
| 147 152 | 
             
                # tweets, unless it is lower than what we have already
         | 
| 148 153 | 
             
                def update_since_id(search)
         | 
| 149 154 | 
             
                  return if search.nil?
         | 
| 150 | 
            -
             | 
| 151 | 
            -
                  
         | 
| 152 | 
            -
             | 
| 153 | 
            -
                            | 
| 154 | 
            -
                              | 
| 155 | 
            -
             | 
| 156 | 
            -
                              | 
| 157 | 
            -
             | 
| 158 | 
            -
                              | 
| 159 | 
            -
                               max_id_from(search)
         | 
| 160 | 
            -
                             end
         | 
| 161 | 
            -
             | 
| 162 | 
            -
                             # incoming tweets
         | 
| 163 | 
            -
                           when Twitter::Tweet then search.id
         | 
| 164 | 
            -
             | 
| 165 | 
            -
                             # an enumeration
         | 
| 166 | 
            -
                           when Array then max_id_from(search)
         | 
| 167 | 
            -
                             
         | 
| 168 | 
            -
                             # probably an actual tweet ID at this point,
         | 
| 169 | 
            -
                             # otherwise it will fail and return 0
         | 
| 170 | 
            -
                           else search
         | 
| 155 | 
            +
                 
         | 
| 156 | 
            +
                  tmp_id = if search.is_a?(Twitter::SearchResults)
         | 
| 157 | 
            +
                             search.attrs[:search_metadata][:max_id]
         | 
| 158 | 
            +
                           elsif search.respond_to?(:max)
         | 
| 159 | 
            +
                             max_id_from(search)
         | 
| 160 | 
            +
                           elsif search.is_a?(Twitter::Tweet)
         | 
| 161 | 
            +
                             search.id
         | 
| 162 | 
            +
                           else
         | 
| 163 | 
            +
                             search
         | 
| 171 164 | 
             
                           end.to_i
         | 
| 172 | 
            -
             | 
| 165 | 
            +
                  
         | 
| 173 166 | 
             
                  config[:tmp_since_id] = [config[:tmp_since_id].to_i, tmp_id].max
         | 
| 174 167 | 
             
                end
         | 
| 175 168 |  | 
| @@ -200,7 +193,7 @@ module Chatterbot | |
| 200 193 | 
             
                # determine if we're being called by one of our internal scripts
         | 
| 201 194 | 
             
                #
         | 
| 202 195 | 
             
                def chatterbot_helper?
         | 
| 203 | 
            -
                   | 
| 196 | 
            +
                  Chatterbot::from_helper == true
         | 
| 204 197 | 
             
                end
         | 
| 205 198 |  | 
| 206 199 | 
             
                #
         | 
| @@ -221,7 +214,6 @@ module Chatterbot | |
| 221 214 | 
             
                # figure out what config file to load based on the name of the bot
         | 
| 222 215 | 
             
                def config_file
         | 
| 223 216 | 
             
                  dest = working_dir
         | 
| 224 | 
            -
             | 
| 225 217 | 
             
                  x = File.join(File.expand_path(dest), "#{botname}.yml")
         | 
| 226 218 | 
             
                end
         | 
| 227 219 |  | 
| @@ -268,7 +260,12 @@ module Chatterbot | |
| 268 260 | 
             
                #
         | 
| 269 261 | 
             
                # bot-specific config settings
         | 
| 270 262 | 
             
                def bot_config
         | 
| 271 | 
            -
                   | 
| 263 | 
            +
                  {
         | 
| 264 | 
            +
                    :consumer_key => ENV["chatterbot_consumer_key"],
         | 
| 265 | 
            +
                    :consumer_secret => ENV["chatterbot_consumer_secret"],
         | 
| 266 | 
            +
                    :token => ENV["chatterbot_token"],
         | 
| 267 | 
            +
                    :secret => ENV["chatterbot_secret"]
         | 
| 268 | 
            +
                  }.merge(slurp_file(config_file) || {})
         | 
| 272 269 | 
             
                end
         | 
| 273 270 |  | 
| 274 271 | 
             
                #
         | 
| @@ -299,7 +296,6 @@ module Chatterbot | |
| 299 296 | 
             
                  tmp
         | 
| 300 297 | 
             
                end
         | 
| 301 298 |  | 
| 302 | 
            -
                
         | 
| 303 299 | 
             
                #
         | 
| 304 300 | 
             
                # load in the config from the assortment of places it can be specified.
         | 
| 305 301 | 
             
                def load_config(params={})
         | 
    
        data/lib/chatterbot/db.rb
    CHANGED
    
    
    
        data/lib/chatterbot/dsl.rb
    CHANGED
    
    | @@ -5,6 +5,8 @@ module Chatterbot | |
| 5 5 | 
             
              #
         | 
| 6 6 | 
             
              # very basic DSL to handle the common stuff you would want to do with a bot.
         | 
| 7 7 | 
             
              module DSL
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # @return initialized Twitter::REST::Client
         | 
| 8 10 | 
             
                def client
         | 
| 9 11 | 
             
                  bot.client
         | 
| 10 12 | 
             
                end
         | 
| @@ -14,7 +16,7 @@ module Chatterbot | |
| 14 16 | 
             
                # the block.
         | 
| 15 17 | 
             
                # @example
         | 
| 16 18 | 
             
                #   search("chatterbot is cool!") do |tweet|
         | 
| 17 | 
            -
                #     puts tweet | 
| 19 | 
            +
                #     puts tweet.text # this is the actual tweeted text
         | 
| 18 20 | 
             
                #     reply "I agree!", tweet
         | 
| 19 21 | 
             
                #   end
         | 
| 20 22 | 
             
                def search(query, opts = {}, &block)
         | 
| @@ -27,13 +29,28 @@ module Chatterbot | |
| 27 29 | 
             
                #
         | 
| 28 30 | 
             
                # @example
         | 
| 29 31 | 
             
                #   replies do |tweet|
         | 
| 30 | 
            -
                #     puts tweet | 
| 32 | 
            +
                #     puts tweet.text # this is the actual tweeted text
         | 
| 31 33 | 
             
                #     reply "Thanks for the mention!", tweet
         | 
| 32 34 | 
             
                #   end
         | 
| 33 35 | 
             
                def replies(&block)
         | 
| 34 36 | 
             
                  bot.replies(&block)
         | 
| 35 37 | 
             
                end
         | 
| 36 38 |  | 
| 39 | 
            +
                def streaming(opts = {}, &block)
         | 
| 40 | 
            +
                  params = {
         | 
| 41 | 
            +
                    :endpoint => :user
         | 
| 42 | 
            +
                  }.merge(opts)
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  h = StreamingHandler.new(bot, params)
         | 
| 45 | 
            +
                  h.apply block
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  bot.do_streaming(h)
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
                
         | 
| 50 | 
            +
                def streaming_tweets(opts={}, &block)
         | 
| 51 | 
            +
                  bot.streaming_tweets(opts, &block)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
                
         | 
| 37 54 | 
             
                #
         | 
| 38 55 | 
             
                # send a tweet
         | 
| 39 56 | 
             
                #
         | 
| @@ -48,11 +65,19 @@ module Chatterbot | |
| 48 65 |  | 
| 49 66 | 
             
                #
         | 
| 50 67 | 
             
                # retweet a tweet
         | 
| 51 | 
            -
                # @param [id] id the ID of  | 
| 68 | 
            +
                # @param [id] id A tweet or the ID of a tweet
         | 
| 52 69 | 
             
                def retweet(id)
         | 
| 53 70 | 
             
                  bot.retweet(id)
         | 
| 54 71 | 
             
                end
         | 
| 55 72 |  | 
| 73 | 
            +
             | 
| 74 | 
            +
                #
         | 
| 75 | 
            +
                # favorite a tweet
         | 
| 76 | 
            +
                # @param [id] id A tweet or the ID of a tweet
         | 
| 77 | 
            +
                def favorite(id)
         | 
| 78 | 
            +
                  bot.favorite(id)
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
                
         | 
| 56 81 | 
             
                #
         | 
| 57 82 | 
             
                # reply to a tweet
         | 
| 58 83 | 
             
                #
         | 
| @@ -62,18 +87,37 @@ module Chatterbot | |
| 62 87 | 
             
                  bot.reply(txt, source)
         | 
| 63 88 | 
             
                end
         | 
| 64 89 |  | 
| 90 | 
            +
                def profile_text(p=nil)
         | 
| 91 | 
            +
                  if p.nil?
         | 
| 92 | 
            +
                    bot.profile_text
         | 
| 93 | 
            +
                  else
         | 
| 94 | 
            +
                    bot.profile_text(p)
         | 
| 95 | 
            +
                  end
         | 
| 96 | 
            +
                end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                def profile_website(w=nil)
         | 
| 99 | 
            +
                  if w.nil?
         | 
| 100 | 
            +
                    bot.profile_website
         | 
| 101 | 
            +
                  else
         | 
| 102 | 
            +
                    bot.profile_website(w)
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
                
         | 
| 65 106 |  | 
| 66 107 | 
             
                #
         | 
| 67 108 | 
             
                # generate a Bot object. if the DSL is being called from a Bot object, just return it
         | 
| 68 109 | 
             
                # otherwise create a bot and return that
         | 
| 69 110 | 
             
                def bot
         | 
| 111 | 
            +
                  puts @bot.inspect
         | 
| 70 112 | 
             
                  return @bot unless @bot.nil?
         | 
| 71 113 |  | 
| 114 | 
            +
                  
         | 
| 72 115 | 
             
                  #
         | 
| 73 116 | 
             
                  # parse any command-line options and use them to initialize the bot
         | 
| 74 117 | 
             
                  #
         | 
| 75 118 | 
             
                  params = {}
         | 
| 76 119 |  | 
| 120 | 
            +
                  #:nocov:
         | 
| 77 121 | 
             
                  opts = OptionParser.new
         | 
| 78 122 |  | 
| 79 123 | 
             
                  opts.banner = "Usage: #{File.basename($0)} [options]"
         | 
| @@ -81,6 +125,7 @@ module Chatterbot | |
| 81 125 | 
             
                  opts.separator ""
         | 
| 82 126 | 
             
                  opts.separator "Specific options:"
         | 
| 83 127 |  | 
| 128 | 
            +
             | 
| 84 129 | 
             
                  opts.on('-d', '--db [ARG]', "Specify a DB connection URI")    { |d| ENV["chatterbot_db"] = d }
         | 
| 85 130 | 
             
                  opts.on('-c', '--config [ARG]', "Specify a config file to use")    { |c| ENV["chatterbot_config"] = c }
         | 
| 86 131 | 
             
                  opts.on('-t', '--test', "Run the bot without actually sending any tweets") { params[:debug_mode] = true }
         | 
| @@ -92,15 +137,47 @@ module Chatterbot | |
| 92 137 | 
             
                    params[:debug_mode] = true
         | 
| 93 138 | 
             
                    params[:reset_since_id] = true
         | 
| 94 139 | 
             
                  }
         | 
| 140 | 
            +
                  opts.on('--profile [ARG]', "get/set your bot's profile text") { |p| 
         | 
| 141 | 
            +
                    @handle_profile_text = true
         | 
| 142 | 
            +
                    @profile_text = p
         | 
| 143 | 
            +
                  }
         | 
| 144 | 
            +
                  opts.on('--website [ARG]', "get/set your bot's profile URL") { |u| 
         | 
| 145 | 
            +
                    @handle_profile_website = true
         | 
| 146 | 
            +
                    @profile_website = u
         | 
| 147 | 
            +
                  }
         | 
| 95 148 |  | 
| 149 | 
            +
                  
         | 
| 96 150 | 
             
                  opts.on_tail("-h", "--help", "Show this message") do
         | 
| 97 151 | 
             
                    puts opts
         | 
| 98 152 | 
             
                    exit
         | 
| 99 153 | 
             
                  end
         | 
| 100 154 |  | 
| 101 155 | 
             
                  opts.parse!(ARGV)
         | 
| 156 | 
            +
                  #:nocov:
         | 
| 102 157 |  | 
| 103 158 | 
             
                  @bot = Chatterbot::Bot.new(params)
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                  if @handle_profile_text == true
         | 
| 161 | 
            +
                    if !@profile_text.nil?
         | 
| 162 | 
            +
                      @bot.profile_text @profile_text
         | 
| 163 | 
            +
                    else
         | 
| 164 | 
            +
                      puts @bot.profile_text
         | 
| 165 | 
            +
                    end
         | 
| 166 | 
            +
                  end
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                  if @handle_profile_website == true
         | 
| 169 | 
            +
                    if !@profile_website.nil?
         | 
| 170 | 
            +
                      @bot.profile_website @profile_website
         | 
| 171 | 
            +
                    else
         | 
| 172 | 
            +
                      puts @bot.profile_website
         | 
| 173 | 
            +
                    end
         | 
| 174 | 
            +
                  end
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                  if @handle_profile_website == true || @handle_profile_text == true
         | 
| 177 | 
            +
                    exit
         | 
| 178 | 
            +
                  end
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                  @bot
         | 
| 104 181 | 
             
                end
         | 
| 105 182 |  | 
| 106 183 | 
             
                #
         | 
| @@ -157,6 +234,26 @@ module Chatterbot | |
| 157 234 | 
             
                def followers(opts={})
         | 
| 158 235 | 
             
                  bot.followers(opts)
         | 
| 159 236 | 
             
                end
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                #
         | 
| 239 | 
            +
                # follow a user
         | 
| 240 | 
            +
                #
         | 
| 241 | 
            +
                # @param u a Twitter::User or user id
         | 
| 242 | 
            +
                def follow(u)
         | 
| 243 | 
            +
                  bot.follow(u)
         | 
| 244 | 
            +
                end
         | 
| 245 | 
            +
             | 
| 246 | 
            +
                
         | 
| 247 | 
            +
                #
         | 
| 248 | 
            +
                # a common list of bad words, which you might want to filter out.
         | 
| 249 | 
            +
                # lifted from https://github.com/dariusk/wordfilter/blob/master/lib/badwords.json
         | 
| 250 | 
            +
                #
         | 
| 251 | 
            +
                def bad_words
         | 
| 252 | 
            +
                  ["skank", "wetback", "bitch", "cunt", "dick", "douchebag", "dyke", "fag", "nigger", "tranny", "trannies",
         | 
| 253 | 
            +
                   "paki", "pussy", "retard", "slut", "titt", "tits", "wop", "whore", "chink", "fatass", "shemale", "daygo",
         | 
| 254 | 
            +
                   "dego", "dago", "gook", "kike", "kraut", "spic", "twat", "lesbo", "homo", "fatso", "lardass", "jap",
         | 
| 255 | 
            +
                   "biatch", "tard", "gimp", "gyp", "chinaman", "chinamen", "golliwog", "crip", "raghead" ]     
         | 
| 256 | 
            +
                end
         | 
| 160 257 |  | 
| 161 258 | 
             
                #
         | 
| 162 259 | 
             
                # specify list of strings we will check when deciding to respond
         | 
| @@ -187,25 +284,42 @@ module Chatterbot | |
| 187 284 | 
             
                  bot.config[:since_id]
         | 
| 188 285 | 
             
                end
         | 
| 189 286 |  | 
| 287 | 
            +
                #
         | 
| 288 | 
            +
                # set the consumer secret
         | 
| 289 | 
            +
                # @param s [String] the consumer secret
         | 
| 190 290 | 
             
                def consumer_secret(s)
         | 
| 191 291 | 
             
                  bot.config[:consumer_secret] = s
         | 
| 192 292 | 
             
                end
         | 
| 193 293 |  | 
| 294 | 
            +
                #
         | 
| 295 | 
            +
                # set the consumer key
         | 
| 296 | 
            +
                # @param k [String] the consumer key
         | 
| 194 297 | 
             
                def consumer_key(k)
         | 
| 195 298 | 
             
                  bot.config[:consumer_key] = k
         | 
| 196 299 | 
             
                end
         | 
| 197 300 |  | 
| 301 | 
            +
                #
         | 
| 302 | 
            +
                # set the secret
         | 
| 303 | 
            +
                # @param s [String] the secret
         | 
| 198 304 | 
             
                def secret(s)
         | 
| 199 305 | 
             
                  bot.config[:secret] = s
         | 
| 200 306 | 
             
                end
         | 
| 307 | 
            +
             | 
| 308 | 
            +
                #
         | 
| 309 | 
            +
                # set the token
         | 
| 310 | 
            +
                # @param s [String] the token
         | 
| 201 311 | 
             
                def token(s)
         | 
| 202 312 | 
             
                  bot.config[:token] = s
         | 
| 203 313 | 
             
                end
         | 
| 204 314 |  | 
| 315 | 
            +
                #
         | 
| 316 | 
            +
                # get the id of the last tweet the bot replied to
         | 
| 317 | 
            +
                # @return tweet id
         | 
| 205 318 | 
             
                def since_id_reply
         | 
| 206 319 | 
             
                  bot.config[:since_id_reply]
         | 
| 207 320 | 
             
                end
         | 
| 208 321 |  | 
| 322 | 
            +
                
         | 
| 209 323 | 
             
                #
         | 
| 210 324 | 
             
                # explicitly save the configuration/state of the bot.
         | 
| 211 325 | 
             
                #
         |