prefix, command, params = $2, $3, $5
if prefix != nil
- data[:source] = prefix
- if prefix =~ /^(\S+)!(\S+)$/
+ # Most servers will send a full nick!user@host prefix for
+ # messages from users. Therefore, when the prefix doesn't match this
+ # syntax it's usually the server hostname.
+ #
+ # This is not always true, though, since some servers do not send a
+ # full hostmask for user messages.
+ #
+ if prefix =~ /^(?:\S+)(?:!\S+)?@(?:\S+)$/
data[:source] = @server.user(prefix)
else
- if @server.hostname && @server.hostname != data[:source]
- warning "Unknown origin #{data[:source]} for message\n#{serverstring.inspect}"
+ if @server.hostname
+ if @server.hostname != prefix
+ debug "Origin #{prefix} for message\n\t#{serverstring.inspect}\nis neither a user hostmask nor the server hostname, assuming it's a nick"
+ data[:source] = @server.user(prefix)
+ else
+ data[:source] = @server
+ end
else
@server.instance_variable_set(:@hostname, data[:source])
+ data[:source] = @server
end
- data[:source] = @server
end
end
users = []
argv[3].scan(/\S+/).each { |u|
# FIXME beware of servers that allow multiple prefixes
- if(u =~ /^(#{@server.supports[:prefix][:prefixes].join})?(.*)$/)
+ if(u =~ /^([#{@server.supports[:prefix][:prefixes].join}])?(.*)$/)
umode = $1
user = $2
users << [user, umode]
users.each { |ar|
u = @server.user(ar[0])
- chan.users << u unless chan.users.include?(u)
+ chan.add_user(u, :silent => true)
+ debug "Adding user #{u}"
if ar[1]
m = @server.supports[:prefix][:prefixes].index(ar[1].to_sym)
- m = @server.supports[:prefix][:modes][m]
- chan.mode[m.to_sym].set(u)
+ ms = @server.supports[:prefix][:modes][m]
+ debug "\twith mode #{ar[1]} (#{ms})"
+ chan.mode[ms].set(u)
end
}
@tmpusers += users
when 'QUIT'
data[:message] = argv[0]
data[:was_on] = @server.channels.inject(ChannelList.new) { |list, ch|
- list << ch if ch.users.include?(data[:source])
- list
+ list << ch if ch.has_user?(data[:source])
+ list
}
@server.delete_user(data[:source])
handle(:quit, data)
when 'JOIN'
data[:channel] = @server.channel(argv[0])
- data[:channel].users << data[:source]
+ data[:channel].add_user(data[:source])
handle(:join, data)
when 'TOPIC'
handle(:invite, data)
when 'NICK'
data[:is_on] = @server.channels.inject(ChannelList.new) { |list, ch|
- list << ch if ch.users.include?(data[:source])
+ list << ch if ch.has_user?(data[:source])
list
}
case data[:channel]
when User
# TODO
+ warn "Unhandled user mode message '#{serverstring}'"
else
# data[:modes] is an array where each element
# is either a flag which doesn't need parameters
data[:modes] << [setting + m]
who_wants_params << data[:modes].length - 1
else
- warn "Unknown mode #{m} in #{serverstring}"
+ warn "Unknown mode #{m} in #{serverstring.inspect}"
end
}
else
idx = who_wants_params.shift
if idx.nil?
- warn "Oops, problems parsing #{serverstring}"
+ warn "Oops, problems parsing #{serverstring.inspect}"
break
end
data[:modes][idx] << arg
handle(:mode, data)
else
+ warn "Unknown message #{serverstring.inspect}"
handle(:unknown, data)
end
end