diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index f2fb2c938..54725a432 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -75,7 +75,6 @@ namespace BlackCore this); connect(m_network, &INetwork::connectionStatusChanged, this, &CContextNetwork::onFsdConnectionStatusChanged); connect(m_network, &INetwork::kicked, this, &CContextNetwork::kicked); - connect(m_network, &INetwork::textMessagesReceived, this, &CContextNetwork::textMessagesReceived); connect(m_network, &INetwork::textMessagesReceived, this, &CContextNetwork::onTextMessagesReceived, Qt::QueuedConnection); connect(m_network, &INetwork::textMessageSent, this, &CContextNetwork::textMessageSent); @@ -631,6 +630,17 @@ namespace BlackCore emit this->connectionStatusChanged(from, to); } + void CContextNetwork::createRelayMessageToPartnerCallsign(const CTextMessage &textMessage, const CCallsign &partnerCallsign, CTextMessageList &relayedMessages) + { + if (textMessage.isEmpty()) { return; } + if (partnerCallsign.isEmpty()) { return; } + if (textMessage.getSenderCallsign() == partnerCallsign) { return; } // no round trips + + CTextMessage modified(textMessage); + modified.makeRelayedMessage(partnerCallsign); + relayedMessages.push_back(modified); + } + void CContextNetwork::xCtxSimulatorRenderRestrictionsChanged(bool restricted, bool enabled, int maxAircraft, const CLength &maxRenderedDistance) { // mainly passing changed restrictions from simulator to network @@ -667,13 +677,39 @@ namespace BlackCore void CContextNetwork::onTextMessagesReceived(const CTextMessageList &messages) { - if (messages.containsPrivateMessages()) + const CTextMessageList textMessages = messages.withRelayedToPrivateMessages(); + emit this->textMessagesReceived(textMessages); + + if (textMessages.containsPrivateMessages()) { - CTextMessageList supMessages(messages.getSupervisorMessages()); + const CTextMessageList supMessages(messages.getSupervisorMessages()); for (const CTextMessage &m : supMessages) { emit this->supervisorTextMessageReceived(m); } + + // part to send to partner "forward" + if (m_network && !m_network->getPresetPartnerCallsign().isEmpty()) + { + const CCallsign partnerCallsign = m_network->getPresetPartnerCallsign(); + + // IMPORTANT: use messages AND NOT textMessages here, exclude messages from partner to avoid infinite roundtrips + CTextMessageList relayedMessages; + const CTextMessageList privateMessages = messages.getPrivateMessages().withRemovedPrivateMessagesFromCallsign(partnerCallsign); + for (const CTextMessage &m : privateMessages) + { + this->createRelayMessageToPartnerCallsign(m, partnerCallsign, relayedMessages); + } + + if (!relayedMessages.isEmpty()) + { + QPointer myself(this); + QTimer::singleShot(10, this, [ = ] + { + if (myself) { myself->sendTextMessages(relayedMessages); } + }); + } + } // relay to partner } } diff --git a/src/blackcore/context/contextnetworkimpl.h b/src/blackcore/context/contextnetworkimpl.h index cb3e766a3..72679eadb 100644 --- a/src/blackcore/context/contextnetworkimpl.h +++ b/src/blackcore/context/contextnetworkimpl.h @@ -319,6 +319,9 @@ namespace BlackCore //! Connection status changed void onFsdConnectionStatusChanged(BlackCore::INetwork::ConnectionStatus from, BlackCore::INetwork::ConnectionStatus to); + //! Relay to partner callsign + void createRelayMessageToPartnerCallsign(const BlackMisc::Network::CTextMessage &textMessage, const BlackMisc::Aviation::CCallsign &partnerCallsign, BlackMisc::Network::CTextMessageList &relayedMessages); + //! Render restrictions have been changed, used with analyzer //! \sa CAirspaceAnalyzer //! \ingroup crosscontextfunction diff --git a/src/blackcore/vatsim/networkvatlib.cpp b/src/blackcore/vatsim/networkvatlib.cpp index f20c43fab..b5dc484a8 100644 --- a/src/blackcore/vatsim/networkvatlib.cpp +++ b/src/blackcore/vatsim/networkvatlib.cpp @@ -600,11 +600,16 @@ namespace BlackCore if (messages.isEmpty()) { return; } CTextMessageList privateMessages = messages.getPrivateMessages(); privateMessages.markAsSent(); - for (const auto &message : as_const(privateMessages)) + for (const CTextMessage &message : as_const(privateMessages)) { if (message.getRecipientCallsign().isEmpty()) { continue; } Vat_SendTextMessage(m_net.data(), toFSD(message.getRecipientCallsign()), toFSD(message.getMessage())); - emit this->textMessageSent(message); + + if (!message.isRelayedMessage()) + { + // this is the normal scenario, but relayed messages will NOT emit + emit this->textMessageSent(message); + } // statistics this->increaseStatisticsValue(QStringLiteral("Vat_SendTextMessage")); @@ -613,7 +618,7 @@ namespace BlackCore CTextMessageList radioMessages = messages.getRadioMessages(); radioMessages.markAsSent(); QVector freqsVec; - for (const auto &message : radioMessages) + for (const CTextMessage &message : radioMessages) { // I could send the same message to n frequencies in one step // if this is really required, I need to group by message