diff --git a/src/Discord.Net.Core/Utils/DateTimeUtils.cs b/src/Discord.Net.Core/Utils/DateTimeUtils.cs index ab285b56d..109c8c791 100644 --- a/src/Discord.Net.Core/Utils/DateTimeUtils.cs +++ b/src/Discord.Net.Core/Utils/DateTimeUtils.cs @@ -11,11 +11,6 @@ namespace Discord private const long UnixEpochMilliseconds = 62_135_596_800_000; #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) => new DateTimeOffset(ticks, TimeSpan.Zero); public static DateTimeOffset? FromTicks(long? ticks) diff --git a/src/Discord.Net.Core/Utils/Preconditions.cs b/src/Discord.Net.Core/Utils/Preconditions.cs index faa35e653..705a15249 100644 --- a/src/Discord.Net.Core/Utils/Preconditions.cs +++ b/src/Discord.Net.Core/Utils/Preconditions.cs @@ -185,7 +185,7 @@ namespace Discord // Bulk Delete 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++) { if (collection[i] <= minimum) diff --git a/src/Discord.Net.Core/Utils/SnowflakeUtils.cs b/src/Discord.Net.Core/Utils/SnowflakeUtils.cs new file mode 100644 index 000000000..c9d0d130b --- /dev/null +++ b/src/Discord.Net.Core/Utils/SnowflakeUtils.cs @@ -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; + } +} diff --git a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs index 0481d37ed..bc521784d 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs @@ -8,7 +8,7 @@ namespace Discord.Rest { public abstract class RestChannel : RestEntity, IChannel, IUpdateable { - public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); + public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); internal RestChannel(BaseDiscordClient discord, ulong id) : base(discord, id) diff --git a/src/Discord.Net.Rest/Entities/Channels/RpcVirtualMessageChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RpcVirtualMessageChannel.cs index 664e9c9fc..2c69a3395 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RpcVirtualMessageChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RpcVirtualMessageChannel.cs @@ -10,7 +10,7 @@ namespace Discord.Rest [DebuggerDisplay(@"{DebuggerDisplay,nq}")] internal class RestVirtualMessageChannel : RestEntity, IMessageChannel { - public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); + public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); public string Mention => MentionUtils.MentionChannel(Id); internal RestVirtualMessageChannel(BaseDiscordClient discord, ulong id) diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index 15acef457..eff178db6 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -32,7 +32,7 @@ namespace Discord.Rest public string SplashId { 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 string IconUrl => CDN.GetGuildIconUrl(Id, IconId); public string SplashUrl => CDN.GetGuildSplashUrl(Id, SplashId); diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestUserGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestUserGuild.cs index 12601b72e..6bc9cea7a 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestUserGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestUserGuild.cs @@ -14,7 +14,7 @@ namespace Discord.Rest public bool IsOwner { 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); internal RestUserGuild(BaseDiscordClient discord, ulong id) diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index bdd4800c1..590886886 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -17,7 +17,7 @@ namespace Discord.Rest 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 IsPinned => false; public virtual DateTimeOffset? EditedTimestamp => null; diff --git a/src/Discord.Net.Rest/Entities/RestApplication.cs b/src/Discord.Net.Rest/Entities/RestApplication.cs index f81e4cd7b..827c33cf7 100644 --- a/src/Discord.Net.Rest/Entities/RestApplication.cs +++ b/src/Discord.Net.Rest/Entities/RestApplication.cs @@ -17,7 +17,7 @@ namespace Discord.Rest 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); internal RestApplication(BaseDiscordClient discord, ulong id) diff --git a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs index dfdbb150d..9807b8357 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs @@ -17,7 +17,7 @@ namespace Discord.Rest public GuildPermissions Permissions { 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 string Mention => MentionUtils.MentionRole(Id); diff --git a/src/Discord.Net.Rest/Entities/Users/RestUser.cs b/src/Discord.Net.Rest/Entities/Users/RestUser.cs index e9b3b39ea..cded876c8 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestUser.cs @@ -13,7 +13,7 @@ namespace Discord.Rest public ushort DiscriminatorValue { 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 Mention => MentionUtils.MentionUser(Id); public virtual Game? Game => null; diff --git a/src/Discord.Net.Rpc/Entities/Channels/RpcChannel.cs b/src/Discord.Net.Rpc/Entities/Channels/RpcChannel.cs index 934dae94b..cca559a31 100644 --- a/src/Discord.Net.Rpc/Entities/Channels/RpcChannel.cs +++ b/src/Discord.Net.Rpc/Entities/Channels/RpcChannel.cs @@ -8,7 +8,7 @@ namespace Discord.Rpc { public string Name { get; private set; } - public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); + public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); internal RpcChannel(DiscordRpcClient discord, ulong id) : base(discord, id) diff --git a/src/Discord.Net.Rpc/Entities/Messages/RpcMessage.cs b/src/Discord.Net.Rpc/Entities/Messages/RpcMessage.cs index c77c06288..a2f7b4558 100644 --- a/src/Discord.Net.Rpc/Entities/Messages/RpcMessage.cs +++ b/src/Discord.Net.Rpc/Entities/Messages/RpcMessage.cs @@ -18,7 +18,7 @@ namespace Discord.Rpc public string Content { 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 IsPinned => false; public virtual bool IsBlocked => false; diff --git a/src/Discord.Net.Rpc/Entities/Users/RpcUser.cs b/src/Discord.Net.Rpc/Entities/Users/RpcUser.cs index cf21928bb..7ed11e57d 100644 --- a/src/Discord.Net.Rpc/Entities/Users/RpcUser.cs +++ b/src/Discord.Net.Rpc/Entities/Users/RpcUser.cs @@ -14,7 +14,7 @@ namespace Discord.Rpc public ushort DiscriminatorValue { 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 Mention => MentionUtils.MentionUser(Id); public virtual bool IsWebhook => false; diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs index f982e66b5..319e17c50 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketChannel.cs @@ -10,7 +10,7 @@ namespace Discord.WebSocket [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public abstract class SocketChannel : SocketEntity, IChannel { - public DateTimeOffset CreatedAt => DateTimeUtils.FromSnowflake(Id); + public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); public IReadOnlyCollection Users => GetUsersInternal(); internal SocketChannel(DiscordSocketClient discord, ulong id) diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 1c2ee1847..889587921 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -53,7 +53,7 @@ namespace Discord.WebSocket public string IconId { 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 string IconUrl => CDN.GetGuildIconUrl(Id, IconId); public string SplashUrl => CDN.GetGuildSplashUrl(Id, SplashId); diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 2d63665de..5442c888a 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -18,7 +18,7 @@ namespace Discord.WebSocket 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 IsPinned => false; public virtual DateTimeOffset? EditedTimestamp => null; diff --git a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs index 61fd4310f..57d913317 100644 --- a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs +++ b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs @@ -19,7 +19,7 @@ namespace Discord.WebSocket public GuildPermissions Permissions { 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 string Mention => MentionUtils.MentionRole(Id); diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index da15ccbf9..1b599bf7e 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -15,7 +15,7 @@ namespace Discord.WebSocket internal abstract SocketGlobalUser GlobalUser { get; } 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 Mention => MentionUtils.MentionUser(Id); public Game? Game => Presence.Game;