Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions docs/features/F2.4-messaging.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# F2.4 Messaging

Status: draft, for 0.5.0 ([#192](https://github.com/APRS-NET/AprsMap/issues/192)). Built on APRS.NET's
`AprsNet.Messaging` (G10, in `0.4.0-alpha.2`).
Status: built for 0.5.0 ([#192](https://github.com/APRS-NET/AprsMap/issues/192)), on APRS.NET's
`AprsNet.Messaging` (G10, in `0.4.0-alpha.2`). The Messages panel docks beside Details; Send message is in a station's
details; unread messages show in the status bar.

## User story

Expand Down
2 changes: 1 addition & 1 deletion docs/scope.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ milestone ([0.3.0-alpha.1](https://github.com/APRS-NET/AprsMap/milestone/1), don
| F2.1 | Own station ([spec](features/F2.1-own-station.md)): callsign, SSID guidance, symbol, comment, passcode, transmit enable and safety interlocks, Send position now; Disable TX per profile, TX enabled and Test send per source, RF through KISS TNCs | SSID, Passcode, Why Won't APRSIS Transmit | App | G01, G02, G13 | built (0.5.0, [#190](https://github.com/APRS-NET/AprsMap/issues/190)) |
| F2.2 | Fixed and SmartBeaconing-style position beacons, status beacons, PHG; **Send via** checkmarks per beacon over the sources that may transmit (F2.1), all ticked by default | PHG | App | G01, G11 | scoped (0.5.0, [#196](https://github.com/APRS-NET/AprsMap/issues/196)) |
| F2.3 | Predictive beaconing indicator: show where others last saw you versus where you are (our own name for the feature) | Red Dot | App | G11 | scoped (0.6.0, [#197](https://github.com/APRS-NET/AprsMap/issues/197)) |
| F2.4 | Messaging ([spec](features/F2.4-messaging.md)): chat per correspondent, ack/retry status, reply-ack, rejects, offline queue, selectable retry profiles (default, APRS-IS, none, slow HF modem), optional double-ack on RF; **Send via** per thread: Automatic (RF to a correspondent heard on a TNC recently, APRS-IS otherwise, falling back to APRS-IS when RF retries go unacked), or chosen sources; acks go back on the source the message came in on | APRS Messaging Explained | App | G01, G10 | spec'd (0.5.0, [#192](https://github.com/APRS-NET/AprsMap/issues/192)) |
| F2.4 | Messaging ([spec](features/F2.4-messaging.md)): chat per correspondent, ack/retry status, reply-ack, rejects, offline queue, selectable retry profiles (default, APRS-IS, none, slow HF modem), optional double-ack on RF; **Send via** per thread: Automatic (RF to a correspondent heard on a TNC recently, APRS-IS otherwise, falling back to APRS-IS when RF retries go unacked), or chosen sources; acks go back on the source the message came in on | APRS Messaging Explained | App | G01, G10 | built (0.5.0, [#192](https://github.com/APRS-NET/AprsMap/issues/192)) |
| F2.5 | Bulletins and announcements, group bulletins; ANSRVR group join and leave; Send via checkmarks as for beacons | ANSRVR | App | G10 | scoped (0.5.0, [#193](https://github.com/APRS-NET/AprsMap/issues/193)) |
| F2.6 | Email via the APRS email gateway, and the QRU/query service helpers | Email, QRU | App | G10 | scoped (0.6.0, [#201](https://github.com/APRS-NET/AprsMap/issues/201)) |
| F2.7 | Objects and items: create, move, re-beacon with decay, kill; multiline objects | Multiline | App | G01, G11 | scoped (0.6.0, [#199](https://github.com/APRS-NET/AprsMap/issues/199)) |
Expand Down
18 changes: 18 additions & 0 deletions src/AprsMap.Core/Messenger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,24 @@ .. _messages
);
})
.OrderByDescending(c => c.Last?.At),
// Started, with Send via or retries chosen, before the first message.
.. _conversations
.Keys.Where(k =>
!_messages.Any(m => string.Equals(m.Correspondent, k, StringComparison.OrdinalIgnoreCase))
)
.Select(k =>
{
var (via, retries) = Settings(k);
var route = PlanRoute(k, via);
return new Conversation(
k,
0,
null,
via,
retries,
route is null ? null : string.Join(", ", route.SourceIds.Select(NameOf))
);
}),
];
}
}
Expand Down
100 changes: 100 additions & 0 deletions src/AprsMap.UI/Localization/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,106 @@ Start the gateway (for example with docker compose up), then open the app from t
<value>Details</value>
<comment>Panel title: details of the selected station.</comment>
</data>
<data name="Shell.Panel.messages" xml:space="preserve">
<value>Messages</value>
<comment>Panel title: conversations with other stations.</comment>
</data>
<data name="Messages.NewCallsign" xml:space="preserve">
<value>Message a callsign</value>
</data>
<data name="Messages.Start" xml:space="preserve">
<value>Start</value>
<comment>Opens a conversation with the callsign typed.</comment>
</data>
<data name="Messages.Conversations" xml:space="preserve">
<value>Conversations</value>
</data>
<data name="Messages.NoMessagesYet" xml:space="preserve">
<value>No messages yet</value>
</data>
<data name="Messages.ConversationSpoken" xml:space="preserve">
<value>{station}, {unread, plural, =0 {no unread messages} one {# unread} other {# unread}}: {last}</value>
</data>
<data name="Messages.Compose" xml:space="preserve">
<value>Write a message</value>
</data>
<data name="Messages.ComposeCount" xml:space="preserve">
<value>{messages, plural, one {# message} other {# messages}} · {length} of 300</value>
</data>
<data name="Messages.Send" xml:space="preserve">
<value>Send</value>
</data>
<data name="Messages.Cancel" xml:space="preserve">
<value>Cancel</value>
<comment>Stops sending a message.</comment>
</data>
<data name="Messages.SendAgain" xml:space="preserve">
<value>Send again</value>
</data>
<data name="Messages.Route" xml:space="preserve">
<value>Send via {sources}</value>
<comment>sources: where the next message goes, such as "Direwolf" or "rotate.aprs2.net".</comment>
</data>
<data name="Messages.RouteNone" xml:space="preserve">
<value>Send via: nothing can send now, so messages wait</value>
</data>
<data name="Messages.Automatic" xml:space="preserve">
<value>Automatic</value>
</data>
<data name="Messages.Automatic.Help" xml:space="preserve">
<value>Over RF to a station your TNC heard in the last 30 minutes, over APRS-IS otherwise, and once more over APRS-IS if RF goes unanswered.</value>
</data>
<data name="Messages.RetriesLabel" xml:space="preserve">
<value>Retries</value>
</data>
<data name="Messages.Retries.Automatic" xml:space="preserve">
<value>Automatic</value>
</data>
<data name="Messages.Retries.Default" xml:space="preserve">
<value>RF (6 tries over 23 minutes)</value>
</data>
<data name="Messages.Retries.AprsIs" xml:space="preserve">
<value>APRS-IS (4 tries over 13 minutes)</value>
</data>
<data name="Messages.Retries.SlowHf" xml:space="preserve">
<value>Slow HF modem (5 tries over 46 minutes)</value>
</data>
<data name="Messages.Retries.None" xml:space="preserve">
<value>Send once</value>
</data>
<data name="Messages.State.Received" xml:space="preserve">
<value>Received</value>
</data>
<data name="Messages.State.NotAcknowledged" xml:space="preserve">
<value>Not acknowledged: transmitting is off</value>
</data>
<data name="Messages.State.Queued" xml:space="preserve">
<value>Waiting to send</value>
</data>
<data name="Messages.State.Sent" xml:space="preserve">
<value>Sent</value>
</data>
<data name="Messages.State.Retrying" xml:space="preserve">
<value>Sent again, try {try} of {of}</value>
</data>
<data name="Messages.State.Delivered" xml:space="preserve">
<value>Delivered</value>
</data>
<data name="Messages.State.Rejected" xml:space="preserve">
<value>Rejected by the station</value>
</data>
<data name="Messages.State.Failed" xml:space="preserve">
<value>Not delivered</value>
</data>
<data name="Messages.State.Cancelled" xml:space="preserve">
<value>Cancelled</value>
</data>
<data name="Messages.UnreadMarker" xml:space="preserve">
<value>{count, plural, one {# new message} other {# new messages}}</value>
</data>
<data name="Details.SendMessage" xml:space="preserve">
<value>Send message</value>
</data>
<data name="Shell.Panel.packets" xml:space="preserve">
<value>Packets</value>
<comment>Panel title: the live list of received packets.</comment>
Expand Down
Loading
Loading