PhigrosLibraryCSharp 5.0.0
dotnet add package PhigrosLibraryCSharp --version 5.0.0
NuGet\Install-Package PhigrosLibraryCSharp -Version 5.0.0
<PackageReference Include="PhigrosLibraryCSharp" Version="5.0.0" />
<PackageVersion Include="PhigrosLibraryCSharp" Version="5.0.0" />
<PackageReference Include="PhigrosLibraryCSharp" />
paket add PhigrosLibraryCSharp --version 5.0.0
#r "nuget: PhigrosLibraryCSharp, 5.0.0"
#:package PhigrosLibraryCSharp@5.0.0
#addin nuget:?package=PhigrosLibraryCSharp&version=5.0.0
#tool nuget:?package=PhigrosLibraryCSharp&version=5.0.0
PhigrosLibraryCSharp
This is a C# implementation of PhigrosLibrary, allowing you to integrate Phigros login workflow and process your scores nicely.
Now available in NuGet!
API Usage
Local save (Reading from PlayerPrefv2.xml)
- 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. <br/> 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");
Cloud Save
Common examples can be found there.
TapTap integration
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.)
Fetching scores and other user info
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.<br/>
Example difficulty value pair: { new ChartConstantKey("Credits.Frums.0", Difficulty.IN), 14.0f }
For more info, please check the common examples. <br/>
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 5.0.0 | 104 | 6/25/2026 |
| 4.4.1 | 104 | 6/20/2026 |
| 4.4.0 | 122 | 6/9/2026 |
| 4.3.0 | 103 | 5/24/2026 |
| 4.2.0 | 121 | 5/9/2026 |
| 4.1.1 | 102 | 5/9/2026 |
| 4.1.0 | 95 | 5/3/2026 |
| 4.0.0 | 108 | 4/23/2026 |
| 3.1.5 | 103 | 4/19/2026 |
| 3.1.1 | 100 | 4/4/2026 |
| 3.1.0 | 95 | 4/4/2026 |
| 3.0.0 | 105 | 4/4/2026 |
| 2.3.0 | 115 | 4/4/2026 |
| 2.2.0 | 97 | 4/4/2026 |
| 2.1.1 | 98 | 4/4/2026 |
| 2.1.0 | 96 | 4/4/2026 |
| 2.0.0 | 100 | 4/4/2026 |
| 1.3.0 | 102 | 4/4/2026 |
| 1.2.3 | 95 | 4/4/2026 |
| 1.2.2 | 96 | 4/4/2026 |
# 5.0.0
- Bump to .NET 10.
- Replace custom binary serializers with BCL `BinaryReader`/`BinaryWriter`.
- Use short-lived `SocketsHttpHandler`s for static `HttpClient`s to avoid DNS caching/ineffective DNS changes.
- Refactor and add `virtual`/`protected` modifiers to some methods/properties/fields to allow easier subclassing for `Save`.
- Use singleton shared `HttpClient` for `Save` class to avoid socket exhaustion and DNS caching issues.