From e358b0e4191b1d3b327eda9ef7c2731424925cb6 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 20 Nov 2023 11:10:56 +0100 Subject: [PATCH] add Pilz.Gaming.Minecraft (generate offline player uuid) --- .../Pilz.Gaming.Minecraft.csproj | 15 +++++++ Pilz.Gaming.Minecraft/Utils.cs | 43 +++++++++++++++++++ Pilz.sln | 14 +++++- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 Pilz.Gaming.Minecraft/Pilz.Gaming.Minecraft.csproj create mode 100644 Pilz.Gaming.Minecraft/Utils.cs diff --git a/Pilz.Gaming.Minecraft/Pilz.Gaming.Minecraft.csproj b/Pilz.Gaming.Minecraft/Pilz.Gaming.Minecraft.csproj new file mode 100644 index 0000000..124e735 --- /dev/null +++ b/Pilz.Gaming.Minecraft/Pilz.Gaming.Minecraft.csproj @@ -0,0 +1,15 @@ + + + + net6.0 + enable + enable + + + + True + 1.yyyy.Mdd.Hmm + 1.2023.1120.1110 + + + diff --git a/Pilz.Gaming.Minecraft/Utils.cs b/Pilz.Gaming.Minecraft/Utils.cs new file mode 100644 index 0000000..e81dcd4 --- /dev/null +++ b/Pilz.Gaming.Minecraft/Utils.cs @@ -0,0 +1,43 @@ +using System.Security.Cryptography; +using System.Text; + +namespace Pilz.Gaming.Minecraft +{ + public static class Utils + { + public static string GetUUID(string value) + { + using var md5 = MD5.Create(); + + //extracted from the java code: + //new GameProfile(UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)), name)); + byte[] data = md5.ComputeHash(Encoding.ASCII.GetBytes(value)); + //set the version to 3 -> Name based md5 hash + data[6] = Convert.ToByte(data[6] & 0x0f | 0x30); + //IETF variant + data[8] = Convert.ToByte(data[8] & 0x3f | 0x80); + + //example: 069a79f4-44e9-4726-a5be-fca90e38aaf5 + var striped = Convert.ToHexString(data); + var components = new string[] { + striped[..].Remove(8), + striped[8..].Remove(4), + striped[12..].Remove(4), + striped[16..].Remove(4), + striped[20..] + }; + + return string.Join('-', components).ToLower(); + } + + public static string GetPlayerUUID(string username, bool offlineMode) + { + using var md5 = MD5.Create(); + + if (!offlineMode) + throw new NotSupportedException("Getting player's online UUID via the Mojang API is not supported at this time."); + + return GetUUID("OfflinePlayer:" + username); + } + } +} diff --git a/Pilz.sln b/Pilz.sln index c05cbc6..0337e07 100644 --- a/Pilz.sln +++ b/Pilz.sln @@ -37,9 +37,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pilz.UI.Telerik", "Pilz.UI. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pilz.Networking.CloudProviders.Nextcloud", "Pilz.Networking.CloudProviders.Nextcloud\Pilz.Networking.CloudProviders.Nextcloud.csproj", "{A91E966B-3A82-4F32-A703-2FC1C7654FD1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pilz.Plugins", "Pilz.Plugins\Pilz.Plugins.csproj", "{1170FCA6-192D-42FE-A79F-49EE03035554}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pilz.Plugins", "Pilz.Plugins\Pilz.Plugins.csproj", "{1170FCA6-192D-42FE-A79F-49EE03035554}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pilz.Plugins.Advanced", "Pilz.Plugins.Advanced\Pilz.Plugins.Advanced.csproj", "{72153EC8-B297-4A94-80AA-3574544BE8CF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pilz.Plugins.Advanced", "Pilz.Plugins.Advanced\Pilz.Plugins.Advanced.csproj", "{72153EC8-B297-4A94-80AA-3574544BE8CF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pilz.Gaming.Minecraft", "Pilz.Gaming.Minecraft\Pilz.Gaming.Minecraft.csproj", "{B285DA24-39C9-4BA2-AF3D-A1A05737268B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -201,6 +203,14 @@ Global {72153EC8-B297-4A94-80AA-3574544BE8CF}.Release|Any CPU.Build.0 = Release|Any CPU {72153EC8-B297-4A94-80AA-3574544BE8CF}.Release|x86.ActiveCfg = Release|Any CPU {72153EC8-B297-4A94-80AA-3574544BE8CF}.Release|x86.Build.0 = Release|Any CPU + {B285DA24-39C9-4BA2-AF3D-A1A05737268B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B285DA24-39C9-4BA2-AF3D-A1A05737268B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B285DA24-39C9-4BA2-AF3D-A1A05737268B}.Debug|x86.ActiveCfg = Debug|Any CPU + {B285DA24-39C9-4BA2-AF3D-A1A05737268B}.Debug|x86.Build.0 = Debug|Any CPU + {B285DA24-39C9-4BA2-AF3D-A1A05737268B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B285DA24-39C9-4BA2-AF3D-A1A05737268B}.Release|Any CPU.Build.0 = Release|Any CPU + {B285DA24-39C9-4BA2-AF3D-A1A05737268B}.Release|x86.ActiveCfg = Release|Any CPU + {B285DA24-39C9-4BA2-AF3D-A1A05737268B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE