From 9a247d4d008503c1094e8b9274b15a99abc3967a Mon Sep 17 00:00:00 2001 From: Yannic Link Date: Wed, 7 Apr 2021 00:43:12 +0200 Subject: [PATCH] Einige Methoden in YoshiBot bzw YoshiCommand ausgeladert und so --- .../yoshibot/command/YoshiCommand.java | 66 +++++-------------- .../command/YoshiCommandDistributor.java | 1 + .../command/commands/PlayCommand.java | 56 ++++------------ .../yoshibot/command/commands/SayCommand.java | 8 +-- .../command/commands/WikipediaCommand.java | 8 +-- .../listeners/DiscordEventListener.java | 20 ++---- .../yoshibot/main/YoshiBot.java | 61 +++++++++++++++++ 7 files changed, 103 insertions(+), 117 deletions(-) diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java index 151f5d7..bb68b38 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java @@ -47,42 +47,6 @@ public abstract class YoshiCommand { 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. * @@ -140,20 +104,24 @@ public abstract class YoshiCommand { return file; } - - - public static boolean sayToChannel(String path, String channel, MessageReceivedEvent event) { - List channels = YoshiBot.getInstance().jda - .getVoiceChannelsByName(channel, true); - if (!(channels.size() > 0)) { - event.getTextChannel().sendMessage("Der Kanalname konnte nicht gefunden werden.").queue(); - return false; + + protected VoiceChannel getVoiceChannelByParam(){ + VoiceChannel vc; + if (context.getEvent().getMember() == null || + !context.getEvent().getMember().getVoiceState().inVoiceChannel()) { + if (!context.containsArguments(new String[]{"channel"})) { + return null; + } + List 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 null; + } + vc = channels.get(0); + } else { + vc = context.getEvent().getMember().getVoiceState().getChannel(); } - VoiceChannel vc = channels.get(0); - - YoshiBot.getInstance().audioPlayerManager.loadItem(path, new AudioLoadResultHandlerImpl()); - vc.getGuild().getAudioManager().openAudioConnection(vc); - return true; + return vc; } } 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 b2a74d9..1633465 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java @@ -67,6 +67,7 @@ public class YoshiCommandDistributor { break; case FOLLOW: command = new FollowCommand(context); + break; default: context.getEvent().getTextChannel().sendMessage("Dieses Kommando existiert noch nicht.").queue(); break; diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PlayCommand.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PlayCommand.java index d0066c8..fac9fea 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PlayCommand.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PlayCommand.java @@ -1,46 +1,26 @@ 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.Resources; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.VoiceChannel; import java.awt.*; import java.io.File; -import java.util.List; public class PlayCommand extends YoshiCommand { - protected final String[] requiredArguments = new String[]{"name"}; - - public PlayCommand(YoshiCommandContext context) { super(context); } - - public static boolean play(String fileName, VoiceChannel vc) { - if(!YoshiBot.getInstance().isActive()) return true; - if (!new File(fileName).isFile()) return false; - - YoshiBot yoshiBot = YoshiBot.getInstance(); - - vc.getGuild().getAudioManager().openAudioConnection(vc); - yoshiBot.audioPlayerManager.loadItem(fileName, new AudioLoadResultHandlerImpl()); - - return true; - } - + @Override public boolean execute() { if (!super.execute()) return false; - YoshiBot yoshiBot = YoshiBot.getInstance(); - - if (context.containsArguments(new String[]{"add"})) { + if (context.containsArguments(new String[]{"add", "name"})) { downloadAttachmentToFile(Resources.getAudioPath(), context.getArgument("name")); } else if (context.containsArguments(new String[]{"list"})) { File audioDirectory = new File(Resources.getAudioPath()); @@ -56,31 +36,17 @@ public class PlayCommand extends YoshiCommand { eb.setColor(Color.blue); eb.setDescription(sb.toString()); sendMessage(eb.build()); - } else { - VoiceChannel vc; - if (context.getEvent().getMember() == null || - !context.getEvent().getMember().getVoiceState().inVoiceChannel()) { - if (!context.containsArguments(new String[]{"channel"})) { - context.getEvent().getTextChannel().sendMessage("Es wurde kein channel spezfiziert.").queue(); - return false; - } - List channels = yoshiBot.jda.getVoiceChannelsByName(context.getArgument("channel"), true); - if (!(channels.size() > 0)) { - context.getEvent().getTextChannel().sendMessage("Der Kanalname konnte nicht gefunden werden.") - .queue(); - return false; - } - vc = channels.get(0); - } else { - vc = context.getEvent().getMember().getVoiceState().getChannel(); - } - - String fileName = Resources.getPathToAudioFile(context.getArgument("name")); - - if (!play(fileName, vc)) { + } else if (context.containsArguments(new String[]{"name"})) { + File file = new File(Resources.getPathToAudioFile(context.getArgument("name"))); + if(!file.isFile()){ sendMessage(String.format("Konnte keine Audiodatei namens '%s.opus' finden!", - context.getArgument("name"))); + context.getArgument("name"))); + return false; } + + YoshiBot.getInstance().playSound(file, getVoiceChannelByParam()); + }else { + sendMessage("Unzureichende Parameter."); } return true; diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/SayCommand.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/SayCommand.java index 253a903..8d3f7dc 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/SayCommand.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/SayCommand.java @@ -2,6 +2,8 @@ package de.yannicpunktdee.yoshibot.command.commands; import de.yannicpunktdee.yoshibot.command.YoshiCommand; import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; +import de.yannicpunktdee.yoshibot.main.YoshiBot; +import net.dv8tion.jda.api.entities.VoiceChannel; public class SayCommand extends YoshiCommand { @@ -18,11 +20,7 @@ public class SayCommand extends YoshiCommand { public boolean execute() { if (!super.execute()) return false; - String path = buildTTSAudio(context.getArgument("text")); - - if (WikipediaCommand.sayToChannel(path, context.getArgument("channel"), context.getEvent())) return false; - - return false; + return YoshiBot.getInstance().sayTTS(context.getArgument("text"), getVoiceChannelByParam()); } } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/WikipediaCommand.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/WikipediaCommand.java index 0161091..71ab287 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/WikipediaCommand.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/WikipediaCommand.java @@ -2,6 +2,7 @@ package de.yannicpunktdee.yoshibot.command.commands; 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.RestHelper; import org.json.JSONObject; @@ -38,12 +39,9 @@ public class WikipediaCommand extends YoshiCommand { String text = page.getString("extract"); sendMessage(text); - sendMessage("Konvertiere Text mittels TTS..."); List 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()); + + return YoshiBot.getInstance().sayTTS(text, getVoiceChannelByParam()); } } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java b/app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java index 4e28893..349c564 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java @@ -49,19 +49,16 @@ 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()) - YoshiBot.getInstance().autoConnectToChannel(); + YoshiBot.getInstance().autoConnectToChannel(); if (Resources.isGreetings_and_byebyes_on()){ String nameToPlay = event.getMember().getNickname(); if(nameToPlay == null) nameToPlay = event.getMember().getUser().getName(); - PlayCommand.play( - YoshiCommand.buildTTSAudio(Resources.getRandomGreeting(nameToPlay)), + YoshiBot.getInstance().sayTTS( + Resources.getRandomGreeting(nameToPlay), event.getMember().getVoiceState().getChannel()); } } @@ -70,19 +67,16 @@ 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()) - YoshiBot.getInstance().autoConnectToChannel(); + YoshiBot.getInstance().autoConnectToChannel(); - if (!Resources.isGreetings_and_byebyes_on()) { + if (Resources.isGreetings_and_byebyes_on()) { String nameToPlay = event.getMember().getNickname(); nameToPlay = nameToPlay == null ? event.getMember().getUser().getName() : nameToPlay; - PlayCommand.play( - YoshiCommand.buildTTSAudio(Resources.getRandomByebye(nameToPlay)), + YoshiBot.getInstance().sayTTS( + Resources.getRandomByebye(nameToPlay), event.getChannelLeft()); } } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java b/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java index 3505e1d..cec9258 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java @@ -5,6 +5,7 @@ import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers; import com.sedmelluq.discord.lavaplayer.source.local.LocalAudioSourceManager; +import de.yannicpunktdee.yoshibot.audio.AudioLoadResultHandlerImpl; import de.yannicpunktdee.yoshibot.audio.AudioPlayerListener; import de.yannicpunktdee.yoshibot.audio.AudioSendHandlerImpl; import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; @@ -21,13 +22,19 @@ import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.OnlineStatus; import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.entities.VoiceChannel; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import javax.security.auth.login.LoginException; +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; import java.nio.file.Files; import java.util.List; import java.util.Random; +import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -66,6 +73,9 @@ public final class YoshiBot { @Getter private boolean active; + + @Getter + private VoiceChannel voiceChannel = null; /** * Initialisiert alle dynamisch hinzugefügten und statischen Ressourcen. Startet aber nicht den Bot selbst. @@ -157,17 +167,22 @@ public final class YoshiBot { } private void joinVoiceChannel(VoiceChannel vc){ + if(vc == null) return; if(vc.equals(guild.getAudioManager().getConnectedChannel())) return; leaveAudioChannel(); guild.getAudioManager().openAudioConnection(vc); + voiceChannel = vc; } private void leaveAudioChannel(){ if(guild.getAudioManager().getConnectedChannel() == null) return; guild.getAudioManager().closeAudioConnection(); + voiceChannel = null; } public void autoConnectToChannel(){ + if(!instance.active) return; + VoiceChannel maxMembersVoiceChannel = null; int maxMembers = 0; for(VoiceChannel vc : guild.getVoiceChannels()){ @@ -185,5 +200,51 @@ public final class YoshiBot { if(active) autoConnectToChannel(); else leaveAudioChannel(); } + + public boolean playSound(File file, VoiceChannel vc){ + if(active) return true; + + if (!file.isFile()) return false; + + joinVoiceChannel((vc == null)? voiceChannel : vc); + + audioPlayerManager.loadItem(file.getAbsolutePath(), new AudioLoadResultHandlerImpl()); + + return true; + } + + public boolean sayTTS(String text, VoiceChannel vc) { + if(!active) return true; + + 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()); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + return playSound(new File(path), vc); + } }