diff --git a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/java/dev/sheldan/abstracto/imagegeneration/command/Grrr.java b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/java/dev/sheldan/abstracto/imagegeneration/command/Grrr.java new file mode 100644 index 000000000..4aa32acd2 --- /dev/null +++ b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/java/dev/sheldan/abstracto/imagegeneration/command/Grrr.java @@ -0,0 +1,134 @@ +package dev.sheldan.abstracto.imagegeneration.command; + + +import dev.sheldan.abstracto.core.command.UtilityModuleDefinition; +import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand; +import dev.sheldan.abstracto.core.command.config.CommandConfiguration; +import dev.sheldan.abstracto.core.command.config.HelpInfo; +import dev.sheldan.abstracto.core.command.config.Parameter; +import dev.sheldan.abstracto.core.command.config.UserCommandConfig; +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.config.FeatureDefinition; +import dev.sheldan.abstracto.core.interaction.InteractionService; +import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig; +import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService; +import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.templating.model.AttachedFile; +import dev.sheldan.abstracto.core.templating.model.MessageToSend; +import dev.sheldan.abstracto.core.templating.service.TemplateService; +import dev.sheldan.abstracto.core.utils.FileService; +import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.abstracto.imagegeneration.config.ImageGenerationFeatureDefinition; +import dev.sheldan.abstracto.imagegeneration.config.ImageGenerationSlashCommandNames; +import dev.sheldan.abstracto.imagegeneration.service.ImageGenerationService; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class Grrr extends AbstractConditionableCommand { + + @Autowired + private ImageGenerationService imageGenerationService; + + @Autowired + private TemplateService templateService; + + @Autowired + private ChannelService channelService; + + @Autowired + private FileService fileService; + + @Autowired + private InteractionService interactionService; + + @Autowired + private SlashCommandParameterService slashCommandParameterService; + + private static final String GRRR_EMBED_TEMPLATE_KEY = "grr_response"; + public static final String TEXT_PARAMETER_KEY = "text"; + + @Override + public CompletableFuture executeAsync(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + String text = (String) parameters.get(0); + File grrrFile = imageGenerationService.getGrrrImage(text); + MessageToSend messageToSend = templateService.renderEmbedTemplate(GRRR_EMBED_TEMPLATE_KEY, new Object(), commandContext.getGuild().getIdLong()); + // template support does not support binary files + AttachedFile file = AttachedFile + .builder() + .file(grrrFile) + .fileName("grrr.png") + .build(); + messageToSend.getAttachedFiles().add(file); + return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel())) + .thenAccept(unused -> fileService.safeDeleteIgnoreException(messageToSend.getAttachedFiles().get(0).getFile())) + .thenApply(unused -> CommandResult.fromIgnored()); + } + + @Override + public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { + event.deferReply().queue(); + String text = slashCommandParameterService.getCommandOption(TEXT_PARAMETER_KEY, event, String.class); + File grrrFile = imageGenerationService.getGrrrImage(text); + MessageToSend messageToSend = templateService.renderEmbedTemplate(GRRR_EMBED_TEMPLATE_KEY, new Object(), event.getGuild().getIdLong()); + // template support does not support binary files + AttachedFile file = AttachedFile + .builder() + .file(grrrFile) + .fileName("grrr.png") + .build(); + messageToSend.getAttachedFiles().add(file); + return FutureUtils.toSingleFutureGeneric(interactionService.sendMessageToInteraction(messageToSend, event.getHook())) + .thenAccept(unused -> fileService.safeDeleteIgnoreException(messageToSend.getAttachedFiles().get(0).getFile())) + .thenApply(unused -> CommandResult.fromIgnored()); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + Parameter textParameter = Parameter + .builder() + .name(TEXT_PARAMETER_KEY) + .type(String.class) + .templated(true) + .build(); + parameters.add(textParameter); + HelpInfo helpInfo = HelpInfo + .builder() + .templated(true) + .build(); + + SlashCommandConfig slashCommandConfig = SlashCommandConfig + .builder() + .enabled(true) + .userInstallable(true) + .userCommandConfig(UserCommandConfig.all()) + .rootCommandName(ImageGenerationSlashCommandNames.IMAGE_GENERATION) + .groupName("memes") + .commandName("grrr") + .build(); + + return CommandConfiguration.builder() + .name("grrr") + .module(UtilityModuleDefinition.UTILITY) + .templated(true) + .supportsEmbedException(true) + .async(true) + .slashCommandConfig(slashCommandConfig) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureDefinition getFeature() { + return ImageGenerationFeatureDefinition.IMAGE_GENERATION; + } +} diff --git a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/java/dev/sheldan/abstracto/imagegeneration/service/ImageGenerationServiceBean.java b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/java/dev/sheldan/abstracto/imagegeneration/service/ImageGenerationServiceBean.java index 0444b24c0..1b8cb6bd0 100644 --- a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/java/dev/sheldan/abstracto/imagegeneration/service/ImageGenerationServiceBean.java +++ b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/java/dev/sheldan/abstracto/imagegeneration/service/ImageGenerationServiceBean.java @@ -27,6 +27,10 @@ public class ImageGenerationServiceBean implements ImageGenerationService { @Value("${abstracto.feature.imagegeneration.amongusText.url}") private String amongusTextUrl; + + @Value("${abstracto.feature.imagegeneration.grrr.url}") + private String grrrUrl; + @Autowired private HttpService httpService; @@ -68,4 +72,13 @@ public class ImageGenerationServiceBean implements ImageGenerationService { } } + @Override + public File getGrrrImage(String text) { + try { + return httpService.downloadFileToTempFile(grrrUrl.replace("{1}", text)); + } catch (IOException | RequestException e) { + throw new AbstractoRunTimeException(String.format("Failed to download grrr image for text %s with error %s", text, e.getMessage())); + } + } + } diff --git a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/image-generation-config.properties b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/image-generation-config.properties index df3565e44..f93245e13 100644 --- a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/image-generation-config.properties +++ b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/image-generation-config.properties @@ -11,3 +11,5 @@ abstracto.feature.imagegeneration.bonk.url=http://${PRIVATE_REST_API_HOST}:${PRI abstracto.feature.imagegeneration.bonk.imagesize=128 abstracto.feature.imagegeneration.amongusText.url=http://${PRIVATE_REST_API_HOST}:${PRIVATE_REST_API_PORT}/memes/amongus/text?text={1} + +abstracto.feature.imagegeneration.grrr.url=http://${PRIVATE_REST_API_HOST}:${PRIVATE_REST_API_PORT}/memes/grrr/text?text={1} diff --git a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/collection.xml b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/collection.xml new file mode 100644 index 000000000..1bbc30fef --- /dev/null +++ b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/collection.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/seedData/command.xml b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/seedData/command.xml new file mode 100644 index 000000000..c1821e469 --- /dev/null +++ b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/seedData/command.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/seedData/data.xml b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/seedData/data.xml new file mode 100644 index 000000000..e18fc4181 --- /dev/null +++ b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/1.6.26/seedData/data.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/imageGeneration-changeLog.xml b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/imageGeneration-changeLog.xml index 8c4564614..f88f454ee 100644 --- a/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/imageGeneration-changeLog.xml +++ b/abstracto-application/abstracto-modules/image-generation/image-generation-impl/src/main/resources/migrations/imageGeneration-changeLog.xml @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/image-generation/image-generation-int/src/main/java/dev/sheldan/abstracto/imagegeneration/service/ImageGenerationService.java b/abstracto-application/abstracto-modules/image-generation/image-generation-int/src/main/java/dev/sheldan/abstracto/imagegeneration/service/ImageGenerationService.java index b6ae32432..7531ca4a1 100644 --- a/abstracto-application/abstracto-modules/image-generation/image-generation-int/src/main/java/dev/sheldan/abstracto/imagegeneration/service/ImageGenerationService.java +++ b/abstracto-application/abstracto-modules/image-generation/image-generation-int/src/main/java/dev/sheldan/abstracto/imagegeneration/service/ImageGenerationService.java @@ -7,4 +7,5 @@ public interface ImageGenerationService { File getPatGif(String imageUrl); File getBonkGif(String imageUrl); File getAmongusTextImage(String text); + File getGrrrImage(String text); } diff --git a/python/components/image-gen/python/endpoints/grrr.py b/python/components/image-gen/python/endpoints/grrr.py new file mode 100644 index 000000000..3b831635d --- /dev/null +++ b/python/components/image-gen/python/endpoints/grrr.py @@ -0,0 +1,26 @@ +from __main__ import app + +from PIL import Image, ImageDraw, ImageFont +from flask import request +import logging + +from utils import flask_utils + +@app.route('/memes/grrr/text') +def grrr(): + text = request.args.get('text') + if text is None: + return 'no text', 400 + logging.info(f'Rendering grrr.') + with Image.open('resources/img/grrr.png') as im: + d1 = ImageDraw.Draw(im) + text_box_size = (250, 200) + W, H = text_box_size + font = ImageFont.truetype(f'Impact.ttf', 60) + _, _, w, h = d1.textbbox((0, 0), text, font=font) + d1.text(((W-w)/2 + 120, (H-h)/2 + 330), text, font=font, fill=(255, 255, 255)) + _, _, w2, h2 = d1.textbbox((0, 0), 'grrr', font=font) + d1.text(((W-w2)/2 + 100, (H-h2)/2 - 90), 'grrr', font=font, fill=(255, 255, 255)) + return flask_utils.serve_pil_image(im) + + diff --git a/python/components/image-gen/resources/img/grrr.png b/python/components/image-gen/resources/img/grrr.png new file mode 100644 index 000000000..a0310dea0 Binary files /dev/null and b/python/components/image-gen/resources/img/grrr.png differ