Browse Source

Merge branch 'say_command'

# Conflicts:
#	app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioControllerManager.java
#	app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/JokeCommand.java
#	app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PlayCommand.java
#	app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/StopCommand.java
#	app/src/main/java/de/yannicpunktdee/yoshibot/main/Resources.java
#	rsc/Ordnerstruktur.txt
greetings_byebyes
yl60lepu 4 years ago
parent
commit
0432b4caf9
10 changed files with 158 additions and 59 deletions
  1. +2
    -1
      .gitignore
  2. +2
    -0
      README.md
  3. +2
    -3
      app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioControllerManager.java
  4. +44
    -30
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/JokeCommand.java
  5. +54
    -1
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/SayCommand.java
  6. +3
    -3
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/StopCommand.java
  7. +4
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/main/Main.java
  8. +28
    -21
      app/src/main/java/de/yannicpunktdee/yoshibot/main/Resources.java
  9. +1
    -0
      rsc/Ordnerstruktur.txt
  10. +18
    -0
      rsc/tts.py

+ 2
- 1
.gitignore View File

@ -193,4 +193,5 @@ gradle-app.setting
.classpath
rsc/*
!rsc/Ordnerstruktur.txt
!rsc/Ordnerstruktur.txt
!rsc/tts.py

+ 2
- 0
README.md View File

@ -12,6 +12,8 @@ Werte enthalten:
(dieses Verzeichnis sollte natürlich existieren)
- restrict_commands_to_channel -> Textkanalname, auf dem die Botkommandos empfangen werden
Python gTTS installieren mit pip install gTTS
##Export
Zum Exportieren der Applikation führe den Befehl "gradlew clean build" im Root Verzeichnis aus. Die fertige Jar liegt


+ 2
- 3
app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioControllerManager.java View File

@ -1,7 +1,6 @@
package de.yannicpunktdee.yoshibot.audio;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
@ -17,10 +16,10 @@ public class AudioControllerManager {
public AudioController getController(long guildId) {
AudioController ac = null;
if (audioController.containsKey(guildId))
if(audioController.containsKey(guildId))
ac = audioController.get(guildId);
else {
ac = new AudioController(Objects.requireNonNull(YoshiBot.getInstance().jda.getGuildById(guildId)));
ac = new AudioController(YoshiBot.getInstance().jda.getGuildById(guildId));
audioController.put(guildId, ac);
}
return ac;


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

@ -8,7 +8,6 @@ import java.net.URL;
import java.util.List;
import java.util.Random;
import de.yannicpunktdee.yoshibot.utils.RestHelper;
import org.apache.commons.lang3.StringEscapeUtils;
import org.json.JSONException;
import org.json.JSONObject;
@ -20,9 +19,9 @@ import net.dv8tion.jda.api.entities.TextChannel;
/**
* Schickt einen zufälligen Jokus aus einer zufällig ausgewählten Quelle in den Textchannel.
*
* @author Yannic Link
*/
@SuppressWarnings("deprecation")
public class JokeCommand extends YoshiCommand {
/**
@ -35,56 +34,71 @@ public class JokeCommand extends YoshiCommand {
/**
* {@inheritDoc}
*/
@Override
public synchronized boolean execute() {
@Override public synchronized boolean execute() {
String message = "Jokus";
Random random = new Random();
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;
}
private String getFromURL(String url) throws IOException {
StringBuilder response = new StringBuilder("");
HttpURLConnection con = null;
try{
con = (HttpURLConnection)(new URL(url)).openConnection();
con.setRequestMethod("GET");
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while((line = br.readLine()) != null) {
response.append(StringEscapeUtils.unescapeHtml4(line));
}
br.close();
}catch(IOException e) {
return null;
}finally {
if(con != null) con.disconnect();
}
return response.toString();
}
private String chuckNorris() {
String url = "http://api.icndb.com/jokes/random";
JSONObject json = null;
try {
String raw = RestHelper.getFromURL(url);
String raw = getFromURL(url);
json = new JSONObject(raw);
return json.getJSONObject("value").getString("joke");
} catch (JSONException | IOException e) {
}catch(JSONException | IOException e) {
return "Konnte keinen Jokus von \"" + url + "\" laden.";
}
}
@ -95,13 +109,13 @@ public class JokeCommand extends YoshiCommand {
JSONObject json = null;
try {
String raw = RestHelper.getFromURL(url);
String raw = getFromURL(url);
json = new JSONObject(raw);
String result = json.getString("setup");
result += " - ";
result += json.getString("punchline");
return result;
} catch (JSONException | IOException e) {
}catch(JSONException | IOException e) {
return "Konnte keinen Jokus von \"" + url + "\" laden.";
}
}
@ -112,15 +126,15 @@ public class JokeCommand extends YoshiCommand {
JSONObject json = null;
try {
String raw = RestHelper.getFromURL(url);
String raw = getFromURL(url);
json = new JSONObject(raw);
String result = json.getString("setup");
result += " - ";
result += json.getString("delivery");
return result;
} catch (JSONException | IOException e) {
}catch(JSONException | IOException e) {
return "Konnte keinen Jokus von \"" + url + "\" laden.";
}
}
}

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

@ -1,15 +1,68 @@
package de.yannicpunktdee.yoshibot.command.commands;
import de.yannicpunktdee.yoshibot.audio.AudioController;
import de.yannicpunktdee.yoshibot.audio.AudioLoadResultHandlerImpl;
import de.yannicpunktdee.yoshibot.command.YoshiCommand;
import de.yannicpunktdee.yoshibot.command.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.main.Resources;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
import de.yannicpunktdee.yoshibot.utils.Logger;
import net.dv8tion.jda.api.entities.VoiceChannel;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
public class SayCommand extends YoshiCommand {
protected final String[] requiredArguments = {"text", "channel"};
public SayCommand(YoshiCommandContext context) {
super(context);
}
@Override
public boolean execute() {return true;}
public boolean execute() {
if(!super.execute()) return false;
String path = Resources.buildTempAudioFilePath("tts");
try {
ProcessBuilder pb = new ProcessBuilder(
"python",
"rsc/tts.py",
"--text",
context.getArgument("text"),
"--lang",
"de",
"--out",
path);
pb.redirectError();
Process p = pb.start();
int exitCode = p.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
return false;
}
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);
AudioController ac = YoshiBot.getInstance().audioControllerManager.getController(vc.getGuild().getIdLong());
YoshiBot.getInstance().audioPlayerManager.loadItem(path, new AudioLoadResultHandlerImpl(ac));
vc.getGuild().getAudioManager().openAudioConnection(vc);
File deleteFile = new File(path);
deleteFile.delete(); //FIXME Funktioniert noch nicht
return false;
}
}

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

