Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -354,3 +354,5 @@ MigrationBackup/
ScoreSaber/ObfuscationSettings.cs
ScoreSaber/Core/ReplaySystem/Legacy/LegacyRecorder.cs
ScoreSaber/Core/ReplaySystem/Legacy/OldLegacyReplayPlayer.cs

.idea
18 changes: 7 additions & 11 deletions ScoreSaber/Core/Daemons/MockUploadDaemon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,14 @@ public MockUploadDaemon(LeaderboardService leaderboardService, PlayerService pla
}

public void FakeUpload(StandardLevelScenesTransitionSetupDataSO standardLevelScenesTransitionSetupDataSO, LevelCompletionResults levelCompletionResults) {

ProcessUpload(standardLevelScenesTransitionSetupDataSO.gameMode, standardLevelScenesTransitionSetupDataSO.difficultyBeatmap, levelCompletionResults, standardLevelScenesTransitionSetupDataSO.practiceSettings != null);
ProcessUpload(standardLevelScenesTransitionSetupDataSO.gameMode, standardLevelScenesTransitionSetupDataSO.beatmapLevel, standardLevelScenesTransitionSetupDataSO.beatmapKey, levelCompletionResults, standardLevelScenesTransitionSetupDataSO.practiceSettings != null);
}


private void FakeMultiUpload(MultiplayerLevelScenesTransitionSetupDataSO multiplayerLevelScenesTransitionSetupDataSO, MultiplayerResultsData multiplayerResultsData) {

ProcessUpload(multiplayerLevelScenesTransitionSetupDataSO.gameMode, multiplayerLevelScenesTransitionSetupDataSO.difficultyBeatmap, multiplayerResultsData.localPlayerResultData.multiplayerLevelCompletionResults.levelCompletionResults, false);
ProcessUpload(multiplayerLevelScenesTransitionSetupDataSO.gameMode, multiplayerLevelScenesTransitionSetupDataSO.beatmapLevel, multiplayerLevelScenesTransitionSetupDataSO.beatmapKey, multiplayerResultsData.localPlayerResultData.multiplayerLevelCompletionResults.levelCompletionResults, false);
}

