Skip to content

feat(discordsh): Phase 4 session persistence for dungeon profiles#8136

Merged
h0lybyte merged 1 commit intodevfrom
trunk/session-persistence-1773704757
Mar 17, 2026
Merged

feat(discordsh): Phase 4 session persistence for dungeon profiles#8136
h0lybyte merged 1 commit intodevfrom
trunk/session-persistence-1773704757

Conversation

@h0lybyte
Copy link
Member

Summary

  • Proto: Added DungeonProfile, DungeonRun, LeaderboardEntry messages, enums (DungeonOutcome, DungeonClass, LeaderboardCategory), and RPC methods to discordsh.proto
  • SQL: New dungeon_profiles + dungeon_runs tables with advisory locks, append-only enforcement trigger, JSONB inventory shape validation, per-category leaderboard queries with deterministic tie-breakers, service functions (service_load_profile, service_upsert_profile, service_leaderboard)
  • Rust: ProfileStore (LRU cache + Supabase PostgREST RPC), death penalty logic (25% XP + 50% run gold on defeat), profile load on /dungeon start and /dungeon join, save on game-over/end/leave/expire, /dungeon leaderboard subcommand

Death Penalty

Outcome Level/XP Gold Inventory Lifetime Stats
Victory Keep all Keep Keep +1 victory
Escaped Keep all Keep Keep +1 escape
Defeated/Expired Keep level, -25% XP -50% run gold Revert to snapshot +1 death

Files Changed

File Change
packages/data/proto/kbve/discordsh.proto Dungeon persistence messages, enums, RPCs
packages/data/sql/schema/discordsh/discordsh_dungeon_profiles.sql NEW — reference schema
packages/data/sql/dbmate/migrations/20260316210000_...sql NEW — migration
apps/discordsh/axum-discordsh/src/discord/game/persistence.rs NEW — ProfileStore + save/load
apps/discordsh/axum-discordsh/src/discord/game/mod.rs Add persistence module
apps/discordsh/axum-discordsh/src/discord/game/types.rs Add saved_snapshot to PlayerState
apps/discordsh/axum-discordsh/src/state.rs Wire ProfileStore into AppState
apps/discordsh/axum-discordsh/src/discord/commands/dungeon.rs Load/save integration + leaderboard
apps/discordsh/axum-discordsh/src/discord/game/router.rs Save on game-over detection
apps/discordsh/axum-discordsh/src/discord/game/session.rs Save on expire cleanup
apps/discordsh/axum-discordsh/src/discord/bot.rs Pass profiles to cleanup task

Test plan

  • cargo test -p axum-discordsh — 675 tests pass (no regressions)
  • Apply migration to local postgres and verify tables/functions
  • Start bot with Supabase env vars, play a dungeon, verify profile persists across sessions
  • Verify leaderboard renders after a few completed runs
  • Verify death penalty: defeated run loses XP/gold, victory keeps all

Closes #8111

🤖 Generated with Claude Code

Add Supabase-backed player persistence so dungeon progress (level, XP,
gold, gear, inventory, quests, lifetime stats) survives across sessions.

Proto: DungeonProfile, DungeonRun, LeaderboardEntry messages + RPCs
SQL: dungeon_profiles + dungeon_runs tables with advisory locks,
     append-only enforcement, JSONB inventory validation, per-category
     leaderboard queries with deterministic tie-breakers
Rust: ProfileStore (LRU cache + PostgREST RPC), death penalty logic
      (25% XP + 50% run gold on defeat), save on game-over/end/leave/expire,
      load on start/join, /dungeon leaderboard subcommand

Closes #8111
@github-actions
Copy link
Contributor

Dependency Review

The following issues were found:
  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 1 package(s) with unknown licenses.
See the Details below.

License Issues

apps/discordsh/axum-discordsh/Cargo.toml

PackageVersionLicenseIssue Type
lru>= 0.16.0, < 0.17.0NullUnknown License

OpenSSF Scorecard

PackageVersionScoreDetails
cargo/lru >= 0.16.0, < 0.17.0 UnknownUnknown

Scanned Files

  • apps/discordsh/axum-discordsh/Cargo.toml

@h0lybyte h0lybyte merged commit c977bc7 into dev Mar 17, 2026
5 checks passed
@h0lybyte h0lybyte deleted the trunk/session-persistence-1773704757 branch March 17, 2026 03:03
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.

1 participant