lib/lita/robot.rb in lita-1.1.2 vs lib/lita/robot.rb in lita-2.0.0
- old
+ new
@@ -1,49 +1,104 @@
module Lita
+ # The main object representing a running instance of Lita. Provides a high
+ # level API for the underlying adapter. Dispatches incoming messages to
+ # registered handlers. Can send outgoing chat messages and set the topic
+ # of chat rooms.
class Robot
- attr_reader :name
+ # A +Rack+ application used for the built-in web server.
+ # @return [Rack::Builder] The +Rack+ app.
+ attr_reader :app
+
+ # The name the robot will look for in incoming messages to determine if it's
+ # being addressed.
+ # @return [String] The mention name.
attr_accessor :mention_name
+ # The name of the robot as it will appear in the chat.
+ # @return [String] The robot's name.
+ attr_reader :name
+
def initialize
@name = Lita.config.robot.name
@mention_name = Lita.config.robot.mention_name || @name
+ @app = RackAppBuilder.new(self).to_app
load_adapter
end
+ # The primary entry point from the adapter for an incoming message.
+ # Dispatches the message to all registered handlers.
+ # @param message [Lita::Message] The incoming message.
+ # @return [void]
def receive(message)
Lita.handlers.each { |handler| handler.dispatch(self, message) }
end
+ # Starts the robot, booting the web server and delegating to the adapter to
+ # connect to the chat service.
+ # @return [void]
def run
+ run_app
@adapter.run
rescue Interrupt
shut_down
end
+ # Sends one or more messages to a user or room.
+ # @param target [Lita::Source] The user or room to send to. If the Source
+ # has a room, it will choose the room. Otherwise, it will send to the
+ # user.
+ # @param strings [String, Array<String>] One or more strings to send.
+ # @return [void]
def send_messages(target, *strings)
@adapter.send_messages(target, strings.flatten)
end
alias_method :send_message, :send_messages
+ # Sets the topic for a chat room.
+ # @param target [Lita::Source] A source object specifying the room.
+ # @param topic [String] The new topic message to set.
+ # @return [void]
def set_topic(target, topic)
@adapter.set_topic(target, topic)
end
+ # Gracefully shuts the robot down, stopping the web server and delegating
+ # to the adapter to perform any shut down tasks necessary for the chat
+ # service.
+ # @return [void]
def shut_down
+ @server.stop if @server
+ @server_thread.join if @server_thread
@adapter.shut_down
end
private
+ # Loads the selected adapter.
def load_adapter
adapter_name = Lita.config.robot.adapter
adapter_class = Lita.adapters[adapter_name.to_sym]
unless adapter_class
Lita.logger.fatal("Unknown adapter: :#{adapter_name}.")
abort
end
@adapter = adapter_class.new(self)
+ end
+
+ # Starts the web server.
+ def run_app
+ @server_thread = Thread.new do
+ @server = Thin::Server.new(
+ app,
+ Lita.config.http.port.to_i,
+ signals: false
+ )
+ @server.silent = true unless Lita.config.http.debug
+ @server.start
+ end
+
+ @server_thread.abort_on_exception = true
end
end
end