Ejemplo n.º 1
0
void MMapperPluginParser::exits(QString text) {
  m_descriptionReady = true;

  if (text.isEmpty()) {
    if (!queue.isEmpty())
      if (queue.head() == CID_SCOUT)
	return ;
    emulateExits();
  }
  else {
    parseExits(text);
  }
}
Ejemplo n.º 2
0
void Parser::parseNewMudInput(IncomingData& data /*TelnetIncomingDataQueue& que*/)
{
	bool staticLine = false;
	bool dontSendToUser = false;
	/*IncomingData data; 	
	bool staticLine;
	
	while ( !que.isEmpty() )
	{
		data = que.dequeue();
*/
		
		//dline = (quint8 *)data.line.data();
		switch (data.type)
		{
			case TDT_DELAY:
			case TDT_MENU_PROMPT: 
			case TDT_LOGIN: 
			case TDT_LOGIN_PASSWORD: 
			case TDT_TELNET:
			case TDT_SPLIT:
			case TDT_UNKNOWN:			
#ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE
		(*debugStream) << "***STYPE***";
		(*debugStream) << "Other";
		(*debugStream) << "***ETYPE***";
#endif
				emit sendToUser(data.line);
				break;			

			case TDT_PROMPT:
#ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE
		(*debugStream) << "***STYPE***";
		(*debugStream) << "Prompt";
		(*debugStream) << "***ETYPE***";
#endif
				m_stringBuffer = QString::fromAscii(data.line.constData(), data.line.size());
				m_stringBuffer = m_stringBuffer.simplified();
				latinToAscii(m_stringBuffer);
				
				if (m_readingRoomDesc)
				{
					m_readingRoomDesc = false; // we finished read desc mode
					m_descriptionReady = true;
					if (m_examine) m_examine = false; // stop showing bypassing brief-mode
				}
				
				if	(m_descriptionReady)
				{			
					m_descriptionReady = false;

					parsePrompt(m_stringBuffer);

					if (!queue.isEmpty())
					{
						CommandIdType c = queue.dequeue();
						if ( c != CID_SCOUT ){
							//qDebug("%s",m_roomName.toAscii().data());
							//qDebug("%s",m_dynamicRoomDesc.toAscii().data());
							emit showPath(queue, false);
							characterMoved(c, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags);
						}
						//additional scout move needs to be removed when scout was successful
						else queue.dequeue();
					}
					else
					{	
						//qDebug("%s",m_roomName.toAscii().data());
						//qDebug("%s",m_dynamicRoomDesc.toAscii().data());
						emit showPath(queue, false);
						characterMoved(CID_NONE, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags);
					}    
				}
				
				emit sendToUser(data.line);				
				break;

			case TDT_CRLF:
#ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE
		(*debugStream) << "***STYPE***";
		(*debugStream) << "CRLF";
		(*debugStream) << "***ETYPE***";
#endif			
				if (data.line.contains("null)>")) break;								

				m_stringBuffer = QString::fromAscii(data.line.constData(), data.line.size());
				m_stringBuffer = m_stringBuffer.simplified();
				latinToAscii(m_stringBuffer);
								
				if (m_readingRoomDesc) 
				{					
					if (isEndOfRoomDescription(m_stringBuffer)) // standard end of description parsed
					{  
						m_readingRoomDesc = false; // we finished read desc mode
						m_descriptionReady = true;
						dontSendToUser = true;
					}
					else 
					if (m_stringBuffer.isEmpty())  // standard end of description parsed
					{  
						m_readingRoomDesc = false; // we finished read desc mode
						m_descriptionReady = true;
						if (Config().m_emulatedExits)
							emulateExits();
					} 
					else // reading room description line 
					{ 
						
						switch(Config().m_roomDescriptionsParserType)
						{
						case Configuration::RDPT_COLOR:
							if ((m_readingStaticDescLines == true) && isStaticRoomDescriptionLine(m_stringBuffer))
							{	
								staticLine = true;
								m_staticRoomDesc += m_stringBuffer+"\n";
							}
							else
							{							
								m_readingStaticDescLines = false;
								m_dynamicRoomDesc += m_stringBuffer+"\n";
							}								
							m_roomDescLines++;														
							break;	
							
						case Configuration::RDPT_PARSER:
							if ((m_roomDescLines >= Config().m_minimumStaticLines) && 
								((m_readingStaticDescLines == false) || 
								Patterns::matchDynamicDescriptionPatterns(m_stringBuffer)))
							{
								m_readingStaticDescLines = false;						
								m_dynamicRoomDesc += m_stringBuffer+"\n";
							}
							else
							{
								staticLine = true;
								m_staticRoomDesc += m_stringBuffer+"\n";								
							}
							m_roomDescLines++;							
							break;	
							
						case Configuration::RDPT_LINEBREAK:
							m_dynamicRoomDesc += m_stringBuffer+"\n";
							m_roomDescLines++;														
							break;								
						}						
						
						
					}
				} 
				else 
				if (!m_readingRoomDesc && m_descriptionReady) //read betwen Exits and Prompt (track for example)
				{
					if ( isRoomName(m_stringBuffer) ) //Room name arrived
					{ 
						
						
						if	(m_descriptionReady)
						{			
							m_descriptionReady = false;
		
							if (!queue.isEmpty())
							{
								CommandIdType c = queue.dequeue();
								if ( c != CID_SCOUT ){
									emit showPath(queue, false);
									characterMoved(c, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags);
								}
								//additional scout move needs to be removed when scout was successful
								else queue.dequeue();
							}
							else
							{	
								emit showPath(queue, false);
								characterMoved(CID_NONE, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags);
							}    
						}					
						
						
						m_readingRoomDesc = true; //start of read desc mode
						m_descriptionReady = false;										
						m_roomName=m_stringBuffer;
						m_dynamicRoomDesc=nullString;
						m_staticRoomDesc=nullString;
						m_roomDescLines = 0;
						m_readingStaticDescLines = true;
						m_exitsFlags = 0;
					} 
					else
					if (!m_stringBuffer.isEmpty()) parseMudCommands(m_stringBuffer);					
						  
				} 
				else 
				if ( isRoomName(m_stringBuffer) ) //Room name arrived
				{ 
					
					
					if	(m_descriptionReady)
					{			
						m_descriptionReady = false;
	
						if (!queue.isEmpty())
						{
							CommandIdType c = queue.dequeue();
							if ( c != CID_SCOUT ){
								emit showPath(queue, false);
								characterMoved(c, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags);
							}
							//additional scout move needs to be removed when scout was successful
							else queue.dequeue();
						}
						else
						{	
							emit showPath(queue, false);
							characterMoved(CID_NONE, m_roomName, m_dynamicRoomDesc, m_staticRoomDesc, m_exitsFlags, m_promptFlags);
						}    
					}					
					
					
					m_readingRoomDesc = true; //start of read desc mode
					m_descriptionReady = false;										
					m_roomName=m_stringBuffer;
					m_dynamicRoomDesc=nullString;
					m_staticRoomDesc=nullString;
					m_roomDescLines = 0;
					m_readingStaticDescLines = true;
					m_exitsFlags = 0;
				} 
				else 
				if (!m_stringBuffer.isEmpty() && Patterns::matchNoDescriptionPatterns(m_stringBuffer)) // non standard end of description parsed (fog, dark or so ...)
				{ 
					m_readingRoomDesc = false; // we finished read desc mode
					m_descriptionReady = true;
					m_roomName=nullString;
					m_dynamicRoomDesc=nullString;
					m_staticRoomDesc=nullString;
					m_roomDescLines = 0;
					m_readingStaticDescLines = false;
					m_exitsFlags = 0;
					m_promptFlags = 0;
				} 
				else // parse standard input (answers) from server
				{ 
					//str=removeAnsiMarks(m_stringBuffer);
					if (!m_stringBuffer.isEmpty()) parseMudCommands(m_stringBuffer);
				}
										
				if (!dontSendToUser && !(staticLine && (m_examine || Config().m_brief))) emit sendToUser(data.line);
				break;

			case TDT_LFCR: 
#ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE
		(*debugStream) << "***STYPE***";
		(*debugStream) << "LFCR";
		(*debugStream) << "***ETYPE***";
#endif			
				m_stringBuffer = QString::fromAscii(data.line.constData(), data.line.size());
				m_stringBuffer = m_stringBuffer.simplified();
				latinToAscii(m_stringBuffer);


				if (m_readingRoomDesc && (Config().m_roomDescriptionsParserType == Configuration::RDPT_LINEBREAK) )
				{
					staticLine = true;
					m_staticRoomDesc += m_stringBuffer+"\n";
					m_roomDescLines++;
				}
				if (!(staticLine && (m_examine || Config().m_brief))) emit sendToUser(data.line);
				break;

			case TDT_LF:
#ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE
		(*debugStream) << "***STYPE***";
		(*debugStream) << "LF";
		(*debugStream) << "***ETYPE***";
#endif			
				m_stringBuffer = QString::fromAscii(data.line.constData(), data.line.size());
				emit sendToUser(data.line);
				break;			
		}
		
#ifdef PARSER_STREAM_DEBUG_INPUT_TO_FILE
		(*debugStream) << "***S***";
		(*debugStream) << data.line;
		(*debugStream) << "***E***";
#endif
		
	//}
		
}
Ejemplo n.º 3
0
QByteArray MumeXmlParser::characters(QByteArray &ch)
{
    QByteArray toUser;

    if (ch.isEmpty()) {
        return toUser;
    }

    // replace > and < chars
    stripXmlEntities(ch);

    const auto &config = getConfig();
    m_stringBuffer = QString::fromLatin1(ch);

    if (m_readSnoopTag && m_stringBuffer.length() > 3 && m_stringBuffer.at(0) == '&'
        && m_stringBuffer.at(2) == ' ') {
        // Remove snoop prefix (i.e. "&J Exits: north.")
        m_stringBuffer = m_stringBuffer.mid(3);
    }

    switch (m_xmlMode) {
    case XmlMode::NONE: // non room info
        m_stringBuffer = normalizeStringCopy(m_stringBuffer.trimmed());
        if (m_stringBuffer.isEmpty()) { // standard end of description parsed
            if (m_readingRoomDesc) {
                m_readingRoomDesc = false; // we finished read desc mode
                m_descriptionReady = true;
                if (config.mumeNative.emulatedExits) {
                    emulateExits();
                }
            }
        } else {
            parseMudCommands(m_stringBuffer);
        }
        if (m_readSnoopTag) {
            if (m_descriptionReady) {
                m_promptFlags.reset(); // Don't trust god prompts
                queue.enqueue(m_move);
                emit showPath(queue, true);
                move();
                m_readSnoopTag = false;
            }
        }
        toUser.append(ch);
        break;

    case XmlMode::ROOM: // dynamic line
        m_dynamicRoomDesc += normalizeStringCopy(m_stringBuffer.simplified().append("\n"));
        toUser.append(ch);
        break;

    case XmlMode::NAME:
        if (m_descriptionReady) {
            move();
        }
        m_readingRoomDesc = true; // start of read desc mode
        m_roomName = normalizeStringCopy(m_stringBuffer);
        toUser.append(ch);
        break;

    case XmlMode::DESCRIPTION: // static line
        m_staticRoomDesc += normalizeStringCopy(m_stringBuffer.simplified().append("\n"));
        if (!m_gratuitous) {
            toUser.append(ch);
        }
        break;

    case XmlMode::EXITS:
        m_exits += m_stringBuffer;
        if (m_readingRoomDesc) {
            m_readingRoomDesc = false;
            m_descriptionReady = true;
        }
        break;

    case XmlMode::PROMPT:
        emit sendPromptLineEvent(normalizeStringCopy(m_stringBuffer).toLatin1());
        if (m_readingRoomDesc) {       // fixes compact mode
            m_readingRoomDesc = false; // we finished read desc mode
            m_descriptionReady = true;
            if (config.mumeNative.emulatedExits) {
                emulateExits();
            }
        }
        if (m_descriptionReady) {
            parsePrompt(normalizeStringCopy(m_stringBuffer));
            move();
        }

        toUser.append(ch);
        break;

    case XmlMode::TERRAIN:
    default:
        toUser.append(ch);
        break;
    }

    if (!getConfig().parser.removeXmlTags) {
        toUser.replace(ampersand, ampersandTemplate);
        toUser.replace(greaterThanChar, greaterThanTemplate);
        toUser.replace(lessThanChar, lessThanTemplate);
    }
    return toUser;
}