Commit graph

13 commits

Author SHA1 Message Date
Blake Oliver
bf19688cbe
DOn't dismiss the keyboard after sending a message 2026-04-10 01:12:35 -06:00
Blake Oliver
ec36a403c7
Copy fastlanes from another project: bump minor major patch and build number, git ignore fastlane artifacts 2026-04-10 01:10:11 -06:00
Blake Oliver
60e7b27ab6
Add CHANGELOG to document the various testflight and appstore notes 2026-04-10 01:09:12 -06:00
Blake Oliver
9f58a6cc67
Remove alpha channel from app icon to allow for testflight upload 2026-04-09 01:48:33 -06:00
Blake Oliver
5a7fa843fd
Add app distribution detection and bump remoteFormEvent method ID
- Add `AppDistribution` enum to `AppInfo.swift` that detects simulator,
  development, TestFlight, Ad Hoc, and App Store builds at runtime
- Display distribution type in the settings footer version label
- Bump `remoteFormEvent` server method ID from 20 to 21 (comment range
  updated to 9..20 accordingly)

This fixes the client to work with the game server again and allows it to determine the install
method.
2026-04-09 01:20:32 -06:00
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