# 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
# - "@" is used for secret channels, "*" for private
# channels, and "=" for others (public channels).
data[:channeltype] = argv[1]
- data[:channel] = argv[2]
-
- chan = @server.channel(data[:channel])
+ data[:channel] = chan = @server.channel(argv[2])
users = []
argv[3].scan(/\S+/).each { |u|
}
@tmpusers += users
when RPL_ENDOFNAMES
- data[:channel] = argv[1]
+ data[:channel] = @server.channel(argv[1])
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"
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.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
end
data[:hopcount], data[:real_name] = argv[7].split(" ", 2)
- user = @server.user(data[:nick])
-
user.user = data[:user]
user.host = data[:host]
user.away = data[:away] # FIXME doesn't provide the actual message
# TODO hopcount
user.real_name = data[:real_name]
- channel = @server.channel(data[:channel])
-
channel.add_user(user, :silent=>true)
data[:modes].map { |mode|
channel.mode[mode].set(user)
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}]/)
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.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.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])
+ 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)
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)
data[:modes].last << arg
end
}
- else
+ when Channel
# array of indices in data[:modes] where parameters
# are needed
who_wants_params = []
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
data[:target].mode[key].send(set)
end
}
+ else
+ warning "Ignoring #{data[:modestring]} for unrecognized target #{argv[0]} (#{data[:target].inspect})"
end
end
end