@@ -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; | ||||