feat: playable among friends (client/server config + chat throttle) #24

Merged
marco merged 1 commit from feat/playable-among-friends into main 2026-07-17 13:28:11 +02:00
Owner

Summary

Makes IsoMmo playable among friends: connection config on the client, server config for reachability/content, and pre-exposure hardening (chat rate-limiting).

  • Client config (config.json next to the exe): the client assumes nothing — no file -> empty template + a "No server configured" screen with the path; no localhost default. Debug builds drop a localhost config into the output so dev just works; Release never does.
  • Server: both bind 0.0.0.0; Game:ContentRoot overrides where the map is read (default = next to exe); Game:ChatMinIntervalMs (750).
  • Chat rate-limiting (ChatRateLimiter, per player, sanitize-then-throttle) — resolves the accepted tech debt.
  • Docs: docs/deploy.md (server config, public reverse-proxy + TLS example, open-registration caveat) and docs/protocol.md (client<->server overview stub). Tech-debt list updated.

How it was tested

Unit tests: ClientConfigTests (load/create/malformed/unconfigured), ChatRateLimiterTests (accept/reject/window). Full suite green (just test), just lint clean, zero warnings.

Notes for review

  • Public + open registration was chosen deliberately (friends server); the caveat + invite-gating follow-up are documented (see tech debt / #deploy).
  • Follow-ups opened: study issue #23 (DB vs binary snapshots for world state).

Checklist

  • just lint passes
  • just test green
  • Whole solution builds
  • Multi-platform preserved
  • Tests added
## Summary Makes IsoMmo playable among friends: connection config on the client, server config for reachability/content, and pre-exposure hardening (chat rate-limiting). - **Client config** (`config.json` next to the exe): the client assumes nothing — no file -> empty template + a "No server configured" screen with the path; no localhost default. Debug builds drop a localhost config into the output so dev just works; Release never does. - **Server**: both bind `0.0.0.0`; `Game:ContentRoot` overrides where the map is read (default = next to exe); `Game:ChatMinIntervalMs` (750). - **Chat rate-limiting** (`ChatRateLimiter`, per player, sanitize-then-throttle) — resolves the accepted tech debt. - **Docs**: `docs/deploy.md` (server config, public reverse-proxy + TLS example, open-registration caveat) and `docs/protocol.md` (client<->server overview stub). Tech-debt list updated. ## How it was tested Unit tests: `ClientConfigTests` (load/create/malformed/unconfigured), `ChatRateLimiterTests` (accept/reject/window). Full suite green (`just test`), `just lint` clean, zero warnings. ## Notes for review - Public + open registration was chosen deliberately (friends server); the caveat + invite-gating follow-up are documented (see tech debt / #deploy). - Follow-ups opened: study issue #23 (DB vs binary snapshots for world state). ## Checklist - [x] `just lint` passes - [x] `just test` green - [x] Whole solution builds - [x] Multi-platform preserved - [x] Tests added
feat: playable among friends — client config, server config, chat throttle
All checks were successful
ci / Lint & Test (pull_request) Successful in 1m24s
9df965bc9f
Client reads config.json next to the executable and assumes nothing: no file -> empty
template + 'configure the server' on the login screen (no localhost default). Debug
builds drop a localhost config for dev. Servers bind 0.0.0.0 and gain configurable
content root; add per-player chat rate-limiting (ChatRateLimiter, ~1 msg/750ms,
sanitize-then-throttle). Docs: deploy.md (server config, public reverse-proxy+TLS,
open-registration caveat) and protocol.md (client<->server overview). Tech-debt updated.
marco merged commit 6e35ea0ac9 into main 2026-07-17 13:28:11 +02:00
marco deleted branch feat/playable-among-friends 2026-07-17 13:28:11 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
marco/IsoMmo!24
No description provided.