From eea11ef8d232972dd40d965fe81f528ebf72de44 Mon Sep 17 00:00:00 2001 From: RogueException Date: Tue, 8 Aug 2017 05:33:42 -0300 Subject: [PATCH] Added image serializer Added support for more image formats --- src/Discord.Net.Core/Entities/Image.cs | 8 +++- src/Discord.Net.Rest/API/Image.cs | 5 ++- .../Extensions/EntityExtensions.cs | 2 +- .../JsonConverters/ImagePropertyConverter.cs | 46 ++++++++++++++++++++-- 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Image.cs b/src/Discord.Net.Core/Entities/Image.cs index c2c997365..2262d4bde 100644 --- a/src/Discord.Net.Core/Entities/Image.cs +++ b/src/Discord.Net.Core/Entities/Image.cs @@ -7,13 +7,16 @@ namespace Discord public struct Image { public Stream Stream { get; } + public ImageFormat Format { get; } + /// /// Create the image with a Stream. /// /// This must be some type of stream with the contents of a file in it. - public Image(Stream stream) + public Image(Stream stream, ImageFormat format = ImageFormat.Jpeg) { Stream = stream; + Format = format; } #if FILESYSTEM /// @@ -23,9 +26,10 @@ namespace Discord /// This file path is NOT validated, and is passed directly into a /// /// The path to the file. - public Image(string path) + public Image(string path, ImageFormat format = ImageFormat.Jpeg) { Stream = File.OpenRead(path); + Format = format; } #endif } diff --git a/src/Discord.Net.Rest/API/Image.cs b/src/Discord.Net.Rest/API/Image.cs index b2357a0a6..89173a975 100644 --- a/src/Discord.Net.Rest/API/Image.cs +++ b/src/Discord.Net.Rest/API/Image.cs @@ -5,16 +5,19 @@ namespace Discord.API internal struct Image { public Stream Stream { get; } + public ImageFormat StreamFormat { get; } public string Hash { get; } - public Image(Stream stream) + public Image(Stream stream, ImageFormat format) { Stream = stream; + StreamFormat = format; Hash = null; } public Image(string hash) { Stream = null; + StreamFormat = ImageFormat.Jpeg; Hash = hash; } } diff --git a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs index b88a5b515..0312e7411 100644 --- a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs @@ -114,7 +114,7 @@ namespace Discord.Rest public static API.Image ToModel(this Image entity) { - return new API.Image(entity.Stream); + return new API.Image(entity.Stream, entity.Format); } public static Overwrite ToEntity(this API.Overwrite model) diff --git a/src/Discord.Net.Rest/Serialization/JsonConverters/ImagePropertyConverter.cs b/src/Discord.Net.Rest/Serialization/JsonConverters/ImagePropertyConverter.cs index 8062c0c9e..6d28136aa 100644 --- a/src/Discord.Net.Rest/Serialization/JsonConverters/ImagePropertyConverter.cs +++ b/src/Discord.Net.Rest/Serialization/JsonConverters/ImagePropertyConverter.cs @@ -1,12 +1,52 @@ -using System.Text.Json; +using System; +using System.Text.Json; namespace Discord.Serialization.Json.Converters { internal class ImagePropertyConverter : IJsonPropertyConverter { public API.Image Read(PropertyMap map, ref JsonReader reader, bool isTopLevel) - => throw new System.NotImplementedException(); + { + if (isTopLevel) + reader.Read(); + if (reader.ValueType != JsonValueType.String) + throw new SerializationException("Bad input, expected String"); + return new API.Image(reader.ParseString()); + } public void Write(PropertyMap map, ref JsonWriter writer, API.Image value, bool isTopLevel) - => throw new System.NotImplementedException(); + { + string str; + if (value.Stream != null) + { + byte[] bytes = new byte[value.Stream.Length - value.Stream.Position]; + value.Stream.Read(bytes, 0, bytes.Length); + + string base64 = Convert.ToBase64String(bytes); + switch (value.StreamFormat) + { + case ImageFormat.Jpeg: + str = $"data:image/jpeg;base64,{base64}"; + break; + case ImageFormat.Png: + str = $"data:image/png;base64,{base64}"; + break; + case ImageFormat.Gif: + str = $"data:image/gif;base64,{base64}"; + break; + case ImageFormat.WebP: + str = $"data:image/webp;base64,{base64}"; + break; + default: + throw new SerializationException($"Unable to serialize an {nameof(Image)} with a format of {value.StreamFormat}"); + } + } + else + str = value.Hash; + + if (isTopLevel) + writer.WriteAttribute(map.Key, str); + else + writer.WriteValue(str); + } } }