From b8ef95cd8177d7a59d48b45759eb3694dc5beabe Mon Sep 17 00:00:00 2001 From: Christopher F Date: Fri, 10 Nov 2017 13:53:05 -0500 Subject: [PATCH] Fix JSON converters for Activities --- .../Entities/Activities/GameParty.cs | 4 +-- .../Entities/Activities/GameTimestamps.cs | 6 ++-- src/Discord.Net.Rest/API/Common/GameParty.cs | 4 +-- .../API/Common/GameTimestamps.cs | 6 ++-- .../API/UnixTimestampAttribute.cs | 7 +++++ .../Net/Converters/DiscordContractResolver.cs | 6 ++++ .../Net/Converters/UnixTimestampConverter.cs | 28 +++++++++++++++++++ .../Extensions/EntityExtensions.cs | 2 +- 8 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 src/Discord.Net.Rest/API/UnixTimestampAttribute.cs create mode 100644 src/Discord.Net.Rest/Net/Converters/UnixTimestampConverter.cs diff --git a/src/Discord.Net.Core/Entities/Activities/GameParty.cs b/src/Discord.Net.Core/Entities/Activities/GameParty.cs index 3d4138086..2c369b9e8 100644 --- a/src/Discord.Net.Core/Entities/Activities/GameParty.cs +++ b/src/Discord.Net.Core/Entities/Activities/GameParty.cs @@ -2,7 +2,7 @@ { public class GameParty { - public ulong[] Size { get; internal set; } - public ulong Id { get; internal set; } + public string Id { get; internal set; } + public int[] Size { get; internal set; } } } \ No newline at end of file diff --git a/src/Discord.Net.Core/Entities/Activities/GameTimestamps.cs b/src/Discord.Net.Core/Entities/Activities/GameTimestamps.cs index 106f8ea49..477e71f10 100644 --- a/src/Discord.Net.Core/Entities/Activities/GameTimestamps.cs +++ b/src/Discord.Net.Core/Entities/Activities/GameTimestamps.cs @@ -4,10 +4,10 @@ namespace Discord { public class GameTimestamps { - public DateTimeOffset Start { get; } - public DateTimeOffset End { get; } + public DateTimeOffset? Start { get; } + public DateTimeOffset? End { get; } - public GameTimestamps(DateTimeOffset start, DateTimeOffset end) + public GameTimestamps(DateTimeOffset? start, DateTimeOffset? end) { Start = start; End = end; diff --git a/src/Discord.Net.Rest/API/Common/GameParty.cs b/src/Discord.Net.Rest/API/Common/GameParty.cs index e6ece06cf..e0da4a098 100644 --- a/src/Discord.Net.Rest/API/Common/GameParty.cs +++ b/src/Discord.Net.Rest/API/Common/GameParty.cs @@ -5,8 +5,8 @@ namespace Discord.API internal class GameParty { [JsonProperty("id")] - public ulong Id { get; set; } + public string Id { get; set; } [JsonProperty("size")] - public ulong[] Size { get; set; } + public int[] Size { get; set; } } } \ No newline at end of file diff --git a/src/Discord.Net.Rest/API/Common/GameTimestamps.cs b/src/Discord.Net.Rest/API/Common/GameTimestamps.cs index 4bee3cb9a..5c6f10b86 100644 --- a/src/Discord.Net.Rest/API/Common/GameTimestamps.cs +++ b/src/Discord.Net.Rest/API/Common/GameTimestamps.cs @@ -6,8 +6,10 @@ namespace Discord.API internal class GameTimestamps { [JsonProperty("start")] - public DateTimeOffset Start { get; set; } + [UnixTimestamp] + public Optional Start { get; set; } [JsonProperty("end")] - public DateTimeOffset End { get; set; } + [UnixTimestamp] + public Optional End { get; set; } } } \ No newline at end of file diff --git a/src/Discord.Net.Rest/API/UnixTimestampAttribute.cs b/src/Discord.Net.Rest/API/UnixTimestampAttribute.cs new file mode 100644 index 000000000..3890ffc46 --- /dev/null +++ b/src/Discord.Net.Rest/API/UnixTimestampAttribute.cs @@ -0,0 +1,7 @@ +using System; + +namespace Discord.API +{ + [AttributeUsage(AttributeTargets.Property)] + internal class UnixTimestampAttribute : Attribute { } +} \ No newline at end of file diff --git a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs index b465fbed2..9213c5d75 100644 --- a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs +++ b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs @@ -66,6 +66,12 @@ namespace Discord.Net.Converters if (type == typeof(ulong)) return UInt64Converter.Instance; } + bool hasUnixStamp = propInfo.GetCustomAttribute() != null; + if (hasUnixStamp) + { + if (type == typeof(DateTimeOffset)) + return UnixTimestampConverter.Instance; + } //Enums if (type == typeof(PermissionTarget)) diff --git a/src/Discord.Net.Rest/Net/Converters/UnixTimestampConverter.cs b/src/Discord.Net.Rest/Net/Converters/UnixTimestampConverter.cs new file mode 100644 index 000000000..d4660dc44 --- /dev/null +++ b/src/Discord.Net.Rest/Net/Converters/UnixTimestampConverter.cs @@ -0,0 +1,28 @@ +using System; +using Newtonsoft.Json; + +namespace Discord.Net.Converters +{ + public class UnixTimestampConverter : JsonConverter + { + public static readonly UnixTimestampConverter Instance = new UnixTimestampConverter(); + + public override bool CanConvert(Type objectType) => true; + public override bool CanRead => true; + public override bool CanWrite => true; + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + // Discord doesn't validate if timestamps contain decimals or not + if (reader.Value is double d) + return new DateTimeOffset(1970, 1, 1, 0, 0, 0, 0, TimeSpan.Zero).AddMilliseconds(d); + long offset = (long)reader.Value; + return new DateTimeOffset(1970, 1, 1, 0, 0, 0, 0, TimeSpan.Zero).AddMilliseconds(offset); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs index 35efef269..9a1bf9740 100644 --- a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs @@ -69,7 +69,7 @@ public static GameTimestamps ToEntity(this API.GameTimestamps model) { - return new GameTimestamps(model.Start, model.End); + return new GameTimestamps(model.Start.ToNullable(), model.End.ToNullable()); } } }