X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Frfc2812.rb;h=ee0d08d605d40781c40b0e3e656d4d82a0a68e43;hb=81e0b9c7405c3731f6df1e50f6b32a35c224dfa7;hp=d781c0f1f7e9bb0a805e081d4c5a5954e1cd4eb1;hpb=eebdc6973a6ab1089ed18c0ea02e72cd6e656120;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/rfc2812.rb b/lib/rbot/rfc2812.rb index d781c0f1..ee0d08d6 100644 --- a/lib/rbot/rfc2812.rb +++ b/lib/rbot/rfc2812.rb @@ -981,7 +981,6 @@ module Irc # # ==server events currently supported: # - # TODO handle errors ERR_NOSUCHNICK, ERR_NOSUCHCHANNEL # TODO handle errors ERR_CHANOPRIVSNEEDED, ERR_CANNOTSENDTOCHAN # # welcome:: server welcome message on connect @@ -1153,13 +1152,7 @@ module Irc # - "@" is used for secret channels, "*" for private # channels, and "=" for others (public channels). data[:channeltype] = argv[1] - data[:channel] = argv[2] - - chan = @server.get_channel(data[:channel]) - unless chan - warning "Received names #{data[:topic].inspect} for channel #{data[:channel].inspect} I was not on" - return - end + data[:channel] = chan = @server.channel(argv[2]) users = [] argv[3].scan(/\S+/).each { |u| @@ -1183,7 +1176,7 @@ module Irc } @tmpusers += users when RPL_ENDOFNAMES - data[:channel] = argv[1] + data[:channel] = @server.channel(argv[1]) data[:users] = @tmpusers handle(:names, data) @tmpusers = Array.new @@ -1245,17 +1238,16 @@ module Irc data[:text] = argv[1] handle(:datastr, data) when RPL_AWAY - data[:nick] = argv[1] + data[:nick] = user = @server.user(argv[1]) data[:message] = argv[-1] - user = @server.get_user(data[:nick]) user.away = data[:message] handle(:away, data) when RPL_WHOREPLY - data[:channel] = argv[1] + data[:channel] = channel = @server.channel(argv[1]) data[:user] = argv[2] data[:host] = argv[3] data[:userserver] = argv[4] - data[:nick] = argv[5] + data[:nick] = user = @server.user(argv[5]) if argv[6] =~ /^(H|G)(\*)?(.*)?$/ data[:away] = ($1 == 'G') data[:ircop] = $2 @@ -1268,8 +1260,6 @@ module Irc end data[:hopcount], data[:real_name] = argv[7].split(" ", 2) - user = @server.get_user(data[:nick]) - user.user = data[:user] user.host = data[:host] user.away = data[:away] # FIXME doesn't provide the actual message @@ -1278,8 +1268,6 @@ module Irc # TODO hopcount user.real_name = data[:real_name] - channel = @server.get_channel(data[:channel]) - channel.add_user(user, :silent=>true) data[:modes].map { |mode| channel.mode[mode].set(user) @@ -1295,7 +1283,7 @@ module Irc @whois[:host] = argv[3] @whois[:real_name] = argv[-1] - user = @server.get_user(@whois[:nick]) + user = @server.user(@whois[:nick]) user.user = @whois[:user] user.host = @whois[:host] user.real_name = @whois[:real_name] @@ -1313,7 +1301,7 @@ module Irc when RPL_WHOISIDLE @whois ||= Hash.new @whois[:nick] = argv[1] - user = @server.get_user(@whois[:nick]) + user = @server.user(@whois[:nick]) @whois[:idle] = argv[2].to_i user.idle_since = Time.now - @whois[:idle] if argv[-1] == 'seconds idle, signon time' @@ -1330,17 +1318,15 @@ module Irc @whois ||= Hash.new @whois[:nick] = argv[1] @whois[:channels] = [] - user = @server.get_user(@whois[:nick]) + user = @server.user(@whois[:nick]) argv[-1].split.each do |prechan| pfx = prechan.scan(/[#{@server.supports[:prefix][:prefixes].join}]/) modes = pfx.map { |p| @server.mode_for_prefix p } chan = prechan[pfx.length..prechan.length] - channel = @server.get_channel(chan) - if channel - channel.add_user(user, :silent => true) - modes.map { |mode| channel.mode[mode].set(user) } - end + channel = @server.channel(chan) + channel.add_user(user, :silent => true) + modes.map { |mode| channel.mode[mode].set(user) } @whois[:channels] << [chan, modes] end @@ -1348,15 +1334,27 @@ module Irc parse_mode(serverstring, argv[1..-1], data) handle(:mode, data) when RPL_CREATIONTIME - data[:channel] = argv[1] + data[:channel] = @server.channel(argv[1]) data[:time] = Time.at(argv[2].to_i) - @server.get_channel(data[:channel]).creation_time=data[:time] + data[:channel].creation_time=data[:time] handle(:creationtime, data) when RPL_CHANNEL_URL - data[:channel] = argv[1] + data[:channel] = @server.channel(argv[1]) data[:url] = argv[2] - @server.get_channel(data[:channel]).url=data[:url].dup + data[:channel].url=data[:url].dup handle(:channel_url, data) + when ERR_NOSUCHNICK + data[:nick] = argv[1] + if user = @server.get_user(data[:nick]) + @server.delete_user(user) + end + handle(:nosuchnick, data) + when ERR_NOSUCHCHANNEL + data[:channel] = argv[1] + if channel = @server.get_channel(data[:channel]) + @server.delete_channel(channel) + end + handle(:nosuchchannel, data) else warning "Unknown message #{serverstring.inspect}" handle(:unknown, data) @@ -1476,6 +1474,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) @@ -1533,7 +1534,7 @@ module Irc data[:modes].last << arg end } - else + when Channel # array of indices in data[:modes] where parameters # are needed who_wants_params = [] @@ -1586,6 +1587,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 @@ -1595,6 +1600,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