Changes property types for any URLs in Embeds to System.URI. Adding field name/value null/empty checks.pull/711/head
| @@ -10,7 +10,7 @@ namespace Discord | |||||
| public string Type { get; } | public string Type { get; } | ||||
| public string Description { get; internal set; } | public string Description { get; internal set; } | ||||
| public string Url { get; internal set; } | |||||
| public Uri Url { get; internal set; } | |||||
| public string Title { get; internal set; } | public string Title { get; internal set; } | ||||
| public DateTimeOffset? Timestamp { get; internal set; } | public DateTimeOffset? Timestamp { get; internal set; } | ||||
| public Color? Color { get; internal set; } | public Color? Color { get; internal set; } | ||||
| @@ -30,7 +30,7 @@ namespace Discord | |||||
| internal Embed(string type, | internal Embed(string type, | ||||
| string title, | string title, | ||||
| string description, | string description, | ||||
| string url, | |||||
| Uri url, | |||||
| DateTimeOffset? timestamp, | DateTimeOffset? timestamp, | ||||
| Color? color, | Color? color, | ||||
| EmbedImage? image, | EmbedImage? image, | ||||
| @@ -1,4 +1,5 @@ | |||||
| using System.Diagnostics; | |||||
| using System; | |||||
| using System.Diagnostics; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| @@ -6,11 +7,11 @@ namespace Discord | |||||
| public struct EmbedAuthor | public struct EmbedAuthor | ||||
| { | { | ||||
| public string Name { get; internal set; } | public string Name { get; internal set; } | ||||
| public string Url { get; internal set; } | |||||
| public string IconUrl { get; internal set; } | |||||
| public string ProxyIconUrl { get; internal set; } | |||||
| public Uri Url { get; internal set; } | |||||
| public Uri IconUrl { get; internal set; } | |||||
| public Uri ProxyIconUrl { get; internal set; } | |||||
| internal EmbedAuthor(string name, string url, string iconUrl, string proxyIconUrl) | |||||
| internal EmbedAuthor(string name, Uri url, Uri iconUrl, Uri proxyIconUrl) | |||||
| { | { | ||||
| Name = name; | Name = name; | ||||
| Url = url; | Url = url; | ||||
| @@ -1,4 +1,5 @@ | |||||
| using System.Diagnostics; | |||||
| using System; | |||||
| using System.Diagnostics; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| @@ -6,10 +7,10 @@ namespace Discord | |||||
| public struct EmbedFooter | public struct EmbedFooter | ||||
| { | { | ||||
| public string Text { get; internal set; } | public string Text { get; internal set; } | ||||
| public string IconUrl { get; internal set; } | |||||
| public string ProxyUrl { get; internal set; } | |||||
| public Uri IconUrl { get; internal set; } | |||||
| public Uri ProxyUrl { get; internal set; } | |||||
| internal EmbedFooter(string text, string iconUrl, string proxyUrl) | |||||
| internal EmbedFooter(string text, Uri iconUrl, Uri proxyUrl) | |||||
| { | { | ||||
| Text = text; | Text = text; | ||||
| IconUrl = iconUrl; | IconUrl = iconUrl; | ||||
| @@ -1,16 +1,17 @@ | |||||
| using System.Diagnostics; | |||||
| using System; | |||||
| using System.Diagnostics; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| [DebuggerDisplay("{DebuggerDisplay,nq}")] | [DebuggerDisplay("{DebuggerDisplay,nq}")] | ||||
| public struct EmbedImage | public struct EmbedImage | ||||
| { | { | ||||
| public string Url { get; } | |||||
| public string ProxyUrl { get; } | |||||
| public Uri Url { get; } | |||||
| public Uri ProxyUrl { get; } | |||||
| public int? Height { get; } | public int? Height { get; } | ||||
| public int? Width { get; } | public int? Width { get; } | ||||
| internal EmbedImage(string url, string proxyUrl, int? height, int? width) | |||||
| internal EmbedImage(Uri url, Uri proxyUrl, int? height, int? width) | |||||
| { | { | ||||
| Url = url; | Url = url; | ||||
| ProxyUrl = proxyUrl; | ProxyUrl = proxyUrl; | ||||
| @@ -19,6 +20,6 @@ namespace Discord | |||||
| } | } | ||||
| private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | ||||
| public override string ToString() => Url; | |||||
| public override string ToString() => Url.ToString(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,4 +1,5 @@ | |||||
| using System.Diagnostics; | |||||
| using System; | |||||
| using System.Diagnostics; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| @@ -6,9 +7,9 @@ namespace Discord | |||||
| public struct EmbedProvider | public struct EmbedProvider | ||||
| { | { | ||||
| public string Name { get; } | public string Name { get; } | ||||
| public string Url { get; } | |||||
| public Uri Url { get; } | |||||
| internal EmbedProvider(string name, string url) | |||||
| internal EmbedProvider(string name, Uri url) | |||||
| { | { | ||||
| Name = name; | Name = name; | ||||
| Url = url; | Url = url; | ||||
| @@ -1,16 +1,17 @@ | |||||
| using System.Diagnostics; | |||||
| using System; | |||||
| using System.Diagnostics; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| [DebuggerDisplay("{DebuggerDisplay,nq}")] | [DebuggerDisplay("{DebuggerDisplay,nq}")] | ||||
| public struct EmbedThumbnail | public struct EmbedThumbnail | ||||
| { | { | ||||
| public string Url { get; } | |||||
| public string ProxyUrl { get; } | |||||
| public Uri Url { get; } | |||||
| public Uri ProxyUrl { get; } | |||||
| public int? Height { get; } | public int? Height { get; } | ||||
| public int? Width { get; } | public int? Width { get; } | ||||
| internal EmbedThumbnail(string url, string proxyUrl, int? height, int? width) | |||||
| internal EmbedThumbnail(Uri url, Uri proxyUrl, int? height, int? width) | |||||
| { | { | ||||
| Url = url; | Url = url; | ||||
| ProxyUrl = proxyUrl; | ProxyUrl = proxyUrl; | ||||
| @@ -19,6 +20,6 @@ namespace Discord | |||||
| } | } | ||||
| private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | ||||
| public override string ToString() => Url; | |||||
| public override string ToString() => Url.ToString(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,15 +1,16 @@ | |||||
| using System.Diagnostics; | |||||
| using System; | |||||
| using System.Diagnostics; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| [DebuggerDisplay("{DebuggerDisplay,nq}")] | [DebuggerDisplay("{DebuggerDisplay,nq}")] | ||||
| public struct EmbedVideo | public struct EmbedVideo | ||||
| { | { | ||||
| public string Url { get; } | |||||
| public Uri Url { get; } | |||||
| public int? Height { get; } | public int? Height { get; } | ||||
| public int? Width { get; } | public int? Width { get; } | ||||
| internal EmbedVideo(string url, int? height, int? width) | |||||
| internal EmbedVideo(Uri url, int? height, int? width) | |||||
| { | { | ||||
| Url = url; | Url = url; | ||||
| Height = height; | Height = height; | ||||
| @@ -17,6 +18,6 @@ namespace Discord | |||||
| } | } | ||||
| private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | ||||
| public override string ToString() => Url; | |||||
| public override string ToString() => Url.ToString(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -5,7 +5,7 @@ namespace Discord | |||||
| { | { | ||||
| public interface IEmbed | public interface IEmbed | ||||
| { | { | ||||
| string Url { get; } | |||||
| Uri Url { get; } | |||||
| string Type { get; } | string Type { get; } | ||||
| string Title { get; } | string Title { get; } | ||||
| string Description { get; } | string Description { get; } | ||||
| @@ -13,7 +13,7 @@ namespace Discord.API | |||||
| [JsonProperty("description")] | [JsonProperty("description")] | ||||
| public string Description { get; set; } | public string Description { get; set; } | ||||
| [JsonProperty("url")] | [JsonProperty("url")] | ||||
| public string Url { get; set; } | |||||
| public Uri Url { get; set; } | |||||
| [JsonProperty("color")] | [JsonProperty("color")] | ||||
| public uint? Color { get; set; } | public uint? Color { get; set; } | ||||
| [JsonProperty("timestamp")] | [JsonProperty("timestamp")] | ||||
| @@ -1,4 +1,5 @@ | |||||
| using Newtonsoft.Json; | |||||
| using System; | |||||
| using Newtonsoft.Json; | |||||
| namespace Discord.API | namespace Discord.API | ||||
| { | { | ||||
| @@ -7,10 +8,10 @@ namespace Discord.API | |||||
| [JsonProperty("name")] | [JsonProperty("name")] | ||||
| public string Name { get; set; } | public string Name { get; set; } | ||||
| [JsonProperty("url")] | [JsonProperty("url")] | ||||
| public string Url { get; set; } | |||||
| public Uri Url { get; set; } | |||||
| [JsonProperty("icon_url")] | [JsonProperty("icon_url")] | ||||
| public string IconUrl { get; set; } | |||||
| public Uri IconUrl { get; set; } | |||||
| [JsonProperty("proxy_icon_url")] | [JsonProperty("proxy_icon_url")] | ||||
| public string ProxyIconUrl { get; set; } | |||||
| public Uri ProxyIconUrl { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,4 +1,5 @@ | |||||
| using Newtonsoft.Json; | |||||
| using System; | |||||
| using Newtonsoft.Json; | |||||
| namespace Discord.API | namespace Discord.API | ||||
| { | { | ||||
| @@ -7,8 +8,8 @@ namespace Discord.API | |||||
| [JsonProperty("text")] | [JsonProperty("text")] | ||||
| public string Text { get; set; } | public string Text { get; set; } | ||||
| [JsonProperty("icon_url")] | [JsonProperty("icon_url")] | ||||
| public string IconUrl { get; set; } | |||||
| public Uri IconUrl { get; set; } | |||||
| [JsonProperty("proxy_icon_url")] | [JsonProperty("proxy_icon_url")] | ||||
| public string ProxyIconUrl { get; set; } | |||||
| public Uri ProxyIconUrl { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,4 +1,5 @@ | |||||
| #pragma warning disable CS1591 | #pragma warning disable CS1591 | ||||
| using System; | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| namespace Discord.API | namespace Discord.API | ||||
| @@ -6,9 +7,9 @@ namespace Discord.API | |||||
| internal class EmbedImage | internal class EmbedImage | ||||
| { | { | ||||
| [JsonProperty("url")] | [JsonProperty("url")] | ||||
| public string Url { get; set; } | |||||
| public Uri Url { get; set; } | |||||
| [JsonProperty("proxy_url")] | [JsonProperty("proxy_url")] | ||||
| public string ProxyUrl { get; set; } | |||||
| public Uri ProxyUrl { get; set; } | |||||
| [JsonProperty("height")] | [JsonProperty("height")] | ||||
| public Optional<int> Height { get; set; } | public Optional<int> Height { get; set; } | ||||
| [JsonProperty("width")] | [JsonProperty("width")] | ||||
| @@ -1,4 +1,5 @@ | |||||
| #pragma warning disable CS1591 | #pragma warning disable CS1591 | ||||
| using System; | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| namespace Discord.API | namespace Discord.API | ||||
| @@ -8,6 +9,6 @@ namespace Discord.API | |||||
| [JsonProperty("name")] | [JsonProperty("name")] | ||||
| public string Name { get; set; } | public string Name { get; set; } | ||||
| [JsonProperty("url")] | [JsonProperty("url")] | ||||
| public string Url { get; set; } | |||||
| public Uri Url { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,4 +1,5 @@ | |||||
| #pragma warning disable CS1591 | #pragma warning disable CS1591 | ||||
| using System; | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| namespace Discord.API | namespace Discord.API | ||||
| @@ -6,9 +7,9 @@ namespace Discord.API | |||||
| internal class EmbedThumbnail | internal class EmbedThumbnail | ||||
| { | { | ||||
| [JsonProperty("url")] | [JsonProperty("url")] | ||||
| public string Url { get; set; } | |||||
| public Uri Url { get; set; } | |||||
| [JsonProperty("proxy_url")] | [JsonProperty("proxy_url")] | ||||
| public string ProxyUrl { get; set; } | |||||
| public Uri ProxyUrl { get; set; } | |||||
| [JsonProperty("height")] | [JsonProperty("height")] | ||||
| public Optional<int> Height { get; set; } | public Optional<int> Height { get; set; } | ||||
| [JsonProperty("width")] | [JsonProperty("width")] | ||||
| @@ -1,4 +1,5 @@ | |||||
| #pragma warning disable CS1591 | #pragma warning disable CS1591 | ||||
| using System; | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| namespace Discord.API | namespace Discord.API | ||||
| @@ -6,7 +7,7 @@ namespace Discord.API | |||||
| internal class EmbedVideo | internal class EmbedVideo | ||||
| { | { | ||||
| [JsonProperty("url")] | [JsonProperty("url")] | ||||
| public string Url { get; set; } | |||||
| public Uri Url { get; set; } | |||||
| [JsonProperty("height")] | [JsonProperty("height")] | ||||
| public Optional<int> Height { get; set; } | public Optional<int> Height { get; set; } | ||||
| [JsonProperty("width")] | [JsonProperty("width")] | ||||
| @@ -38,11 +38,11 @@ namespace Discord | |||||
| } | } | ||||
| } | } | ||||
| public string Url { get { return _embed.Url; } set { _embed.Url = value; } } | |||||
| public string ThumbnailUrl { get { return _embed.Thumbnail?.Url; } set { _embed.Thumbnail = new EmbedThumbnail(value, null, null, null); } } | |||||
| public string ImageUrl { get { return _embed.Image?.Url; } set { _embed.Image = new EmbedImage(value, null, null, null); } } | |||||
| public DateTimeOffset? Timestamp { get { return _embed.Timestamp; } set { _embed.Timestamp = value; } } | |||||
| public Color? Color { get { return _embed.Color; } set { _embed.Color = value; } } | |||||
| public Uri Url { get => _embed.Url; set { _embed.Url = value; } } | |||||
| public Uri ThumbnailUrl { get => _embed.Thumbnail?.Url; set { _embed.Thumbnail = new EmbedThumbnail(value, null, null, null); } } | |||||
| public Uri ImageUrl { get => _embed.Image?.Url; set { _embed.Image = new EmbedImage(value, null, null, null); } } | |||||
| public DateTimeOffset? Timestamp { get => _embed.Timestamp; set { _embed.Timestamp = value; } } | |||||
| public Color? Color { get => _embed.Color; set { _embed.Color = value; } } | |||||
| public EmbedAuthorBuilder Author { get; set; } | public EmbedAuthorBuilder Author { get; set; } | ||||
| public EmbedFooterBuilder Footer { get; set; } | public EmbedFooterBuilder Footer { get; set; } | ||||
| @@ -69,17 +69,17 @@ namespace Discord | |||||
| Description = description; | Description = description; | ||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedBuilder WithUrl(string url) | |||||
| public EmbedBuilder WithUrl(Uri url) | |||||
| { | { | ||||
| Url = url; | Url = url; | ||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedBuilder WithThumbnailUrl(string thumbnailUrl) | |||||
| public EmbedBuilder WithThumbnailUrl(Uri thumbnailUrl) | |||||
| { | { | ||||
| ThumbnailUrl = thumbnailUrl; | ThumbnailUrl = thumbnailUrl; | ||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedBuilder WithImageUrl(string imageUrl) | |||||
| public EmbedBuilder WithImageUrl(Uri imageUrl) | |||||
| { | { | ||||
| ImageUrl = imageUrl; | ImageUrl = imageUrl; | ||||
| return this; | return this; | ||||
| @@ -186,7 +186,8 @@ namespace Discord | |||||
| get => _field.Name; | get => _field.Name; | ||||
| set | set | ||||
| { | { | ||||
| if (value?.Length > MaxFieldNameLength) throw new ArgumentException($"Field name length must be less than or equal to {MaxFieldNameLength}."); | |||||
| if (string.IsNullOrEmpty(value)) throw new ArgumentException($"Field name must not be null or empty"); | |||||
| if (value.Length > MaxFieldNameLength) throw new ArgumentException($"Field name length must be less than or equal to {MaxFieldNameLength}."); | |||||
| _field.Name = value; | _field.Name = value; | ||||
| } | } | ||||
| } | } | ||||
| @@ -197,11 +198,12 @@ namespace Discord | |||||
| set | set | ||||
| { | { | ||||
| var stringValue = value.ToString(); | var stringValue = value.ToString(); | ||||
| if (string.IsNullOrEmpty(stringValue)) throw new ArgumentException($"Field value must not be null or empty"); | |||||
| if (stringValue.Length > MaxFieldValueLength) throw new ArgumentException($"Field value length must be less than or equal to {MaxFieldValueLength}."); | if (stringValue.Length > MaxFieldValueLength) throw new ArgumentException($"Field value length must be less than or equal to {MaxFieldValueLength}."); | ||||
| _field.Value = stringValue; | _field.Value = stringValue; | ||||
| } | } | ||||
| } | } | ||||
| public bool IsInline { get { return _field.Inline; } set { _field.Inline = value; } } | |||||
| public bool IsInline { get => _field.Inline; set { _field.Inline = value; } } | |||||
| public EmbedFieldBuilder() | public EmbedFieldBuilder() | ||||
| { | { | ||||
| @@ -243,8 +245,8 @@ namespace Discord | |||||
| _author.Name = value; | _author.Name = value; | ||||
| } | } | ||||
| } | } | ||||
| public string Url { get { return _author.Url; } set { _author.Url = value; } } | |||||
| public string IconUrl { get { return _author.IconUrl; } set { _author.IconUrl = value; } } | |||||
| public Uri Url { get => _author.Url; set { _author.Url = value; } } | |||||
| public Uri IconUrl { get => _author.IconUrl; set { _author.IconUrl = value; } } | |||||
| public EmbedAuthorBuilder() | public EmbedAuthorBuilder() | ||||
| { | { | ||||
| @@ -256,12 +258,12 @@ namespace Discord | |||||
| Name = name; | Name = name; | ||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedAuthorBuilder WithUrl(string url) | |||||
| public EmbedAuthorBuilder WithUrl(Uri url) | |||||
| { | { | ||||
| Url = url; | Url = url; | ||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedAuthorBuilder WithIconUrl(string iconUrl) | |||||
| public EmbedAuthorBuilder WithIconUrl(Uri iconUrl) | |||||
| { | { | ||||
| IconUrl = iconUrl; | IconUrl = iconUrl; | ||||
| return this; | return this; | ||||
| @@ -286,7 +288,7 @@ namespace Discord | |||||
| _footer.Text = value; | _footer.Text = value; | ||||
| } | } | ||||
| } | } | ||||
| public string IconUrl { get { return _footer.IconUrl; } set { _footer.IconUrl = value; } } | |||||
| public Uri IconUrl { get => _footer.IconUrl; set { _footer.IconUrl = value; } } | |||||
| public EmbedFooterBuilder() | public EmbedFooterBuilder() | ||||
| { | { | ||||
| @@ -298,7 +300,7 @@ namespace Discord | |||||
| Text = text; | Text = text; | ||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedFooterBuilder WithIconUrl(string iconUrl) | |||||
| public EmbedFooterBuilder WithIconUrl(Uri iconUrl) | |||||
| { | { | ||||
| IconUrl = iconUrl; | IconUrl = iconUrl; | ||||
| return this; | return this; | ||||