diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioPlayerListener.java b/app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioPlayerListener.java index 4eab8dd..09cc645 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioPlayerListener.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioPlayerListener.java @@ -18,7 +18,6 @@ public class AudioPlayerListener implements AudioEventListener { public void onEvent(AudioEvent event) { if(event.player.getPlayingTrack() == null) { event.player.stopTrack(); - audioManager.closeAudioConnection(); } } 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 32f018a..66858ad 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java @@ -62,6 +62,8 @@ public class YoshiCommandDistributor { case BONK: command = new BonkCommand(context); break; + case FOLLOW: + command = new FollowCommand(context); default: context.getEvent().getTextChannel().sendMessage("Dieses Kommando existiert noch nicht.").queue(); break; @@ -108,7 +110,8 @@ public class YoshiCommandDistributor { DELETE, SAUCE, PAT, - BONK + BONK, + FOLLOW } diff --git a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/FollowCommand.java b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/FollowCommand.java new file mode 100644 index 0000000..3d08512 --- /dev/null +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/FollowCommand.java @@ -0,0 +1,30 @@ +package de.yannicpunktdee.yoshibot.command.commands; + +import de.yannicpunktdee.yoshibot.command.YoshiCommand; +import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; +import de.yannicpunktdee.yoshibot.main.YoshiBot; + +public class FollowCommand extends YoshiCommand { + + protected final String[] requiredArguments = {"enable"}; + + + public FollowCommand(YoshiCommandContext context) { + super(context); + } + + @Override + public boolean execute() { + if(!super.execute()) return false; + + if(context.getArgument("enable").equalsIgnoreCase("true")){ + YoshiBot.getInstance().setActive(true); + }else if(context.getArgument("enable").equalsIgnoreCase("false")){ + YoshiBot.getInstance().setActive(false); + }else{ + sendMessage("Der Wert des Parameters -enable muss true oder false sein."); + return false; + } + return true; + } +} 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 3d4f2e7..a55e7f6 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 @@ -25,6 +25,8 @@ public class PlayCommand extends YoshiCommand { } 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(); 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 b9b79e3..9a3bf63 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java @@ -48,33 +48,39 @@ public class DiscordEventListener extends ListenerAdapter { @Override public void onGuildVoiceJoin(@NotNull GuildVoiceJoinEvent event) { super.onGuildVoiceJoin(event); - - if (!Resources.isGreetings_and_byebyes_on()) return; - + if (event.getMember().getUser().isBot()) return; - - String nameToPlay = event.getMember().getNickname(); - nameToPlay = nameToPlay == null ? event.getMember().getUser().getName() : nameToPlay; - - PlayCommand.play( - SayCommand.buildTTSAudio(Resources.getRandomGreeting(nameToPlay)), - event.getMember().getVoiceState().getChannel()); + + if(YoshiBot.getInstance().isActive()) + YoshiBot.getInstance().autoConnectToChannel(); + + if (Resources.isGreetings_and_byebyes_on()){ + String nameToPlay = event.getMember().getNickname(); + if(nameToPlay == null) nameToPlay = event.getMember().getUser().getName(); + + PlayCommand.play( + SayCommand.buildTTSAudio(Resources.getRandomGreeting(nameToPlay)), + event.getMember().getVoiceState().getChannel()); + } } @Override public void onGuildVoiceLeave(@NotNull GuildVoiceLeaveEvent event) { super.onGuildVoiceLeave(event); - - if (!Resources.isGreetings_and_byebyes_on()) return; - + if (event.getMember().getUser().isBot()) return; - - String nameToPlay = event.getMember().getNickname(); - nameToPlay = nameToPlay == null ? event.getMember().getUser().getName() : nameToPlay; - - PlayCommand.play( - SayCommand.buildTTSAudio(Resources.getRandomByebye(nameToPlay)), - event.getChannelLeft()); + + if(YoshiBot.getInstance().isActive()) + YoshiBot.getInstance().autoConnectToChannel(); + + if (!Resources.isGreetings_and_byebyes_on()) { + String nameToPlay = event.getMember().getNickname(); + nameToPlay = nameToPlay == null ? event.getMember().getUser().getName() : nameToPlay; + + PlayCommand.play( + SayCommand.buildTTSAudio(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 d176587..3505e1d 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java @@ -21,6 +21,7 @@ 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.VoiceChannel; import javax.security.auth.login.LoginException; import java.io.File; @@ -62,11 +63,15 @@ public final class YoshiBot { @Getter private final Random random = new Random(); + + @Getter + private boolean active; /** * Initialisiert alle dynamisch hinzugefügten und statischen Ressourcen. Startet aber nicht den Bot selbst. */ public boolean init(String configPath) { + active = false; return Resources.init(configPath); } @@ -113,6 +118,8 @@ public final class YoshiBot { new SauceProvider(300); Executors.newScheduledThreadPool(1).scheduleAtFixedRate(YoshiBot::setRandomActivity, 0, 10, TimeUnit.HOURS); + + if(active) autoConnectToChannel(); } public synchronized void stop() { @@ -148,5 +155,35 @@ public final class YoshiBot { yoshiBot.jda.getPresence().setActivity(Activity.playing(activity)); Logger.logInfo("Setze Aktivität auf " + activity); } + + private void joinVoiceChannel(VoiceChannel vc){ + if(vc.equals(guild.getAudioManager().getConnectedChannel())) return; + leaveAudioChannel(); + guild.getAudioManager().openAudioConnection(vc); + } + + private void leaveAudioChannel(){ + if(guild.getAudioManager().getConnectedChannel() == null) return; + guild.getAudioManager().closeAudioConnection(); + } + + public void autoConnectToChannel(){ + VoiceChannel maxMembersVoiceChannel = null; + int maxMembers = 0; + for(VoiceChannel vc : guild.getVoiceChannels()){ + if(vc.getMembers().size() > maxMembers){ + maxMembersVoiceChannel = vc; + maxMembers = vc.getMembers().size(); + } + } + if(maxMembers == 0) leaveAudioChannel(); + else joinVoiceChannel(maxMembersVoiceChannel); + } + + public void setActive(boolean a){ + active = a; + if(active) autoConnectToChannel(); + else leaveAudioChannel(); + } }