From a9d284dc9d61e67edfb052f4be0c32dc86a1641f Mon Sep 17 00:00:00 2001 From: West14 <30056636+West14@users.noreply.github.com> Date: Fri, 21 Jan 2022 14:18:56 +0200 Subject: [PATCH] [quote] Code cleanup. --- .../Json/NullToEmptyObjectResolver.cs | 2 +- .../Json/NullToEmptyObjectValueProvider.cs | 4 +- modules/ChatQuotes/Model/Quote/MediaType.cs | 6 ++ modules/ChatQuotes/Model/Quote/Message.cs | 47 +++++++++++ modules/ChatQuotes/Model/Quote/Request.cs | 35 ++++++++ modules/ChatQuotes/Model/Quote/Response.cs | 16 ++++ modules/ChatQuotes/Model/Quote/Result.cs | 13 +++ modules/ChatQuotes/Model/Quote/Type.cs | 8 ++ modules/ChatQuotes/Model/QuoteRequest.cs | 82 ------------------- modules/ChatQuotes/Model/QuoteResponse.cs | 35 -------- modules/ChatQuotes/QuoteGeneratorService.cs | 15 ++-- 11 files changed, 138 insertions(+), 125 deletions(-) create mode 100644 modules/ChatQuotes/Model/Quote/MediaType.cs create mode 100644 modules/ChatQuotes/Model/Quote/Message.cs create mode 100644 modules/ChatQuotes/Model/Quote/Request.cs create mode 100644 modules/ChatQuotes/Model/Quote/Response.cs create mode 100644 modules/ChatQuotes/Model/Quote/Result.cs create mode 100644 modules/ChatQuotes/Model/Quote/Type.cs delete mode 100644 modules/ChatQuotes/Model/QuoteRequest.cs delete mode 100644 modules/ChatQuotes/Model/QuoteResponse.cs diff --git a/modules/ChatQuotes/Json/NullToEmptyObjectResolver.cs b/modules/ChatQuotes/Json/NullToEmptyObjectResolver.cs index be2d3c1..75fe112 100644 --- a/modules/ChatQuotes/Json/NullToEmptyObjectResolver.cs +++ b/modules/ChatQuotes/Json/NullToEmptyObjectResolver.cs @@ -10,7 +10,7 @@ namespace West.TelegramBot.ChatQuotes.Json return type.GetProperties() .Select(p => { var jp = base.CreateProperty(p, memberSerialization); - jp.ValueProvider = new NullToEmptyStringValueProvider(p); + jp.ValueProvider = new NullToEmptyObjectValueProvider(p); return jp; }).ToList(); } diff --git a/modules/ChatQuotes/Json/NullToEmptyObjectValueProvider.cs b/modules/ChatQuotes/Json/NullToEmptyObjectValueProvider.cs index aad5bb1..5f08515 100644 --- a/modules/ChatQuotes/Json/NullToEmptyObjectValueProvider.cs +++ b/modules/ChatQuotes/Json/NullToEmptyObjectValueProvider.cs @@ -4,10 +4,10 @@ using Telegram.Bot.Types; namespace West.TelegramBot.ChatQuotes.Json; -public class NullToEmptyStringValueProvider : IValueProvider +public class NullToEmptyObjectValueProvider : IValueProvider { private readonly PropertyInfo _memberInfo; - public NullToEmptyStringValueProvider(PropertyInfo memberInfo) + public NullToEmptyObjectValueProvider(PropertyInfo memberInfo) { _memberInfo = memberInfo; } diff --git a/modules/ChatQuotes/Model/Quote/MediaType.cs b/modules/ChatQuotes/Model/Quote/MediaType.cs new file mode 100644 index 0000000..10b63a9 --- /dev/null +++ b/modules/ChatQuotes/Model/Quote/MediaType.cs @@ -0,0 +1,6 @@ +namespace West.TelegramBot.ChatQuotes.Model.Quote; + +public enum MediaType +{ + Sticker = 0 +} \ No newline at end of file diff --git a/modules/ChatQuotes/Model/Quote/Message.cs b/modules/ChatQuotes/Model/Quote/Message.cs new file mode 100644 index 0000000..27650d6 --- /dev/null +++ b/modules/ChatQuotes/Model/Quote/Message.cs @@ -0,0 +1,47 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using Telegram.Bot.Types; +using File = Telegram.Bot.Types.File; + +namespace West.TelegramBot.ChatQuotes.Model.Quote; + +[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] +public class Message +{ + public List? Media { get; set; } + public MediaType? MediaType { get; set; } + public long ChatId { get; set; } + public bool Avatar { get; set; } = true; + public User? From { get; set; } + public string? Text { get; set; } + public Telegram.Bot.Types.Message? ReplyMessage { get; set; } + + public static Message FromMessage(Telegram.Bot.Types.Message msg) + { + var quoteMessage = new Message(); + + if (msg.Text != null) + { + quoteMessage.Text = msg.Text; + } + + var sticker = msg.Sticker; + if (sticker != null) + { + var file = new File + { + FileId = sticker.FileId, + FileSize = sticker.FileSize, + FileUniqueId = sticker.FileUniqueId + }; + quoteMessage.Media = new List { file }; + quoteMessage.MediaType = Quote.MediaType.Sticker; + } + + quoteMessage.ChatId = msg.Chat.Id; + quoteMessage.ReplyMessage = msg.ReplyToMessage; + quoteMessage.From = User.FromTgUser(msg.From!); + + return quoteMessage; + } +} \ No newline at end of file diff --git a/modules/ChatQuotes/Model/Quote/Request.cs b/modules/ChatQuotes/Model/Quote/Request.cs new file mode 100644 index 0000000..2a68390 --- /dev/null +++ b/modules/ChatQuotes/Model/Quote/Request.cs @@ -0,0 +1,35 @@ +#nullable enable + +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace West.TelegramBot.ChatQuotes.Model.Quote; + +[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] +public class Request +{ + public Request(Telegram.Bot.Types.Message msg) + { + // TODO: move default values to config + Format = "webp"; + BackgroundColor = "#1b1429"; + Width = 512; + Height = 768; + Scale = 2; + + Messages = new List {Message.FromMessage(msg)}; + } + + public Type Type { get; set; } + public string Format { get; set; } + public string BackgroundColor { get; set; } + public int Width { get; set; } + public int Height { get; set; } + public int Scale { get; set; } + public List? Messages { get; set; } + + public string ToJson() + { + return JsonConvert.SerializeObject(this, ChatQuotes.SerializerSettings); + } +} \ No newline at end of file diff --git a/modules/ChatQuotes/Model/Quote/Response.cs b/modules/ChatQuotes/Model/Quote/Response.cs new file mode 100644 index 0000000..23ca597 --- /dev/null +++ b/modules/ChatQuotes/Model/Quote/Response.cs @@ -0,0 +1,16 @@ +#nullable disable + +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace West.TelegramBot.ChatQuotes.Model.Quote; + +[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] +public class Response +{ + public bool Ok { get; set; } + + public Result Result { get; set; } + public static Response FromJson(string json) + => JsonConvert.DeserializeObject(json, ChatQuotes.SerializerSettings); +} \ No newline at end of file diff --git a/modules/ChatQuotes/Model/Quote/Result.cs b/modules/ChatQuotes/Model/Quote/Result.cs new file mode 100644 index 0000000..3387c7a --- /dev/null +++ b/modules/ChatQuotes/Model/Quote/Result.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace West.TelegramBot.ChatQuotes.Model.Quote; + +[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] +public class Result +{ + public string Image { get; set; } + public Type Type { get; set; } + public long Width { get; set; } + public long Height { get; set; } +} \ No newline at end of file diff --git a/modules/ChatQuotes/Model/Quote/Type.cs b/modules/ChatQuotes/Model/Quote/Type.cs new file mode 100644 index 0000000..b30a38c --- /dev/null +++ b/modules/ChatQuotes/Model/Quote/Type.cs @@ -0,0 +1,8 @@ +namespace West.TelegramBot.ChatQuotes.Model.Quote; + +public enum Type +{ + Quote = 0, + Image, + Null +} \ No newline at end of file diff --git a/modules/ChatQuotes/Model/QuoteRequest.cs b/modules/ChatQuotes/Model/QuoteRequest.cs deleted file mode 100644 index bda9183..0000000 --- a/modules/ChatQuotes/Model/QuoteRequest.cs +++ /dev/null @@ -1,82 +0,0 @@ -#nullable enable - -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using Telegram.Bot.Types; -using File = Telegram.Bot.Types.File; - -namespace West.TelegramBot.ChatQuotes.Model; - -[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] -public class QuoteRequest -{ - public QuoteRequest(Message msg) - { - // TODO: move default values to config - Format = "webp"; - BackgroundColor = "#1b1429"; - Width = 512; - Height = 768; - Scale = 2; - - Messages = new List {QuoteMessage.FromMessage(msg)}; - } - - public QuoteType Type { get; set; } - public string Format { get; set; } - public string BackgroundColor { get; set; } - public int Width { get; set; } - public int Height { get; set; } - public int Scale { get; set; } - public List? Messages { get; set; } - - public string ToJson() - { - return JsonConvert.SerializeObject(this, ChatQuotes.SerializerSettings); - } -} -[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] -public class QuoteMessage -{ - public List? Media { get; set; } - public QuoteMediaType? MediaType { get; set; } - public long ChatId { get; set; } - public bool Avatar { get; set; } = true; - public User? From { get; set; } - public string? Text { get; set; } - public Message? ReplyMessage { get; set; } - - public static QuoteMessage FromMessage(Message msg) - { - var quoteMessage = new QuoteMessage(); - - if (msg.Text != null) - { - quoteMessage.Text = msg.Text; - } - - var sticker = msg.Sticker; - if (sticker != null) - { - var file = new File - { - FileId = sticker.FileId, - FileSize = sticker.FileSize, - FileUniqueId = sticker.FileUniqueId - }; - quoteMessage.Media = new List {file}; - quoteMessage.MediaType = QuoteMediaType.Sticker; - } - - quoteMessage.ChatId = msg.Chat.Id; - quoteMessage.ReplyMessage = msg.ReplyToMessage; - quoteMessage.From = User.FromTgUser(msg.From!); - - return quoteMessage; - } -} - -public enum QuoteMediaType -{ - Sticker = 0 -} \ No newline at end of file diff --git a/modules/ChatQuotes/Model/QuoteResponse.cs b/modules/ChatQuotes/Model/QuoteResponse.cs deleted file mode 100644 index 85bb85e..0000000 --- a/modules/ChatQuotes/Model/QuoteResponse.cs +++ /dev/null @@ -1,35 +0,0 @@ -#nullable disable - -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; - -namespace West.TelegramBot.ChatQuotes.Model; - -[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] -public class QuoteResponse -{ - public bool Ok { get; set; } - - public Result Result { get; set; } - public static QuoteResponse FromJson(string json) - => JsonConvert.DeserializeObject(json, ChatQuotes.SerializerSettings); -} - -[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] -public class Result -{ - public string Image { get; set; } - - public QuoteType Type { get; set; } - - public long Width { get; set; } - - public long Height { get; set; } -} - -public enum QuoteType -{ - Quote = 0, - Image, - Null -} \ No newline at end of file diff --git a/modules/ChatQuotes/QuoteGeneratorService.cs b/modules/ChatQuotes/QuoteGeneratorService.cs index 9e407fc..8177f82 100644 --- a/modules/ChatQuotes/QuoteGeneratorService.cs +++ b/modules/ChatQuotes/QuoteGeneratorService.cs @@ -4,12 +4,15 @@ using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Telegram.Bot.Types; using West.TelegramBot.ChatQuotes.Model; +using West.TelegramBot.ChatQuotes.Model.Quote; +using Message = Telegram.Bot.Types.Message; namespace West.TelegramBot.ChatQuotes; public class QuoteGeneratorService { private readonly HttpClient _httpClient; + private readonly MediaTypeHeaderValue _mediaType; public QuoteGeneratorService(IConfiguration configuration) { @@ -17,22 +20,24 @@ public class QuoteGeneratorService { BaseAddress = new Uri(configuration.GetValue("QuoteApiUrl")) }; + + _mediaType = MediaTypeHeaderValue.Parse("application/json"); } - public async Task GenerateQuoteImage(Message msg) + public async Task GenerateQuoteImage(Message msg) { - var request = new QuoteRequest(msg); + var request = new Request(msg); var content = new ByteArrayContent(Encoding.UTF8.GetBytes(request.ToJson().ToCharArray())) { Headers = { - ContentType = MediaTypeHeaderValue.Parse("application/json") + ContentType = _mediaType } }; var resp = await _httpClient.PostAsync("/generate", content); - var quoteResponse = JsonConvert.DeserializeObject(await resp.Content.ReadAsStringAsync()); + var quoteResponse = JsonConvert.DeserializeObject(await resp.Content.ReadAsStringAsync()); - return new MemoryStream(Convert.FromBase64String(quoteResponse.Result.Image)); + return quoteResponse.Ok ? new MemoryStream(Convert.FromBase64String(quoteResponse.Result.Image)) : null; } } \ No newline at end of file