From 273847b7545f80c07807111a1310ca9e4662847f Mon Sep 17 00:00:00 2001 From: Yannic Link Date: Sat, 3 Apr 2021 00:57:01 +0200 Subject: [PATCH] Pat-Kommando --- .gitignore | 1 + .../command/YoshiCommandDistributor.java | 14 ++- .../command/commands/HelpCommand.java | 2 + .../yoshibot/command/commands/PatCommand.java | 87 +++++++++++++++++++ .../yoshibot/utils/Resources.java | 16 ++++ rsc/pat.py | 34 ++++++++ 6 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PatCommand.java create mode 100644 rsc/pat.py diff --git a/.gitignore b/.gitignore index 3b9016d..7c692d6 100644 --- a/.gitignore +++ b/.gitignore @@ -194,4 +194,5 @@ gradle-app.setting # Resources rsc/audio +rsc/image rsc/PrivateJdaBuilderString.txt \ No newline at end of file diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java index f3576a4..c8a8cd2 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java @@ -50,15 +50,15 @@ public class YoshiCommandDistributor { case SAY: command = new SayCommand(context); break; - case LIST: - command = new ListCommand(context); - break; case PLAY: command = new PlayCommand(context); break; case SAUCE: command = new SauceCommand(context); break; + case PAT: + command = new PatCommand(context); + break; default: context.getEvent().getTextChannel().sendMessage("Dieses Kommando existiert noch nicht.").queue(); break; @@ -91,11 +91,6 @@ public class YoshiCommandDistributor { * Standardm��ig wird die Ausgabe in den Textchannel zur�ckgesendet, aus dem das Kommando kam. */ SAY, - /** - * Listet alle zugewiesenen Ressourcen auf. Mit der Option -type [all|link|audio|video] l�sst sich das Format - * der Ressource spezifizieren. - */ - LIST, /** * Gibt eine vorhandene Ressource -name aus. (Vorhandene Ressourcen lassen sich mit der Aktion LIST anzeigen). * �ber den Parameter -type [link|audio|video] l�sst sich der Typ der Ressource spezifizieren. Ein Link wird @@ -108,7 +103,8 @@ public class YoshiCommandDistributor { * L�scht die Ressource, die �ber -name spezifiziert wurde. Mit -type wird der Ressourcentyp festgelegt. */ DELETE, - SAUCE + SAUCE, + PAT } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/HelpCommand.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/HelpCommand.java index 24335d0..eaabb6c 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/HelpCommand.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/HelpCommand.java @@ -33,6 +33,8 @@ public class HelpCommand extends YoshiCommand { false); eb.addField("sauce", "Was erwartest du? Gibt dir halt Soße. Pack nen -tags dahinter und dann bisschen \" um " + "die tags und ab geht der rechte Arm", false); + eb.addField("pat", "Sendet ein Pat-Gif mit dem angehangenen oder alternativ mit -name spezifiziertem " + + "(muss dann aber auf dem Server vorhanden sein) Bild.)", false); sendMessage(eb.build()); return true; diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PatCommand.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PatCommand.java new file mode 100644 index 0000000..46151a1 --- /dev/null +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PatCommand.java @@ -0,0 +1,87 @@ +package de.yannicpunktdee.yoshibot.command.commands; + +import de.yannicpunktdee.yoshibot.command.YoshiCommand; +import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; +import de.yannicpunktdee.yoshibot.utils.Logger; +import de.yannicpunktdee.yoshibot.utils.Resources; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.TextChannel; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class PatCommand extends YoshiCommand { + + public PatCommand(YoshiCommandContext context) { + super(context); + } + + @Override + public boolean execute() { + if(!super.execute()) return false; + + List attachments = context.getEvent().getMessage().getAttachments(); + String path = ""; + if(context.containsArguments(new String[]{"name"})){ + path = Resources.getImagePath() + context.getArgument("name") + ".png"; + File image = new File(path); + if(!image.exists()){ + sendMessage("Bilddatei existiert nicht."); + return false; + } + }else if(attachments.size() == 1){ + path = Resources.getTempPath() + UUID.randomUUID().toString() + ".png"; + CompletableFuture future = attachments.get(0).downloadToFile(path); + future.exceptionally(e -> { + sendMessage("Der Anhang konnte nicht gedownloaded werden."); + return null; + }); + try { + future.get(); + sendMessage("Bild erfolgreich heruntergeladen."); + } catch (InterruptedException | ExecutionException e) { + sendMessage("Die Bilddatei konnte nicht ordnungsgemäß erstellt werden."); + return false; + } + }else{ + return false; + } + + String outPath = Resources.getTempPath().replace('\\', '/') + "/" + UUID.randomUUID().toString() + ".gif"; + try { + ProcessBuilder pb = new ProcessBuilder( + "python", + Resources.getPatPath(), + "--image", + path, + "--patfolder", + Resources.getImagePath(), + "--out", + outPath); + + Process p = pb.start(); + BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream())); + StringBuilder builder = new StringBuilder(); + String line; + while ((line = errorReader.readLine()) != null) { + builder.append(line).append("\n"); + } + if (builder.toString().length() > 0) { + Logger.log(builder.toString(), Logger.Type.ERROR); + } + p.waitFor(); + System.out.println(outPath); + context.getEvent().getTextChannel().sendFile(new File(outPath)).queue(); + } catch (IOException | InterruptedException e) { + return false; + } + + return true; + } +} diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/Resources.java b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/Resources.java index 1c98b5e..b1501d7 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/utils/Resources.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/utils/Resources.java @@ -36,6 +36,10 @@ public final class Resources { private static String sauceConfigPath; @Getter private static String ttsPath; + @Getter + private static String patPath; + @Getter + private static String imagePath; private static Properties propertiesFile; @@ -72,6 +76,8 @@ public final class Resources { if (isOk) isOk = initGuildId(); if (isOk) isOk = initChannelRestrict(); if (isOk) isOk = initTagFilter(); + if (isOk) isOk = initPat(); + if (isOk) isOk = initImages(); if (isOk) Logger.log("Die Konfigurationen wurden erfolgreich geladen.", Type.INFO); else Logger.log("Die Konfiguration konnte nicht geladen werden", Type.ERROR); @@ -242,6 +248,16 @@ public final class Resources { Logger.log("tags_general_filter erfolgreich geladen", Type.INFO); return true; } + + private static boolean initPat(){ + patPath = verifyExists(resourcePath + "pat.py", File::isFile); + return patPath != null; + } + + private static boolean initImages(){ + imagePath = verifyExists(resourcePath + "image/", File::isDirectory); + return imagePath != null; + } private static String verifyExists(String filename, Function checkIsValidFile) { String[] split = filename.split("/"); diff --git a/rsc/pat.py b/rsc/pat.py new file mode 100644 index 0000000..9c21408 --- /dev/null +++ b/rsc/pat.py @@ -0,0 +1,34 @@ +import argparse +from PIL import Image, ImageDraw, ImageFilter + +parser = argparse.ArgumentParser() +parser.add_argument("--patfolder") +parser.add_argument("--image") +parser.add_argument("--out") +args = parser.parse_args() + +patfolder = args.patfolder +personImage = args.image +outPath = args.out + +frame1 = Image.open(patfolder + "pat1.png").resize((500, 400)) +frame2 = Image.open(patfolder + "pat2.png").resize((500, 400)) +frame3 = Image.open(patfolder + "pat3.png").resize((500, 400)) + +person1 = Image.open(personImage).resize((400,400)) +person2 = Image.open(personImage).resize((400,430)) +person3 = Image.open(personImage).resize((400,450)) + +image1 = Image.new('RGBA', (500,500)) +image1.paste(person1, (100,100)) +image1.paste(frame1, (0,0), frame1) + +image2 = Image.new('RGBA', (500,500)) +image2.paste(person2, (100,70)) +image2.paste(frame2, (0,0), frame2) + +image3 = Image.new('RGBA', (500,500)) +image3.paste(person3, (100,50)) +image3.paste(frame3, (0,0), frame3) + +image1.save(outPath, save_all=True,append_images=[image2,image3],optimize=False,duration=100,loop=0) \ No newline at end of file