private async void ProcessUpload(string gameMode, IDifficultyBeatmap difficultyBeatmap, LevelCompletionResults levelCompletionResults, bool practicing) {
private async void ProcessUpload(string gameMode, BeatmapLevel beatmapLevel, BeatmapKey beatmapKey, LevelCompletionResults levelCompletionResults, bool practicing) {

var practiceViewController = Resources.FindObjectsOfTypeAll<PracticeViewController>().FirstOrDefault();
if (!practiceViewController.isInViewControllerHierarchy) {
Expand All @@ -77,9 +74,8 @@ private async void ProcessUpload(string gameMode, IDifficultyBeatmap difficultyB
return;
}


bool ranked = true;
Leaderboard currentLeaderboard = await _leaderboardService.GetCurrentLeaderboard(difficultyBeatmap);
Leaderboard currentLeaderboard = await _leaderboardService.GetCurrentLeaderboard(beatmapKey);

if (currentLeaderboard != null) {
ranked = currentLeaderboard.leaderboardInfo.ranked;
Expand All @@ -96,23 +92,23 @@ private async void ProcessUpload(string gameMode, IDifficultyBeatmap difficultyB
}

// We good, "upload" the score
WriteReplay(difficultyBeatmap).RunTask();
WriteReplay(beatmapLevel, beatmapKey).RunTask();
}
} else {
// We still want to write a replay to memory if in practice mode
_replayService.WriteSerializedReplay().RunTask();
}
}

public async Task WriteReplay(IDifficultyBeatmap beatmap) {
public async Task WriteReplay(BeatmapLevel beatmapLevel, BeatmapKey beatmapKey) {

uploading = true;
UploadStatusChanged?.Invoke(UploadStatus.Uploading, "Packaging replay...");

byte[] serializedReplay = await _replayService.WriteSerializedReplay();

if (Plugin.Settings.saveLocalReplays) {
string replayPath = $@"{Settings.replayPath}\{_playerService.localPlayerInfo.playerId}-{beatmap.level.songName.ReplaceInvalidChars().Truncate(155)}-{beatmap.difficulty.SerializedName()}-{beatmap.parentDifficultyBeatmapSet.beatmapCharacteristic.serializedName}-{beatmap.level.levelID}.dat";
string replayPath = $@"{Settings.replayPath}\{_playerService.localPlayerInfo.playerId}-{beatmapLevel.songName.ReplaceInvalidChars().Truncate(155)}-{beatmapKey.difficulty.SerializedName()}-{beatmapKey.beatmapCharacteristic.serializedName}-{beatmapLevel.levelID}.dat";
File.WriteAllBytes(replayPath, serializedReplay);
}
uploading = false;
Expand Down
28 changes: 18 additions & 10 deletions ScoreSaber/Core/ReplaySystem/ReplayLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,18 +75,22 @@ await Task.Run(async () => {
overrideEnvironmentSettings: playerData.overrideEnvironmentSettings,
playerOverrideColorScheme: playerData.colorSchemesSettings.GetOverrideColorScheme(),
playerOverrideLightshowColors: playerData.colorSchemesSettings.ShouldOverrideLightshowColors(),
beatmapOverrideColorScheme: beatmapLevel.GetColorScheme(beatmapKey.beatmapCharacteristic, beatmapKey.difficulty),
gameplayModifiers: gameplayModifiers,
playerSpecificSettings: playerSettings,
practiceSettings: null,
environmentsListModel: _environmentsListModel,
backButtonText: "Exit Replay",
useTestNoteCutSoundEffects: false,
startPaused: false,
gameplayAdditionalInformation: new GameplayAdditionalInformation(
backButtonText: "Exit Replay",
useTestNoteCutSoundEffects: false,
startPaused: false,
playmodeOptions: PlaymodeOptions.Default,
recordingRelativePath: null
),
beforeSceneSwitchToGameplayCallback: null,
afterSceneSwitchToGameplayCallback: null,
levelFinishedCallback: ReplayEnd,
levelRestartedCallback: null
levelRestartedCallback: null,
beatmapLevelData: null
);
});
}
Expand Down Expand Up @@ -151,18 +155,22 @@ await Task.Run(async () => {
overrideEnvironmentSettings: playerData.overrideEnvironmentSettings,
playerOverrideColorScheme: playerData.colorSchemesSettings.GetOverrideColorScheme(),
playerOverrideLightshowColors: playerData.colorSchemesSettings.ShouldOverrideLightshowColors(),
beatmapOverrideColorScheme: beatmapLevel.GetColorScheme(beatmapKey.beatmapCharacteristic, beatmapKey.difficulty),
gameplayModifiers: LeaderboardUtils.GetModifierFromStrings(replay.metadata.Modifiers.ToArray(), false).gameplayModifiers,
playerSpecificSettings: playerSettings,
practiceSettings: null,
environmentsListModel: _environmentsListModel,
backButtonText: "Exit Replay",
useTestNoteCutSoundEffects: false,
startPaused: false,
gameplayAdditionalInformation: new GameplayAdditionalInformation(
backButtonText: "Exit Replay",
useTestNoteCutSoundEffects: false,
startPaused: false,
playmodeOptions: PlaymodeOptions.Default,
recordingRelativePath: null
),
beforeSceneSwitchToGameplayCallback: null,
afterSceneSwitchToGameplayCallback: null,
levelFinishedCallback: ReplayEnd,
levelRestartedCallback: null
levelRestartedCallback: null,
beatmapLevelData: null
);
});
}
Expand Down
57 changes: 46 additions & 11 deletions ScoreSaber/Core/Services/PlayerService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using Steamworks;
using System.Reflection;
using UnityEngine;

