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; }
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; } }