X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Frbot%2Firc.rb;h=129f947e61d1d9d906e1b02d7b7e7deb486fd5f3;hb=4a86158144a13bc901222442ccd2db9c2bbd6bb0;hp=c2c1e82fdd518c30889a1eed9cad0830857ea9de;hpb=c705ba5a89cd7b5c19677f4950c9784828ffc5c6;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/irc.rb b/lib/rbot/irc.rb index c2c1e82f..129f947e 100644 --- a/lib/rbot/irc.rb +++ b/lib/rbot/irc.rb @@ -321,7 +321,7 @@ class String raise "Unexpected match #{m} when converting #{self}" end } - Regexp.new(regmask) + Regexp.new("^#{regmask}$") end end @@ -629,24 +629,48 @@ module Irc end end - # A Netmask is easily converted to a String for the usual representation + # A Netmask is easily converted to a String for the usual representation. + # We skip the user or host parts if they are "*", unless we've been asked + # for the full form # + def to_s + ret = nick.dup + ret << "!" << user unless user == "*" + ret << "@" << host unless host == "*" + return ret + end + def fullform "#{nick}!#{user}@#{host}" end - alias :to_s :fullform + + # This method downcases the fullform of the netmask. While this may not be + # significantly different from the #downcase() method provided by the + # ServerOrCasemap mixin, it's significantly different for Netmask + # subclasses such as User whose simple downcasing uses the nick only. + # + def full_irc_downcase(cmap=casemap) + self.fullform.irc_downcase(cmap) + end + + # full_downcase() will return the fullform downcased according to the + # User's own casemap + # + def full_downcase + self.full_irc_downcase + end # Converts the receiver into a Netmask with the given (optional) # server/casemap association. We return self unless a conversion # is needed (different casemap/server) # - # Subclasses of Netmask will return a new Netmask + # Subclasses of Netmask will return a new Netmask, using full_downcase # def to_irc_netmask(opts={}) if self.class == Netmask return self if fits_with_server_and_casemap?(opts) end - return self.downcase.to_irc_netmask(opts) + return self.full_downcase.to_irc_netmask(opts) end # Converts the receiver into a User with the given (optional) @@ -861,6 +885,8 @@ module Irc class User < Netmask alias :to_s :nick + attr_accessor :real_name + # Create a new IRC User from a given Netmask (or anything that can be converted # into a Netmask) provided that the given Netmask does not have globs. # @@ -870,6 +896,7 @@ module Irc raise ArgumentError, "#{str.inspect} must not have globs (unescaped * or ?)" if user.has_irc_glob? && user != "*" raise ArgumentError, "#{str.inspect} must not have globs (unescaped * or ?)" if host.has_irc_glob? && host != "*" @away = false + @real_name = String.new end # The nick of a User may be changed freely, but it must not contain glob patterns. @@ -900,7 +927,7 @@ module Irc # Checks if a User is well-known or not by looking at the hostname and user # def known? - return nick!= "*" && user!="*" && host!="*" + return nick != "*" && user != "*" && host != "*" end # Is the user away? @@ -920,21 +947,6 @@ module Irc end end - # Users can be either simply downcased (their nick only) - # or fully downcased: this will return the fullform downcased - # according to the given casemap. - # - def full_irc_downcase(cmap=casemap) - self.fullform.irc_downcase(cmap) - end - - # full_downcase() will return the fullform downcased according to the - # User's own casemap - # - def full_downcase - self.full_irc_downcase - end - # Since to_irc_user runs the same checks on server and channel as # to_irc_netmask, we just try that and return self if it works. # @@ -961,6 +973,35 @@ module Irc end end + def modes_on(channel) + case channel + when Channel + channel.modes_of(self) + else + return @server.channel(channel).modes_of(self) if @server + raise "Can't resolve channel #{channel}" + end + end + + def is_op?(channel) + case channel + when Channel + channel.has_op?(self) + else + return @server.channel(channel).has_op?(self) if @server + raise "Can't resolve channel #{channel}" + end + end + + def is_voice?(channel) + case channel + when Channel + channel.has_voice?(self) + else + return @server.channel(channel).has_voice?(self) if @server + raise "Can't resolve channel #{channel}" + end + end end @@ -1164,7 +1205,7 @@ module Irc # def initialize(text="", set_by="", set_on=Time.new) @text = text - @set_by = set_by.to_irc_user + @set_by = set_by.to_irc_netmask @set_on = set_on end @@ -1234,7 +1275,7 @@ module Irc # Checks if the receiver already has a user with the given _nick_ # def has_user?(nick) - user_nicks.index(nick.irc_downcase(casemap)) + @users.index(nick.to_irc_user(server_and_casemap)) end # Returns the user with nick _nick_, if available @@ -1248,8 +1289,8 @@ module Irc # def add_user(user, opts={}) silent = opts.fetch(:silent, false) - if has_user?(user) && !silent - warn "Trying to add user #{user} to channel #{self} again" + if has_user?(user) + warn "Trying to add user #{user} to channel #{self} again" unless silent else @users << user.to_irc_user(server_and_casemap) end @@ -1327,6 +1368,21 @@ module Irc @mode[sym.to_sym] = kl.new(self) end + def modes_of(user) + l = [] + @mode.map { |s, m| + l << s if (m.class <= UserMode and m.list[user]) + } + l + end + + def has_op?(user) + @mode.has_key?(:o) and @mode[:o].list[user] + end + + def has_voice?(user) + @mode.has_key?(:v) and @mode[:v].list[user] + end end @@ -1456,10 +1512,10 @@ module Irc # Resets the Channel and User list # def reset_lists - @users.each { |u| + @users.reverse_each { |u| delete_user(u) } - @channels.each { |u| + @channels.reverse_each { |u| delete_channel(u) } end @@ -1526,6 +1582,10 @@ module Irc groups.each { |g| k, v = g.split(':') @supports[key][k] = v.to_i || 0 + if @supports[key][k] == 0 + warn "Deleting #{key} limit of 0 for #{k}" + @supports[key].delete(k) + end } } when :chanmodes @@ -1677,7 +1737,8 @@ module Irc channel_names.each { |n| count += 1 if k.include?(n[0]) } - raise IndexError, "Already joined #{count} channels with prefix #{k}" if count == @supports[:chanlimit][k] + # raise IndexError, "Already joined #{count} channels with prefix #{k}" if count == @supports[:chanlimit][k] + warn "Already joined #{count}/#{@supports[:chanlimit][k]} channels with prefix #{k}, we may be going over server limits" if count >= @supports[:chanlimit][k] } # So far, everything is fine. Now create the actual Channel