This is a C# implementation of PhigrosLibrary, allowing you to integrate Phigros login workflow and process your scores nicely.
Now available in NuGet!
Note: For .NET 10 and above, you should consider using version 5.0.0 or above (
v5branch, also available in same nuget), this branch holds 4.x.x versions. .NET 8 support will be dropped after reaching EOL.
- Parse the xml and get the key and value string pair, the string should look like
xaHiFItVgoS6CBFNHTR2%2BA%3D%3D - URL decode it using
System.Net.WebUtility.UrlDecode, to get the Base64 string (ex.xaHiFItVgoS6CBFNHTR2+A==) - Decrypt it using static function
LocalSave.DecryptSaveStringNew(string base64EncodedString), there is also a model for score (RawScore, can be converted into a more dev-friendly format by callingToInternalFormatmethod)- Example:
LocalSave.DecryptSaveStringNew("eSB6QJlXU1vwHjVx7kcpb4/jdk9o5j4Wiatn+jrJ+etI2KFMlPDyH8s7I8zM+qlW") - Decrypted score string pair would be something like
MARENOL.LeaF.0.Record.HDand{"s":992580,"a":99.17559051513672,"c":1}. - Note: the PlayerPrefv2.xml also contains other misc data, so you need to pick scores.
- Example:
- Once decrypted, you can do anything to the score data.
Full example code:
public static SongScore ExampleDecryptLocal(string key, string data)
{
string decryptedKey = LocalSave.DecryptSaveStringNew(WebUtility.UrlDecode(key));
string decryptedData = LocalSave.DecryptSaveStringNew(WebUtility.UrlDecode(data));
string[] splitted = decryptedKey.Split(".");
string id = string.Join(".", splitted.Take(3));
return RawScore.FromJson(decryptedData).ToSongScore(id, Enum.Parse<Difficulty>(splitted[^1]));
}
// somewhere else in ur code...
ExampleDecryptLocal(@"Cgw4SttKwRFIjb68TF8z5EC%2FLwVpK8KjKmjcm9T3M78%3D", @"eSB6QJlXU1vwHjVx7kcpb4%2Fjdk9o5j4Wiatn%2BjrJ%2BetI2KFMlPDyH8s7I8zM%2BqlW");Common examples can be found there.
See this for QRCode login example. There is also a callback login implementation, however it is limited since you can only callback to localhost (which means you cannot use this when you are hosting a server like a Discord bot.)
Here is a short example of how to read scores from cloud save:
Save save = new(/* phigros token */, /* is international or not */);
// if you are using it in wasm project then you need to replace the decrypt function since
// aes doesn't work in browser environment:
// save.Decrypter = async (byte[] key, byte[] iv, byte[] data) => { /* your decrypting function here */ };
var context = await save.GetSaveContextAsync(/* save index, 0 for the latest save */);
(List<CompleteScore> Phi3, List<CompleteScore> Other, double RKS) context.ReadGameRecord().GetSortedListForRks(/* difficulty map */, /* name map */); // all scores
context.ReadSummary() // summary info like username, level, etc.
context.ReadGameUserInfo() // in-game user info
// there's also other functions for reading different data, check the documentation for more info.difficulties parameter should be a IReadOnlyDictionary<ChartConstantKey, float>,
the ChartConstantKey would be song id and difficulty combined together, and the float is the chart constants.
Example difficulty value pair: { new ChartConstantKey("Credits.Frums.0", Difficulty.IN), 14.0f }
For more info, please check the common examples.