#
# ==server events currently supported:
#
- # TODO handle errors ERR_NOSUCHNICK, ERR_NOSUCHCHANNEL
# TODO handle errors ERR_CHANOPRIVSNEEDED, ERR_CANNOTSENDTOCHAN
#
# welcome:: server welcome message on connect
# - "@" 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|
}
@tmpusers += users
when RPL_ENDOFNAMES
- data[:channel] = argv[1]
+ data[:channel] = @server.channel(argv[1])
data[:users] = @tmpusers
handle(:names, data)
@tmpusers = Array.new
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
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
# 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)
@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]
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'
@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
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)