DiscordId.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #nullable enable
  2. using System;
  3. using Jint.Native.Date;
  4. namespace Jint.Tests.Runtime.TestClasses;
  5. public class DiscordTestClass
  6. {
  7. public string Echo(DiscordId id)
  8. {
  9. return id.ToString();
  10. }
  11. public DiscordId Create(uint value)
  12. {
  13. return new DiscordId(value);
  14. }
  15. }
  16. public readonly struct DiscordId : IConvertible, IEquatable<DiscordId>
  17. {
  18. private readonly string? _value;
  19. private string Value => _value ?? "0";
  20. public override string ToString() => Value;
  21. public DiscordId(string s)
  22. {
  23. if (ulong.TryParse(s, out _))
  24. _value = s;
  25. else
  26. throw new FormatException($"{nameof(s)} must consist of decimal digits and cannot be too large");
  27. }
  28. public DiscordId(ulong u)
  29. {
  30. _value = u.ToString();
  31. }
  32. public override bool Equals(object? obj) => obj is DiscordId id && Equals(id);
  33. public bool Equals(DiscordId id) => _value == id._value;
  34. public override int GetHashCode()
  35. {
  36. return Value.GetHashCode();
  37. }
  38. public DateTimeOffset CreatedAt => DateTimeOffset.FromUnixTimeMilliseconds((long)((ulong.Parse(Value) >> 22) + (ulong) (DateConstructor.Epoch.Ticks / 1000)));
  39. TypeCode IConvertible.GetTypeCode() => TypeCode.String;
  40. bool IConvertible.ToBoolean(IFormatProvider? provider) => Convert.ToBoolean(Value, provider);
  41. byte IConvertible.ToByte(IFormatProvider? provider) => Convert.ToByte(Value, provider);
  42. char IConvertible.ToChar(IFormatProvider? provider) => Convert.ToChar(Value, provider);
  43. DateTime IConvertible.ToDateTime(IFormatProvider? provider) => CreatedAt.UtcDateTime;
  44. decimal IConvertible.ToDecimal(IFormatProvider? provider) => Convert.ToDecimal(Value, provider);
  45. double IConvertible.ToDouble(IFormatProvider? provider) => Convert.ToDouble(Value, provider);
  46. short IConvertible.ToInt16(IFormatProvider? provider) => Convert.ToInt16(Value, provider);
  47. int IConvertible.ToInt32(IFormatProvider? provider) => Convert.ToInt32(Value, provider);
  48. long IConvertible.ToInt64(IFormatProvider? provider) => Convert.ToInt64(Value, provider);
  49. sbyte IConvertible.ToSByte(IFormatProvider? provider) => Convert.ToSByte(Value, provider);
  50. float IConvertible.ToSingle(IFormatProvider? provider) => Convert.ToSingle(Value, provider);
  51. string IConvertible.ToString(IFormatProvider? provider) => Value;
  52. object IConvertible.ToType(Type conversionType, IFormatProvider? provider) => Convert.ChangeType(Value, conversionType, provider);
  53. ushort IConvertible.ToUInt16(IFormatProvider? provider) => Convert.ToUInt16(Value, provider);
  54. uint IConvertible.ToUInt32(IFormatProvider? provider) => Convert.ToUInt32(Value, provider);
  55. ulong IConvertible.ToUInt64(IFormatProvider? provider) => Convert.ToUInt64(Value, provider);
  56. public static implicit operator DiscordId(ulong u) => new(u);
  57. public static explicit operator DiscordId(string s) => new(s);
  58. }