refactor: change package path to reflect group id of pom.xml
BREAKING CHANGE:
This commit is contained in:
1 parent
2b08351f6d
commit
f4c7e9c703
94 files changed
+373
-372
No files matched your search
@@ -0,0 +1,253 @@
|
||||
package me.bobert.netneutrality.music;
|
||||
|
||||
/*
|
||||
* Copyright (c) anthorob
|
||||
*
|
||||
* https://discord.gg/qUa6zNFZsd
|
||||
*/
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.http.HttpAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.soundcloud.SoundCloudAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import dev.lavalink.youtube.YoutubeAudioSourceManager;
|
||||
import me.bobert.netneutrality.command.CommandExecutionResult;
|
||||
import me.bobert.netneutrality.core.GuildManager;
|
||||
import me.bobert.netneutrality.core.LogHandler;
|
||||
import me.bobert.netneutrality.core.context.CommandContext;
|
||||
import me.bobert.netneutrality.db.GSettings;
|
||||
import me.bobert.netneutrality.exceptions.CommandExecutionException;
|
||||
import me.bobert.netneutrality.music.loadable.LoadableSong;
|
||||
import me.bobert.netneutrality.music.source.UdioAudioSourceManager;
|
||||
import me.bobert.netneutrality.thread.MusicPlayerAutoDisconnectThread;
|
||||
import me.bobert.netneutrality.thread.ThreadManager;
|
||||
import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel;
|
||||
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class MusicManager {
|
||||
|
||||
private final static Logger logger = LogManager.getLogger(MusicManager.class);
|
||||
private final static Map<String, MusicManager> managers = new ConcurrentHashMap<>();
|
||||
private final static ScheduledExecutorService executor = ThreadManager.getMusicExecutor();
|
||||
|
||||
private final static AudioPlayerManager playerManager = new DefaultAudioPlayerManager();
|
||||
private final Guild guild;
|
||||
private final AudioPlayer player;
|
||||
private final TrackScheduler scheduler;
|
||||
private TrackLoader lastTrackLoader;
|
||||
private ScheduledFuture<?> autoDisconnectThread;
|
||||
private final int baseVolume;
|
||||
|
||||
private MusicManager(Guild guild) {
|
||||
this.guild = guild;
|
||||
this.player = playerManager.createPlayer();
|
||||
this.scheduler = new TrackScheduler(this);
|
||||
this.baseVolume = Integer.parseInt(GuildManager.getManager(guild).getGuildConfigManager().getSetting(GSettings.MUSIC_VOLUME));
|
||||
|
||||
guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player));
|
||||
player.addListener(scheduler);
|
||||
|
||||
managers.put(guild.getId(), this);
|
||||
}
|
||||
|
||||
public static MusicManager get(Guild guild) {
|
||||
if (managers.containsKey(guild.getId())) {
|
||||
return managers.get(guild.getId());
|
||||
} else {
|
||||
return new MusicManager(guild);
|
||||
}
|
||||
}
|
||||
|
||||
public static void initPlayerManager() {
|
||||
playerManager.registerSourceManager(new YoutubeAudioSourceManager());
|
||||
playerManager.registerSourceManager(SoundCloudAudioSourceManager.createDefault());
|
||||
playerManager.registerSourceManager(new UdioAudioSourceManager());
|
||||
playerManager.registerSourceManager(new HttpAudioSourceManager());
|
||||
}
|
||||
|
||||
public boolean isNotConnectedTo(VoiceChannel vChannel) {
|
||||
return vChannel == null || !vChannel.equals(guild.getAudioManager().getConnectedChannel());
|
||||
}
|
||||
|
||||
public synchronized void connect(VoiceChannel vChannel) {
|
||||
if (vChannel != null && isNotConnectedTo(vChannel)) {
|
||||
logger.debug("Guild {}: connecting to voice channel {}", vChannel.getGuild().getId(), vChannel.getId());
|
||||
guild.getAudioManager().openAudioConnection(vChannel);
|
||||
guild.getAudioManager().setSelfDeafened(true);
|
||||
player.setVolume(baseVolume);
|
||||
|
||||
if (autoDisconnectThread == null)
|
||||
autoDisconnectThread = executor.scheduleWithFixedDelay(new MusicPlayerAutoDisconnectThread(this), 240, 240, TimeUnit.SECONDS);
|
||||
} else {
|
||||
throw new RuntimeException("Error connecting to voice channel");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isConnected() {
|
||||
return guild != null && guild.getAudioManager().getConnectedChannel() != null;
|
||||
}
|
||||
|
||||
public synchronized AudioTrack getCurrentlyPlaying() {
|
||||
return player.getPlayingTrack();
|
||||
}
|
||||
|
||||
public synchronized boolean isCurrentlyPlaying() {
|
||||
return player.getPlayingTrack() != null;
|
||||
}
|
||||
|
||||
public synchronized Member getRequesterOfCurrentTrack() {
|
||||
QueueManager.TrackInfo info = scheduler.getQueueManager().peekHeadOfQueue();
|
||||
|
||||
if (info == null)
|
||||
return null;
|
||||
|
||||
return info.getRequester();
|
||||
}
|
||||
|
||||
protected AudioPlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public Guild getGuild() {
|
||||
return guild;
|
||||
}
|
||||
|
||||
public void stopLoading() {
|
||||
lastTrackLoader.stopLoading();
|
||||
}
|
||||
|
||||
public synchronized void leave() {
|
||||
if (guild != null && guild.getAudioManager().getConnectedChannel() != null) {
|
||||
logger.debug("Guild {}: leaving voice channel {}", guild.getId(), guild.getAudioManager().getConnectedChannel().getId());
|
||||
player.stopTrack();
|
||||
guild.getAudioManager().closeAudioConnection();
|
||||
}
|
||||
|
||||
scheduler.detachTextChannel();
|
||||
|
||||
if (autoDisconnectThread != null) {
|
||||
autoDisconnectThread.cancel(true);
|
||||
autoDisconnectThread = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void disconnectPlayers() {
|
||||
for (MusicManager mm : managers.values()) {
|
||||
mm.getScheduler().getQueueManager().clearQueue();
|
||||
mm.player.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void play(String url, CommandContext context, boolean needToBeConnected, boolean silent) {
|
||||
logger.debug("Guild {}: request to play '{}' by user {}", guild.getId(), url, context.getGuildUser().getId());
|
||||
|
||||
List<LoadableSong> toLoad = new ArrayList<>();
|
||||
toLoad.add(new LoadableSong(null, url, null));
|
||||
|
||||
play(toLoad, context, needToBeConnected, silent);
|
||||
}
|
||||
|
||||
public void play(List<LoadableSong> songs, CommandContext context, boolean needToBeConnected, boolean silent) {
|
||||
Member member = context.getGuildUser();
|
||||
MessageChannel channel = context.getChannel();
|
||||
|
||||
if (member.getVoiceState() == null) {
|
||||
logger.error("Guild {}: Voice state is null", guild.getId());
|
||||
context.replyToMessage("Voice state is null, something has gone terribly wrong.");
|
||||
LogHandler.log(new CommandExecutionException("Voice state is null", context, null));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!member.getVoiceState().inAudioChannel()) {
|
||||
context.replyToMessage("You are not in a voice channel");
|
||||
return;
|
||||
}
|
||||
|
||||
VoiceChannel vChannel = (VoiceChannel) member.getVoiceState().getChannel();
|
||||
if (needToBeConnected && isNotConnectedTo(vChannel)) {
|
||||
context.replyToMessage("The player is not in your voice channel");
|
||||
return;
|
||||
}
|
||||
|
||||
if (isNotConnectedTo(vChannel)) {
|
||||
connect(vChannel);
|
||||
scheduler.attachTextChannel(channel);
|
||||
}
|
||||
|
||||
TrackLoader loader = new TrackLoader(this, context, playerManager, silent);
|
||||
lastTrackLoader = loader;
|
||||
|
||||
loader.loadAllSongs(songs);
|
||||
}
|
||||
|
||||
public synchronized void stopTrack() {
|
||||
player.stopTrack();
|
||||
}
|
||||
|
||||
public synchronized CommandExecutionResult voteSkip(CommandContext context) {
|
||||
VoiceChannel voiceChannel = (VoiceChannel) guild.getAudioManager().getConnectedChannel();
|
||||
|
||||
if (voiceChannel == null) {
|
||||
return CommandExecutionResult.none();
|
||||
}
|
||||
|
||||
if (!isCurrentlyPlaying()) {
|
||||
return CommandExecutionResult.none();
|
||||
}
|
||||
|
||||
QueueManager.TrackInfo info = scheduler.getQueueManager().peekHeadOfQueue();
|
||||
if (info == null) {
|
||||
return CommandExecutionResult.none();
|
||||
}
|
||||
|
||||
// Minus the bot itself
|
||||
int connected = voiceChannel.getMembers().size() - 1;
|
||||
|
||||
if (connected < 3) {
|
||||
context.reply("Skipping current track since not enough people are connected to the voice channel.");
|
||||
scheduler.getQueueManager().skip();
|
||||
|
||||
return CommandExecutionResult.none();
|
||||
}
|
||||
|
||||
double needed = connected / 2.1;
|
||||
|
||||
info.addSkip(context.getGuildUser());
|
||||
logger.debug("VoteSkip: guild={}, connected={}, needed={}, skips={}, user={}", context.getGuild().getId(), connected, needed, info.getSkips().size(), context.getGuildUser().getId());
|
||||
|
||||
if (info.getSkips().size() > needed) {
|
||||
return scheduler.getQueueManager().skip();
|
||||
} else {
|
||||
context.reply("Adding your vote to skip the current track. Current votes: %d/%d", info.getSkips().size(), (int) Math.ceil(needed));
|
||||
}
|
||||
|
||||
return CommandExecutionResult.none();
|
||||
}
|
||||
|
||||
public synchronized void setVolume(int volume) {
|
||||
player.setVolume(volume);
|
||||
}
|
||||
|
||||
public int getQueueSize() {
|
||||
return scheduler.getQueueManager().getQueueSize();
|
||||
}
|
||||
|
||||
public TrackScheduler getScheduler() {
|
||||
return scheduler;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user