Přidejte soubory projektu.
parent
e88e0d8699
commit
c82247f383
|
@ -0,0 +1,13 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.4.33205.214
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lib_MCPlayerStats", "Lib_MCPlayerStats.csproj", "{D09C0088-FF5D-42AA-A790-8415AB21E11A}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D09C0088-FF5D-42AA-A790-8415AB21E11A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D09C0088-FF5D-42AA-A790-8415AB21E11A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D09C0088-FF5D-42AA-A790-8415AB21E11A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D09C0088-FF5D-42AA-A790-8415AB21E11A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {5DCEC488-14AC-4868-A2F5-048BB8B934D8}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,24 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Lib_MCPlayerStats
|
||||
{
|
||||
internal class MojangApi
|
||||
{
|
||||
public string? id;
|
||||
public string? name;
|
||||
public Cape? properties;
|
||||
}
|
||||
|
||||
internal class Cape
|
||||
{
|
||||
public string? name;
|
||||
public string? value;
|
||||
public string? signature;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Lib_MCPlayerStats
|
||||
{
|
||||
public class Player_Stats
|
||||
{
|
||||
public SortedList<string, int>? picked_up;
|
||||
|
||||
|
||||
public SortedList<string, int>? mined;
|
||||
|
||||
|
||||
public SortedList<string, int>? crafted;
|
||||
|
||||
|
||||
public SortedList<string, int>? broken;
|
||||
|
||||
|
||||
public SortedList<string, int>? killed;
|
||||
|
||||
|
||||
public SortedList<string, int>? dropped;
|
||||
|
||||
|
||||
public SortedList<string, int>? custom;
|
||||
|
||||
|
||||
public SortedList<string, int>? used;
|
||||
|
||||
|
||||
public SortedList<string, int>? killed_by;
|
||||
|
||||
public string? Username;
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
using Newtonsoft.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Lib_MCPlayerStats
|
||||
{
|
||||
public class PlayersStats
|
||||
{
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Load player Stats from file
|
||||
/// </summary>
|
||||
/// <param name="file">File path</param>
|
||||
/// <returns></returns>
|
||||
public static Task<Player_Stats> LoadPlayerAsync(string file)
|
||||
{
|
||||
Player_Stats player = new();
|
||||
|
||||
if (!File.Exists(file))
|
||||
{
|
||||
player.Username = "File not Exist";
|
||||
return Task.FromResult(player); //If Deserialized object is null return empty stats object with ErrorMessage in Username
|
||||
}
|
||||
|
||||
Stats_Internal? loaded = JsonConvert.DeserializeObject<Stats_Internal>(File.ReadAllText(file)); //Desearialize Stats file to internal object
|
||||
|
||||
if (loaded == null)
|
||||
{
|
||||
player.Username = "Deserialized object is null";
|
||||
return Task.FromResult(player); //If Deserialized object is null return empty stats object with ErrorMessage in Username
|
||||
}
|
||||
|
||||
player.Username = GetNameByUUID(file.Split(@"/").Last().Replace("-", "").Replace(".json", ""));
|
||||
|
||||
//Move data from loaded stats to object with username
|
||||
player.picked_up = loaded.stats.picked_up;
|
||||
player.mined = loaded.stats.mined;
|
||||
player.crafted = loaded.stats.crafted;
|
||||
player.broken = loaded.stats.broken;
|
||||
player.killed = loaded.stats.killed;
|
||||
player.dropped = loaded.stats.dropped;
|
||||
player.custom = loaded.stats.custom;
|
||||
player.used = loaded.stats.used;
|
||||
player.killed_by = loaded.stats.killed_by;
|
||||
|
||||
return Task.FromResult(player); //Return object with player Stats
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load all player stats from files in folder
|
||||
/// </summary>
|
||||
/// <param name="folder">Folder path</param>
|
||||
/// <returns></returns>
|
||||
public static async Task<List<Player_Stats>> LoadPlayersAsync(string folder)
|
||||
{
|
||||
List<Player_Stats> stats = new();
|
||||
|
||||
foreach (string file in Directory.GetFiles(folder))
|
||||
{
|
||||
if (file.EndsWith(".json"))
|
||||
{
|
||||
stats.Add(await LoadPlayerAsync(file));
|
||||
}
|
||||
}
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Get Username from UUID by Mojang Api
|
||||
/// </summary>
|
||||
/// <param name="UUID"></param>
|
||||
/// <returns></returns>
|
||||
private static string GetNameByUUID(string UUID)
|
||||
{
|
||||
HttpClient client = new();
|
||||
MojangApi? data = null;
|
||||
|
||||
HttpResponseMessage response = client.GetAsync($"https://sessionserver.mojang.com/session/minecraft/profile/{UUID}").Result;
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
#pragma warning disable CS8604
|
||||
data = JsonConvert.DeserializeObject<MojangApi>(response.Content.ToString());
|
||||
#pragma warning restore CS8604
|
||||
}
|
||||
|
||||
if (data == null)
|
||||
return UUID;
|
||||
|
||||
#pragma warning disable CS8603
|
||||
return data.name;
|
||||
#pragma warning restore CS8603
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Lib_MCPlayerStats
|
||||
{
|
||||
internal class Stats_Internal
|
||||
{
|
||||
#pragma warning disable CS8618 // Pole, které nemůže být null, musí při ukončování konstruktoru obsahovat hodnotu, která není null. Zvažte možnost deklarovat ho jako pole s možnou hodnotou null.
|
||||
public Stats stats;
|
||||
#pragma warning restore CS8618 // Pole, které nemůže být null, musí při ukončování konstruktoru obsahovat hodnotu, která není null. Zvažte možnost deklarovat ho jako pole s možnou hodnotou null.
|
||||
|
||||
public int DataVersion;
|
||||
}
|
||||
|
||||
internal class Stats
|
||||
{
|
||||
|
||||
public SortedList<string, int>? picked_up;
|
||||
|
||||
|
||||
public SortedList<string, int>? mined;
|
||||
|
||||
|
||||
public SortedList<string, int>? crafted;
|
||||
|
||||
|
||||
public SortedList<string, int>? broken;
|
||||
|
||||
|
||||
public SortedList<string, int>? killed;
|
||||
|
||||
|
||||
public SortedList<string, int>? dropped;
|
||||
|
||||
|
||||
public SortedList<string, int>? custom;
|
||||
|
||||
|
||||
public SortedList<string, int>? used;
|
||||
|
||||
|
||||
public SortedList<string, int>? killed_by;
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue