Ref T703, sending and receiving of relayed text messages

* turn relayed messages into normal messages
* avoid signals for relayed messaged
* relay received messages to partner (co-pilot)
This commit is contained in:
Klaus Basan
2019-08-17 20:59:38 +02:00
committed by Mat Sutcliffe
parent 0a372edef6
commit a583def040
3 changed files with 50 additions and 6 deletions

View File

@@ -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<CContextNetwork> myself(this);
QTimer::singleShot(10, this, [ = ]
{
if (myself) { myself->sendTextMessages(relayedMessages); }
});
}
} // relay to partner
}
}

View File

@@ -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

View File

@@ -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<int> 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