$debug = false unless $debug
# print +message+ if debugging is enabled
def debug(message=nil)
- print "DEBUG: #{message}\n" if($debug && message)
+ stamp = Time.now.strftime("%Y/%m/%d %H:%M:%S")
+ print "D: [#{stamp}] #{message}\n" if($debug && message)
#yield
end
# bot's Language data
attr_reader :lang
- # bot's configured addressing prefixes
- attr_reader :addressing_prefixes
-
# channel info for channels the bot is in
attr_reader :channels
# connect the bot to IRC
def connect
begin
+ trap("SIGINT") { quit }
trap("SIGTERM") { quit }
trap("SIGHUP") { quit }
- trap("SIGINT") { quit }
rescue
debug "failed to trap signals, probably running on windows?"
end
begin
@socket.connect
- rescue => e
+ rescue => e
raise "failed to connect to IRC server at #{@config['server.name']} #{@config['server.port']}: " + e
end
@socket.puts "PASS " + @config['server.password'] if @config['server.password']
# begin event handling loop
def mainloop
while true
+ begin
connect
@timer.start
- begin
while true
if @socket.select
break unless reply = @socket.gets
# exceptions that ARENT SocketError's. How am I supposed to handle
# that?
#rescue TimeoutError, SocketError => e
+ rescue SystemExit
+ exit 0
rescue Exception => e
- puts "network exception: connection closed: #{e}"
+ puts "network exception: connection closed: #{e.inspect}"
puts e.backtrace.join("\n")
@socket.shutdown # now we reconnect
rescue => e
end
puts "disconnected"
+ @last_ping = nil
@channels.clear
@socket.clearq
# disconnect from the server and cleanup all plugins and modules
def shutdown(message = nil)
- trap("SIGTERM", "DEFAULT")
- trap("SIGHUP", "DEFAULT")
- trap("SIGINT", "DEFAULT")
+ begin
+ trap("SIGINT", "DEFAULT")
+ trap("SIGTERM", "DEFAULT")
+ trap("SIGHUP", "DEFAULT")
+ rescue
+ debug "failed to trap signals, probably running on windows?"
+ end
message = @lang.get("quit") if (message.nil? || message.empty?)
@socket.clearq
save
@channels.each_value {|v|
log "@ quit (#{message})", v.name
}
+ @registry.close
@socket.puts "QUIT :#{message}"
@socket.flush
@socket.shutdown
- @registry.close
puts "rbot quit (#{message})"
end
# message:: optional IRC quit message
# quit IRC, shutdown the bot
def quit(message=nil)
- shutdown(message)
- exit 0
+ begin
+ shutdown(message)
+ ensure
+ exit 0
+ end
end
# totally shutdown and respawn the bot
# we'll ping the server every 30 seconds or so, and expect a response
# before the next one come around..
def start_server_pings
+ @last_ping = nil
# stop existing timers if running
unless @ping_timer.nil?
@timer.remove @ping_timer
rescue
debug "couldn't shutdown connection (already shutdown?)"
end
+ @last_ping = nil
end
end
}