From 368f14cc074113520aea5fcdc57921deba001175 Mon Sep 17 00:00:00 2001 From: Jordan Sherer Date: Fri, 1 Feb 2019 03:08:47 -0500 Subject: [PATCH] Added ability to relay MSG and MSG TO commands --- mainwindow.cpp | 90 +++++++++++++++++++++++++++++--------------------- varicode.cpp | 2 +- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 510c2a7..4e867af 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1351,9 +1351,13 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, } } else { - CallDetail cd = {}; - cd.call = callsign; - m_callActivity[callsign] = cd; + if(Varicode::isValidCallsign(callsign, nullptr)){ + CallDetail cd = {}; + cd.call = callsign; + m_callActivity[callsign] = cd; + } else { + MessageBox::critical_message (this, QString("%1 is not a valid callsign or group").arg(callsign)); + } } displayActivity(true); @@ -9731,8 +9735,11 @@ void MainWindow::processCommandActivity() { continue; } - // and mark the offset as a directed offset so future free text is displayed - // markOffsetDirected(ad.freq, isAllCall); + + // HACK: if this is an autoreply cmd and relay path is populated and cmd is not MSG or MSG TO:, then swap out the relay path + if(Varicode::isCommandAutoreply(d.cmd) && !d.relayPath.isEmpty() && !d.cmd.startsWith(" MSG")){ + d.from = d.relayPath; + } // construct a reply, if needed QString reply; @@ -9852,7 +9859,7 @@ void MainWindow::processCommandActivity() { reply = QString("%1 ACK").arg(d.relayPath); // check to see if the relay text contains a command that should be replied to instead of an ack. - auto relayedCmds = d.text.split(" "); + QStringList relayedCmds = d.text.split(" "); if(!relayedCmds.isEmpty()){ auto first = relayedCmds.first(); @@ -9860,6 +9867,21 @@ void MainWindow::processCommandActivity() { if(!valid){ first = " " + first; valid = Varicode::isCommandAllowed(first); + if(valid){ + relayedCmds.removeFirst(); + } + } + + // HACK: "MSG TO:" should be supported but contains a space :( + if(!relayedCmds.isEmpty() && first == " MSG"){ + auto second = relayedCmds.first(); + if(second == "TO:"){ + first = " MSG TO:"; + relayedCmds.removeFirst(); + } else if(second.startsWith("TO:")){ + first = " MSG TO:"; + relayedCmds.replace(0, second.mid(3)); + } } if(valid && Varicode::isCommandAutoreply(first)){ @@ -9867,8 +9889,9 @@ void MainWindow::processCommandActivity() { rd.bits = d.bits; rd.cmd = first; rd.freq = d.freq; - rd.from = d.relayPath; // is this correct? - rd.text = d.text; + rd.from = d.from; + rd.relayPath = d.relayPath; + rd.text = relayedCmds.join(" "); //d.text; rd.to = d.to; rd.utcTimestamp = d.utcTimestamp; @@ -9900,7 +9923,12 @@ void MainWindow::processCommandActivity() { } auto to = segs.first(); - auto text = d.text.mid(to.length()).trimmed(); + segs.removeFirst(); + + auto text = segs.join(" ").trimmed(); + + auto calls = parseRelayPathCallsigns(d.from, text); + d.relayPath = calls.join(">"); CommandDetail cd = {}; cd.bits = d.bits; @@ -9920,7 +9948,8 @@ void MainWindow::processCommandActivity() { addCommandToInboxStorage("STORE", cd); - reply = QString("%1 ACK").arg(d.from); + // we haven't replaced the from with the relay path, so we have to use it for the ack if there is one + reply = QString("%1 ACK").arg(calls.length() > 1 ? d.relayPath : d.from); } // PROCESS AGN @@ -9950,27 +9979,11 @@ void MainWindow::processCommandActivity() { } // PROCESS MSG - else if (d.cmd == " MSG"){ + else if (d.cmd == " MSG" && !isAllCall){ - auto segs = d.text.split(" "); - if(segs.isEmpty()){ - continue; - } + auto text = d.text; - bool ok = false; - auto mid = segs.first().toInt(&ok); - if(!ok){ - continue; - } - - segs.removeFirst(); - if(segs.isEmpty()){ - continue; - } - - auto text = segs.join(" "); - - qDebug() << "adding message" << mid << "to inbox" << text; + qDebug() << "adding message to inbox" << text; auto calls = parseRelayPathCallsigns(d.from, text); @@ -9980,12 +9993,12 @@ void MainWindow::processCommandActivity() { addCommandToMyInbox(d); - // make sure this is explicit - continue; + // we haven't replaced the from with the relay path, so we have to use it for the ack if there is one + reply = QString("%1 ACK").arg(calls.length() > 1 ? d.relayPath : d.from); } // PROCESS ACKS - else if (d.cmd == " ACK"){ + else if (d.cmd == " ACK" && !isAllCall){ qDebug() << "skipping incoming ack" << d.text; // make sure this is explicit @@ -9993,7 +10006,7 @@ void MainWindow::processCommandActivity() { } // PROCESS BUFFERED CMD - else if (d.cmd == " CMD"){ + else if (d.cmd == " CMD" && !isAllCall){ qDebug() << "skipping incoming command" << d.text; // make sure this is explicit @@ -10001,7 +10014,7 @@ void MainWindow::processCommandActivity() { } // PROCESS BUFFERED QUERY - else if (d.cmd == " QUERY"){ + else if (d.cmd == " QUERY" && !isAllCall){ auto who = d.from; QStringList segs = d.text.split(" "); @@ -10031,7 +10044,9 @@ void MainWindow::processCommandActivity() { } auto from = params.value("FROM").toString().trimmed(); - if(from != who){ + + auto to = params.value("TO").toString().trimmed(); + if(to != who){ continue; } @@ -10045,9 +10060,8 @@ void MainWindow::processCommandActivity() { inbox.set(mid, msg); // and reply - reply = QString("%1 MSG %2 %3 DE %4"); + reply = QString("%1 MSG %2 DE %3"); reply = reply.arg(who); - reply = reply.arg(mid); reply = reply.arg(text); reply = reply.arg(from); } @@ -10119,7 +10133,7 @@ void MainWindow::processCommandActivity() { } // PROCESS BUFFERED HEARING - else if (d.cmd == " HEARING"){ + else if (d.cmd == " HEARING" && !isAllCall){ auto calls = Varicode::parseCallsigns(d.text); foreach(auto call, calls){ logHeardGraph(d.from, call); diff --git a/varicode.cpp b/varicode.cpp index 576e7f2..5678cda 100644 --- a/varicode.cpp +++ b/varicode.cpp @@ -106,7 +106,7 @@ QMap directed_cmds = { QSet allowed_cmds = {-1, 0, /*1,*/ /*2,*/ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; // commands that result in an autoreply (which can be relayed) -QSet autoreply_cmds = {0, 3, 4, 6, 11, 12, 13, 16, 30}; +QSet autoreply_cmds = {0, 3, 4, 6, 9, 10, 11, 12, 13, 16, 30}; // commands that should be buffered QSet buffered_cmds = {5, 9, 10, 11, 12, 13, 14, 15, 24};