diff --git a/src/Controllers/ImageGenerationController.cs b/src/Controllers/ImageGenerationController.cs index 26f0dbc..471e489 100644 --- a/src/Controllers/ImageGenerationController.cs +++ b/src/Controllers/ImageGenerationController.cs @@ -86,6 +86,35 @@ public class ImageGenerationController : BaseController GenerateMemeAsync() + { + try + { + var result = await ImageManager.GenerateImageAsync(Request.HttpContext.RequestAborted); + + if (result is byte[] data) + { + var image = new MemoryStream(data); + + return HttpContext.SendStream(image, "image/png"); + } + + return result as IResult; + } + catch (ArgumentException ex) + { + _logger.LogCritical(ex.Message, ex); + return HttpContext.Send(EventResult.FromFailure("Can't parse result"), System.Net.HttpStatusCode.InternalServerError); } } diff --git a/src/Managers/ImageManager.Generation.cs b/src/Managers/ImageManager.Generation.cs index f623125..cf56c70 100644 --- a/src/Managers/ImageManager.Generation.cs +++ b/src/Managers/ImageManager.Generation.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using Exsersewo.Common.Extensions; using Exsersewo.Common.Utilities; using ImageMagick; using Kynareth.Models; @@ -19,6 +20,30 @@ public static partial class ImageManager GenerationTemplateBaseFolder = Path.Combine(_appEnvironment.WebRootPath, configuration.GetValue("ShitpostBot:Folder")); GenerationEndpoints = configuration.GetSection("ShitpostBot:Templates").Get>(); } + + public static async Task GenerateImageAsync(CancellationToken cancellationToken) + { + ImageGenerationImage imageTemplate = null; + + var endpoint = GenerationEndpoints.Random(); + + if (endpoint is null) + { + var ex = new ArgumentException($"Couldn't find endpoint"); + + return GetResult(StatusCodes.Status404NotFound, EventResult.FromFailureException(ex.Message, ex)); + } + + string variant = null; + if (endpoint.Variants.Any() && TrueRandom.Next(0, 50) > 25) + { + variant = endpoint.Variants.Random().Name; + } + + var sources = sourceFiles.GetRandomAmount(endpoint.SourcesRequired) as string[]; + + return await GenerateImageAsync(endpoint.Name, variant, sources, cancellationToken); + } public static async Task GenerateImageAsync(string template, string variant, CancellationToken cancellationToken) {