@key.to_s\r
end\r
\r
+ # Two Casemaps are equal if they have the same upper and lower ranges\r
+ #\r
+ def ==(arg)\r
+ other = arg.to_irc_casemap\r
+ return self.upper == other.upper && self.lower == other.lower\r
+ end\r
+\r
# Raise an error if _arg_ and self are not the same Casemap\r
#\r
def must_be(arg)\r
other = arg.to_irc_casemap\r
- raise "Casemap mismatch (#{self} != #{other})" unless self == other\r
+ raise "Casemap mismatch (#{self.inspect} != #{other.inspect})" unless self == other\r
return true\r
end\r
\r
# @server (if possible) or at the @casemap otherwise\r
#\r
def casemap\r
- @server.casemap rescue @casemap\r
+ return @server.casemap if defined?(@server) and @server\r
+ return @casemap\r
end\r
\r
# Returns a hash with the current @server and @casemap as values of\r
# :server and :casemap\r
#\r
def server_and_casemap\r
- {:server => @server, :casemap => @casemap}\r
+ h = {}\r
+ h[:server] = @server if defined?(@server) and @server\r
+ h[:casemap] = @casemap if defined?(@casemap) and @casemap\r
+ return h\r
end\r
\r
# We allow up/downcasing with a different casemap\r
# Empty +nick+, +user+ or +host+ are converted to the generic glob pattern\r
#\r
def initialize(str="", opts={})\r
- debug "String: #{str.inspect}, options: #{opts.inspect}"\r
-\r
# First of all, check for server/casemap option\r
#\r
init_server_or_casemap(opts)\r
if self.class == Netmask\r
return self if fits_with_server_and_casemap?(opts)\r
end\r
- return self.fullform.to_irc_netmask(opts)\r
+ return self.fullform.to_irc_netmask(server_and_casemap.merge(opts))\r
end\r
\r
# Converts the receiver into a User with the given (optional)\r
# is needed (different casemap/server)\r
#\r
def to_irc_user(opts={})\r
- self.fullform.to_irc_user(opts)\r
+ self.fullform.to_irc_user(server_and_casemap.merge(opts))\r
end\r
\r
# Inspection of a Netmask reveals the server it's bound to (if there is\r
#\r
def inspect\r
str = "<#{self.class}:#{'0x%x' % self.object_id}:"\r
- str << " @server=#{@server}" if @server\r
+ str << " @server=#{@server}" if defined?(@server) and @server\r
str << " @nick=#{@nick.inspect} @user=#{@user.inspect}"\r
- str << " @host=#{@host.inspect} casemap=#{casemap.inspect}>"\r
- str\r
+ str << " @host=#{@host.inspect} casemap=#{casemap.inspect}"\r
+ str << ">"\r
end\r
\r
# Equality: two Netmasks are equal if they downcase to the same thing\r
#\r
def matches?(arg)\r
cmp = arg.to_irc_netmask(:casemap => casemap)\r
+ debug "Matching #{self.fullform} against #{arg.fullform}"\r
[:nick, :user, :host].each { |component|\r
us = self.send(component).irc_downcase(casemap)\r
them = cmp.send(component).irc_downcase(casemap)\r
- raise NotImplementedError if us.has_irc_glob? && them.has_irc_glob?\r
+ if us.has_irc_glob? && them.has_irc_glob?\r
+ next if us == them\r
+ warn NotImplementedError\r
+ return false\r
+ end\r
return false if us.has_irc_glob? && !them.has_irc_glob?\r
return false unless us =~ them.to_irc_regexp\r
}\r
\r
end\r
\r
+\r
class String\r
\r
# We keep extending String, this time adding a method that converts a\r
# into a Netmask) provided that the given Netmask does not have globs.\r
#\r
def initialize(str="", opts={})\r
- debug "String: #{str.inspect}, options: #{opts.inspect}"\r
super\r
raise ArgumentError, "#{str.inspect} must not have globs (unescaped * or ?)" if nick.has_irc_glob? && nick != "*"\r
raise ArgumentError, "#{str.inspect} must not have globs (unescaped * or ?)" if user.has_irc_glob? && user != "*"\r
#\r
def to_irc_user(opts={})\r
return self if fits_with_server_and_casemap?(opts)\r
- return self.fullform.to_irc_user(opts)\r
+ return self.fullform.to_irc_user(server_and_casemap(opts))\r
end\r
\r
# We can replace everything at once with data from another User\r
def replace(other)\r
case other\r
when User\r
- nick = other.nick\r
- user = other.user\r
- host = other.host\r
+ self.nick = other.nick\r
+ self.user = other.user\r
+ self.host = other.host\r
@server = other.server\r
@casemap = other.casemap unless @server\r
- @away = other.away\r
+ @away = other.away?\r
else\r
- replace(other.to_irc_user(server_and_casemap))\r
+ self.replace(other.to_irc_user(server_and_casemap))\r
end\r
end\r
\r
# String into an Irc::User object\r
#\r
def to_irc_user(opts={})\r
- debug "opts = #{opts.inspect}"\r
Irc::User.new(self, opts)\r
end\r
\r
str = "<#{self.class}:#{'0x%x' % self.object_id}:"\r
str << " on server #{server}" if server\r
str << " @name=#{@name.inspect} @topic=#{@topic.text.inspect}"\r
- str << " @users=<#{@users.sort.join(', ')}>"\r
- str\r
+ str << " @users=[#{@users.sort.join(', ')}]"\r
+ str << ">"\r
end\r
\r
# Returns self\r
str = "<#{self.class}:#{'0x%x' % self.object_id}:"\r
str << " @hostname=#{hostname}"\r
str << " @channels=#{chans}"\r
- str << " @users=#{users}>"\r
- str\r
+ str << " @users=#{users}"\r
+ str << ">"\r
end\r
\r
# Create a new Server, with all instance variables reset to nil (for\r
#\r
def reset_capabilities\r
@supports = {\r
- :casemapping => 'rfc1459',\r
+ :casemapping => 'rfc1459'.to_irc_casemap,\r
:chanlimit => {},\r
:chanmodes => {\r
:typea => nil, # Type A: address lists\r
key = prekey.downcase.to_sym\r
end\r
case key\r
- when :casemapping, :network\r
+ when :casemapping\r
noval_warn(key, val) {\r
- @supports[key] = val\r
+ @supports[key] = val.to_irc_casemap\r
}\r
when :chanlimit, :idchan, :maxlist, :targmax\r
noval_warn(key, val) {\r
@supports[key][k] = v.to_i\r
}\r
}\r
- when :maxchannels\r
- noval_warn(key, val) {\r
- reparse += "CHANLIMIT=(chantypes):#{val} "\r
- }\r
- when :maxtargets\r
- noval_warn(key, val) {\r
- @supports[key]['PRIVMSG'] = val.to_i\r
- @supports[key]['NOTICE'] = val.to_i\r
- }\r
when :chanmodes\r
noval_warn(key, val) {\r
groups = val.split(',')\r
when :invex\r
val ||= 'I'\r
@supports[key] = val\r
+ when :maxchannels\r
+ noval_warn(key, val) {\r
+ reparse += "CHANLIMIT=(chantypes):#{val} "\r
+ }\r
+ when :maxtargets\r
+ noval_warn(key, val) {\r
+ @supports[key]['PRIVMSG'] = val.to_i\r
+ @supports[key]['NOTICE'] = val.to_i\r
+ }\r
+ when :network\r
+ noval_warn(key, val) {\r
+ @supports[key] = val\r
+ }\r
when :nicklen\r
noval_warn(key, val) {\r
@supports[key] = val.to_i\r
def new_user(str, fails=true)\r
tmp = str.to_irc_user(:server => self)\r
old = get_user(tmp.nick)\r
+ # debug "Tmp: #{tmp.inspect}"\r
+ # debug "Old: #{old.inspect}"\r
if old\r
# debug "User already existed as #{old.inspect}"\r
if tmp.known?\r
if old.known?\r
+ # debug "Both were known"\r
# Do not raise an error: things like Freenode change the hostname after identification\r
warning "User #{tmp.nick} has inconsistent Netmasks! #{self} knows #{old.inspect} but access was tried with #{tmp.inspect}" if old != tmp\r
raise "User #{tmp} already exists on server #{self}" if fails\r
end\r
- if old != tmp\r
+ if old.fullform.downcase != tmp.fullform.downcase\r
old.replace(tmp)\r
- # debug "User improved to #{old.inspect}"\r
+ # debug "Known user now #{old.inspect}"\r
end\r
end\r
return old\r