Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extract leaderboard fetch logic from song select beatmap leaderboard drawable #32494

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

bdach
Copy link
Collaborator

@bdach bdach commented Mar 21, 2025

RFC. Another attempt at this.

This is a weird diff because I am feeling rather boxed in by all the constraints, namely that:

  • Leaderboard state should be global state
  • But the global state is essentially managed by song select and namely BeatmapLeaderboard itself. That's because trying to e.g. not have BeatmapLeaderboard pass the beatmap and the ruleset to the global leaderboard manager is worse, as it essentially introduces two parallel paths of execution that need to be somehow merged into one (as in I'd have to somehow sync LeaderboardManager responding to global beatmap/ruleset changes with BeatmapLeaderboard which is also doing the same via RefetchScores() inheritance hell)
  • Also local leaderboard fetching is data-push (as in the scores can change under the leaderboard manager), and online leaderboard fetching is data-pull (as in the scores do not change unless the leaderboard manager does something). Also online leaderboard fetching can fail. Which is why I need to still have the weird setup wherein there's a FetchWithCriteriaAsync() (because I need to be able to respond to online requests taking time, or failing), but also the BeatmapLeaderboard only uses the public Scores bindable to actually read the scores (because it needs to respond to new local scores arriving).
  • Another thing to think about here is what happens when a retrieval fails because e.g. the user requested friend leaderboards without having supporter. With how this diff is written, that special condition is handled local to BeatmapLeaderboard, and LeaderboardManager's state will remain as whatever it was before that scope change was requested, which may be considered good or it may not (I imagine it's better to show any scores in gameplay than not in this case, but maybe I'm wrong?)

…drawable

RFC. Another attempt at this.

- Supersedes ppy#31881
- Supersedes / closes ppy#31355
- Closes ppy#29861

This is a weird diff because I am feeling rather boxed in by all the
constraints, namely that:

- Leaderboard state should be global state
- But the global state is essentially managed by song select and namely
  `BeatmapLeaderboard` itself. That's because trying to e.g. not have
  `BeatmapLeaderboard` pass the beatmap and the ruleset to the global
  leaderboard manager is worse, as it essentially introduces two
  parallel paths of execution that need to be somehow merged into one
  (as in I'd have to somehow sync `LeaderboardManager` responding to
  beatmap/ruleset changes with `BeatmapLeaderboard` which is inheritance
  hell)
- Also local leaderboard fetching is data-push (as in the scores can
  change under the leaderboard manager), and online leaderboard fetching
  is data-pull (as in the scores do not change unless the leaderboard
  manager does something). Also online leaderboard fetching can fail.
  Which is why I need to still have the weird setup wherein there's a
  `FetchWithCriteriaAsync()` (because I need to be able to respond to
  online requests taking time, or failing), but also the
  `BeatmapLeaderboard` only uses the public `Scores` bindable to
  actually read the scores (because it needs to respond to new local
  scores arriving).
- Another thing to think about here is what happens when a retrieval
  fails because e.g. the user requested friend leaderboards without
  having supporter. With how this diff is written, that special
  condition is handled to `BeatmapLeaderboard`, and
  `LeaderboardManager`'s state will remain as whatever it was before
  that scope change was requested, which may be considered good or it
  may not (I imagine it's better to show scores in gameplay than not in
  this case, but maybe I'm wrong?)
@smoogipoo
Copy link
Contributor

This looks better to me on a brief pass. I'll defer full review to @peppy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Leaderboards do not show when a user goes into gameplay immediately
2 participants