Browse Source

Einige Methoden in YoshiBot bzw YoshiCommand ausgeladert und so

pull/2/head
Yannic Link 4 years ago
parent
commit
9a247d4d00
7 changed files with 103 additions and 117 deletions
  1. +17
    -49
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java
  2. +1
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java
  3. +11
    -45
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PlayCommand.java
  4. +3
    -5
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/SayCommand.java
  5. +3
    -5
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/WikipediaCommand.java
  6. +7
    -13
      app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java
  7. +61
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java

+ 17
- 49
app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java View File

@ -47,42 +47,6 @@ public abstract class YoshiCommand {
this.context = 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. * Führt das Kommando aus.
* *
@ -140,20 +104,24 @@ public abstract class YoshiCommand {
return file; 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;
protected VoiceChannel getVoiceChannelByParam(){
VoiceChannel vc;
if (context.getEvent().getMember() == null ||
!context.getEvent().getMember().getVoiceState().inVoiceChannel()) {
if (!context.containsArguments(new String[]{"channel"})) {
return null;
}
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 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;
} }
} }

+ 1
- 0
app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java View File

@ -67,6 +67,7 @@ public class YoshiCommandDistributor {
break; break;
case FOLLOW: case FOLLOW:
command = new FollowCommand(context); command = new FollowCommand(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;


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

@ -1,46 +1,26 @@
package de.yannicpunktdee.yoshibot.command.commands; package de.yannicpunktdee.yoshibot.command.commands;
import de.yannicpunktdee.yoshibot.audio.AudioLoadResultHandlerImpl;
import de.yannicpunktdee.yoshibot.command.YoshiCommand; import de.yannicpunktdee.yoshibot.command.YoshiCommand;
import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; import de.yannicpunktdee.yoshibot.command.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.main.YoshiBot; import de.yannicpunktdee.yoshibot.main.YoshiBot;
import de.yannicpunktdee.yoshibot.utils.Resources; import de.yannicpunktdee.yoshibot.utils.Resources;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.VoiceChannel;
import java.awt.*; import java.awt.*;
import java.io.File; import java.io.File;
import java.util.List;
public class PlayCommand extends YoshiCommand { public class PlayCommand extends YoshiCommand {
protected final String[] requiredArguments = new String[]{"name"};
public PlayCommand(YoshiCommandContext context) { public PlayCommand(YoshiCommandContext context) {
super(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 @Override
public boolean execute() { public boolean execute() {
if (!super.execute()) return false; 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")); downloadAttachmentToFile(Resources.getAudioPath(), context.getArgument("name"));
} else if (context.containsArguments(new String[]{"list"})) { } else if (context.containsArguments(new String[]{"list"})) {
File audioDirectory = new File(Resources.getAudioPath()); File audioDirectory = new File(Resources.getAudioPath());
@ -56,31 +36,17 @@ public class PlayCommand extends YoshiCommand {
eb.setColor(Color.blue); eb.setColor(Color.blue);
eb.setDescription(sb.toString()); eb.setDescription(sb.toString());
sendMessage(eb.build()); 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<VoiceChannel> 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!", 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; return true;


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

@ -2,6 +2,8 @@ package de.yannicpunktdee.yoshibot.command.commands;
import de.yannicpunktdee.yoshibot.command.YoshiCommand; import de.yannicpunktdee.yoshibot.command.YoshiCommand;
import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; import de.yannicpunktdee.yoshibot.command.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
import net.dv8tion.jda.api.entities.VoiceChannel;
public class SayCommand extends YoshiCommand { public class SayCommand extends YoshiCommand {
@ -18,11 +20,7 @@ public class SayCommand extends YoshiCommand {
public boolean execute() { public boolean execute() {
if (!super.execute()) return false; 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());
} }
} }

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

@ -2,6 +2,7 @@ package de.yannicpunktdee.yoshibot.command.commands;
import de.yannicpunktdee.yoshibot.command.YoshiCommand; import de.yannicpunktdee.yoshibot.command.YoshiCommand;
import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; import de.yannicpunktdee.yoshibot.command.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
import de.yannicpunktdee.yoshibot.utils.Logger; import de.yannicpunktdee.yoshibot.utils.Logger;
import de.yannicpunktdee.yoshibot.utils.RestHelper; import de.yannicpunktdee.yoshibot.utils.RestHelper;
import org.json.JSONObject; import org.json.JSONObject;
@ -38,12 +39,9 @@ public class WikipediaCommand extends YoshiCommand {
String text = page.getString("extract"); String text = page.getString("extract");
sendMessage(text); sendMessage(text);
sendMessage("Konvertiere Text mittels TTS...");
List<String> parts = Arrays.asList(text.split(" ")); List<String> parts = Arrays.asList(text.split(" "));
text = String.join(" ", parts.subList(0, Math.min(parts.size(), 50))); 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());
} }
} }

+ 7
- 13
app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java View File

@ -49,19 +49,16 @@ public class DiscordEventListener extends ListenerAdapter {
public void onGuildVoiceJoin(@NotNull GuildVoiceJoinEvent event) { public void onGuildVoiceJoin(@NotNull GuildVoiceJoinEvent event) {
super.onGuildVoiceJoin(event); super.onGuildVoiceJoin(event);
if (!Resources.isGreetings_and_byebyes_on()) return;
if (event.getMember().getUser().isBot()) 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(); String nameToPlay = event.getMember().getNickname();
if(nameToPlay == null) nameToPlay = event.getMember().getUser().getName(); 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()); event.getMember().getVoiceState().getChannel());
} }
} }
@ -70,19 +67,16 @@ public class DiscordEventListener extends ListenerAdapter {
public void onGuildVoiceLeave(@NotNull GuildVoiceLeaveEvent event) { public void onGuildVoiceLeave(@NotNull GuildVoiceLeaveEvent event) {
super.onGuildVoiceLeave(event); super.onGuildVoiceLeave(event);
if (!Resources.isGreetings_and_byebyes_on()) return;
if (event.getMember().getUser().isBot()) 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(); String nameToPlay = event.getMember().getNickname();
nameToPlay = nameToPlay == null ? event.getMember().getUser().getName() : nameToPlay; nameToPlay = nameToPlay == null ? event.getMember().getUser().getName() : nameToPlay;
PlayCommand.play(
YoshiCommand.buildTTSAudio(Resources.getRandomByebye(nameToPlay)),
YoshiBot.getInstance().sayTTS(
Resources.getRandomByebye(nameToPlay),
event.getChannelLeft()); event.getChannelLeft());
} }
} }


+ 61
- 0
app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java View File

@ -5,6 +5,7 @@ import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers; import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
import com.sedmelluq.discord.lavaplayer.source.local.LocalAudioSourceManager; 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.AudioPlayerListener;
import de.yannicpunktdee.yoshibot.audio.AudioSendHandlerImpl; import de.yannicpunktdee.yoshibot.audio.AudioSendHandlerImpl;
import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; 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.OnlineStatus;
import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.entities.Guild; 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.entities.VoiceChannel;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import javax.security.auth.login.LoginException; import javax.security.auth.login.LoginException;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.UUID;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -66,6 +73,9 @@ public final class YoshiBot {
@Getter @Getter
private boolean active; private boolean active;
@Getter
private VoiceChannel voiceChannel = null;
/** /**
* Initialisiert alle dynamisch hinzugefügten und statischen Ressourcen. Startet aber nicht den Bot selbst. * 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){ private void joinVoiceChannel(VoiceChannel vc){
if(vc == null) return;
if(vc.equals(guild.getAudioManager().getConnectedChannel())) return; if(vc.equals(guild.getAudioManager().getConnectedChannel())) return;
leaveAudioChannel(); leaveAudioChannel();
guild.getAudioManager().openAudioConnection(vc); guild.getAudioManager().openAudioConnection(vc);
voiceChannel = vc;
} }
private void leaveAudioChannel(){ private void leaveAudioChannel(){
if(guild.getAudioManager().getConnectedChannel() == null) return; if(guild.getAudioManager().getConnectedChannel() == null) return;
guild.getAudioManager().closeAudioConnection(); guild.getAudioManager().closeAudioConnection();
voiceChannel = null;
} }
public void autoConnectToChannel(){ public void autoConnectToChannel(){
if(!instance.active) return;
VoiceChannel maxMembersVoiceChannel = null; VoiceChannel maxMembersVoiceChannel = null;
int maxMembers = 0; int maxMembers = 0;
for(VoiceChannel vc : guild.getVoiceChannels()){ for(VoiceChannel vc : guild.getVoiceChannels()){
@ -185,5 +200,51 @@ public final class YoshiBot {
if(active) autoConnectToChannel(); if(active) autoConnectToChannel();
else leaveAudioChannel(); 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);
}
} }

Loading…
Cancel
Save