DiscordId.cs 2.9 KB

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