# File lib/rbot/ircbot.rb, line 532
  def mainloop
    while true
      begin
        quit if $interrupted > 0
        connect
        @timer.start

        while @socket.connected?
          if @socket.select
            break unless reply = @socket.gets
            @client.process reply
          end
          quit if $interrupted > 0
        end

      # I despair of this. Some of my users get "connection reset by peer"
      # exceptions that ARENT SocketError's. How am I supposed to handle
      # that?
      rescue SystemExit
        log_session_end
        exit 0
      rescue Errno::ETIMEDOUT, TimeoutError, SocketError => e
        error "network exception: #{e.class}: #{e}"
        debug e.backtrace.join("\n")
      rescue BDB::Fatal => e
        fatal "fatal bdb error: #{e.class}: #{e}"
        fatal e.backtrace.join("\n")
        DBTree.stats
        # Why restart? DB problems are serious stuff ...
        # restart("Oops, we seem to have registry problems ...")
        log_session_end
        exit 2
      rescue Exception => e
        error "non-net exception: #{e.class}: #{e}"
        error e.backtrace.join("\n")
      rescue => e
        fatal "unexpected exception: #{e.class}: #{e}"
        fatal e.backtrace.join("\n")
        log_session_end
        exit 2
      end

      stop_server_pings
      @channels.clear
      if @socket.connected?
        @socket.clearq
        @socket.shutdown
      end

      log "disconnected"

      quit if $interrupted > 0

      log "waiting to reconnect"
      sleep @config['server.reconnect_wait']
    end
  end