| @@ -11,11 +11,6 @@ namespace Discord | |||||
| private const long UnixEpochMilliseconds = 62_135_596_800_000; | private const long UnixEpochMilliseconds = 62_135_596_800_000; | ||||
| #endif | #endif | ||||
| public static DateTimeOffset FromSnowflake(ulong value) | |||||
| => FromUnixMilliseconds((long)((value >> 22) + 1420070400000UL)); | |||||
| public static ulong ToSnowflake(DateTimeOffset value) | |||||
| => ((ulong)ToUnixMilliseconds(value) - 1420070400000UL) << 22; | |||||
| public static DateTimeOffset FromTicks(long ticks) | public static DateTimeOffset FromTicks(long ticks) | ||||
| => new DateTimeOffset(ticks, TimeSpan.Zero); | => new DateTimeOffset(ticks, TimeSpan.Zero); | ||||
| public static DateTimeOffset? FromTicks(long? ticks) | public static DateTimeOffset? FromTicks(long? ticks) | ||||
| @@ -185,7 +185,7 @@ namespace Discord | |||||
| // Bulk Delete | // Bulk Delete | ||||
| public static void YoungerThanTwoWeeks(ulong[] collection, string name) | public static void YoungerThanTwoWeeks(ulong[] collection, string name) | ||||
| { | { | ||||
| var minimum = DateTimeUtils.ToSnowflake(DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(14))); | |||||
| var minimum = SnowflakeUtils.ToSnowflake(DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(14))); | |||||
| for (var i = 0; i < collection.Length; i++) | for (var i = 0; i < collection.Length; i++) | ||||
| { | { | ||||
| if (collection[i] <= minimum) | if (collection[i] <= minimum) | ||||
| @@ -0,0 +1,12 @@ | |||||
| using System; | |||||
| namespace Discord | |||||
| { | |||||
| public static class SnowflakeUtils | |||||
| { | |||||
| public static DateTimeOffset FromSnowflake(ulong value) | |||||
| => DateTimeUtils.FromUnixMilliseconds((long)((value >> 22) + 1420070400000UL)); | |||||
| public static ulong ToSnowflake(DateTimeOffset value) | |||||
| => ((ulong)DateTimeUtils.ToUnixMilliseconds(value) - 1420070400000UL) << 22; | |||||
| } | |||||
| } | |||||
| @@ -8,7 +8,7 @@ namespace Discord.Rest | |||||
| { | { | ||||
| public abstract class RestChannel : RestEntity<ulong>, IChannel, IUpdateable | public abstract class RestChannel : RestEntity<ulong>, IChannel, IUpdateable | ||||
| { | { | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| internal RestChannel(BaseDiscordClient discord, ulong id) | internal RestChannel(BaseDiscordClient discord, ulong id) | ||||
| : base(discord, id) | : base(discord, id) | ||||
| @@ -10,7 +10,7 @@ namespace Discord.Rest | |||||
| [DebuggerDisplay(@"{DebuggerDisplay,nq}")] | [DebuggerDisplay(@"{DebuggerDisplay,nq}")] | ||||
| internal class RestVirtualMessageChannel : RestEntity<ulong>, IMessageChannel | internal class RestVirtualMessageChannel : RestEntity<ulong>, IMessageChannel | ||||
| { | { | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public string Mention => MentionUtils.MentionChannel(Id); | public string Mention => MentionUtils.MentionChannel(Id); | ||||
| internal RestVirtualMessageChannel(BaseDiscordClient discord, ulong id) | internal RestVirtualMessageChannel(BaseDiscordClient discord, ulong id) | ||||
| @@ -32,7 +32,7 @@ namespace Discord.Rest | |||||
| public string SplashId { get; private set; } | public string SplashId { get; private set; } | ||||
| internal bool Available { get; private set; } | internal bool Available { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public ulong DefaultChannelId => Id; | public ulong DefaultChannelId => Id; | ||||
| public string IconUrl => CDN.GetGuildIconUrl(Id, IconId); | public string IconUrl => CDN.GetGuildIconUrl(Id, IconId); | ||||
| public string SplashUrl => CDN.GetGuildSplashUrl(Id, SplashId); | public string SplashUrl => CDN.GetGuildSplashUrl(Id, SplashId); | ||||
| @@ -14,7 +14,7 @@ namespace Discord.Rest | |||||
| public bool IsOwner { get; private set; } | public bool IsOwner { get; private set; } | ||||
| public GuildPermissions Permissions { get; private set; } | public GuildPermissions Permissions { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public string IconUrl => CDN.GetGuildIconUrl(Id, _iconId); | public string IconUrl => CDN.GetGuildIconUrl(Id, _iconId); | ||||
| internal RestUserGuild(BaseDiscordClient discord, ulong id) | internal RestUserGuild(BaseDiscordClient discord, ulong id) | ||||
| @@ -17,7 +17,7 @@ namespace Discord.Rest | |||||
| public string Content { get; private set; } | public string Content { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public virtual bool IsTTS => false; | public virtual bool IsTTS => false; | ||||
| public virtual bool IsPinned => false; | public virtual bool IsPinned => false; | ||||
| public virtual DateTimeOffset? EditedTimestamp => null; | public virtual DateTimeOffset? EditedTimestamp => null; | ||||
| @@ -17,7 +17,7 @@ namespace Discord.Rest | |||||
| public IUser Owner { get; private set; } | public IUser Owner { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public string IconUrl => CDN.GetApplicationIconUrl(Id, _iconId); | public string IconUrl => CDN.GetApplicationIconUrl(Id, _iconId); | ||||
| internal RestApplication(BaseDiscordClient discord, ulong id) | internal RestApplication(BaseDiscordClient discord, ulong id) | ||||
| @@ -17,7 +17,7 @@ namespace Discord.Rest | |||||
| public GuildPermissions Permissions { get; private set; } | public GuildPermissions Permissions { get; private set; } | ||||
| public int Position { get; private set; } | public int Position { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public bool IsEveryone => Id == Guild.Id; | public bool IsEveryone => Id == Guild.Id; | ||||
| public string Mention => MentionUtils.MentionRole(Id); | public string Mention => MentionUtils.MentionRole(Id); | ||||
| @@ -13,7 +13,7 @@ namespace Discord.Rest | |||||
| public ushort DiscriminatorValue { get; private set; } | public ushort DiscriminatorValue { get; private set; } | ||||
| public string AvatarId { get; private set; } | public string AvatarId { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public string Discriminator => DiscriminatorValue.ToString("D4"); | public string Discriminator => DiscriminatorValue.ToString("D4"); | ||||
| public string Mention => MentionUtils.MentionUser(Id); | public string Mention => MentionUtils.MentionUser(Id); | ||||
| public virtual Game? Game => null; | public virtual Game? Game => null; | ||||
| @@ -8,7 +8,7 @@ namespace Discord.Rpc | |||||
| { | { | ||||
| public string Name { get; private set; } | public string Name { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| internal RpcChannel(DiscordRpcClient discord, ulong id) | internal RpcChannel(DiscordRpcClient discord, ulong id) | ||||
| : base(discord, id) | : base(discord, id) | ||||
| @@ -18,7 +18,7 @@ namespace Discord.Rpc | |||||
| public string Content { get; private set; } | public string Content { get; private set; } | ||||
| public Color AuthorColor { get; private set; } | public Color AuthorColor { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public virtual bool IsTTS => false; | public virtual bool IsTTS => false; | ||||
| public virtual bool IsPinned => false; | public virtual bool IsPinned => false; | ||||
| public virtual bool IsBlocked => false; | public virtual bool IsBlocked => false; | ||||
| @@ -14,7 +14,7 @@ namespace Discord.Rpc | |||||
| public ushort DiscriminatorValue { get; private set; } | public ushort DiscriminatorValue { get; private set; } | ||||
| public string AvatarId { get; private set; } | public string AvatarId { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public string Discriminator => DiscriminatorValue.ToString("D4"); | public string Discriminator => DiscriminatorValue.ToString("D4"); | ||||
| public string Mention => MentionUtils.MentionUser(Id); | public string Mention => MentionUtils.MentionUser(Id); | ||||
| public virtual bool IsWebhook => false; | public virtual bool IsWebhook => false; | ||||
| @@ -10,7 +10,7 @@ namespace Discord.WebSocket | |||||
| [DebuggerDisplay(@"{DebuggerDisplay,nq}")] | [DebuggerDisplay(@"{DebuggerDisplay,nq}")] | ||||
| public abstract class SocketChannel : SocketEntity<ulong>, IChannel | public abstract class SocketChannel : SocketEntity<ulong>, IChannel | ||||
| { | { | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public IReadOnlyCollection<SocketUser> Users => GetUsersInternal(); | public IReadOnlyCollection<SocketUser> Users => GetUsersInternal(); | ||||
| internal SocketChannel(DiscordSocketClient discord, ulong id) | internal SocketChannel(DiscordSocketClient discord, ulong id) | ||||
| @@ -53,7 +53,7 @@ namespace Discord.WebSocket | |||||
| public string IconId { get; private set; } | public string IconId { get; private set; } | ||||
| public string SplashId { get; private set; } | public string SplashId { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public SocketTextChannel DefaultChannel => GetTextChannel(Id); | public SocketTextChannel DefaultChannel => GetTextChannel(Id); | ||||
| public string IconUrl => CDN.GetGuildIconUrl(Id, IconId); | public string IconUrl => CDN.GetGuildIconUrl(Id, IconId); | ||||
| public string SplashUrl => CDN.GetGuildSplashUrl(Id, SplashId); | public string SplashUrl => CDN.GetGuildSplashUrl(Id, SplashId); | ||||
| @@ -18,7 +18,7 @@ namespace Discord.WebSocket | |||||
| public string Content { get; private set; } | public string Content { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public virtual bool IsTTS => false; | public virtual bool IsTTS => false; | ||||
| public virtual bool IsPinned => false; | public virtual bool IsPinned => false; | ||||
| public virtual DateTimeOffset? EditedTimestamp => null; | public virtual DateTimeOffset? EditedTimestamp => null; | ||||
| @@ -19,7 +19,7 @@ namespace Discord.WebSocket | |||||
| public GuildPermissions Permissions { get; private set; } | public GuildPermissions Permissions { get; private set; } | ||||
| public int Position { get; private set; } | public int Position { get; private set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public bool IsEveryone => Id == Guild.Id; | public bool IsEveryone => Id == Guild.Id; | ||||
| public string Mention => MentionUtils.MentionRole(Id); | public string Mention => MentionUtils.MentionRole(Id); | ||||
| @@ -15,7 +15,7 @@ namespace Discord.WebSocket | |||||
| internal abstract SocketGlobalUser GlobalUser { get; } | internal abstract SocketGlobalUser GlobalUser { get; } | ||||
| internal abstract SocketPresence Presence { get; set; } | internal abstract SocketPresence Presence { get; set; } | ||||
| public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); | |||||
| public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); | |||||
| public string Discriminator => DiscriminatorValue.ToString("D4"); | public string Discriminator => DiscriminatorValue.ToString("D4"); | ||||
| public string Mention => MentionUtils.MentionUser(Id); | public string Mention => MentionUtils.MentionUser(Id); | ||||
| public Game? Game => Presence.Game; | public Game? Game => Presence.Game; | ||||