From b26859bbaee3a4dec2f2e86a09a3b57e90845948 Mon Sep 17 00:00:00 2001 From: Yannic Link Date: Wed, 7 Apr 2021 03:37:20 +0200 Subject: [PATCH] =?UTF-8?q?Follow=20Teil=203=20Follow-Command=20abgeschaff?= =?UTF-8?q?t.=20Bot=20h=C3=A4lt=20nun=20in=20Channels=20die=20Verbindung?= =?UTF-8?q?=20und=20sucht=20sich=20den=20aus,=20der=20am=20meisten=20Membe?= =?UTF-8?q?rs=20hat.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yoshibot/audio/AudioPlayerListener.java | 9 ++- .../yoshibot/command/YoshiCommand.java | 9 +-- .../command/YoshiCommandDistributor.java | 4 -- .../command/commands/FollowCommand.java | 30 --------- .../command/commands/PlayCommand.java | 2 + .../listeners/DiscordEventListener.java | 15 +++-- .../yoshibot/main/YoshiBot.java | 67 +++++++------------ 7 files changed, 47 insertions(+), 89 deletions(-) delete mode 100644 app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/FollowCommand.java 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 09cc645..d7048a7 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioPlayerListener.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioPlayerListener.java @@ -3,11 +3,16 @@ package de.yannicpunktdee.yoshibot.audio; import com.sedmelluq.discord.lavaplayer.player.event.AudioEvent; import com.sedmelluq.discord.lavaplayer.player.event.AudioEventListener; +import de.yannicpunktdee.yoshibot.main.YoshiBot; +import lombok.Getter; import net.dv8tion.jda.api.managers.AudioManager; public class AudioPlayerListener implements AudioEventListener { private AudioManager audioManager; + + @Getter + private static boolean isPlayingTrack = false; public AudioPlayerListener(AudioManager audioManager) { @@ -18,7 +23,9 @@ public class AudioPlayerListener implements AudioEventListener { public void onEvent(AudioEvent event) { if(event.player.getPlayingTrack() == null) { event.player.stopTrack(); - } + isPlayingTrack = false; + YoshiBot.getInstance().joinVoiceChannelWithMostMembers(); + } else isPlayingTrack = true; } } 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 bb68b38..d3160bf 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java @@ -107,18 +107,15 @@ public abstract class YoshiCommand { protected VoiceChannel getVoiceChannelByParam(){ VoiceChannel vc; - if (context.getEvent().getMember() == null || - !context.getEvent().getMember().getVoiceState().inVoiceChannel()) { - if (!context.containsArguments(new String[]{"channel"})) { - return null; - } + if(context.containsArguments(new String[]{"channel"})){ + if(context.getArgument("channel") == null) 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 { + }else{ vc = context.getEvent().getMember().getVoiceState().getChannel(); } 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 1633465..32207c8 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java @@ -65,9 +65,6 @@ public class YoshiCommandDistributor { case WIKIPEDIA: command = new WikipediaCommand(context); break; - case FOLLOW: - command = new FollowCommand(context); - break; default: context.getEvent().getTextChannel().sendMessage("Dieses Kommando existiert noch nicht.").queue(); break; @@ -115,7 +112,6 @@ public class YoshiCommandDistributor { SAUCE, PAT, BONK, - FOLLOW, WIKIPEDIA } 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 deleted file mode 100644 index 3d08512..0000000 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/FollowCommand.java +++ /dev/null @@ -1,30 +0,0 @@ -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 fac9fea..a9503a0 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 @@ -3,6 +3,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.Resources; import net.dv8tion.jda.api.EmbedBuilder; @@ -44,6 +45,7 @@ public class PlayCommand extends YoshiCommand { return false; } + Logger.logDebug(getVoiceChannelByParam().getName()); YoshiBot.getInstance().playSound(file, getVoiceChannelByParam()); }else { sendMessage("Unzureichende Parameter."); 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 349c564..2766bbf 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java @@ -1,13 +1,13 @@ package de.yannicpunktdee.yoshibot.listeners; -import de.yannicpunktdee.yoshibot.command.YoshiCommand; +import de.yannicpunktdee.yoshibot.audio.AudioPlayerListener; import de.yannicpunktdee.yoshibot.command.YoshiCommandContext; -import de.yannicpunktdee.yoshibot.command.commands.PlayCommand; import de.yannicpunktdee.yoshibot.main.YoshiBot; import de.yannicpunktdee.yoshibot.utils.Resources; import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.events.guild.voice.GuildVoiceJoinEvent; import net.dv8tion.jda.api.events.guild.voice.GuildVoiceLeaveEvent; +import net.dv8tion.jda.api.events.guild.voice.GuildVoiceMoveEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.jetbrains.annotations.NotNull; @@ -51,7 +51,7 @@ public class DiscordEventListener extends ListenerAdapter { if (event.getMember().getUser().isBot()) return; - YoshiBot.getInstance().autoConnectToChannel(); + if(!AudioPlayerListener.isPlayingTrack()) YoshiBot.getInstance().joinVoiceChannelWithMostMembers(); if (Resources.isGreetings_and_byebyes_on()){ String nameToPlay = event.getMember().getNickname(); @@ -62,14 +62,19 @@ public class DiscordEventListener extends ListenerAdapter { event.getMember().getVoiceState().getChannel()); } } - + + @Override + public void onGuildVoiceMove(@NotNull GuildVoiceMoveEvent event) { + if(!AudioPlayerListener.isPlayingTrack()) YoshiBot.getInstance().joinVoiceChannelWithMostMembers(); + } + @Override public void onGuildVoiceLeave(@NotNull GuildVoiceLeaveEvent event) { super.onGuildVoiceLeave(event); if (event.getMember().getUser().isBot()) return; - YoshiBot.getInstance().autoConnectToChannel(); + if(!AudioPlayerListener.isPlayingTrack()) YoshiBot.getInstance().joinVoiceChannelWithMostMembers(); if (Resources.isGreetings_and_byebyes_on()) { String nameToPlay = event.getMember().getNickname(); 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 cec9258..596121e 100644 --- a/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java +++ b/app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java @@ -22,9 +22,8 @@ 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.Member; 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; @@ -61,8 +60,9 @@ public final class YoshiBot { * LavaPlayer AudioPlayerManager. */ public AudioPlayerManager audioPlayerManager; - - public Guild guild; + + @Getter + private Guild guild; public AudioPlayer audioPlayer; @@ -70,18 +70,11 @@ public final class YoshiBot { @Getter private final Random random = new Random(); - - @Getter - private boolean active; - - @Getter - private VoiceChannel voiceChannel = null; /** * 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); } @@ -129,7 +122,7 @@ public final class YoshiBot { Executors.newScheduledThreadPool(1).scheduleAtFixedRate(YoshiBot::setRandomActivity, 0, 10, TimeUnit.HOURS); - if(active) autoConnectToChannel(); + joinVoiceChannelWithMostMembers(); } public synchronized void stop() { @@ -166,47 +159,37 @@ public final class YoshiBot { Logger.logInfo("Setze Aktivität auf " + activity); } - private void joinVoiceChannel(VoiceChannel vc){ - if(vc == null) return; - if(vc.equals(guild.getAudioManager().getConnectedChannel())) return; - leaveAudioChannel(); + public synchronized void joinVoiceChannel(VoiceChannel vc){ + if(vc == null) { + guild.getAudioManager().closeAudioConnection(); + return; + } + if(guild.getAudioManager().getConnectedChannel() != null && + vc.getIdLong() == guild.getAudioManager().getConnectedChannel().getIdLong()) return; 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; + public void joinVoiceChannelWithMostMembers(){ + VoiceChannel maxVoiceChannel = null; int maxMembers = 0; for(VoiceChannel vc : guild.getVoiceChannels()){ - if(vc.getMembers().size() > maxMembers){ - maxMembersVoiceChannel = vc; - maxMembers = vc.getMembers().size(); + int membersInChannel = 0; + for(Member m : vc.getMembers()) + if(!m.getUser().isBot()) membersInChannel++; + if(membersInChannel > maxMembers){ + maxVoiceChannel = vc; + maxMembers = membersInChannel; } } - if(maxMembers == 0) leaveAudioChannel(); - else joinVoiceChannel(maxMembersVoiceChannel); - } - - public void setActive(boolean a){ - active = a; - if(active) autoConnectToChannel(); - else leaveAudioChannel(); + if(maxMembers < 1) joinVoiceChannel(null); + else if(maxMembers > 0 && maxVoiceChannel != null) + joinVoiceChannel(maxVoiceChannel); } public boolean playSound(File file, VoiceChannel vc){ - if(active) return true; - if (!file.isFile()) return false; - joinVoiceChannel((vc == null)? voiceChannel : vc); + joinVoiceChannel(vc); audioPlayerManager.loadItem(file.getAbsolutePath(), new AudioLoadResultHandlerImpl()); @@ -214,8 +197,6 @@ public final class YoshiBot { } public boolean sayTTS(String text, VoiceChannel vc) { - if(!active) return true; - String path = Resources.getPathToTempAudioFile(UUID.randomUUID().toString()); try {