mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-31 12:55:33 +08:00
Ref T761, relay original sender AND recipient
* display sent messages of partner callsing as send by myself * allow PMs from partner as normal PMs
This commit is contained in:
committed by
Mat Sutcliffe
parent
a54f804cf1
commit
64b17b787c
@@ -711,8 +711,34 @@ namespace BlackCore
|
||||
|
||||
void CContextNetwork::onTextMessagesReceived(const CTextMessageList &messages)
|
||||
{
|
||||
const CTextMessageList textMessages = messages.withRelayedToPrivateMessages();
|
||||
emit this->textMessagesReceived(textMessages); // relayed messaged "now look like PMs"
|
||||
if (messages.isEmpty()) { return; }
|
||||
|
||||
const CCallsign partnerCallsign = this->getPartnerCallsign();
|
||||
const CCallsign ownCallsign = this->ownAircraft().getCallsign();
|
||||
|
||||
CTextMessageList textMessages = messages.withRelayedToPrivateMessages();
|
||||
CTextMessageList partnerMessages;
|
||||
|
||||
if (!partnerCallsign.isEmpty())
|
||||
{
|
||||
partnerMessages = textMessages.findBySender(partnerCallsign);
|
||||
const CTextMessageList relayedSentMessages = partnerMessages.findByNotForRecipient(ownCallsign).markedAsSent();
|
||||
partnerMessages = partnerMessages.findByRecipient(ownCallsign); // really send to me as PM and not a forwared one
|
||||
|
||||
// avoid infinite rountrips
|
||||
textMessages = textMessages.withRemovedPrivateMessagesFromCallsign(partnerCallsign);
|
||||
|
||||
// fake those as sent by myself
|
||||
for (const CTextMessage &rsm : relayedSentMessages)
|
||||
{
|
||||
emit this->textMessageSent(rsm);
|
||||
}
|
||||
}
|
||||
|
||||
// 1) relayed messaged "now look like PMs"
|
||||
// 2) all messaged of partner are EXCLUDED
|
||||
if (!textMessages.isEmpty()) { emit this->textMessagesReceived(textMessages); }
|
||||
if (!partnerMessages.isEmpty()) { emit this->textMessagesReceived(partnerMessages); }
|
||||
|
||||
if (textMessages.containsPrivateMessages())
|
||||
{
|
||||
@@ -722,13 +748,12 @@ namespace BlackCore
|
||||
emit this->supervisorTextMessageReceived(m);
|
||||
}
|
||||
|
||||
// part to send to partner "forward"
|
||||
const CCallsign partnerCallsign = this->getPartnerCallsign();
|
||||
// part to send to partner, "forward/relay" to partner
|
||||
if (!partnerCallsign.isEmpty())
|
||||
{
|
||||
// IMPORTANT: use messages AND NOT textMessages here, exclude messages from partner to avoid infinite roundtrips
|
||||
// IMPORTANT: partner messages already received
|
||||
CTextMessageList relayedMessages;
|
||||
const CTextMessageList privateMessages = messages.getPrivateMessages().withRemovedPrivateMessagesFromCallsign(partnerCallsign);
|
||||
const CTextMessageList privateMessages = messages.getPrivateMessages();
|
||||
for (const CTextMessage &m : privateMessages)
|
||||
{
|
||||
this->createRelayMessageToPartnerCallsign(m, partnerCallsign, relayedMessages);
|
||||
@@ -753,8 +778,9 @@ namespace BlackCore
|
||||
|
||||
if (message.isPrivateMessage())
|
||||
{
|
||||
// forward messages which are NO real PMs tp the partner
|
||||
const CCallsign partnerCallsign = this->getPartnerCallsign();
|
||||
if (!partnerCallsign.isEmpty())
|
||||
if (!partnerCallsign.isEmpty() && message.getRecipientCallsign() != partnerCallsign)
|
||||
{
|
||||
QPointer<CContextNetwork> myself(this);
|
||||
CTextMessageList relayedMessages;
|
||||
|
||||
@@ -82,11 +82,12 @@ namespace BlackMisc
|
||||
void CTextMessage::makeRelayedMessage(const CCallsign &partnerCallsign)
|
||||
{
|
||||
if (this->getMessage().startsWith(CTextMessage::swiftRelayMessage())) { return; }
|
||||
const QString sender = this->getSenderCallsign().asString();
|
||||
const QString recipient = this->getRecipientCallsign().asString();
|
||||
this->markAsRelayedMessage();
|
||||
this->setRecipientCallsign(partnerCallsign);
|
||||
m_recipientCallsign.setTypeHint(CCallsign::Aircraft);
|
||||
const QString sender = this->getSenderCallsign().asString();
|
||||
const QString newMessage = CTextMessage::swiftRelayMessage() % sender % u";" % this->getMessage();
|
||||
const QString newMessage = CTextMessage::swiftRelayMessage() % sender % u" " % recipient % u";" % this->getMessage();
|
||||
m_message = newMessage;
|
||||
}
|
||||
|
||||
@@ -96,8 +97,13 @@ namespace BlackMisc
|
||||
const int index = m_message.indexOf(';');
|
||||
if (index < CTextMessage::swiftRelayMessage().length()) { return false; }
|
||||
if (m_message.length() <= index + 1) { return false; } // no next line
|
||||
const QString originalSender = m_message.left(index).remove(CTextMessage::swiftRelayMessage()).trimmed();
|
||||
this->setSenderCallsign(CCallsign(originalSender)); // sender can be aircraft or ATC
|
||||
const QString senderRecipient = m_message.left(index).remove(CTextMessage::swiftRelayMessage()).trimmed();
|
||||
const QStringList sr = senderRecipient.split(' ');
|
||||
if (sr.size() != 2) { return false; }
|
||||
const QString originalSender = sr.first();
|
||||
const QString originalRecipient = sr.last();
|
||||
this->setSenderCallsign(CCallsign(originalSender)); // sender can be aircraft or ATC
|
||||
this->setRecipientCallsign(CCallsign(originalRecipient)); // recipient can be aircraft or ATC
|
||||
m_message = m_message.mid(index + 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -97,6 +97,31 @@ namespace BlackMisc
|
||||
return this->findBy(&CTextMessage::getFrequency, frequency);
|
||||
}
|
||||
|
||||
CTextMessageList CTextMessageList::findBySender(const CCallsign &sender) const
|
||||
{
|
||||
return this->findBy(&CTextMessage::getSenderCallsign, sender);
|
||||
}
|
||||
|
||||
CTextMessageList CTextMessageList::findByRecipient(const CCallsign &recipient) const
|
||||
{
|
||||
return this->findBy(&CTextMessage::getRecipientCallsign, recipient);
|
||||
}
|
||||
|
||||
CTextMessageList CTextMessageList::findByNotForRecipient(const CCallsign &recipient) const
|
||||
{
|
||||
CTextMessageList result;
|
||||
if (recipient.isEmpty()) { return result; }
|
||||
for (const CTextMessage &m : *this)
|
||||
{
|
||||
if (m.getRecipientCallsign().isEmpty()) { continue; }
|
||||
if (m.getRecipientCallsign() != recipient)
|
||||
{
|
||||
result.push_back(m);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void CTextMessageList::toggleSenderRecipients()
|
||||
{
|
||||
if (this->isEmpty()) { return; }
|
||||
|
||||
@@ -82,6 +82,15 @@ namespace BlackMisc
|
||||
//! Find by frequency
|
||||
CTextMessageList findByFrequency(const PhysicalQuantities::CFrequency &frequency) const;
|
||||
|
||||
//! Find by sender
|
||||
CTextMessageList findBySender(const BlackMisc::Aviation::CCallsign &sender) const;
|
||||
|
||||
//! Find by recipient
|
||||
CTextMessageList findByRecipient(const BlackMisc::Aviation::CCallsign &recipient) const;
|
||||
|
||||
//! Find by recipient is NOT addressed
|
||||
CTextMessageList findByNotForRecipient(const BlackMisc::Aviation::CCallsign &recipient) const;
|
||||
|
||||
//! Toggle all sender <-> recipients
|
||||
void toggleSenderRecipients();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user