Merge branch 'feature/refactor' into feature/database_migration
This commit is contained in:
@ -29,8 +29,18 @@ package net.locusworks.discord.eighttrack.adaptors;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.time.Duration;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import net.dv8tion.jda.api.JDA;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
|
||||
@ -43,13 +53,41 @@ public class MusicListenerAdaptor extends ListenerAdapter {
|
||||
private ApplicationLogger logger;
|
||||
|
||||
private Map<Long, GuildMusicHandler> playerMap;
|
||||
private JDA client;
|
||||
|
||||
public MusicListenerAdaptor(Path musicDir) throws IOException {
|
||||
public MusicListenerAdaptor(Path musicDir, JDA client) throws IOException {
|
||||
this.logger = ApplicationLoggerFactory.getLogger(MusicListenerAdaptor.class);
|
||||
this.playerMap = new ConcurrentHashMap<>();
|
||||
this.musicDir = musicDir;
|
||||
this.client = client;
|
||||
|
||||
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
|
||||
executor.scheduleWithFixedDelay(()->checkPlayers(), 1, 1, TimeUnit.MINUTES);
|
||||
|
||||
}
|
||||
|
||||
private void checkPlayers() {
|
||||
logger.debug("Checking players to see if anyone is listening");
|
||||
OffsetDateTime now = OffsetDateTime.now();
|
||||
for(Iterator<Entry<Long, GuildMusicHandler>> iterator = playerMap.entrySet().iterator(); iterator.hasNext();) {
|
||||
Entry<Long, GuildMusicHandler> entry = iterator.next();
|
||||
GuildMusicHandler gmh = entry.getValue();
|
||||
long guildId = entry.getKey();
|
||||
|
||||
OffsetDateTime lastPlayed = gmh.getLastPlayed();
|
||||
Duration duration = Duration.between(lastPlayed, now);
|
||||
if (duration.getSeconds() > 300) {
|
||||
Guild guild = client.getGuildById(guildId);
|
||||
if (guild == null) {
|
||||
iterator.remove();
|
||||
continue;
|
||||
}
|
||||
guild.getAudioManager().closeAudioConnection();
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
|
||||
if (event.getAuthor().isBot()) return;
|
||||
@ -66,6 +104,7 @@ public class MusicListenerAdaptor extends ListenerAdapter {
|
||||
playerMap.put(event.getGuild().getIdLong(), new GuildMusicHandler(musicDir));
|
||||
}
|
||||
GuildMusicHandler gmh = playerMap.get(event.getGuild().getIdLong());
|
||||
gmh.accept((id) -> playerMap.remove(id));
|
||||
|
||||
String command = event.getMessage().getContentRaw().trim().toLowerCase();
|
||||
switch (command) {
|
||||
|
@ -33,6 +33,7 @@ import java.nio.file.Path;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
@ -42,6 +43,8 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
|
||||
import net.dv8tion.jda.api.EmbedBuilder;
|
||||
import net.dv8tion.jda.api.Permission;
|
||||
import net.dv8tion.jda.api.entities.ChannelType;
|
||||
import net.dv8tion.jda.api.entities.GuildChannel;
|
||||
import net.dv8tion.jda.api.entities.MessageEmbed;
|
||||
import net.dv8tion.jda.api.entities.VoiceChannel;
|
||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
||||
@ -58,12 +61,18 @@ public class GuildMusicHandler {
|
||||
private ApplicationLogger logger;
|
||||
private AudioPlayer player;
|
||||
private AtomicBoolean playing;
|
||||
private Long voiceChannelId;
|
||||
|
||||
private OffsetDateTime lastPlayed;
|
||||
|
||||
private Consumer<Long> callback;
|
||||
|
||||
public GuildMusicHandler(Path musicDir) throws IOException {
|
||||
this.logger = ApplicationLoggerFactory.getLogger(GuildMusicHandler.class);
|
||||
this.playing = new AtomicBoolean(false);
|
||||
this.musicDir = musicDir;
|
||||
|
||||
this.lastPlayed = OffsetDateTime.now();
|
||||
|
||||
this.apm = new DefaultAudioPlayerManager();
|
||||
|
||||
AudioSourceManagers.registerLocalSource(apm);
|
||||
@ -74,6 +83,14 @@ public class GuildMusicHandler {
|
||||
indexFiles();
|
||||
}
|
||||
|
||||
public OffsetDateTime getLastPlayed() {
|
||||
return lastPlayed;
|
||||
}
|
||||
|
||||
public void accept(Consumer<Long> callback) {
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
public void isPlaying(boolean playing) {
|
||||
this.playing.set(playing);
|
||||
}
|
||||
@ -127,6 +144,15 @@ public class GuildMusicHandler {
|
||||
}
|
||||
|
||||
public void next(GuildMessageReceivedEvent event) {
|
||||
|
||||
GuildChannel gc = event.getGuild().getGuildChannelById(ChannelType.VOICE, voiceChannelId);
|
||||
if (gc != null && gc.getMembers().size() == 1) {
|
||||
event.getChannel().sendMessage("Going silent since no one is currently listening to the channel").queue();
|
||||
event.getGuild().getAudioManager().closeAudioConnection();
|
||||
if (callback != null) callback.accept(event.getGuild().getIdLong());
|
||||
return;
|
||||
}
|
||||
|
||||
playing.set(false);
|
||||
stop(event);
|
||||
play(event);
|
||||
@ -143,12 +169,14 @@ public class GuildMusicHandler {
|
||||
event.getChannel().sendMessage(String.format("<@%s> you are not in a voice channel to play music", event.getMember().getId())).queue();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!event.getGuild().getSelfMember().hasPermission(vc, Permission.VOICE_CONNECT, Permission.VOICE_SPEAK)) {
|
||||
event.getChannel().sendMessage(String.format("<@%s>, I cannot play my music in channel %s as I dont have permission to",
|
||||
event.getMember().getId(), vc.getName())).queue();
|
||||
return;
|
||||
}
|
||||
|
||||
voiceChannelId = vc.getIdLong();
|
||||
|
||||
AudioManager manager = event.getGuild().getAudioManager();
|
||||
manager.openAudioConnection(vc);
|
||||
@ -156,8 +184,10 @@ public class GuildMusicHandler {
|
||||
manager.setSendingHandler(new EightTrackAudioSendHandler(player));
|
||||
|
||||
if (ts.hasTracks()) {
|
||||
lastPlayed = OffsetDateTime.now();
|
||||
|
||||
AudioTrack track = ts.getNextTrack();
|
||||
|
||||
|
||||
MessageEmbed embed = new EmbedBuilder()
|
||||
.setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
|
||||
.setTitle("Now Playing:")
|
||||
|
Reference in New Issue
Block a user