diff --git a/src/Discord.Net.Core/API/Common/Embed.cs b/src/Discord.Net.Core/API/Common/Embed.cs index eb56ce696..33b97e641 100644 --- a/src/Discord.Net.Core/API/Common/Embed.cs +++ b/src/Discord.Net.Core/API/Common/Embed.cs @@ -1,4 +1,5 @@ #pragma warning disable CS1591 +using System; using Newtonsoft.Json; namespace Discord.API @@ -15,6 +16,8 @@ namespace Discord.API public string Url { get; set; } [JsonProperty("color")] public uint? Color { get; set; } + [JsonProperty("timestamp")] + public DateTimeOffset? Timestamp { get; set; } [JsonProperty("author")] public Optional Author { get; set; } [JsonProperty("footer")] diff --git a/src/Discord.Net.Core/API/DiscordRestApiClient.cs b/src/Discord.Net.Core/API/DiscordRestApiClient.cs index 6ec7c5fb2..16ea37d92 100644 --- a/src/Discord.Net.Core/API/DiscordRestApiClient.cs +++ b/src/Discord.Net.Core/API/DiscordRestApiClient.cs @@ -49,7 +49,7 @@ namespace Discord.API { _restClientProvider = restClientProvider; _userAgent = userAgent; - _serializer = serializer ?? new JsonSerializer { ContractResolver = new DiscordContractResolver() }; + _serializer = serializer ?? new JsonSerializer { DateFormatString = "yyyy-MM-ddTHH:mm:ssZ", ContractResolver = new DiscordContractResolver() }; RequestQueue = requestQueue; FetchCurrentUser = true; diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index c0069aa9a..2fba6d47e 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -20,14 +20,15 @@ namespace Discord _fields = new List(); } - public string Title { get { return _model.Title; } set { _model.Title = value; } } + public string Title { get { return _model.Title; } set { _model.Title = value; } } public string Description { get { return _model.Description; } set { _model.Description = value; } } public string Url { get { return _model.Url; } set { _model.Url = value; } } + public string ThumbnailUrl { get; set; } + public string ImageUrl { get; set; } + public DateTimeOffset? Timestamp { get; set; } public Color? Color { get { return _model.Color.HasValue ? new Color(_model.Color.Value) : (Color?)null; } set { _model.Color = value?.RawValue; } } public EmbedAuthorBuilder Author { get; set; } public EmbedFooterBuilder Footer { get; set; } - public EmbedThumbnailBuilder Thumbnail { get; set; } - public EmbedImageBuilder Image { get; set; } public EmbedBuilder WithTitle(string title) { @@ -44,6 +45,26 @@ namespace Discord Url = url; return this; } + public EmbedBuilder WithThumbnailUrl(string thumbnailUrl) + { + ThumbnailUrl = thumbnailUrl; + return this; + } + public EmbedBuilder WithImageUrl(string imageUrl) + { + ImageUrl = ImageUrl; + return this; + } + public EmbedBuilder WithCurrentTimestamp() + { + Timestamp = DateTimeOffset.UtcNow; + return this; + } + public EmbedBuilder WithTimestamp(DateTimeOffset dateTimeOffset) + { + Timestamp = dateTimeOffset; + return this; + } public EmbedBuilder WithColor(Color color) { Color = color; @@ -74,30 +95,6 @@ namespace Discord Footer = footer; return this; } - public EmbedBuilder WithThumbnail(EmbedThumbnailBuilder thumbnail) - { - Thumbnail = thumbnail; - return this; - } - public EmbedBuilder WithThumbnail(Action action) - { - var thumbnail = new EmbedThumbnailBuilder(); - action(thumbnail); - Thumbnail = thumbnail; - return this; - } - public EmbedBuilder WithImage(EmbedImageBuilder image) - { - Image = image; - return this; - } - public EmbedBuilder WithImage(Action action) - { - var image = new EmbedImageBuilder(); - action(image); - Image = image; - return this; - } public EmbedBuilder AddField(Action action) { @@ -111,8 +108,9 @@ namespace Discord { _model.Author = Author?.ToModel(); _model.Footer = Footer?.ToModel(); - _model.Thumbnail = Thumbnail?.ToModel(); - _model.Image = Image?.ToModel(); + _model.Timestamp = Timestamp?.ToUniversalTime(); + _model.Thumbnail = ThumbnailUrl != null ? new Thumbnail { Url = ThumbnailUrl } : null; + _model.Image = ImageUrl != null ? new Image { Url = ImageUrl } : null; _model.Fields = _fields.ToArray(); return _model; } @@ -120,7 +118,7 @@ namespace Discord public class EmbedFieldBuilder { - private Field _model; + private readonly Field _model; public string Name { get { return _model.Name; } set { _model.Name = value; } } public string Value { get { return _model.Value; } set { _model.Value = value; } } @@ -152,7 +150,7 @@ namespace Discord public class EmbedAuthorBuilder { - private Author _model; + private readonly Author _model; public string Name { get { return _model.Name; } set { _model.Name = value; } } public string Url { get { return _model.Url; } set { _model.Url = value; } } @@ -184,7 +182,7 @@ namespace Discord public class EmbedFooterBuilder { - private Footer _model; + private readonly Footer _model; public string Text { get { return _model.Text; } set { _model.Text = value; } } public string IconUrl { get { return _model.IconUrl; } set { _model.IconUrl = value; } } @@ -207,44 +205,4 @@ namespace Discord internal Footer ToModel() => _model; } - - public class EmbedThumbnailBuilder - { - private Thumbnail _model; - - public string Url { get { return _model.Url; } set { _model.Url = value; } } - - public EmbedThumbnailBuilder() - { - _model = new Thumbnail(); - } - - public EmbedThumbnailBuilder WithUrl(string url) - { - Url = url; - return this; - } - - internal Thumbnail ToModel() => _model; - } - - public class EmbedImageBuilder - { - private Image _model; - - public string Url { get { return _model.Url; } set { _model.Url = value; } } - - public EmbedImageBuilder() - { - _model = new Image(); - } - - public EmbedImageBuilder WithUrl(string url) - { - Url = url; - return this; - } - - internal Image ToModel() => _model; - } } diff --git a/src/Discord.Net.Core/Entities/Messages/IEmbed.cs b/src/Discord.Net.Core/Entities/Messages/IEmbed.cs index 86463534d..5eef5ec9b 100644 --- a/src/Discord.Net.Core/Entities/Messages/IEmbed.cs +++ b/src/Discord.Net.Core/Entities/Messages/IEmbed.cs @@ -1,4 +1,5 @@ -using System.Collections.Immutable; +using System; +using System.Collections.Immutable; namespace Discord { @@ -8,6 +9,7 @@ namespace Discord string Type { get; } string Title { get; } string Description { get; } + DateTimeOffset? Timestamp { get; } Color? Color { get; } EmbedImage? Image { get; } EmbedVideo? Video { get; } diff --git a/src/Discord.Net.Rest/Entities/Messages/Embed.cs b/src/Discord.Net.Rest/Entities/Messages/Embed.cs index 7124df417..a291dc6c0 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Embed.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Embed.cs @@ -13,6 +13,7 @@ namespace Discord public string Url { get; } public string Title { get; } public string Type { get; } + public DateTimeOffset? Timestamp { get; } public Color? Color { get; } public EmbedImage? Image { get; } public EmbedVideo? Video { get; } @@ -23,10 +24,11 @@ namespace Discord public ImmutableArray Fields { get; } internal Embed(string type, - string title, - string description, - string url, - Color? color, + string title, + string description, + string url, + DateTimeOffset? timestamp, + Color? color, EmbedImage? image, EmbedVideo? video, EmbedAuthor? author, @@ -40,6 +42,7 @@ namespace Discord Description = description; Url = url; Color = color; + Timestamp = timestamp; Image = image; Video = video; Author = author; @@ -50,15 +53,15 @@ namespace Discord } internal static Embed Create(Model model) { - return new Embed(model.Type, model.Title, model.Description, model.Url, - model.Color.HasValue ? new Color(model.Color.Value) : (Color?)null, + return new Embed(model.Type, model.Title, model.Description, model.Url,model.Timestamp, + model.Color.HasValue ? new Color(model.Color.Value) : (Color?)null, model.Image.IsSpecified ? EmbedImage.Create(model.Image.Value) : (EmbedImage?)null, model.Video.IsSpecified ? EmbedVideo.Create(model.Video.Value) : (EmbedVideo?)null, model.Author.IsSpecified ? EmbedAuthor.Create(model.Author.Value) : (EmbedAuthor?)null, model.Footer.IsSpecified ? EmbedFooter.Create(model.Footer.Value) : (EmbedFooter?)null, model.Provider.IsSpecified ? EmbedProvider.Create(model.Provider.Value) : (EmbedProvider?)null, model.Thumbnail.IsSpecified ? EmbedThumbnail.Create(model.Thumbnail.Value) : (EmbedThumbnail?)null, - model.Fields.IsSpecified ? model.Fields.Value.Select(x => EmbedField.Create(x)).ToImmutableArray() : ImmutableArray.Create()); + model.Fields.IsSpecified ? model.Fields.Value.Select(EmbedField.Create).ToImmutableArray() : ImmutableArray.Create()); } public override string ToString() => Title;