lib/marvin/irc/client.rb in jeffrafter-marvin-0.1.20081115 vs lib/marvin/irc/client.rb in jeffrafter-marvin-0.1.20081120
- old
+ new
@@ -43,56 +43,88 @@
# ==== Adding handlers
# To add an object as a handler, you simply call
# the class method, register_handler with the
# handler as the only argument.
class Client < Marvin::AbstractClient
+ cattr_accessor :stopped
attr_accessor :em_connection
class EMConnection < EventMachine::Protocols::LineAndTextProtocol
- attr_accessor :client
+ attr_accessor :client, :server, :port
- def initialize
- super
- self.client = Marvin::IRC::Client.new
+ def initialize(*args)
+ opts = args.extract_options!
+ super(*args)
+ self.client = Marvin::IRC::Client.new(opts)
self.client.em_connection = self
end
def post_init
client.process_connect
+ super
end
def unbind
client.process_disconnect
+ super
end
def receive_line(line)
+ Marvin::Logger.debug "<< #{line.strip}"
self.client.receive_line(line)
end
end
def send_line(*args)
+ args.each { |line| Marvin::Logger.debug ">> #{line.strip}" }
em_connection.send_data *args
end
## Client specific details
# Starts the EventMachine loop and hence starts up the actual
# networking portion of the IRC Client.
def self.run
self.setup # So we have options etc
- EventMachine::run do
- logger.debug "Connecting to #{self.configuration.server}:#{self.configuration.port}"
- EventMachine::connect self.configuration.server, self.configuration.port, Marvin::IRC::Client::EMConnection
+ settings = YAML.load_file(Marvin::Settings.root / "config/connections.yml")
+ if settings.is_a?(Hash)
+ EventMachine.epoll
+ EventMachine::run do
+ settings.each do |name, options|
+ settings = options.symbolize_keys!
+ settings[:server] ||= name
+ settings.reverse_merge!(:port => 6667, :channels => [])
+ connect settings
+ end
+ end
+ else
+ logger.fatal "config/connections.yml couldn't be loaded. Exiting"
end
end
+ def self.connect(opts = {})
+ logger.info "Connecting to #{opts[:server]}:#{opts[:port]} - Channels: #{opts[:channels].join(", ")}"
+ EventMachine::connect(opts[:server], opts[:port], EMConnection, opts)
+ logger.info "Connection created for #{opts[:server]}:#{opts[:port]}"
+ end
+
def self.stop
+ return if self.stopped
logger.debug "Telling all connections to quit"
self.connections.dup.each { |connection| connection.quit }
logger.debug "Telling Event Machine to Stop"
EventMachine::stop_event_loop
logger.debug "Stopped."
+ self.stopped = true
+ end
+
+ def self.add_reconnect(opts = {})
+ Marvin::Logger.warn "Adding entry to reconnect to #{opts[:server]}:#{opts[:port]} in 15 seconds"
+ EventMachine::add_timer(15) do
+ Marvin::Logger.warn "Attempting to reconnect to #{opts[:server]}:#{opts[:port]}"
+ Marvin::IRC::Client.connect(opts)
+ end
end
# Registers a callback handle that will be periodically run.
def periodically(timing, event_callback)
callback = proc { self.dispatch event_callback.to_sym }
\ No newline at end of file