Ejemplo n.º 1
0
bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const {
  Q_UNUSED(sourceParent);
  QModelIndex sourceIdx = sourceModel()->index(sourceRow, 2);
  Message::Type messageType = (Message::Type)sourceIdx.data(MessageModel::TypeRole).toInt();

  // apply message type filter
  if(_messageTypeFilter & messageType)
    return false;

  if(_validBuffers.isEmpty())
    return true;

  BufferId bufferId = sourceIdx.data(MessageModel::BufferIdRole).value<BufferId>();
  if(!bufferId.isValid()) {
    return true;
  }

  MsgId msgId = sourceIdx.data(MessageModel::MsgIdRole).value<MsgId>();
  Message::Flags flags = (Message::Flags)sourceIdx.data(MessageModel::FlagsRole).toInt();

  NetworkId myNetworkId = networkId();
  NetworkId msgNetworkId = Client::networkModel()->networkId(bufferId);
  if(myNetworkId != msgNetworkId)
    return false;

  // ignorelist handling
  // only match if message is not flagged as server msg
  if(!(flags & Message::ServerMsg) && Client::ignoreListManager()
      && Client::ignoreListManager()->match(sourceIdx.data(MessageModel::MessageRole).value<Message>(), Client::networkModel()->networkName(bufferId)))
    return false;

  if(flags & Message::Redirected) {
    int redirectionTarget = 0;
    switch(messageType) {
    case Message::Notice:
      if(Client::networkModel()->bufferType(bufferId) != BufferInfo::ChannelBuffer) {
	if(flags & Message::ServerMsg) {
	  // server notice
	  redirectionTarget = _serverNoticesTarget;
	} else {
	  redirectionTarget = _userNoticesTarget;
	}
      }
      break;
    case Message::Error:
      redirectionTarget = _errorMsgsTarget;
      break;
    default:
      break;
    }

    if(redirectionTarget & BufferSettings::DefaultBuffer && _validBuffers.contains(bufferId))
      return true;

    if(redirectionTarget & BufferSettings::CurrentBuffer && !(flags & Message::Backlog)) {
      BufferId redirectedTo = sourceModel()->data(sourceIdx, MessageModel::RedirectedToRole).value<BufferId>();
      if(!redirectedTo.isValid()) {
	BufferId redirectedTo = Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>();
	if(redirectedTo.isValid())
	  sourceModel()->setData(sourceIdx, QVariant::fromValue<BufferId>(redirectedTo), MessageModel::RedirectedToRole);
      }

      if(_validBuffers.contains(redirectedTo))
	return true;
    }

    if(redirectionTarget & BufferSettings::StatusBuffer) {
      QSet<BufferId>::const_iterator idIter = _validBuffers.constBegin();
      while(idIter != _validBuffers.constEnd()) {
	if(Client::networkModel()->bufferType(*idIter) == BufferInfo::StatusBuffer)
	  return true;
	idIter++;
      }
    }

    return false;
  }


  if(_validBuffers.contains(bufferId)) {
    return true;
  } else {
    // show Quit messages in Query buffers:
    if(bufferType() != BufferInfo::QueryBuffer)
      return false;
    if(!(messageType & Message::Quit))
      return false;

    if(myNetworkId != msgNetworkId)
      return false;

    uint messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value<QDateTime>().toTime_t();
    QString quiter = sourceModel()->data(sourceIdx, Qt::DisplayRole).toString().section(' ', 0, 0, QString::SectionSkipEmpty).toLower();
    if(quiter != bufferName().toLower())
      return false;

    if(_filteredQuitMsgs.contains(quiter, messageTimestamp))
      return false;

    MessageFilter *that = const_cast<MessageFilter *>(this);
    that->_filteredQuitMsgs.insert(quiter,  messageTimestamp);
    return true;
  }
}
bool ConsoleCommandParserMessageTo::performParsing (const NetworkId & /*userId*/, const StringVector_t & argv, const String_t & /* originalMessage */, String_t & result, const CommandParser *)
{
	if (isCommand( argv [0], "viewLastKnownLocations"))
	{
		result += Unicode::narrowToWide(MessageToQueue::getInstance().debugGetLastKnownLocations());
		result += getErrorMessage(argv[0], ERR_SUCCESS);
	}
	if (isCommand( argv [0], "viewScheduler"))
	{
		char temp[256];
		snprintf(temp,sizeof(temp),"Current time is %li\n",ServerClock::getInstance().getGameTimeSeconds());
		result += Unicode::narrowToWide(temp);
		result += Unicode::narrowToWide(MessageToQueue::getInstance().debugGetSchedulerData());
		result += getErrorMessage(argv[0], ERR_SUCCESS);
	}
	if (isCommand( argv [0], "listMessages"))
	{
		NetworkId networkId(Unicode::wideToNarrow (argv[1]));
		ServerObject const * const object = safe_cast<ServerObject const *>(NetworkIdManager::getObjectById(networkId));
		if (object)
		{
			char temp[256];
			snprintf(temp,sizeof(temp),"Current time is %li\n",ServerClock::getInstance().getGameTimeSeconds());
			result += Unicode::narrowToWide(temp);
			result += Unicode::narrowToWide(object->debugGetMessageToList());
			result += getErrorMessage(argv[0], ERR_SUCCESS);
		}
		else
			result += getErrorMessage(argv[0],ERR_INVALID_OBJECT);
	}
	if (isCommand( argv [0], "cancelMessage"))
	{
		NetworkId networkId(Unicode::wideToNarrow (argv[1]));
		std::string message(Unicode::wideToNarrow (argv[2]));
		ServerObject * const object = safe_cast<ServerObject *>(NetworkIdManager::getObjectById(networkId));
		if (object)
		{
			char buffer[255];
			snprintf(buffer,sizeof(buffer)-1,"%i messages cancelled\n", object->cancelMessageTo(message));
			buffer[sizeof(buffer)-1]='\0';
			result += Unicode::narrowToWide(buffer);
			result += getErrorMessage(argv[0], ERR_SUCCESS);
		}
		else
			result += getErrorMessage(argv[0],ERR_INVALID_OBJECT);
	}
	if (isCommand( argv [0], "cancelMessageById"))
	{
		NetworkId networkId(Unicode::wideToNarrow (argv[1]));
		NetworkId messageId(Unicode::wideToNarrow (argv[2]));
		ServerObject * const object = safe_cast<ServerObject *>(NetworkIdManager::getObjectById(networkId));
		if (object)
		{
			char buffer[255];
			snprintf(buffer,sizeof(buffer)-1,"%i messages cancelled\n", object->cancelMessageToByMessageId(messageId));
			buffer[sizeof(buffer)-1]='\0';
			result += Unicode::narrowToWide(buffer);
			result += getErrorMessage(argv[0], ERR_SUCCESS);
		}
		else
			result += getErrorMessage(argv[0],ERR_INVALID_OBJECT);
	}

	return true;
}
Ejemplo n.º 3
0
bool MessageFilter::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const
{
    Q_UNUSED(sourceParent);
    QModelIndex sourceIdx = sourceModel()->index(sourceRow, 2);
    Message::Type messageType = (Message::Type)sourceIdx.data(MessageModel::TypeRole).toInt();

    // apply message type filter
    if (_messageTypeFilter & messageType)
        return false;

    if (_validBuffers.isEmpty())
        return true;

    BufferId bufferId = sourceIdx.data(MessageModel::BufferIdRole).value<BufferId>();
    if (!bufferId.isValid()) {
        return true;
    }

    // MsgId msgId = sourceIdx.data(MessageModel::MsgIdRole).value<MsgId>();
    Message::Flags flags = (Message::Flags)sourceIdx.data(MessageModel::FlagsRole).toInt();

    NetworkId myNetworkId = networkId();
    NetworkId msgNetworkId = Client::networkModel()->networkId(bufferId);
    if (myNetworkId != msgNetworkId)
        return false;

    // ignorelist handling
    // only match if message is not flagged as server msg
    if (!(flags & Message::ServerMsg) && Client::ignoreListManager()
        && Client::ignoreListManager()->match(sourceIdx.data(MessageModel::MessageRole).value<Message>(),
                                              Client::networkModel()->networkName(bufferId)))
        return false;

    if (flags & Message::Redirected) {
        int redirectionTarget = 0;
        switch (messageType) {
        case Message::Notice:
            if (Client::networkModel()->bufferType(bufferId) != BufferInfo::ChannelBuffer) {
                if (flags & Message::ServerMsg) {
                    // server notice
                    redirectionTarget = _serverNoticesTarget;
                }
                else {
                    redirectionTarget = _userNoticesTarget;
                }
            }
            break;
        case Message::Error:
            redirectionTarget = _errorMsgsTarget;
            break;
        default:
            break;
        }

        if (redirectionTarget & BufferSettings::DefaultBuffer && _validBuffers.contains(bufferId))
            return true;

        if (redirectionTarget & BufferSettings::CurrentBuffer && !(flags & Message::Backlog)) {
            BufferId redirectedTo = sourceModel()->data(sourceIdx, MessageModel::RedirectedToRole).value<BufferId>();
            if (!redirectedTo.isValid()) {
                BufferId redirectedTo = Client::bufferModel()->currentIndex().data(NetworkModel::BufferIdRole).value<BufferId>();
                if (redirectedTo.isValid())
                    sourceModel()->setData(sourceIdx, QVariant::fromValue<BufferId>(redirectedTo), MessageModel::RedirectedToRole);
            }

            if (_validBuffers.contains(redirectedTo))
                return true;
        }

        if (redirectionTarget & BufferSettings::StatusBuffer) {
            QSet<BufferId>::const_iterator idIter = _validBuffers.constBegin();
            while (idIter != _validBuffers.constEnd()) {
                if (Client::networkModel()->bufferType(*idIter) == BufferInfo::StatusBuffer)
                    return true;
                ++idIter;
            }
        }

        return false;
    }

    if (_validBuffers.contains(bufferId)) {
        return true;
    }
    else {
        // show Quit messages in Query buffers:
        if (bufferType() != BufferInfo::QueryBuffer)
            return false;
        if (!(messageType & Message::Quit))
            return false;

        if (myNetworkId != msgNetworkId)
            return false;

        // Extract timestamp and nickname from the new quit message
        qint64 messageTimestamp = sourceModel()->data(sourceIdx, MessageModel::TimestampRole).value<QDateTime>().toMSecsSinceEpoch();
        QString quiter = nickFromMask(sourceModel()->data(sourceIdx, MessageModel::MessageRole).value<Message>().sender()).toLower();

        // Check that nickname matches query name
        if (quiter != bufferName().toLower())
            return false;

        // Check if a quit message was already forwarded within +/- 1000 ms
        static constexpr qint64 MAX_QUIT_DELTA_MS = 1 * 1000;
        // No need to check if it's the appropriate buffer, each query has a unique message filter
        if (std::binary_search(_filteredQuitMsgTime.begin(), _filteredQuitMsgTime.end(), messageTimestamp, [](qint64 a, qint64 b) {
                return ((a + MAX_QUIT_DELTA_MS) < b);
            })) {
            // New element is less than if at least 1000 ms older/newer
            // Match found, no need to forward another quit message
            return false;
        }

        // Mark query as having a quit message inserted
        auto* that = const_cast<MessageFilter*>(this);
        that->_filteredQuitMsgTime.insert(messageTimestamp);
        return true;
    }
}