lib/chatterbot/bot.rb in chatterbot-1.0.2 vs lib/chatterbot/bot.rb in chatterbot-2.0.0.pre
- old
+ new
@@ -1,48 +1,153 @@
module Chatterbot
+ require 'chatterbot/handler'
#
# primary Bot object, includes all the other modules
class Bot
include Utils
- include Blacklist
- include Whitelist
include Streaming
+ include Blocklist
+ include Safelist
include Config
include Logging
include Search
+ include DirectMessages
include HomeTimeline
include Tweet
include Profile
include Retweet
include Favorite
include Reply
include Followers
include UI
include Client
- include DB
include Helpers
+ # handlers that can use the REST API
+ HANDLER_CALLS = [:direct_messages, :home_timeline, :replies, :search]
+
+ # handlers that require the Streaming API
+ STREAMING_ONLY_HANDLERS = [:favorited, :followed, :deleted]
+
#
# Create a new bot. No options for now.
def initialize(params={})
if params.has_key?(:name)
@botname = params.delete(:name)
end
@config = load_config(params)
+ @run_count = 0
- if reset_bot?
- reset_since_id
- update_config
- puts "Reset to #{@config[:since_id]}"
- exit
+ #
+ # check for command line options
+ # handle resets, etc
+ #
+
+ at_exit do
+ if !@handlers.empty? && @run_count <= 0 && skip_run? != true
+ run_or_stream
+ end
+
+ raise $! if $!
+ end
+ @handlers = {}
+ end
+
+ #
+ # determine the right API to use and run the bot
+ #
+ def run_or_stream
+ @run_count += 1
+ if streaming?
+ stream!
else
- # update config when we exit
- at_exit do
- raise $! if $!
- update_config_at_exit
- end
+ run!
end
+ end
+
+ #
+ # run the bot with the Streaming API
+ #
+ def stream!
+ before_run
+
+ #
+ # figure out how we want to call streaming client
+ #
+ if @handlers[:search]
+ method = :filter
+ args = streamify_search_options(@handlers[:search].opts)
+ else
+ method = :user
+ args = nil
+ end
+
+ streaming_client.send(method, args) do |object|
+ handle_streaming_object(object)
+ end
+ after_run
+ end
+
+ #
+ # the REST API and Streaming API have a slightly different format.
+ # tweak our search handler to switch from REST to Streaming
+ #
+ def streamify_search_options(opts)
+ if opts.is_a?(String)
+ { track: opts }
+ elsif opts.is_a?(Array)
+ { track: opts.join(", ") }
+ else
+ opts
+ end
+ end
+
+ #
+ # run the bot with the REST API
+ #
+ def run!
+ before_run
+
+ HANDLER_CALLS.each { |c|
+ if (h = @handlers[c])
+ puts "calling #{c} #{h.opts.inspect}"
+ send(c, *(h.opts)) do |obj|
+ h.call(obj)
+ end
+ end
+ }
+
+ after_run
+ end
+
+
+ def before_run
+ @run_count = @run_count + 1
+ end
+
+ def after_run
+
+ end
+
+ def call_api_immediately?
+ streaming?
+ end
+
+ def register_handler(method, opts = nil, &block)
+ # @todo raise error if method already defined
+ @handlers[method] = Handler.new(opts, &block)
+
+ if STREAMING_ONLY_HANDLERS.include?(method)
+ puts "Forcing usage of Streaming API to support #{method} calls"
+ self.streaming = true
+ elsif call_api_immediately?
+ h = @handlers[method]
+ send(method, *(h.opts)) do |obj|
+ h.call(obj)
+ end
+ end
+
end
end
end