| @@ -8,14 +8,36 @@ namespace Discord | |||||
| { | { | ||||
| private readonly Embed _embed; | private readonly Embed _embed; | ||||
| public const int MaxFieldCount = 25; | |||||
| public const int MaxTitleLength = 256; | |||||
| public const int MaxDescriptionLength = 2048; | |||||
| public EmbedBuilder() | public EmbedBuilder() | ||||
| { | { | ||||
| _embed = new Embed("rich"); | _embed = new Embed("rich"); | ||||
| Fields = new List<EmbedFieldBuilder>(); | Fields = new List<EmbedFieldBuilder>(); | ||||
| } | } | ||||
| 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 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 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 string ImageUrl { get { return _embed.Image?.Url; } set { _embed.Image = new EmbedImage(value, null, null, null); } } | ||||
| @@ -30,8 +52,10 @@ namespace Discord | |||||
| get => _fields; | get => _fields; | ||||
| set | 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) | .WithIsInline(false) | ||||
| .WithName(name) | .WithName(name) | ||||
| .WithValue(value); | .WithValue(value); | ||||
| Fields.Add(field); | |||||
| AddField(field); | |||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedBuilder AddInlineField(string name, object value) | public EmbedBuilder AddInlineField(string name, object value) | ||||
| @@ -116,11 +140,16 @@ namespace Discord | |||||
| .WithIsInline(true) | .WithIsInline(true) | ||||
| .WithName(name) | .WithName(name) | ||||
| .WithValue(value); | .WithValue(value); | ||||
| Fields.Add(field); | |||||
| AddField(field); | |||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedBuilder AddField(EmbedFieldBuilder field) | 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); | Fields.Add(field); | ||||
| return this; | return this; | ||||
| } | } | ||||
| @@ -128,7 +157,7 @@ namespace Discord | |||||
| { | { | ||||
| var field = new EmbedFieldBuilder(); | var field = new EmbedFieldBuilder(); | ||||
| action(field); | action(field); | ||||
| Fields.Add(field); | |||||
| this.AddField(field); | |||||
| return this; | return this; | ||||
| } | } | ||||
| @@ -149,8 +178,29 @@ namespace Discord | |||||
| { | { | ||||
| private EmbedField _field; | 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 bool IsInline { get { return _field.Inline; } set { _field.Inline = value; } } | ||||
| public EmbedFieldBuilder() | public EmbedFieldBuilder() | ||||
| @@ -182,7 +232,17 @@ namespace Discord | |||||
| { | { | ||||
| private EmbedAuthor _author; | 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 Url { get { return _author.Url; } set { _author.Url = value; } } | ||||
| public string IconUrl { get { return _author.IconUrl; } set { _author.IconUrl = value; } } | public string IconUrl { get { return _author.IconUrl; } set { _author.IconUrl = value; } } | ||||
| @@ -215,7 +275,17 @@ namespace Discord | |||||
| { | { | ||||
| private EmbedFooter _footer; | 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 string IconUrl { get { return _footer.IconUrl; } set { _footer.IconUrl = value; } } | ||||
| public EmbedFooterBuilder() | public EmbedFooterBuilder() | ||||