Skip to content

Commit

Permalink
Add json converters for the properties of Message that are defined as…
Browse files Browse the repository at this point in the history
… interfaces
  • Loading branch information
calexander3 committed Aug 9, 2023
1 parent 416f5ea commit 206db47
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 4 deletions.
18 changes: 16 additions & 2 deletions SlackAPI/Block.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,12 @@ public class DatePickerElement : IElement
public string initial_date { get; set; }
public Confirm confirm { get; set; }
}

public class MarkdownElement : IElement
{
public string type { get; } = ElementTypes.Markdown;
public string text { get; set; }
}

public class View
{
Expand Down Expand Up @@ -227,10 +233,18 @@ public static class ElementTypes
public const string ConversationSelect = "conversation_select";
public const string Overflow = "overflow";
public const string DatePicker = "datepicker";
public const string Markdown = "mrkdwn";
}

public interface IElement { }
public interface IElement
{
string type { get; }
}

public interface IBlock { }
public interface IBlock
{
string type { get; }
string block_id { get; set; }
}

}
42 changes: 42 additions & 0 deletions SlackAPI/BlockConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace SlackAPI
{
public class BlockConverter: JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var block = JObject.Load(reader);
var blockTypeString = block["type"]?.Value<string>();
switch (blockTypeString)
{
case BlockTypes.Actions:
return block.ToObject<ActionsBlock>(serializer);
case BlockTypes.Context:
return block.ToObject<ContextBlock>(serializer);
case BlockTypes.Divider:
return block.ToObject<DividerBlock>(serializer);
case BlockTypes.Header:
return block.ToObject<HeaderBlock>(serializer);
case BlockTypes.Image:
return block.ToObject<ImageBlock>(serializer);
case BlockTypes.Section:
return block.ToObject<SectionBlock>(serializer);
default:
return block.ToObject<Block>(serializer);
}
}

public override bool CanConvert(Type objectType)
{
return objectType == typeof(IBlock);
}
}
}
50 changes: 50 additions & 0 deletions SlackAPI/ElementConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace SlackAPI
{
public class ElementConverter: JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var element = JObject.Load(reader);
var elementTypeString = element["type"]?.Value<string>();
switch (elementTypeString)
{
case ElementTypes.Button:
return element.ToObject<ButtonElement>(serializer);
case ElementTypes.ChannelSelect:
return element.ToObject<ChannelSelectElement>(serializer);
case ElementTypes.ConversationSelect:
return element.ToObject<ConversationSelectElement>(serializer);
case ElementTypes.DatePicker:
return element.ToObject<DatePickerElement>(serializer);
case ElementTypes.ExternalSelect:
return element.ToObject<ExternalSelectElement>(serializer);
case ElementTypes.Image:
return element.ToObject<ImageElement>(serializer);
case ElementTypes.Markdown:
return element.ToObject<MarkdownElement>(serializer);
case ElementTypes.Overflow:
return element.ToObject<OverflowElement>(serializer);
case ElementTypes.UserSelect:
return element.ToObject<UserSelectElement>(serializer);
case ElementTypes.StaticSelect:
return element.ToObject<StaticSelectElement>(serializer);
default:
return element.ToObject<Element>(serializer);
}
}

public override bool CanConvert(Type objectType)
{
return objectType == typeof(IElement);
}
}
}
9 changes: 7 additions & 2 deletions SlackAPI/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@ namespace SlackAPI
{
public static class Extensions
{
internal static readonly IList<JsonConverter> Converters = new List<JsonConverter> { new JavascriptDateTimeConverter() };
internal static readonly IList<JsonConverter> Converters = new List<JsonConverter>
{
new JavascriptDateTimeConverter(),
new BlockConverter(),
new ElementConverter()
};

/// <summary>
/// Converts to a propert JavaScript timestamp interpretted by Slack. Also handles converting to UTC.
/// Converts to a property JavaScript timestamp interpreted by Slack. Also handles converting to UTC.
/// </summary>
/// <param name="that"></param>
/// <returns></returns>
Expand Down

0 comments on commit 206db47

Please sign in to comment.