From 22e6b0f386e82e6f65571a76cd2f18ea6b1b761c Mon Sep 17 00:00:00 2001 From: RogueException Date: Wed, 22 Mar 2017 04:34:17 -0300 Subject: [PATCH 1/6] Fixed RpcChannelSummary accessibilities --- src/Discord.Net.Rpc/Entities/Channels/RpcChannelSummary.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Rpc/Entities/Channels/RpcChannelSummary.cs b/src/Discord.Net.Rpc/Entities/Channels/RpcChannelSummary.cs index 72679ac58..c35437e26 100644 --- a/src/Discord.Net.Rpc/Entities/Channels/RpcChannelSummary.cs +++ b/src/Discord.Net.Rpc/Entities/Channels/RpcChannelSummary.cs @@ -7,8 +7,8 @@ namespace Discord.Rpc public class RpcChannelSummary { public ulong Id { get; } - public string Name { get; set; } - public ChannelType Type { get; set; } + public string Name { get; private set; } + public ChannelType Type { get; private set; } internal RpcChannelSummary(ulong id) { From 32cf7ba5e1ce8e17d542c10fa2a0e272e1c3a892 Mon Sep 17 00:00:00 2001 From: RogueException Date: Wed, 22 Mar 2017 05:22:11 -0300 Subject: [PATCH 2/6] A few datetime fixes --- src/Discord.Net.Core/Utils/DateTimeUtils.cs | 2 +- src/Discord.Net.Core/Utils/Preconditions.cs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Utils/DateTimeUtils.cs b/src/Discord.Net.Core/Utils/DateTimeUtils.cs index fc9ef4b7b..99cc9387f 100644 --- a/src/Discord.Net.Core/Utils/DateTimeUtils.cs +++ b/src/Discord.Net.Core/Utils/DateTimeUtils.cs @@ -13,7 +13,7 @@ namespace Discord public static DateTimeOffset FromSnowflake(ulong value) => FromUnixMilliseconds((long)((value >> 22) + 1420070400000UL)); public static ulong ToSnowflake(DateTimeOffset value) - => (ulong)(ToUnixMilliseconds(value) - 1420070400000L) << 22; + => ((ulong)ToUnixMilliseconds(value) - 1420070400000UL) << 22; public static DateTimeOffset FromTicks(long ticks) => new DateTimeOffset(ticks, TimeSpan.Zero); diff --git a/src/Discord.Net.Core/Utils/Preconditions.cs b/src/Discord.Net.Core/Utils/Preconditions.cs index 16046c2a9..faa35e653 100644 --- a/src/Discord.Net.Core/Utils/Preconditions.cs +++ b/src/Discord.Net.Core/Utils/Preconditions.cs @@ -185,9 +185,12 @@ namespace Discord // Bulk Delete public static void YoungerThanTwoWeeks(ulong[] collection, string name) { - var minimum = DateTimeUtils.ToSnowflake(DateTimeOffset.Now.Subtract(TimeSpan.FromMilliseconds(1209540000))); + var minimum = DateTimeUtils.ToSnowflake(DateTimeOffset.UtcNow.Subtract(TimeSpan.FromDays(14))); for (var i = 0; i < collection.Length; i++) - if (collection[i] <= minimum) throw new ArgumentOutOfRangeException(name, "Messages must be younger than two weeks to delete."); + { + if (collection[i] <= minimum) + throw new ArgumentOutOfRangeException(name, "Messages must be younger than two weeks old."); + } } } } From 13b9b15cf085b4b68324bb0b2f8d7ad6fd6ab2e8 Mon Sep 17 00:00:00 2001 From: RogueException Date: Wed, 22 Mar 2017 05:35:19 -0300 Subject: [PATCH 3/6] Fixed DateTimeUtils on .Net Standard 1.1 --- src/Discord.Net.Core/Utils/DateTimeUtils.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net.Core/Utils/DateTimeUtils.cs b/src/Discord.Net.Core/Utils/DateTimeUtils.cs index 99cc9387f..ab285b56d 100644 --- a/src/Discord.Net.Core/Utils/DateTimeUtils.cs +++ b/src/Discord.Net.Core/Utils/DateTimeUtils.cs @@ -2,12 +2,13 @@ namespace Discord { + //Source: https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/DateTimeOffset.cs internal static class DateTimeUtils { #if !NETSTANDARD1_3 - //https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/DateTimeOffset.cs - private const long UnixEpochTicks = 621355968000000000; - private const long UnixEpochSeconds = 62135596800; + private const long UnixEpochTicks = 621_355_968_000_000_000; + private const long UnixEpochSeconds = 62_135_596_800; + private const long UnixEpochMilliseconds = 62_135_596_800_000; #endif public static DateTimeOffset FromSnowflake(ulong value) @@ -29,12 +30,12 @@ namespace Discord return new DateTimeOffset(ticks, TimeSpan.Zero); #endif } - public static DateTimeOffset FromUnixMilliseconds(long seconds) + public static DateTimeOffset FromUnixMilliseconds(long milliseconds) { #if NETSTANDARD1_3 - return DateTimeOffset.FromUnixTimeMilliseconds(seconds); + return DateTimeOffset.FromUnixTimeMilliseconds(milliseconds); #else - long ticks = seconds * TimeSpan.TicksPerMillisecond + UnixEpochTicks; + long ticks = milliseconds * TimeSpan.TicksPerMillisecond + UnixEpochTicks; return new DateTimeOffset(ticks, TimeSpan.Zero); #endif } @@ -53,8 +54,8 @@ namespace Discord #if NETSTANDARD1_3 return dto.ToUnixTimeMilliseconds(); #else - long seconds = dto.UtcDateTime.Ticks / TimeSpan.TicksPerMillisecond; - return seconds - UnixEpochSeconds; + long milliseconds = dto.UtcDateTime.Ticks / TimeSpan.TicksPerMillisecond; + return milliseconds - UnixEpochMilliseconds; #endif } } From 35d7a0cec89398a69fd5d3472fe6980f327f5d00 Mon Sep 17 00:00:00 2001 From: RogueException Date: Wed, 22 Mar 2017 06:08:58 -0300 Subject: [PATCH 4/6] Ensure UploadFile is always a seekable stream. --- src/Discord.Net.Rest/DiscordRestApiClient.cs | 9 ++------- src/Discord.Net.Rest/Net/DefaultRestClient.cs | 9 ++++++++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index afa4af9e6..09f5a5767 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -494,13 +494,8 @@ namespace Discord.API if (args.Content.GetValueOrDefault(null) == null) args.Content = ""; - else if (args.Content.IsSpecified) - { - if (args.Content.Value == null) - args.Content = ""; - if (args.Content.Value?.Length > DiscordConfig.MaxMessageSize) - throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content)); - } + else if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize) + throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content)); var ids = new BucketIds(channelId: channelId); return await SendMultipartAsync("POST", () => $"channels/{channelId}/messages", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false); diff --git a/src/Discord.Net.Rest/Net/DefaultRestClient.cs b/src/Discord.Net.Rest/Net/DefaultRestClient.cs index 39b94294f..2381a9976 100644 --- a/src/Discord.Net.Rest/Net/DefaultRestClient.cs +++ b/src/Discord.Net.Rest/Net/DefaultRestClient.cs @@ -101,7 +101,14 @@ namespace Discord.Net.Rest if (p.Value is MultipartFile) { var fileValue = (MultipartFile)p.Value; - content.Add(new StreamContent(fileValue.Stream), p.Key, fileValue.Filename); + var stream = fileValue.Stream; + if (!stream.CanSeek) + { + var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream).ConfigureAwait(false); + stream = memoryStream; + } + content.Add(new StreamContent(stream), p.Key, fileValue.Filename); continue; } From ca18eb0eb4a2c68d1ffd608bc80039dddd2bdc60 Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Thu, 23 Mar 2017 14:03:06 +0000 Subject: [PATCH 5/6] Replace TryGetValue call with TryRemove call (#586) Resolves #584 --- src/Discord.Net.Commands/CommandService.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 91472b9eb..c0c20f80f 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -159,8 +159,7 @@ namespace Discord.Commands try { ModuleInfo module; - _typedModuleDefs.TryGetValue(typeof(T), out module); - if (module == default(ModuleInfo)) + if (!_typedModuleDefs.TryRemove(typeof(T), out module)) return false; return RemoveModuleInternal(module); From df129dd76687d08b73c029dbefcb2aa6fbb4a83c Mon Sep 17 00:00:00 2001 From: RogueException Date: Thu, 23 Mar 2017 11:38:03 -0300 Subject: [PATCH 6/6] Actually populate SocketSimpleUser's fields --- .../Entities/Users/SocketSimpleUser.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs index 1ecb5e578..0d2198888 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs @@ -29,6 +29,14 @@ namespace Discord.WebSocket internal override void Update(ClientState state, PresenceModel model) { + if (model.User.Avatar.IsSpecified) + AvatarId = model.User.Avatar.Value; + if (model.User.Discriminator.IsSpecified) + DiscriminatorValue = ushort.Parse(model.User.Discriminator.Value); + if (model.User.Bot.IsSpecified) + IsBot = model.User.Bot.Value; + if (model.User.Username.IsSpecified) + Username = model.User.Username.Value; } internal new SocketSimpleUser Clone() => MemberwiseClone() as SocketSimpleUser;