Browse Source

Follow Teil 3 Follow-Command abgeschafft. Bot hält nun in Channels die Verbindung und sucht sich den aus, der am meisten Members hat.

pull/2/head
Yannic Link 4 years ago
parent
commit
b26859bbae
7 changed files with 47 additions and 89 deletions
  1. +8
    -1
      app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioPlayerListener.java
  2. +3
    -6
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java
  3. +0
    -4
      app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommandDistributor.java
  4. +0
    -30
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/FollowCommand.java
  5. +2
    -0
      app/src/main/java/de/yannicpunktdee/yoshibot/command/commands/PlayCommand.java
  6. +10
    -5
      app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java
  7. +24
    -43
      app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java

+ 8
- 1
app/src/main/java/de/yannicpunktdee/yoshibot/audio/AudioPlayerListener.java View File

@ -3,11 +3,16 @@ package de.yannicpunktdee.yoshibot.audio;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEvent; import com.sedmelluq.discord.lavaplayer.player.event.AudioEvent;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventListener; import com.sedmelluq.discord.lavaplayer.player.event.AudioEventListener;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
import lombok.Getter;
import net.dv8tion.jda.api.managers.AudioManager; import net.dv8tion.jda.api.managers.AudioManager;
public class AudioPlayerListener implements AudioEventListener { public class AudioPlayerListener implements AudioEventListener {
private AudioManager audioManager; private AudioManager audioManager;
@Getter
private static boolean isPlayingTrack = false;
public AudioPlayerListener(AudioManager audioManager) { public AudioPlayerListener(AudioManager audioManager) {
@ -18,7 +23,9 @@ public class AudioPlayerListener implements AudioEventListener {
public void onEvent(AudioEvent event) { public void onEvent(AudioEvent event) {
if(event.player.getPlayingTrack() == null) { if(event.player.getPlayingTrack() == null) {
event.player.stopTrack(); event.player.stopTrack();
}
isPlayingTrack = false;
YoshiBot.getInstance().joinVoiceChannelWithMostMembers();
} else isPlayingTrack = true;
} }
} }

+ 3
- 6
app/src/main/java/de/yannicpunktdee/yoshibot/command/YoshiCommand.java View File

@ -107,18 +107,15 @@ public abstract class YoshiCommand {
protected VoiceChannel getVoiceChannelByParam(){ protected VoiceChannel getVoiceChannelByParam(){
VoiceChannel vc; 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<VoiceChannel> channels = YoshiBot.getInstance().jda.getVoiceChannelsByName(context.getArgument("channel"), true); List<VoiceChannel> channels = YoshiBot.getInstance().jda.getVoiceChannelsByName(context.getArgument("channel"), true);
if (!(channels.size() > 0)) { if (!(channels.size() > 0)) {
context.getEvent().getTextChannel().sendMessage("Der Kanalname konnte nicht gefunden werden.").queue(); context.getEvent().getTextChannel().sendMessage("Der Kanalname konnte nicht gefunden werden.").queue();
return null; return null;
} }
vc = channels.get(0); vc = channels.get(0);
} else {
}else{
vc = context.getEvent().getMember().getVoiceState().getChannel(); vc = context.getEvent().getMember().getVoiceState().getChannel();
} }
return vc; return vc;


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

@ -65,9 +65,6 @@ public class YoshiCommandDistributor {
case WIKIPEDIA: case WIKIPEDIA:
command = new WikipediaCommand(context); command = new WikipediaCommand(context);
break; break;
case FOLLOW:
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;
@ -115,7 +112,6 @@ public class YoshiCommandDistributor {
SAUCE, SAUCE,
PAT, PAT,
BONK, BONK,
FOLLOW,
WIKIPEDIA WIKIPEDIA
} }


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

@ -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;
}
}

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

@ -3,6 +3,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.main.YoshiBot;
import de.yannicpunktdee.yoshibot.utils.Logger;
import de.yannicpunktdee.yoshibot.utils.Resources; import de.yannicpunktdee.yoshibot.utils.Resources;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
@ -44,6 +45,7 @@ public class PlayCommand extends YoshiCommand {
return false; return false;
} }
Logger.logDebug(getVoiceChannelByParam().getName());
YoshiBot.getInstance().playSound(file, getVoiceChannelByParam()); YoshiBot.getInstance().playSound(file, getVoiceChannelByParam());
}else { }else {
sendMessage("Unzureichende Parameter."); sendMessage("Unzureichende Parameter.");


+ 10
- 5
app/src/main/java/de/yannicpunktdee/yoshibot/listeners/DiscordEventListener.java View File

@ -1,13 +1,13 @@
package de.yannicpunktdee.yoshibot.listeners; 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.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.command.commands.PlayCommand;
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.entities.ChannelType; import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceJoinEvent; 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.GuildVoiceLeaveEvent;
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceMoveEvent;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -51,7 +51,7 @@ public class DiscordEventListener extends ListenerAdapter {
if (event.getMember().getUser().isBot()) return; if (event.getMember().getUser().isBot()) return;
YoshiBot.getInstance().autoConnectToChannel();
if(!AudioPlayerListener.isPlayingTrack()) YoshiBot.getInstance().joinVoiceChannelWithMostMembers();
if (Resources.isGreetings_and_byebyes_on()){ if (Resources.isGreetings_and_byebyes_on()){
String nameToPlay = event.getMember().getNickname(); String nameToPlay = event.getMember().getNickname();
@ -62,14 +62,19 @@ public class DiscordEventListener extends ListenerAdapter {
event.getMember().getVoiceState().getChannel()); event.getMember().getVoiceState().getChannel());
} }
} }
@Override
public void onGuildVoiceMove(@NotNull GuildVoiceMoveEvent event) {
if(!AudioPlayerListener.isPlayingTrack()) YoshiBot.getInstance().joinVoiceChannelWithMostMembers();
}
@Override @Override
public void onGuildVoiceLeave(@NotNull GuildVoiceLeaveEvent event) { public void onGuildVoiceLeave(@NotNull GuildVoiceLeaveEvent event) {
super.onGuildVoiceLeave(event); super.onGuildVoiceLeave(event);
if (event.getMember().getUser().isBot()) return; if (event.getMember().getUser().isBot()) return;
YoshiBot.getInstance().autoConnectToChannel();
if(!AudioPlayerListener.isPlayingTrack()) YoshiBot.getInstance().joinVoiceChannelWithMostMembers();
if (Resources.isGreetings_and_byebyes_on()) { if (Resources.isGreetings_and_byebyes_on()) {
String nameToPlay = event.getMember().getNickname(); String nameToPlay = event.getMember().getNickname();


+ 24
- 43
app/src/main/java/de/yannicpunktdee/yoshibot/main/YoshiBot.java View File

@ -22,9 +22,8 @@ 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.Member;
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.BufferedReader;
@ -61,8 +60,9 @@ public final class YoshiBot {
* LavaPlayer AudioPlayerManager. * LavaPlayer AudioPlayerManager.
*/ */
public AudioPlayerManager audioPlayerManager; public AudioPlayerManager audioPlayerManager;
public Guild guild;
@Getter
private Guild guild;
public AudioPlayer audioPlayer; public AudioPlayer audioPlayer;
@ -70,18 +70,11 @@ public final class YoshiBot {
@Getter @Getter
private final Random random = new Random(); 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. * Initialisiert alle dynamisch hinzugefügten und statischen Ressourcen. Startet aber nicht den Bot selbst.
*/ */
public boolean init(String configPath) { public boolean init(String configPath) {
active = false;
return Resources.init(configPath); return Resources.init(configPath);
} }
@ -129,7 +122,7 @@ public final class YoshiBot {
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(YoshiBot::setRandomActivity, 0, 10, TimeUnit.HOURS); Executors.newScheduledThreadPool(1).scheduleAtFixedRate(YoshiBot::setRandomActivity, 0, 10, TimeUnit.HOURS);
if(active) autoConnectToChannel();
joinVoiceChannelWithMostMembers();
} }
public synchronized void stop() { public synchronized void stop() {
@ -166,47 +159,37 @@ public final class YoshiBot {
Logger.logInfo("Setze Aktivität auf " + activity); 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); 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; int maxMembers = 0;
for(VoiceChannel vc : guild.getVoiceChannels()){ 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){ public boolean playSound(File file, VoiceChannel vc){
if(active) return true;
if (!file.isFile()) return false; if (!file.isFile()) return false;
joinVoiceChannel((vc == null)? voiceChannel : vc);
joinVoiceChannel(vc);
audioPlayerManager.loadItem(file.getAbsolutePath(), new AudioLoadResultHandlerImpl()); audioPlayerManager.loadItem(file.getAbsolutePath(), new AudioLoadResultHandlerImpl());
@ -214,8 +197,6 @@ public final class YoshiBot {
} }
public boolean sayTTS(String text, VoiceChannel vc) { public boolean sayTTS(String text, VoiceChannel vc) {
if(!active) return true;
String path = Resources.getPathToTempAudioFile(UUID.randomUUID().toString()); String path = Resources.getPathToTempAudioFile(UUID.randomUUID().toString());
try { try {


Loading…
Cancel
Save