@ -8,16 +8,16 @@ public class StopCommand extends YoshiCommand {
protected final String[] requiredArguments = {"please", "uwu"};
public StopCommand(YoshiCommandContext context) {
super(context);
}
@Override
public boolean execute() {
if (!super.execute()) return false;
if(!super.execute()) return false;
YoshiBot.getInstance().stop();
return true;
}
}

+ 4
- 0
app/src/main/java/de/yannicpunktdee/yoshibot/main/Main.java View File

@ -1,7 +1,11 @@
package de.yannicpunktdee.yoshibot.main;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.util.UUID;
import javax.security.auth.login.LoginException;
/**


+ 28
- 21
app/src/main/java/de/yannicpunktdee/yoshibot/main/Resources.java View File

@ -14,7 +14,7 @@ import java.util.stream.Collectors;
public class Resources {
private static final String default_propertiesFilePath = "../rsc/Config.properties";
private static final String default_propertiesFilePath = "rsc/Config.properties";
private static String propertiesFilePath = default_propertiesFilePath;
private static Properties propertiesFile;
@ -25,14 +25,14 @@ public class Resources {
private static final String[] default_restrict_commands_to_channel = null;
private static String[] restrict_commands_to_channel = default_restrict_commands_to_channel;
private static String[] filtered_tags;
private static Map<String, List<String>> feedDetails;
public synchronized static boolean init(String pathToConfig) {
Logger.log("Lade Config.properties ...", Type.INFO);
if (pathToConfig != null) {
if (!(new File(pathToConfig)).exists()) {
Logger.log("Der in den Argumenten angegebene Pfad zur Config.properties existiert nicht.", Type.ERROR);
@ -44,26 +44,26 @@ public class Resources {
Type.ERROR);
return false;
}
propertiesFile = new Properties();
try {
propertiesFile.load(
new FileInputStream(propertiesFilePath)
);
);
Logger.log("Config-Datei erfolgreich geladen.", Type.INFO);
} catch (IOException e) {
Logger.log("Es ist ein Fehler beim Öffnen der Config.propeties aufgetreten.", Type.ERROR);
return false;
}
boolean isOk = initJdaBuilderString();
if (isOk) isOk = initChannelRestrict();
if (isOk) isOk = initAudio();
initTagFilter();
if (isOk) Logger.log("Die Konfigurationen wurden erfolgreich geladen.", Type.INFO);
else Logger.log("Die Konfiguration konnte nicht geladen werden", Type.ERROR);
return isOk;
}
@ -75,12 +75,12 @@ public class Resources {
jda_builder_string = propertiesFile.getProperty("jda_builder_string");
return true;
}
public static String getJdaBuilderString() {
return jda_builder_string;
}
private static void initTagFilter() {
if (!propertiesFile.containsKey("tags_general_filter")) {
Logger.log("Kein Attribut 'tags_general_filter' gefunden", Type.WARNING);
@ -96,32 +96,39 @@ public class Resources {
list -> Arrays.asList(list).subList(1, list.length)));
}
}
private static boolean initAudio() {
if (propertiesFile.containsKey("audio_source_directory")) {
audio_source_directory = propertiesFile.getProperty("audio_source_directory");
} else {
Logger.log("Die Config.properties spezifiziert kein audio_source_directory. Lade default.", Type.WARNING);
}
File file = new File(audio_source_directory);
if (!file.exists() || !file.isDirectory()) {
Logger.log("Das Audio-Verzeichnis wurde nicht gefunden.", Type.ERROR);
return false;
}
if (file.listFiles().length < 1)
Logger.log("Das Audio-Verzeichnis ist leer.", Type.WARNING);
return true;
}
public static String getAudioFilePath(String name) {
name = audio_source_directory + (audio_source_directory.endsWith("/") ? "" : "/") + name + ".opus";
if ((new File(name)).exists()) return name;
else return null;
}
public static String getTempAudioFilePath(String name) {
name = audio_source_directory + (audio_source_directory.endsWith("/")? "" : "/") + "temp/" + name + ".opus";
if((new File(name)).exists()) return name;
else return null;
}
public static String buildTempAudioFilePath(String name){
return audio_source_directory + (audio_source_directory.endsWith("/")? "" : "/") + "temp/" + name + ".opus";
}
public static String getAudioSourceDirectory() {
return audio_source_directory;
}
@ -131,17 +138,17 @@ public class Resources {
restrict_commands_to_channel = propertiesFile.getProperty("restrict_commands_to_channel").split(" ");
return true;
}
public static String[] getRestrictCommandsToChannel() {
return restrict_commands_to_channel;
}
public static Map<String, List<String>> getFeedDetails() {
return feedDetails;
}
public static String[] getGeneralFilterTags() {
return filtered_tags;
}
}

+ 1
- 0
rsc/Ordnerstruktur.txt View File

@ -2,6 +2,7 @@ rsc
|-- .gitkeep
|-- Ordnerstruktur.txt
|-- Config.properties
|-- tts.py
|-- audio
|-- temp
|-- temp_1.opus


+ 18
- 0
rsc/tts.py View File

@ -0,0 +1,18 @@
import sys
from gtts import gTTS
import os
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--text")
parser.add_argument("--lang")
parser.add_argument("--out")
args = parser.parse_args()
mytext = args.text
language = args.lang
output = args.out
myobj = gTTS(text=mytext, lang=language, slow=False)
myobj.save(output)

Loading…
Cancel
Save