]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/rfc2812.rb
search: google calc can be in non-h2 headers
[user/henk/code/ruby/rbot.git] / lib / rbot / rfc2812.rb
index 800c012094b944c50eacb9204a58858e2437df4b..fb70619c200f60b415da8439e5e4d09904b1c8c5 100644 (file)
@@ -967,6 +967,9 @@ module Irc
       # This is used by some messages to build lists of users that
       # will be delegated when the ENDOF... message is received
       @tmpusers = []
+
+      # Same as above, just for bans
+      @tmpbans = []
     end
 
     # Clear the server and reset the user
@@ -1180,6 +1183,17 @@ module Irc
           data[:users] = @tmpusers
           handle(:names, data)
           @tmpusers = Array.new
+        when RPL_BANLIST
+          data[:channel] = @server.channel(argv[1])
+          data[:mask] = argv[2]
+          data[:by] = argv[3]
+          data[:at] = argv[4]
+          @tmpbans << data
+        when RPL_ENDOFBANLIST
+          data[:channel] = @server.channel(argv[1])
+          data[:bans] = @tmpbans
+          handle(:banlist, data)
+          @tmpbans = Array.new
         when RPL_LUSERCLIENT
           # ":There are <integer> users and <integer>
           # services on <integer> servers"
@@ -1317,7 +1331,7 @@ module Irc
         when RPL_WHOISCHANNELS
           @whois ||= Hash.new
           @whois[:nick] = argv[1]
-          @whois[:channels] = []
+          @whois[:channels] ||= []
           user = @server.user(@whois[:nick])
           argv[-1].split.each do |prechan|
             pfx = prechan.scan(/[#{@server.supports[:prefix][:prefixes].join}]/)
@@ -1344,17 +1358,19 @@ module Irc
           data[:channel].url=data[:url].dup
           handle(:channel_url, data)
         when ERR_NOSUCHNICK
-          data[:nick] = argv[1]
-          if user = @server.get_user(data[:nick])
+          data[:target] = argv[1]
+          data[:message] = argv[2]
+          handle(:nosuchtarget, data)
+          if user = @server.get_user(data[:target])
             @server.delete_user(user)
           end
-          handle(:nosuchnick, data)
         when ERR_NOSUCHCHANNEL
-          data[:channel] = argv[1]
-          if channel = @server.get_channel(data[:channel])
+          data[:target] = argv[1]
+          data[:message] = argv[2]
+          handle(:nosuchtarget, data)
+          if channel = @server.get_channel(data[:target])
             @server.delete_channel(channel)
           end
-          handle(:nosuchchannel, data)
         else
           warning "Unknown message #{serverstring.inspect}"
           handle(:unknown, data)
@@ -1474,6 +1490,9 @@ module Irc
       when :MODE
         parse_mode(serverstring, argv, data)
         handle(:mode, data)
+      when :ERROR
+        data[:message] = argv[1]
+        handle(:error, data)
       else
         warning "Unknown message #{serverstring.inspect}"
         handle(:unknown, data)
@@ -1531,7 +1550,7 @@ module Irc
             data[:modes].last << arg
           end
         }
-      else
+      when Channel
         # array of indices in data[:modes] where parameters
         # are needed
         who_wants_params = []
@@ -1584,6 +1603,10 @@ module Irc
             getting_args = true unless who_wants_params.empty?
           end
         end
+        unless who_wants_params.empty?
+          warning "Unhandled malformed modeline #{data[:modestring]} (unexpected empty arguments)"
+          return
+        end
 
         data[:modes].each { |mode|
           set, key, val = mode
@@ -1593,6 +1616,8 @@ module Irc
             data[:target].mode[key].send(set)
           end
         }
+      else
+        warning "Ignoring #{data[:modestring]} for unrecognized target #{argv[0]} (#{data[:target].inspect})"
       end
     end
   end