new: check for alone and disconnect

This commit is contained in:
ZtereoHYPE 2021-12-28 01:36:41 +01:00
parent fee15771ad
commit 39efb6b4ee
3 changed files with 82 additions and 13 deletions

View file

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

View file

@ -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<Guild, Long> 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<Guild, Long> 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
}

View file

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