namespace ScoreSaber.Core.Services {
Expand Down Expand Up @@ -47,30 +50,62 @@ private async Task SignIn() {

ChangeLoginStatus(LoginStatus.InProgress, "Signing into ScoreSaber...");

var platformUserModel = Plugin.Container.TryResolve<IPlatformUserModel>();
var authToken = await platformUserModel.GetUserAuthToken();
var userInfo = await platformUserModel.GetUserInfo(CancellationToken.None);
var userInfo = await BS_Utils.Gameplay.GetUserInfo.GetUserAsync();
var platform = BS_Utils.Gameplay.GetUserInfo.GetPlatformUserModel();

var nonce = string.Empty;
var platform = string.Empty;
var platformString = string.Empty;

switch (userInfo.platform) {
case UserInfo.Platform.Steam:
nonce = authToken.token;
platform = "0";
nonce = await platform.user.GetAccessTokenAsync();
platformString = "0";
break;
case UserInfo.Platform.Oculus:
nonce = authToken.token + "," + (await platformUserModel.RequestXPlatformAccessToken(CancellationToken.None)).token;
platform = "1";
var accessToken = await platform.user.GetAccessTokenAsync();
var xplatformToken = await platform.user.GetXPlatformAccessTokenAsync();
nonce = accessToken + "," + xplatformToken;
platformString = "1";
break;
}

var playerId = userInfo.platformUserId;
var playerName = userInfo.userName;
var friendIds = await platformUserModel.GetUserFriendsUserIds(false);
var friends = string.Join(",", friendIds.Where(x => x != "0"));


var playerInfo = new LocalPlayerInfo(playerId, playerName, friends, platform, nonce);

// Get friends list
var friends = string.Empty;
if (userInfo.platform == UserInfo.Platform.Steam) {
var friendDetailList = new List<string>();
int friendCount = SteamFriends.GetFriendCount(EFriendFlags.k_EFriendFlagAll);
for (int i = 0; i < friendCount; i++) {
CSteamID friendSteamId = SteamFriends.GetFriendByIndex(i, EFriendFlags.k_EFriendFlagAll);
friendDetailList.Add(friendSteamId.ToString());
}
friends = string.Join(",", friendDetailList);
}
else {
// Fallback for non-Steam platforms (e.g., Oculus)
var platformNetworkPlayerModel = Resources.FindObjectsOfTypeAll<PlatformNetworkPlayerModel>().FirstOrDefault();
if (platformNetworkPlayerModel != null) {
var friendIds = new List<string>();
foreach (var friend in platformNetworkPlayerModel.friends) {
var idProperty = friend.GetType().GetProperty("id");
if (idProperty != null) {
var idValue = idProperty.GetValue(friend);
if (idValue != null) {
friendIds.Add(idValue.ToString());
continue;
}
}
friendIds.Add(friend.userId);
}
friends = string.Join(",", friendIds);
}
}

var playerInfo = new LocalPlayerInfo(playerId, playerName, friends, platformString, nonce);

int attempts = 1;

Expand Down
25 changes: 25 additions & 0 deletions ScoreSaber/ScoreSaber.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="BeatSaber.Destinations">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\BeatSaber.Destinations.dll</HintPath>
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="BeatSaber.ViewSystem">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\BeatSaber.ViewSystem.dll</HintPath>
</Reference>
Expand Down Expand Up @@ -90,6 +95,21 @@
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="BeatSaber.Multiplayer.Core">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\BeatSaber.Multiplayer.Core.dll</HintPath>
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="OculusStudios.Platform.Core">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\OculusStudios.Platform.Core.dll</HintPath>
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="com.rlabrecque.steamworks.net">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\com.rlabrecque.steamworks.net.dll</HintPath>
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="SegmentedControl">
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\SegmentedControl.dll</HintPath>
</Reference>
Expand All @@ -101,6 +121,11 @@
<Reference Include="SiraUtil">
<HintPath>$(BeatSaberDir)\Plugins\SiraUtil.dll</HintPath>
</Reference>
<Reference Include="BS_Utils">
<HintPath>$(BeatSaberDir)\Plugins\BS_Utils.dll</HintPath>
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="0Harmony">
<HintPath>$(BeatSaberDir)\Libs\0Harmony.dll</HintPath>
</Reference>
Expand Down
7 changes: 4 additions & 3 deletions ScoreSaber/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@
"$schema": "https://raw.githubusercontent.com/nike4613/ModSaber-MetadataFileSchema/master/Schema.json",
"author": "Umbranox",
"description": "Allows you to upload scores to an online leaderboard, earn PP from ranked maps and compare scores with others.",
"gameVersion": "1.40.9",
"gameVersion": "1.42.2",
"icon": "ScoreSaber.logo.png",
"id": "ScoreSaber",
"name": "ScoreSaber",
"version": "3.3.17",
"version": "3.3.18",
"dependsOn": {
"BSIPA": "^4.3.6",
"BeatSaberMarkupLanguage": "^1.12.0",
"SiraUtil": "^3.1.11",
"SongCore": "^3.16.0"
"SongCore": "^3.16.0",
"BS Utils": "^1.14.3"
},
"links": {
"website": "https://scoresaber.com"
Expand Down