Browse Source

Merge branch 'master' of http://yannicpunktdee.de:3000/yannic/YoshiBot into master

 Conflicts:
	app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java
	app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java
pull/2/head
Yannic Link 4 years ago
parent
commit
64698d5f91
9 changed files with 176 additions and 106 deletions
  1. +82
    -18
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java
  2. +8
    -3
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java
  3. +26
    -15
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/JokeCommand.java
  4. +0
    -3
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PlayCommand.java
  5. +1
    -58
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/SayCommand.java
  6. +49
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/WikipediaCommand.java
  7. +5
    -1
      app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java
  8. +3
    -1
      app/src/main/java/de/yannicpunktdee/yoshibot/utils/RestHelper.java
  9. +2
    -7
      app/src/main/java/de/yannicpunktdee/yoshibot/utils/SauceProvider.java

+ 82
- 18
app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java View File

@ -1,12 +1,20 @@
package de.yannicpunktdee.yoshibot.command;
import de.yannicpunktdee.yoshibot.audio.AudioLoadResultHandlerImpl;
import de.yannicpunktdee.yoshibot.command.commands.SayCommand;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
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.Message.Attachment;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.VoiceChannel;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
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;
@ -14,6 +22,7 @@ import java.util.concurrent.ExecutionException;
/**
* Abstrakte Superklasse für alle Kommandos.
*
* @author Yannic Link
*/
public abstract class YoshiCommand {
@ -25,53 +34,93 @@ public abstract class YoshiCommand {
*/
protected YoshiCommandContext context;
public static String resourceToDelete = null;
/**
* Erzeugt ein neues Kommando, führt es aber noch nicht aus. Es wird ermittelt, ob die Argumentenkombination
* valide ist und das isOk-Flag gesetzt. Im Fehlerfall wird eine Fehleremeldung spezifiziert.
* Erzeugt ein neues Kommando, führt es aber noch nicht aus. Es wird ermittelt, ob die Argumentenkombination valide
* ist und das isOk-Flag gesetzt. Im Fehlerfall wird eine Fehleremeldung spezifiziert.
*
* @param context Der Kontext mit dem das Kommando aufgerufen wurde.
*/
public YoshiCommand(YoshiCommandContext context) {
this.context = context;
}
public static String buildTTSAudio(String text) {
String path = Resources.getPathToTempAudioFile(UUID.randomUUID().toString());
try {
ProcessBuilder pb = new ProcessBuilder(
"python3",
Resources.getTtsPath(),
"--text",
text,
"--lang",
"de",
"--out",
path);
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.logError(builder.toString());
}
if (resourceToDelete != null)
synchronized (resourceToDelete) {
resourceToDelete = path;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
return path;
}
/**
* Führt das Kommando aus.
*
* @return True, wenn Ausführung erfolgreich. False, wenn Ausführung fehlgeschlagen. Fehlermeldung wird in
* errorMessage spezifiziert.
*/
public boolean execute() {
if(!context.containsArguments(requiredArguments)){
if (!context.containsArguments(requiredArguments)) {
sendMessage("Fehlende Argumente");
return false;
}
return true;
}
protected void sendMessage(String message) {
protected final void sendMessage(String message) {
context.getEvent().getTextChannel().sendMessage(message).queue();
}
public void sendMessage(MessageEmbed messageEmbed){
protected final void sendMessage(MessageEmbed messageEmbed) {
context.getEvent().getTextChannel().sendMessage(messageEmbed).queue();
}
protected File downloadAttachmentToFile(String directoryPath, String name){
if(directoryPath == null) directoryPath = Resources.getTempPath();
if(name == null) name = UUID.randomUUID().toString();
if(!(new File(directoryPath)).isDirectory()){
protected File downloadAttachmentToFile(String directoryPath, String name) {
if (directoryPath == null) directoryPath = Resources.getTempPath();
if (name == null) name = UUID.randomUUID().toString();
if (!(new File(directoryPath)).isDirectory()) {
Logger.logError("Das Download-Verzeichnis wurde nicht gefunden.");
sendMessage("Der Anhang konnte nicht gedownloaded werden.");
return null;
}
List<Attachment> attachments = context.getEvent().getMessage().getAttachments();
if(attachments.size() == 0){
if (attachments.size() == 0) {
return null;
}
Attachment attachment = attachments.get(0);
File file = new File(directoryPath + name + "." + attachment.getFileExtension());
CompletableFuture<File> future = attachment.downloadToFile(file);
future.exceptionally(e -> {
@ -84,12 +133,27 @@ public abstract class YoshiCommand {
sendMessage("Ein Anhang konnte nicht gedownloaded werden.");
return null;
}
if(!file.exists()) {
if (!file.exists()) {
sendMessage("Ein Anhang konnte nicht gedownloaded werden.");
return null;
}
return file;
}
public static boolean sayToChannel(String path, String channel, MessageReceivedEvent event) {
List<VoiceChannel> channels = YoshiBot.getInstance().jda
.getVoiceChannelsByName(channel, true);
if (!(channels.size() > 0)) {
event.getTextChannel().sendMessage("Der Kanalname konnte nicht gefunden werden.").queue();
return false;
}
VoiceChannel vc = channels.get(0);
YoshiBot.getInstance().audioPlayerManager.loadItem(path, new AudioLoadResultHandlerImpl());
vc.getGuild().getAudioManager().openAudioConnection(vc);
return true;
}
}

+ 8
- 3
app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java View File

@ -59,8 +59,11 @@ public class YoshiCommandDistributor {
case PAT:
command = new PatCommand(context);
break;
case BONK:
command = new BonkCommand(context);
case BONK:
command = new BonkCommand(context);
break;
case WIKIPEDIA:
command = new WikipediaCommand(context);
break;
case FOLLOW:
command = new FollowCommand(context);
@ -111,7 +114,9 @@ public class YoshiCommandDistributor {
SAUCE,
PAT,
BONK,
FOLLOW
FOLLOW,
WIKIPEDIA,
BONK
}


+ 26
- 15
app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/JokeCommand.java View File

@ -15,6 +15,7 @@ import static de.yannicpunktdee.yoshibot.utils.RestHelper.getFromURL;
/**
* Schickt einen zufälligen Jokus aus einer zufällig ausgewählten Quelle in den Textchannel.
*
* @author Yannic Link
*/
public class JokeCommand extends YoshiCommand {
@ -29,31 +30,41 @@ public class JokeCommand extends YoshiCommand {
/**
* {@inheritDoc}
*/
@Override public synchronized boolean execute() {
@Override
public synchronized boolean execute() {
String message = "Jokus";
Random random = YoshiBot.getInstance().getRandom();
int number = random.nextInt(3);
switch(number) {
case 0: message = jokeApi(); break;
case 1: message = officialJokeApi(); break;
case 2: message = chuckNorris(); break;
default: message = "Jokus"; break;
switch (number) {
case 0:
message = jokeApi();
break;
case 1:
message = officialJokeApi();
break;
case 2:
message = chuckNorris();
break;
default:
message = "Jokus";
break;
}
if(context.containsArguments(new String[] {"channel"})) {
if (context.containsArguments(new String[]{"channel"})) {
String arg = context.getArgument("channel");
if(arg == null) {
if (arg == null) {
sendMessage("Es wurde kein channel angegeben.");
return false;
}
List<TextChannel> channels = YoshiBot.getInstance().jda.getTextChannelsByName(context.getArgument("channel"), true);
if(channels.isEmpty()) {
List<TextChannel> channels = YoshiBot.getInstance().jda
.getTextChannelsByName(context.getArgument("channel"), true);
if (channels.isEmpty()) {
sendMessage("Der Kanalname konnte nicht gefunden werden.");
return false;
}
channels.get(0).sendMessage(message).queue();
}else {
} else {
sendMessage(message);
}
return true;
@ -68,7 +79,7 @@ public class JokeCommand extends YoshiCommand {
String raw = getFromURL(url);
json = new JSONObject(raw);
return json.getJSONObject("value").getString("joke");
}catch(JSONException | IOException e) {
} catch (JSONException e) {
return "Konnte keinen Jokus von \"" + url + "\" laden.";
}
}
@ -85,7 +96,7 @@ public class JokeCommand extends YoshiCommand {
result += " - ";
result += json.getString("punchline");
return result;
}catch(JSONException | IOException e) {
} catch (JSONException e) {
return "Konnte keinen Jokus von \"" + url + "\" laden.";
}
}
@ -102,9 +113,9 @@ public class JokeCommand extends YoshiCommand {
result += " - ";
result += json.getString("delivery");
return result;
}catch(JSONException | IOException e) {
} catch (JSONException e) {
return "Konnte keinen Jokus von \"" + url + "\" laden.";
}
}
}

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

@ -6,14 +6,11 @@ import de.yannicpunktdee.yoshibot.command.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
import de.yannicpunktdee.yoshibot.utils.Resources;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.VoiceChannel;
import java.awt.*;
import java.io.File;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class PlayCommand extends YoshiCommand {


+ 1
- 58
app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/SayCommand.java View File

@ -1,22 +1,10 @@
package de.yannicpunktdee.yoshibot.command.commands;
import de.yannicpunktdee.yoshibot.audio.AudioLoadResultHandlerImpl;
import de.yannicpunktdee.yoshibot.command.YoshiCommand;
import de.yannicpunktdee.yoshibot.command.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
import de.yannicpunktdee.yoshibot.utils.Logger;
import de.yannicpunktdee.yoshibot.utils.Resources;
import net.dv8tion.jda.api.entities.VoiceChannel;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.UUID;
public class SayCommand extends YoshiCommand {
public static String resourceToDelete = null;
protected final String[] requiredArguments = {"text", "channel"};
@ -26,58 +14,13 @@ public class SayCommand extends YoshiCommand {
super(context);
}
public static String buildTTSAudio(String text) {
String path = Resources.getPathToTempAudioFile(UUID.randomUUID().toString());
try {
ProcessBuilder pb = new ProcessBuilder(
"python3",
Resources.getTtsPath(),
"--text",
text,
"--lang",
"de",
"--out",
path);
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.logError(builder.toString());
}
if (resourceToDelete != null)
synchronized (resourceToDelete) {
resourceToDelete = path;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
return path;
}
@Override
public boolean execute() {
if (!super.execute()) return false;
String path = buildTTSAudio(context.getArgument("text"));
List<VoiceChannel> channels = YoshiBot.getInstance().jda
.getVoiceChannelsByName(context.getArgument("channel"), true);
if (!(channels.size() > 0)) {
context.getEvent().getTextChannel().sendMessage("Der Kanalname konnte nicht gefunden werden.").queue();
return false;
}
VoiceChannel vc = channels.get(0);
YoshiBot.getInstance().audioPlayerManager.loadItem(path, new AudioLoadResultHandlerImpl());
vc.getGuild().getAudioManager().openAudioConnection(vc);
if (WikipediaCommand.sayToChannel(path, context.getArgument("channel"), context.getEvent())) return false;
return false;
}


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

@ -0,0 +1,49 @@
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.RestHelper;
import org.json.JSONObject;
import java.util.Arrays;
import java.util.List;
public class WikipediaCommand extends YoshiCommand {
/**
* Erzeugt ein neues Kommando, führt es aber noch nicht aus. Es wird ermittelt, ob die Argumentenkombination valide
* ist und das isOk-Flag gesetzt. Im Fehlerfall wird eine Fehleremeldung spezifiziert.
*
* @param context Der Kontext mit dem das Kommando aufgerufen wurde.
*/
public WikipediaCommand(YoshiCommandContext context) {
super(context);
}
@Override
public boolean execute() {
if (!super.execute()) return false;
String url = "https://de.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext" +
"&redirects&titles=" + context.getArgument("name");
JSONObject articleBase = new JSONObject(RestHelper.getFromURL(url));
JSONObject pages = articleBase.getJSONObject("query").getJSONObject("pages");
if (pages.has("-1")) {
sendMessage("Kein Artikel namens " + context.getArgument("name") + " gefunden!");
Logger.logWarning("Konnte Artikel " + context.getArgument("name") + " nicht finden!");
}
assert pages.keySet().stream().findFirst().isPresent();
JSONObject page = pages.getJSONObject(pages.keySet().stream().findFirst().get());
String text = page.getString("extract");
sendMessage(text);
sendMessage("Konvertiere Text mittels TTS...");
List<String> parts = Arrays.asList(text.split(" "));
text = String.join(" ", parts.subList(0, Math.min(parts.size(), 50)));
String path = YoshiCommand.buildTTSAudio(text);
return YoshiCommand.sayToChannel(path, context.getArgument("channel"), context.getEvent());
}
}

+ 5
- 1
app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java View File

@ -1,8 +1,8 @@
package de.yannicpunktdee.yoshibot.listeners;
import de.yannicpunktdee.yoshibot.command.YoshiCommand;
import de.yannicpunktdee.yoshibot.command.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.command.commands.PlayCommand;
import de.yannicpunktdee.yoshibot.command.commands.SayCommand;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
import de.yannicpunktdee.yoshibot.utils.Resources;
import net.dv8tion.jda.api.entities.ChannelType;
@ -49,6 +49,8 @@ public class DiscordEventListener extends ListenerAdapter {
public void onGuildVoiceJoin(@NotNull GuildVoiceJoinEvent event) {
super.onGuildVoiceJoin(event);
if (!Resources.isGreetings_and_byebyes_on()) return;
if (event.getMember().getUser().isBot()) return;
if(YoshiBot.getInstance().isActive())
@ -68,6 +70,8 @@ public class DiscordEventListener extends ListenerAdapter {
public void onGuildVoiceLeave(@NotNull GuildVoiceLeaveEvent event) {
super.onGuildVoiceLeave(event);
if (!Resources.isGreetings_and_byebyes_on()) return;
if (event.getMember().getUser().isBot()) return;
if(YoshiBot.getInstance().isActive())


+ 3
- 1
app/src/main/java/de/yannicpunktdee/yoshibot/utils/RestHelper.java View File

@ -1,5 +1,6 @@
package de.yannicpunktdee.yoshibot.utils;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringEscapeUtils;
import java.io.BufferedReader;
@ -10,7 +11,8 @@ import java.net.URL;
public final class RestHelper {
public static String getFromURL(String url) throws IOException {
@SneakyThrows
public static String getFromURL(String url) {
StringBuilder response = new StringBuilder("");
HttpURLConnection con = null;


+ 2
- 7
app/src/main/java/de/yannicpunktdee/yoshibot/utils/SauceProvider.java View File

@ -135,13 +135,8 @@ public class SauceProvider {
}
private static JSONObject getParsedSauceData(String url) {
String raw = null;
try {
raw = RestHelper.getFromURL(url);
} catch (IOException e) {
e.printStackTrace();
}
return new JSONObject(Objects.requireNonNull(raw));
String raw = RestHelper.getFromURL(url);
return new JSONObject(raw);
}
private static String tagsForRest(String tags) {


Loading…
Cancel
Save