Browse Source

Pat-Kommando

pull/2/head
Yannic Link 4 years ago
parent
commit
273847b754
6 changed files with 145 additions and 9 deletions
  1. +1
    -0
      .gitignore
  2. +5
    -9
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java
  3. +2
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/HelpCommand.java
  4. +87
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PatCommand.java
  5. +16
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/utils/Resources.java
  6. +34
    -0
      rsc/pat.py

+ 1
- 0
.gitignore View File

@ -194,4 +194,5 @@ gradle-app.setting
# Resources # Resources
rsc/audio rsc/audio
rsc/image
rsc/PrivateJdaBuilderString.txt rsc/PrivateJdaBuilderString.txt

+ 5
- 9
app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java View File

@ -50,15 +50,15 @@ public class YoshiCommandDistributor {
case SAY: case SAY:
command = new SayCommand(context); command = new SayCommand(context);
break; break;
case LIST:
command = new ListCommand(context);
break;
case PLAY: case PLAY:
command = new PlayCommand(context); command = new PlayCommand(context);
break; break;
case SAUCE: case SAUCE:
command = new SauceCommand(context); command = new SauceCommand(context);
break; break;
case PAT:
command = new PatCommand(context);
break;
default: default:
context.getEvent().getTextChannel().sendMessage("Dieses Kommando existiert noch nicht.").queue(); context.getEvent().getTextChannel().sendMessage("Dieses Kommando existiert noch nicht.").queue();
break; break;
@ -91,11 +91,6 @@ public class YoshiCommandDistributor {
* Standardmig wird die Ausgabe in den Textchannel zurckgesendet, aus dem das Kommando kam. * Standardmig wird die Ausgabe in den Textchannel zurckgesendet, aus dem das Kommando kam.
*/ */
SAY, SAY,
/**
* Listet alle zugewiesenen Ressourcen auf. Mit der Option -type [all|link|audio|video] lsst sich das Format
* der Ressource spezifizieren.
*/
LIST,
/** /**
* Gibt eine vorhandene Ressource -name aus. (Vorhandene Ressourcen lassen sich mit der Aktion LIST anzeigen). * Gibt eine vorhandene Ressource -name aus. (Vorhandene Ressourcen lassen sich mit der Aktion LIST anzeigen).
* ber den Parameter -type [link|audio|video] lsst sich der Typ der Ressource spezifizieren. Ein Link wird * ber den Parameter -type [link|audio|video] lsst sich der Typ der Ressource spezifizieren. Ein Link wird
@ -108,7 +103,8 @@ public class YoshiCommandDistributor {
* Lscht die Ressource, die ber -name spezifiziert wurde. Mit -type wird der Ressourcentyp festgelegt. * Lscht die Ressource, die ber -name spezifiziert wurde. Mit -type wird der Ressourcentyp festgelegt.
*/ */
DELETE, DELETE,
SAUCE
SAUCE,
PAT
} }


+ 2
- 0
app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/HelpCommand.java View File

@ -33,6 +33,8 @@ public class HelpCommand extends YoshiCommand {
false); false);
eb.addField("sauce", "Was erwartest du? Gibt dir halt Soße. Pack nen -tags dahinter und dann bisschen \" um " + 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); "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()); sendMessage(eb.build());
return true; return true;


+ 87
- 0
app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PatCommand.java View File

@ -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<Message.Attachment> 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<File> 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;
}
}

+ 16
- 0
app/src/main/java/de/yannicpunktdee/yoshibot/utils/Resources.java View File

@ -36,6 +36,10 @@ public final class Resources {
private static String sauceConfigPath; private static String sauceConfigPath;
@Getter @Getter
private static String ttsPath; private static String ttsPath;
@Getter
private static String patPath;
@Getter
private static String imagePath;
private static Properties propertiesFile; private static Properties propertiesFile;
@ -72,6 +76,8 @@ public final class Resources {
if (isOk) isOk = initGuildId(); if (isOk) isOk = initGuildId();
if (isOk) isOk = initChannelRestrict(); if (isOk) isOk = initChannelRestrict();
if (isOk) isOk = initTagFilter(); if (isOk) isOk = initTagFilter();
if (isOk) isOk = initPat();
if (isOk) isOk = initImages();
if (isOk) Logger.log("Die Konfigurationen wurden erfolgreich geladen.", Type.INFO); if (isOk) Logger.log("Die Konfigurationen wurden erfolgreich geladen.", Type.INFO);
else Logger.log("Die Konfiguration konnte nicht geladen werden", Type.ERROR); 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); Logger.log("tags_general_filter erfolgreich geladen", Type.INFO);
return true; 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<File, Boolean> checkIsValidFile) { private static String verifyExists(String filename, Function<File, Boolean> checkIsValidFile) {
String[] split = filename.split("/"); String[] split = filename.split("/");


+ 34
- 0
rsc/pat.py View File

@ -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)

Loading…
Cancel
Save