Skip to content

feat(messaging): a conversation per ANSRVR group - #442

Merged
gx1400 merged 1 commit into
mainfrom
feat/ansrvr-group-conversations
Oct 28, 2026
Merged

gx1400 merged 1 commit into
mainfrom
feat/ansrvr-group-conversations

Conversation

@gx1400

@gx1400 gx1400 commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Uses APRS.NET 0.7.0-alpha.3 (#443, merged).

Closes #285.

Unblocked by capturing an ANSRVR relay, receive-only, on APRS-IS on 2026-10-27: a member of group NEDR posted, and ANSRVR relayed it to two members.

N1KXJ-14>APSTKA,TCPIP*,qAS,N1KXJ-W3::ANSRVR   :CQ NEDR Pretty quiet ot here...{9W      ← post
N1KXJ-14>APWW11,qAO,KJ4ERJ-15::N1KXJ-10 :N:NEDR Pretty quiet ot here...                 ← relay
N1KXJ-14>APWW11,qAO,KJ4ERJ-15::N1KXJ-7  :N:NEDR Pretty quiet ot here...                 ← relay
ANSRVR>APWW11,KJ4ERJ-15*,TCPIP*,qAS,KJ4ERJ-15::N1KXJ-14 :N:NEDR 2 Messages Sent{HV}     ← notice
  • What a relay looks like:
    • It comes in the posting member's name, not ANSRVR's, injected by ANSRVR's host (APWW11,qAO,KJ4ERJ-15).
    • Its text is N:<GROUP> <text>.
    • It has no message ID.
  • Why October's tests saw nothing (probably): our posting station was itself logged in to APRS-IS. A relay in its name arriving through another connection looks like a loop, and servers drop such packets. That's unconfirmed, and it's noted in the spec as a caveat for stations that post while logged in directly.

What's built

  • Recognition: APRS.NET's AnsrvrMessage (0.7.0-alpha.3, APRS.NET#281), built from this capture. A relay is N:<GROUP> … with no message ID from a member; a notice is the same from ANSRVR. Only joined groups' traffic goes to a group conversation.
    • Other N: messages stay ordinary, including a typed one with a message ID.
  • Contract: ChatMessage.Group, Conversation.Group, Conversation.ForGroup("NEDR") = #NEDR, and Conversation.GroupOf.
  • Messenger:
    • Group traffic is filed under #<GROUP>, from the member who posted, with the prefix taken off.
    • It's never acked (it has no ID), never treated as a ping, and never answered by the away reply.
    • Joined groups have conversations before their first message, with ANSRVR's route.
    • MarkRead("#NEDR") covers the group's messages.
  • Sending: SendMessageAsync("#NEDR", text) posts to the group (CQ NEDR text to ANSRVR). The post is tagged with its group, so it shows in that conversation.
  • Messages panel: groups by the same key, shows the joined groups' conversations (also right after joining from Bulletins), puts each received message's sender above it, and shows our posts without their CQ <GROUP>.
  • Docs: F2.5 (the status line and behavior 9, as built) and gap G34.

Verified

  • Release build and all tests pass; csharpier is clean.
  • Engine test with the captured lines:
    • A join creates #NEDR.
    • The relay lands in it, from N1KXJ-14, with its text, and isn't acked or answered. ANSRVR's notice lands there too.
    • N:OTHER from a non-member stays an ordinary message.
    • Writing in #NEDR sends CQ NEDR Hello NEDR to ANSRVR.
    • Mark read clears the conversation's unread count.
  • UI test: a joined group's conversation from the start, then relay, notice and post, each with the right sender and text.
  • A screenshot is in the session.

History

  • The capture was posted to APRS.NET#281, and APRS.NET shipped AnsrvrMessage in 0.7.0-alpha.3 the same day, so this PR uses it directly. There's no shim here.

@gx1400
gx1400 force-pushed the feat/ansrvr-group-conversations branch from c4b62f5 to cbb570c Compare October 27, 2026 18:57
@gx1400
gx1400 changed the base branch from main to fix/deps-aprsnet-0.7.0-alpha.3 October 27, 2026 18:57
Base automatically changed from fix/deps-aprsnet-0.7.0-alpha.3 to main October 27, 2026 23:49
@gx1400
gx1400 force-pushed the feat/ansrvr-group-conversations branch from cbb570c to 5f9d3af Compare October 28, 2026 00:21
- A joined group has a conversation in Messages, #<GROUP>, from the moment it's joined.
- It holds each member's post relayed by ANSRVR, with the member's callsign; ANSRVR's notices about the group; and
  this station's posts, without their CQ <GROUP>. Writing in it posts to the group.
- APRS.NET's AnsrvrMessage (0.7.0-alpha.3, APRS.NET#281) recognises the traffic. A relay comes in the posting
  member's name as N:<GROUP> <text>, with no message ID; a notice comes from ANSRVR.
- Only joined groups' traffic goes to a group conversation. It's never treated as a ping or answered by the away
  reply. Any other N: message, including one typed with a message ID, stays an ordinary message.

Closes #285
@github-actions

Copy link
Copy Markdown
Contributor

Package report

Vulnerable packages

No known vulnerabilities in direct or transitive packages.

Available package updates

Package Current version Available version Note
xunit.runner.visualstudio 3.1.5 4.0.1 Pinned in AprsMap.UI.Tests (see below)
xunit.v3.mtp-off 3.2.2 4.0.2 Pinned in AprsMap.UI.Tests (see below)

Pinned versions

These projects override the central version in Directory.Packages.props on purpose; updates for them are held back until the reason no longer applies.

Package Pinned version Project Reason
xunit.runner.visualstudio 3.1.5 AprsMap.UI.Tests Avalonia.Headless.XUnit 12.1 is built against xUnit v3 3.x and fails test discovery under 4.x (missing TestIntrospectionHelper overload). Pin this project only until Avalonia supports v4; see dependabot.yml.
xunit.v3.mtp-off 3.2.2 AprsMap.UI.Tests Avalonia.Headless.XUnit 12.1 is built against xUnit v3 3.x and fails test discovery under 4.x (missing TestIntrospectionHelper overload). Pin this project only until Avalonia supports v4; see dependabot.yml.

Checked at f42dc89 against nuget.org.

@gx1400
gx1400 force-pushed the feat/ansrvr-group-conversations branch from 5f9d3af to cf73d10 Compare October 28, 2026 00:23
@gx1400
gx1400 merged commit fcca60c into main Oct 28, 2026
12 checks passed
@gx1400
gx1400 deleted the feat/ansrvr-group-conversations branch October 28, 2026 02:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

F2.5 A conversation per ANSRVR group

1 participant