Commit graph

8 commits

Author SHA1 Message Date
Blake Oliver
25bb6d1b54
Add Announce Background Messages setting and descriptive footers
- New "Announce Background Messages" toggle in Accessibility section (off by default) — VoiceOver announces messages from non-active buffers when enabled
- Rename "Other Buffers" to "Background Buffer Sounds" in Sounds section
- Add footer descriptions to Save Debug Buffer, Background Buffer Sounds, Status Haptics, and Announce Background Messages
2026-04-05 20:12:16 -06:00
Blake Oliver
0e36f8b5ff
Add .claude and .pi with swift data pro skill and xcode mcp allows 2026-04-05 18:52:28 -06:00
Blake Oliver
8a39e5939f
Add swiftData message persistence and reactive side effects
Persistence:
- SavedMessage SwiftData model with index on [buffer, timestamp]
- @Query in ChatBufferView/DMListView/DMConversationView — SwiftData is the single source of truth, no in-memory dictionary
- Settings: Save Messages toggle, Save Debug Buffer toggle, Delete After picker (1d/1w/1m/1y/never), Delete All with confirmation dialog
- Expired and debug messages purged on launch based on settings
- Say messages go to debug buffer only (not all buffers)

Reactive side effects:
- Sound, haptic, and VoiceOver announcement all fire from ChatBufferView's onChange(of: messages.count)
- Sound plays for active buffer or background buffers if enabled
- Haptic and announcement fire on active buffer only, current session only (I'll add a toggle to announce other buffers next)
- Status haptic for Say messages stays imperative in model (global event, not per-buffer)
- Removed trigger counters and lastAnnouncement from ConnectionManager

DM conversation fix:
- Track DM recipient via lastDMRecipientId; tag outgoing echoes with partner ID in characterId
- Conversation view filters on characterId == partnerId (shows only that conversation)

Other:
- modelContext set in ContentView.onAppear (available for all screens)
- Instant scroll (no animation), respects Reduce Motion
2026-04-05 18:46:38 -06:00
Blake Oliver
c9865cda15
Add minimal README 2026-04-05 09:18:45 -06:00
Blake Oliver
18f2326ba8
Add website link to settings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 09:13:03 -06:00
Blake Oliver
26182ec8d0
Character switching, entity ID capture, and UI fixes
- Switch Character now works: send LeaveGame, then re-send LoginRequest with cached token to trigger account screen
- Capture player entity ID from LoadInstance packet to identify own messages and enable LeaveGame
- Fix MsgPackValue Decodable to handle MessagePack timestamp extension types (Date)
- ListBox uses button-based rows instead of Picker (server expects click events, not selection changes)
- Dynamic nav title per buffer tab (Kirandur Global Chat, Map Chat, etc.)
- App icon on login screen via separate Logo image asset
- AsyncStream buffering set to unbounded
2026-04-05 09:11:02 -06:00
Blake Oliver
f9c751a993
Chat sounds, message card UI, own-message detection, and crash fix
Sounds:
- Add chat sounds (global, map, DM) converted from game client ogg to caf
- Audio category .ambient (mixes with other audio, respects silent switch)
- Per-buffer sound toggles and background buffer sound option in Settings

Messages:
- Card-style message rows with .regularMaterial background, bumped fonts (content .title3, sender .headline)
- Context menu and VoiceOver actions: DM and Show Profile on other players' messages
- Generate local UUIDs for message identity (server ID field is not unique, caused ForEach to collapse messages)

Own-message detection:
- Capture player entity ID from LoadInstance packet (Key 1) on game join
- Hide DM/Profile actions on own messages via senderId comparison

Crash fix:
- Guard all UInt64 timestamp subtractions against underflow (retransmitPending, ping, disconnect timeout)
2026-04-05 08:15:31 -06:00
Blake Oliver
2d3fefa013
Initial commit of KDChat
This is an iOS chat client for Kirandur, a multiplayer RPG. Reimplements the LiteNetLib UDP protocol in Swift for reliable ordered messaging. Renders server-driven UI via a RemoteForms widget system for login, character creation and more inside the client.

Uses msgpack-swift for serialization, Keychain for credentials, and targets iOS 18.6+/Xcode 26+.

No message persistence yet. No auto-reconnect. Game-specific packets (movement, combat, etc.) are silently ignored.
No profile viewing yet.

Assisted by Claude Code (Opus 4.6)
2026-04-05 07:11:07 -06:00