X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fircbot.rb;h=389494af7911157f6708145a544b2683db6b5d06;hb=8115edef0169d95f0ebb64d77364e346e9452099;hp=f8dbc5013cae68321c4476bc3dfee6ab387ca617;hpb=63803e1e37871e1ff6323056fbbebe0cd13453e9;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/ircbot.rb b/lib/rbot/ircbot.rb index f8dbc501..389494af 100644 --- a/lib/rbot/ircbot.rb +++ b/lib/rbot/ircbot.rb @@ -306,6 +306,9 @@ class Bot Config.register Config::ArrayValue.new('irc.ignore_users', :default => [], :desc => "Which users to ignore input from. This is mainly to avoid bot-wars triggered by creative people") + Config.register Config::ArrayValue.new('irc.ignore_channels', + :default => [], + :desc => "Which channels to ignore input in. This is mainly to turn the bot into a logbot that doesn't interact with users in any way (in the specified channels)") Config.register Config::IntegerValue.new('core.save_every', :default => 60, :validate => Proc.new{|v| v >= 0}, @@ -450,7 +453,7 @@ class Bot missing = Dir.chdir(template) { Dir.glob('*/**') } - Dir.chdir(botclass) { Dir.glob('*/**') } missing.map do |f| dest = File.join(botclass, f) - FileUtils.mkdir_p File.dirname dest + FileUtils.mkdir_p(File.dirname dest) FileUtils.cp File.join(template, f), dest end else @@ -639,11 +642,18 @@ class Bot # debug "Message target is #{data[:target].inspect}" # debug "Bot is #{myself.inspect}" + @config['irc.ignore_channels'].each { |channel| + if m.target.downcase == channel.downcase + m.ignored = true + break + end + } @config['irc.ignore_users'].each { |mask| if m.source.matches?(server.new_netmask(mask)) m.ignored = true + break end - } + } unless m.ignored @plugins.irc_delegate('privmsg', m) } @@ -829,7 +839,8 @@ class Bot # things to do when we receive a signal def got_sig(sig, func=:quit) debug "received #{sig}, queueing #{func}" - $interrupted += 1 + # this is not an interruption if we just need to reconnect + $interrupted += 1 unless func == :reconnect self.send(func) unless @quit_mutex.locked? debug "interrupted #{$interrupted} times" if $interrupted >= 3 @@ -845,6 +856,7 @@ class Bot trap("SIGINT") { got_sig("SIGINT") } trap("SIGTERM") { got_sig("SIGTERM") } trap("SIGHUP") { got_sig("SIGHUP", :restart) } + trap("SIGUSR1") { got_sig("SIGUSR1", :reconnect) } rescue ArgumentError => e debug "failed to trap signals (#{e.pretty_inspect}): running on Windows?" rescue Exception => e @@ -857,6 +869,7 @@ class Bot begin quit if $interrupted > 0 @socket.connect + @last_rec = Time.now rescue => e raise e.class, "failed to connect to IRC server at #{@socket.server_uri}: " + e end @@ -872,15 +885,39 @@ class Bot myself.user = @config['irc.user'] end + # disconnect the bot from IRC, if connected, and then connect (again) + def reconnect(message=nil, too_fast=false) + # we will wait only if @last_rec was not nil, i.e. if we were connected or + # got disconnected by a network error + # if someone wants to manually call disconnect() _and_ reconnect(), they + # will have to take care of the waiting themselves + will_wait = !!@last_rec + + if @socket.connected? + disconnect(message) + end + + if will_wait + log "\n\nDisconnected\n\n" + + quit if $interrupted > 0 + + log "\n\nWaiting to reconnect\n\n" + sleep @config['server.reconnect_wait'] + sleep 10*@config['server.reconnect_wait'] if too_fast + end + + connect + end + # begin event handling loop def mainloop while true too_fast = false begin - quit if $interrupted > 0 - connect - quit_msg = nil + reconnect(quit_msg, too_fast) + quit if $interrupted > 0 while @socket.connected? quit if $interrupted > 0 @@ -910,6 +947,7 @@ class Bot # received an ERROR from the server quit_msg = "server ERROR: " + e.message too_fast = e.message.index("reconnect too fast") + retry rescue BDB::Fatal => e fatal "fatal bdb error: #{e.pretty_inspect}" DBTree.stats @@ -925,16 +963,6 @@ class Bot log_session_end exit 2 end - - disconnect(quit_msg) - - log "\n\nDisconnected\n\n" - - quit if $interrupted > 0 - - log "\n\nWaiting to reconnect\n\n" - sleep @config['server.reconnect_wait'] - sleep 10*@config['server.reconnect_wait'] if too_fast end end