From bb2c587ac40ea16d2286fd9b65c909668f1329bb Mon Sep 17 00:00:00 2001 From: moiph Date: Sun, 18 Jun 2017 02:26:50 -0700 Subject: [PATCH] Add various property validation in EmbedBuilder --- .../Entities/Messages/EmbedBuilder.cs | 92 ++++++++++++++++--- 1 file changed, 81 insertions(+), 11 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Rest/Entities/Messages/EmbedBuilder.cs index 98a191379..74d97243f 100644 --- a/src/Discord.Net.Rest/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Rest/Entities/Messages/EmbedBuilder.cs @@ -8,14 +8,36 @@ namespace Discord { private readonly Embed _embed; + public const int MaxFieldCount = 25; + public const int MaxTitleLength = 256; + public const int MaxDescriptionLength = 2048; + public EmbedBuilder() { _embed = new Embed("rich"); Fields = new List(); } - public string Title { get { return _embed.Title; } set { _embed.Title = value; } } - public string Description { get { return _embed.Description; } set { _embed.Description = value; } } + public string Title + { + get => _embed.Title; + set + { + if (value?.Length > MaxTitleLength) throw new ArgumentException($"Title length must be less than or equal to {MaxTitleLength}."); + _embed.Title = value; + } + } + + public string Description + { + get => _embed.Description; + set + { + if (value?.Length > MaxDescriptionLength) throw new ArgumentException($"Description length must be less than or equal to {MaxDescriptionLength}."); + _embed.Description = value; + } + } + 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); } } @@ -30,8 +52,10 @@ namespace Discord get => _fields; set { - if (value != null) _fields = value; - else throw new ArgumentNullException("Cannot set an embed builder's fields collection to null", nameof(value)); + + if (value == null) throw new ArgumentNullException("Cannot set an embed builder's fields collection to null", nameof(value)); + if (value.Count > MaxFieldCount) throw new ArgumentException($"Field count must be less than or equal to {MaxFieldCount}."); + _fields = value; } } @@ -107,7 +131,7 @@ namespace Discord .WithIsInline(false) .WithName(name) .WithValue(value); - Fields.Add(field); + AddField(field); return this; } public EmbedBuilder AddInlineField(string name, object value) @@ -116,11 +140,16 @@ namespace Discord .WithIsInline(true) .WithName(name) .WithValue(value); - Fields.Add(field); + AddField(field); return this; } public EmbedBuilder AddField(EmbedFieldBuilder field) { + if (Fields.Count >= MaxFieldCount) + { + throw new ArgumentException($"Field count must be less than or equal to {MaxFieldCount}."); + } + Fields.Add(field); return this; } @@ -128,7 +157,7 @@ namespace Discord { var field = new EmbedFieldBuilder(); action(field); - Fields.Add(field); + this.AddField(field); return this; } @@ -149,8 +178,29 @@ namespace Discord { private EmbedField _field; - public string Name { get { return _field.Name; } set { _field.Name = value; } } - public object Value { get { return _field.Value; } set { _field.Value = value.ToString(); } } + public const int MaxFieldNameLength = 256; + public const int MaxFieldValueLength = 1024; + + public string Name + { + get => _field.Name; + set + { + if (value?.Length > MaxFieldNameLength) throw new ArgumentException($"Field name length must be less than or equal to {MaxFieldNameLength}."); + _field.Name = value; + } + } + + public object Value + { + get => _field.Value; + set + { + var stringValue = value.ToString(); + if (stringValue.Length > MaxFieldValueLength) throw new ArgumentException($"Field value length must be less than or equal to {MaxFieldValueLength}."); + _field.Value = stringValue; + } + } public bool IsInline { get { return _field.Inline; } set { _field.Inline = value; } } public EmbedFieldBuilder() @@ -182,7 +232,17 @@ namespace Discord { private EmbedAuthor _author; - public string Name { get { return _author.Name; } set { _author.Name = value; } } + public const int MaxAuthorNameLength = 256; + + public string Name + { + get => _author.Name; + set + { + if (value?.Length > MaxAuthorNameLength) throw new ArgumentException($"Author name length must be less than or equal to {MaxAuthorNameLength}."); + _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; } } @@ -215,7 +275,17 @@ namespace Discord { private EmbedFooter _footer; - public string Text { get { return _footer.Text; } set { _footer.Text = value; } } + public const int MaxFooterTextLength = 2048; + + public string Text + { + get => _footer.Text; + set + { + if (value?.Length > MaxFooterTextLength) throw new ArgumentException($"Footer text length must be less than or equal to {MaxFooterTextLength}."); + _footer.Text = value; + } + } public string IconUrl { get { return _footer.IconUrl; } set { _footer.IconUrl = value; } } public EmbedFooterBuilder()