From c660b3e620de241c1158d08edaf0a99028364977 Mon Sep 17 00:00:00 2001 From: Rory& Date: Sat, 16 Aug 2025 00:17:33 +0200 Subject: Some cleanup, further room builder work --- LibMatrix/StructuredData/UserId.cs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 LibMatrix/StructuredData/UserId.cs (limited to 'LibMatrix/StructuredData/UserId.cs') diff --git a/LibMatrix/StructuredData/UserId.cs b/LibMatrix/StructuredData/UserId.cs new file mode 100644 index 0000000..02b2e91 --- /dev/null +++ b/LibMatrix/StructuredData/UserId.cs @@ -0,0 +1,27 @@ +namespace LibMatrix.StructuredData; + +public class UserId { + public required string ServerName { get; set; } + public required string LocalPart { get; set; } + + public static UserId Parse(string mxid) { + if (!mxid.StartsWith('@')) throw new ArgumentException("Matrix User IDs must start with '@'", nameof(mxid)); + var parts = mxid.Split(':', 2); + if (parts.Length != 2) throw new ArgumentException($"Invalid MXID '{mxid}' passed! MXIDs must exist of only 2 parts!", nameof(mxid)); + return new UserId { + LocalPart = parts[0][1..], + ServerName = parts[1] + }; + } + + public static implicit operator UserId(string mxid) => Parse(mxid); + public static implicit operator string(UserId mxid) => $"@{mxid.LocalPart}:{mxid.ServerName}"; + public static implicit operator (string, string)(UserId mxid) => (mxid.LocalPart, mxid.ServerName); + public static implicit operator UserId((string localPart, string serverName) mxid) => (mxid.localPart, mxid.serverName); + // public override string ToString() => $"mxc://{ServerName}/{MediaId}"; + + public void Deconstruct(out string serverName, out string localPart) { + serverName = ServerName; + localPart = LocalPart; + } +} \ No newline at end of file -- cgit 1.5.1