# File rbot/ircbot.rb, line 72
  def initialize(botclass)
    @botclass = botclass.gsub(/\/$/, "")
    @startup_time = Time.new
    
    Dir.mkdir("#{botclass}") if(!File.exist?("#{botclass}"))
    Dir.mkdir("#{botclass}/logs") if(!File.exist?("#{botclass}/logs"))

    @config = Irc::BotConfig.new(self)
    @timer = Timer::Timer.new
    @registry = BotRegistry.new self
    @timer.add(@config["SAVE_EVERY"].to_i) { save }
    @channels = Hash.new
    @logs = Hash.new
    
    @lang = Irc::Language.new(@config["LANGUAGE"])
    @keywords = Irc::Keywords.new(self)
    @auth = Irc::IrcAuth.new(self)
    @plugins = Irc::Plugins.new(self, ["#{botclass}/plugins"])
    @socket = Irc::IrcSocket.new(@config["SERVER"], @config["PORT"], @config["HOST"], @config["SENDQ_DELAY"], @config["SENDQ_BURST"])
    @nick = @config["NICK"]
    @server_password = @config["SERVER_PASSWORD"]
    if @config["ADDRESS_PREFIX"]
      @addressing_prefixes = @config["ADDRESS_PREFIX"].split(" ")
    else
      @addressing_prefixes = Array.new
    end
    
    @client = Irc::IrcClient.new
    @client["PRIVMSG"] = proc { |data|
      message = PrivMessage.new(self, data["SOURCE"], data["TARGET"], data["MESSAGE"])
      onprivmsg(message)
    }
    @client["NOTICE"] = proc { |data|
      message = NoticeMessage.new(self, data["SOURCE"], data["TARGET"], data["MESSAGE"])
      # pass it off to plugins that want to hear everything
      @plugins.delegate "listen", message
    }
    @client["MOTD"] = proc { |data|
      data['MOTD'].each_line { |line|
        log "MOTD: #{line}", "server"
      }
    }
    @client["NICKTAKEN"] = proc { |data| 
      nickchg "#{@nick}_"
    }
    @client["BADNICK"] = proc {|data| 
      puts "WARNING, bad nick (#{data['NICK']})"
    }
    @client["PING"] = proc {|data|
      # (jump the queue for pongs)
      @socket.puts "PONG #{data['PINGID']}"
    }
    @client["NICK"] = proc {|data|
      sourcenick = data["SOURCENICK"]
      nick = data["NICK"]
      m = NickMessage.new(self, data["SOURCE"], data["SOURCENICK"], data["NICK"])
      if(sourcenick == @nick)
        @nick = nick
      end
      @channels.each {|k,v|
        if(v.users.has_key?(sourcenick))
          log "@ #{sourcenick} is now known as #{nick}", k
          v.users[nick] = v.users[sourcenick]
          v.users.delete(sourcenick)
        end
      }
      @plugins.delegate("listen", m)
      @plugins.delegate("nick", m)
    }
    @client["QUIT"] = proc {|data|
      source = data["SOURCE"]
      sourcenick = data["SOURCENICK"]
      sourceurl = data["SOURCEADDRESS"]
      message = data["MESSAGE"]
      m = QuitMessage.new(self, data["SOURCE"], data["SOURCENICK"], data["MESSAGE"])
      if(data["SOURCENICK"] =~ /#{@nick}/)
      else
        @channels.each {|k,v|
          if(v.users.has_key?(sourcenick))
            log "@ Quit: #{sourcenick}: #{message}", k
            v.users.delete(sourcenick)
          end
        }
      end
      @plugins.delegate("listen", m)
      @plugins.delegate("quit", m)
    }
    @client["MODE"] = proc {|data|
      source = data["SOURCE"]
      sourcenick = data["SOURCENICK"]
      sourceurl = data["SOURCEADDRESS"]
      channel = data["CHANNEL"]
      targets = data["TARGETS"]
      modestring = data["MODESTRING"]
      log "@ Mode #{modestring} #{targets} by #{sourcenick}", channel
    }
    @client["WELCOME"] = proc {|data|
      log "joined server #{data['SOURCE']} as #{data['NICK']}", "server"
      debug "I think my nick is #{@nick}, server thinks #{data['NICK']}"
      if data['NICK'] && data['NICK'].length > 0
        @nick = data['NICK']
      end
      if(@config["JOIN_CHANNELS"])
        @config["JOIN_CHANNELS"].split(", ").each {|c|
          puts "autojoining channel #{c}"
          if(c =~ /^(\S+)\s+(\S+)$/)
            join $1, $2
          else
            join c if(c)
          end
        }
      end
    }
    @client["JOIN"] = proc {|data|
      m = JoinMessage.new(self, data["SOURCE"], data["CHANNEL"], data["MESSAGE"])
      onjoin(m)
    }
    @client["PART"] = proc {|data|
      m = PartMessage.new(self, data["SOURCE"], data["CHANNEL"], data["MESSAGE"])
      onpart(m)
    }
    @client["KICK"] = proc {|data|
      m = KickMessage.new(self, data["SOURCE"], data["TARGET"],data["CHANNEL"],data["MESSAGE"]) 
      onkick(m)
    }
    @client["INVITE"] = proc {|data|
      if(data["TARGET"] =~ /^#{@nick}$/)
        join data["CHANNEL"] if (@auth.allow?("join", data["SOURCE"], data["SOURCENICK"]))
      end
    }
    @client["CHANGETOPIC"] = proc {|data|
      channel = data["CHANNEL"]
      sourcenick = data["SOURCENICK"]
      topic = data["TOPIC"]
      if(sourcenick == @nick)
        log "@ I set topic \"#{topic}\"", channel
      else
        log "@ #{sourcenick} set topic \"#{topic}\"", channel
      end
      m = TopicMessage.new(self, data["SOURCE"], data["CHANNEL"], data["TOPIC"])
      @plugins.delegate("topic", m)
      @plugins.delegate("listen", m)
    }
    @client["NAMES"] = proc {|data|
      channel = data["CHANNEL"]
      users = data["USERS"]
      unless(@channels[channel])
        puts "bug: got names for channel '#{channel}' I didn't think I was in\n"
        exit 2
      end
      @channels[channel].users.clear
      users.each {|u|
        @channels[channel].users[u[0]] = ["mode", u[1]]
      }
    }
    @client["UNKNOWN"] = proc {|data|
      debug "UNKNOWN: #{data['SERVERSTRING']}"
    }
  end