diff --git a/src/main/java/codes/ztereohype/ztereomusic/ZtereoMUSIC.java b/src/main/java/codes/ztereohype/ztereomusic/ZtereoMUSIC.java index aa1ef2a..3e21163 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/ZtereoMUSIC.java +++ b/src/main/java/codes/ztereohype/ztereomusic/ZtereoMUSIC.java @@ -4,8 +4,8 @@ import codes.ztereohype.ztereomusic.audio.TrackManager; import codes.ztereohype.ztereomusic.command.Command; import codes.ztereohype.ztereomusic.command.commands.*; import codes.ztereohype.ztereomusic.database.Config; +import codes.ztereohype.ztereomusic.listeners.AloneDisconnectListener; import codes.ztereohype.ztereomusic.listeners.CommandListener; -import codes.ztereohype.ztereomusic.listeners.vcLeaveListener; import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers; @@ -25,9 +25,6 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.Map; -import static net.dv8tion.jda.api.requests.GatewayIntent.GUILD_MESSAGES; -import static net.dv8tion.jda.api.requests.GatewayIntent.GUILD_VOICE_STATES; - @Getter @Setter(AccessLevel.PRIVATE) public class ZtereoMUSIC { @@ -84,6 +81,12 @@ public class ZtereoMUSIC { Disconnect disconnect = new Disconnect(); this.getCommandMap().put(disconnect.getMeta().getName(), disconnect); + Clear clear = new Clear(); + this.getCommandMap().put(clear.getMeta().getName(), clear); + + Remove remove = new Remove(); + this.getCommandMap().put(remove.getMeta().getName(), remove); + Queue queue = new Queue(); this.getCommandMap().put(queue.getMeta().getName(), queue); @@ -103,6 +106,6 @@ public class ZtereoMUSIC { private void setListeners() { this.getJda().addEventListener(new CommandListener()); - this.getJda().addEventListener(new vcLeaveListener()); + this.getJda().addEventListener(new AloneDisconnectListener()); } } diff --git a/src/main/java/codes/ztereohype/ztereomusic/listeners/AloneDisconnectListener.java b/src/main/java/codes/ztereohype/ztereomusic/listeners/AloneDisconnectListener.java new file mode 100644 index 0000000..e36bbf1 --- /dev/null +++ b/src/main/java/codes/ztereohype/ztereomusic/listeners/AloneDisconnectListener.java @@ -0,0 +1,74 @@ +package codes.ztereohype.ztereomusic.listeners; + +import codes.ztereohype.ztereomusic.ZtereoMUSIC; +import codes.ztereohype.ztereomusic.audio.TrackManagers; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.events.guild.voice.GuildVoiceJoinEvent; +import net.dv8tion.jda.api.events.guild.voice.GuildVoiceLeaveEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; + +import javax.annotation.Nonnull; +import java.util.*; + +public class AloneDisconnectListener extends ListenerAdapter { + //sorry reperak, i tried using a list of pairs but iterating over it to find it in onGuildVoiceLeave is too much effort + private final Map aloneGuilds = new HashMap<>(); + + public AloneDisconnectListener() { + Timer timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + checkIfAloneAfterThreshold(); + } + }, 5000, 5000); + } + + @Override + public void onGuildVoiceLeave(@Nonnull GuildVoiceLeaveEvent event) { + Guild guild = event.getGuild(); + Member leavingMember = event.getMember(); + Member ztereoBotMember = event.getGuild().getMember(ZtereoMUSIC.getInstance().getJda().getSelfUser()); + + if (guild.getAudioManager().getConnectedChannel() == null) return; // if we're not connected ignore + + // If the bot gets disconnected, delete the trackManager for that guild and don't be alone + if (leavingMember.equals(ztereoBotMember)) { + TrackManagers.removeGuildTrackManager(guild); + aloneGuilds.remove(guild); + return; + } + + // if there's only one member (and i'm still in), be alone and start a 5m timer + if (guild.getAudioManager().getConnectedChannel().getMembers().size() == 1) { + System.out.println("i'm alone"); + aloneGuilds.put(guild, System.currentTimeMillis()); + } + } + + @Override + public void onGuildVoiceJoin(@Nonnull GuildVoiceJoinEvent event) { + Guild guild = event.getGuild(); + + if (guild.getAudioManager().getConnectedChannel() == null) return; // if we're not connected ignore + + + // if there's no longer only one member don't be alone (i wrote this at 4am please tell me it works) + if (guild.getAudioManager().getConnectedChannel().getMembers().size() > 1) { + aloneGuilds.remove(guild); + } + } + + private void checkIfAloneAfterThreshold() { + long time = System.currentTimeMillis(); + for (Map.Entry entry : aloneGuilds.entrySet()) { + if ((time - entry.getValue()) > (long) 5 * 60 * 1000) { + TrackManagers.removeGuildTrackManager(entry.getKey()); + aloneGuilds.remove(entry.getKey()); + }; + } + } + + //Note: no need to check for moves as the bot currently never moves, only leaves and joins +} diff --git a/src/main/java/codes/ztereohype/ztereomusic/listeners/AloneInVcListener.java b/src/main/java/codes/ztereohype/ztereomusic/listeners/AloneInVcListener.java deleted file mode 100644 index 0e41ffd..0000000 --- a/src/main/java/codes/ztereohype/ztereomusic/listeners/AloneInVcListener.java +++ /dev/null @@ -1,8 +0,0 @@ -//package codes.ztereohype.ztereomusic.listeners; -// -//import net.dv8tion.jda.api.hooks.ListenerAdapter; -// -//public class AloneInVcListener extends ListenerAdapter { -// @Override -// public void on -//}