This is in response to
https://osu.ppy.sh/community/forums/topics/2058708?n=5, wherein the user
is having a problem with joining multiplayer, but I have basically no
diagnosing capabilities, because the logs are all
2025-03-26 18:57:57 [error]: Failed to join multiplayer room:
2025-03-26 18:58:40 [error]: Failed to join multiplayer room:
2025-03-26 18:58:41 [error]: Failed to join multiplayer room:
2025-03-26 18:58:41 [error]: Failed to join multiplayer room:
which appears to originate from
https://github.com/ppy/osu/blob/c82eaafe98d96b9f49a4a7f168ef5c484e67d76f/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerLoungeSubScreen.cs#L91
Now, as far as I can tell, there are two possibilities here:
1. The exception's `Message` is null or empty. That's not exactly great
or typical, but sure, this could possibly happen - in which case the
error logging is silently eating whatever little relevant detail
there is left to use.
2. The exception is *actually* `null` itself, and we're in the X Files.
This PR is intending to defend against (1).
In examining the logging further, I also spotted the following issues:
- In the single path that specifies a custom failure handler (which is
`DrawableLoungeRoom` which handles joining a passworded room), the
custom failure handler being present means that the error would be
presented to the user, but it would not be logged. At all.
- In playlists, if the exception for whatever reason had an empty
message, an empty notification would get posted. And in general to me
it feels a bit dodgy to be directly presenting exception notifications
to users without any preamble, hence the added "Failed to open
playlist" prefix.
Addresses
https://github.com/ppy/osu/discussions/32568#discussioncomment-12610577.
No changes in criteria (yet?), just allowing locally imported plays to
count the same way as full beatmap completion does.
The test scene is a bit rough / semi-manual but dealing with score
imports is a bit of a pain in general. The way to semi-manually test
with the test scene is to import a subset of scores, then recreate the
statistics panel, and observe behaviour. I'm not sure it's worth it to
be putting subscriptions in there, so the full recreation of the panel
is necessary.
Removes storage of `selectedBeatmap` that was referenced through
multiple class-level methods.
To expound a bit, this structure felt better (or otherwise passing
`APIBeatmap` through methods) alongside removal of the `#nullable
disable`, otherwise each method would check `selectedBeatmap != null`.
- Changed copy of the multiplayer spectator activity to be
ruleset-agnostic, thus I guess closing
https://github.com/ppy/osu/issues/32307 maybe? There is still the
ruleset icon in discord RPC but that one is taken from the game-global
ruleset so it's a bit more involved to fix.
- Added new activities for daily challenge screens, therefore partially
addressing https://github.com/ppy/osu/discussions/29200. I didn't add
skin editor because (a) it's not easy to make work because skin editor
isn't a screen and (b) I'm not sure we want that to begin with? Kind
of a weird one.
I've tested backwards compatibility; old server will raise exceptions
that then will be logged as unobserved by the clients when receiving the
new statuses, and an old client, when given one of the new statuses by a
new server, seems to completely ignore it. Seems pretty acceptable to
me.