X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fircbot.rb;h=87d4f3eb40edfcb702941b809380afb2919395b2;hb=4a86158144a13bc901222442ccd2db9c2bbd6bb0;hp=3ef58a38c2fdf440eb08dd3686d410254367f3fd;hpb=5e1fd84bcf6524b10f02caf00de1968452d72523;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/ircbot.rb b/lib/rbot/ircbot.rb index 3ef58a38..87d4f3eb 100644 --- a/lib/rbot/ircbot.rb +++ b/lib/rbot/ircbot.rb @@ -10,7 +10,7 @@ $daemonize = false unless $daemonize $dateformat = "%Y/%m/%d %H:%M:%S" $logger = Logger.new($stderr) $logger.datetime_format = $dateformat -$logger.level = $cl_loglevel if $cl_loglevel +$logger.level = $cl_loglevel if defined? $cl_loglevel $logger.level = 0 if $debug require 'pp' @@ -92,6 +92,7 @@ $interrupted = 0 # these first require 'rbot/rbotconfig' +require 'rbot/load-gettext' require 'rbot/config' # require 'rbot/utils' @@ -217,7 +218,7 @@ class Bot :default => [], :wizard => true, :desc => "What channels the bot should always join at startup. List multiple channels using commas to separate. If a channel requires a password, use a space after the channel name. e.g: '#chan1, #chan2, #secretchan secritpass, #chan3'") BotConfig.register BotConfigArrayValue.new('irc.ignore_users', - :default => [], + :default => [], :desc => "Which users to ignore input from. This is mainly to avoid bot-wars triggered by creative people") BotConfig.register BotConfigIntegerValue.new('core.save_every', @@ -384,7 +385,7 @@ class Bot end # See http://blog.humlab.umu.se/samuel/archives/000107.html - # for the backgrounding code + # for the backgrounding code if $daemonize begin exit if fork @@ -424,11 +425,15 @@ class Bot $logger = Logger.new(@logfile, @config['log.keep'], @config['log.max_size']*1024*1024) $logger.datetime_format= $dateformat $logger.level = @config['log.level'] - $logger.level = $cl_loglevel if $cl_loglevel + $logger.level = $cl_loglevel if defined? $cl_loglevel $logger.level = 0 if $debug log_session_start + File.open($opts['pidfile'] || "#{@botclass}/rbot.pid", 'w') do |pf| + pf << "#{$$}\n" + end + @registry = BotRegistry.new self @timer = Timer::Timer.new(1.0) # only need per-second granularity @@ -551,7 +556,7 @@ class Bot } } @client[:nicktaken] = proc { |data| - new = "#{data[:nick]}_" + new = "#{data[:nick]}_" nickchg new # If we're setting our nick at connection because our choice was taken, # we have to fix our nick manually, because there will be no NICK message @@ -563,7 +568,7 @@ class Bot @plugins.delegate "nicktaken", data[:nick] } @client[:badnick] = proc {|data| - arning "bad nick (#{data[:nick]})" + warning "bad nick (#{data[:nick]})" } @client[:ping] = proc {|data| sendq "PONG #{data[:pingid]}" @@ -606,6 +611,7 @@ class Bot @plugins.delegate("listen", m) @plugins.delegate("join", m) + sendq "WHO #{data[:channel]}", data[:channel], 2 } @client[:part] = proc {|data| m = PartMessage.new(self, server, data[:source], data[:channel], data[:message]) @@ -749,7 +755,7 @@ class Bot quit if $interrupted > 0 realname = @config['irc.name'].clone || 'Ruby bot' - realname << ' ' + COPYRIGHT_NOTICE if @config['irc.name_copyright'] + realname << ' ' + COPYRIGHT_NOTICE if @config['irc.name_copyright'] @socket.emergency_puts "PASS " + @config['server.password'] if @config['server.password'] @socket.emergency_puts "NICK #{@config['irc.nick']}\nUSER #{@config['irc.user']} 4 #{@socket.server_uri.host} :#{realname}" @@ -1006,8 +1012,8 @@ class Bot sendq "TOPIC #{where} :#{topic}", where, 2 end - def disconnect(message = nil) - message = @lang.get("quit") if (message.nil? || message.empty?) + def disconnect(message=nil) + message = @lang.get("quit") if (!message || message.empty?) if @socket.connected? debug "Clearing socket" @socket.clearq @@ -1027,9 +1033,9 @@ class Bot end # disconnect from the server and cleanup all plugins and modules - def shutdown(message = nil) + def shutdown(message=nil) @quit_mutex.synchronize do - debug "Shutting down ..." + debug "Shutting down: #{message}" ## No we don't restore them ... let everything run through # begin # trap("SIGINT", "DEFAULT") @@ -1038,16 +1044,19 @@ class Bot # rescue => e # debug "failed to restore signals: #{e.inspect}\nProbably running on windows?" # end - disconnect - debug "Saving" + debug "\tdisconnecting..." + disconnect(message) + debug "\tsaving ..." save - debug "Cleaning up" + debug "\tcleaning up ..." @save_mutex.synchronize do @plugins.cleanup end + debug "\tstopping timers ..." + @timer.stop # debug "Closing registries" # @registry.close - debug "Cleaning up the db environment" + debug "\t\tcleaning up the db environment ..." DBTree.cleanup_env log "rbot quit (#{message})" end @@ -1064,9 +1073,9 @@ class Bot end # totally shutdown and respawn the bot - def restart(message = false) - msg = message ? message : "restarting, back in #{@config['server.reconnect_wait']}..." - shutdown(msg) + def restart(message=nil) + message = "restarting, back in #{@config['server.reconnect_wait']}..." if (!message || message.empty?) + shutdown(message) sleep @config['server.reconnect_wait'] begin # now we re-exec @@ -1074,6 +1083,8 @@ class Bot debug "going to exec #{$0} #{@argv.inspect} from #{@run_dir}" Dir.chdir(@run_dir) exec($0, *@argv) + rescue Errno::ENOENT + exec("ruby", *(@argv.unshift $0)) rescue Exception => e $interrupted += 1 raise e @@ -1134,12 +1145,12 @@ class Bot topic = nil if topic == "" case topic when nil - helpstr = "help topics: " + helpstr = _("help topics: ") helpstr += @plugins.helptopics - helpstr += " (help for more info)" + helpstr += _(" (help for more info)") else unless(helpstr = @plugins.help(topic)) - helpstr = "no help for topic #{topic}" + helpstr = _("no help for topic %{topic}") % { :topic => topic } end end return helpstr @@ -1150,7 +1161,11 @@ class Bot secs_up = Time.new - @startup_time uptime = Utils.secs_to_string secs_up # return "Uptime #{uptime}, #{@plugins.length} plugins active, #{@registry.length} items stored in registry, #{@socket.lines_sent} lines sent, #{@socket.lines_received} received." - return "Uptime #{uptime}, #{@plugins.length} plugins active, #{@socket.lines_sent} lines sent, #{@socket.lines_received} received." + return (_("Uptime %{up}, %{plug} plugins active, %{sent} lines sent, %{recv} received.") % + { + :up => uptime, :plug => @plugins.length, + :sent => @socket.lines_sent, :recv => @socket.lines_received + }) end # We want to respond to a hung server in a timely manner. If nothing was received