# File rbot/rfc2812.rb, line 857
    def process(serverstring)
      data = Hash.new
      data["SERVERSTRING"] = serverstring
      
      unless serverstring =~ /^(:(\S+)\s)?(\S+)(\s(.*))?/
	      raise "Unparseable Server Message!!!: #{serverstring}"
      end
 
      prefix, command, params = $2, $3, $5
      
      if prefix != nil
        data['SOURCE'] = prefix
        if prefix =~ /^(\S+)!(\S+)$/
          data['SOURCENICK'] = $1
          data['SOURCEADDRESS'] = $2
        end
      end

      # split parameters in an array
      argv = []
      params.scan(/(?!:)(\S+)|:(.*)/) { argv << ($1 || $2) } if params
      
      case command
      when 'PING'
        data['PINGID'] = argv[0]
        handle('PING', data)
      when /^(\d+)$/		# numeric server message
        num=command.to_i
        case num
        when ERR_NICKNAMEINUSE
          # "* <nick> :Nickname is already in use"
          data['NICK'] = argv[1]
          data['MESSAGE'] = argv[2]
          handle('NICKTAKEN', data)
        when ERR_ERRONEUSNICKNAME
          # "* <nick> :Erroneous nickname"
          data['NICK'] = argv[1]
          data['MESSAGE'] = argv[2]
          handle('BADNICK', data)
        when RPL_TOPIC
          data['CHANNEL'] = argv[0]
          data['TOPIC'] = argv[1]
          handle('TOPIC', data)
        when RPL_TOPIC_INFO
          data['CHANNEL'] = argv[0]
          data['NICK'] = argv[1]
          data['UNIXTIME'] = argv[2]
          handle('TOPICINFO', data)
        when RPL_NAMREPLY
          # "( "=" / "*" / "@" ) <channel>
          # :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> )
          # - "@" is used for secret channels, "*" for private
          # channels, and "=" for others (public channels).
          argv[3].scan(/\S+/).each { |u|
            if(u =~ /^([@+])?(.*)$/)
              umode = $1 || ""
              user = $2
              @users << [user, umode]
            end
          }
        when RPL_ENDOFNAMES
          data['CHANNEL'] = argv[1]
          data['USERS'] = @users
          handle('NAMES', data)
          @users = Array.new
        when RPL_WELCOME
          # "Welcome to the Internet Relay Network
          # <nick>!<user>@<host>"
          case argv[1]
          when /((\S+)!(\S+))/
            data['NETMASK'] = $1
            data['NICK'] = $2
            data['ADDRESS'] = $3
          when /Welcome to the Internet Relay Network\s(\S+)/
            data['NICK'] = $1
          when /Welcome.*\s+(\S+)$/
            data['NICK'] = $1
          when /^(\S+)$/
            data['NICK'] = $1
          end
          handle('WELCOME', data)
        when RPL_MOTDSTART
          # "<nick> :- <server> Message of the Day -"
          if argv[1] =~ /^-\s+(\S+)\s/
            server = $1
            @motd = ""
          end
        when RPL_MOTD
          if(argv[1] =~ /^-\s+(.*)$/)
            @motd << $1
            @motd << "\n"
          end
        when RPL_ENDOFMOTD
          data['MOTD'] = @motd
          handle('MOTD', data)
        else
          handle('UNKNOWN', data)
        end
      # end of numeric replies
      when 'PRIVMSG'
        # you can either bind to 'PRIVMSG', to get every one and
        # parse it yourself, or you can bind to 'MSG', 'PUBLIC',
        # etc and get it all nicely split up for you.
        data['TARGET'] = argv[0]
        data['MESSAGE'] = argv[1]
        handle('PRIVMSG', data)
        
        # Now we split it
        if(data['TARGET'] =~ /^(#|&).*/)
          handle('PUBLIC', data)
        else
          handle('MSG', data)
        end
      when 'KICK'
        data['CHANNEL'] = argv[0]
        data['TARGET'] = argv[1]
        data['MESSAGE'] = argv[2]
        handle('KICK', data)
      when 'PART'
        data['CHANNEL'] = argv[0]
        data['MESSAGE'] = argv[1]
        handle('PART', data)
      when 'QUIT'
        data['MESSAGE'] = argv[0]
        handle('QUIT', data)
      when 'JOIN'
        data['CHANNEL'] = argv[0]
        handle('JOIN', data)
      when 'TOPIC'
        data['CHANNEL'] = argv[0]
        data['TOPIC'] = argv[1]
        handle('CHANGETOPIC', data)
      when 'INVITE'
        data['TARGET'] = argv[0]
        data['CHANNEL'] = argv[1]
        handle('INVITE', data)
      when 'NICK'
        data['NICK'] = argv[0]
        handle('NICK', data)
      when 'MODE'
        data['CHANNEL'] = argv[0]
        data['MODESTRING'] = argv[1]
        data['TARGETS'] = argv[2]
        handle('MODE', data)
      when 'NOTICE'
        data['TARGET'] = argv[0]
        data['MESSAGE'] = argv[1]
        if data['SOURCENICK']
          handle('NOTICE', data)
        else
          # "server notice" (not from user, noone to reply to
          handle('SNOTICE', data)
        end
      else
        handle('UNKNOWN', data)
      end
    end