🔨 Audio refracto
This commit is contained in:
parent
a295002fee
commit
2339e7cde6
@ -2,7 +2,7 @@ package net.Broken.Api.Data.Music;
|
|||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
||||||
import net.Broken.Api.Data.UserInfo;
|
import net.Broken.Api.Data.UserInfo;
|
||||||
import net.Broken.audio.UserAudioTrack;
|
import net.Broken.Audio.UserAudioTrack;
|
||||||
|
|
||||||
public record TrackInfo(UserInfo submitter, AudioTrackInfo detail) {
|
public record TrackInfo(UserInfo submitter, AudioTrackInfo detail) {
|
||||||
public TrackInfo(UserInfo submitter, AudioTrackInfo detail) {
|
public TrackInfo(UserInfo submitter, AudioTrackInfo detail) {
|
||||||
|
@ -4,12 +4,11 @@ import net.Broken.Api.Data.Music.Connect;
|
|||||||
import net.Broken.Api.Security.Data.JwtPrincipal;
|
import net.Broken.Api.Security.Data.JwtPrincipal;
|
||||||
import net.Broken.MainBot;
|
import net.Broken.MainBot;
|
||||||
import net.Broken.Tools.CacheTools;
|
import net.Broken.Tools.CacheTools;
|
||||||
import net.Broken.audio.AudioM;
|
import net.Broken.Audio.GuildAudioWrapper;
|
||||||
import net.dv8tion.jda.api.Permission;
|
import net.dv8tion.jda.api.Permission;
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
import net.dv8tion.jda.api.entities.VoiceChannel;
|
import net.dv8tion.jda.api.entities.VoiceChannel;
|
||||||
import okhttp3.Cache;
|
|
||||||
import org.springframework.security.access.expression.SecurityExpressionRoot;
|
import org.springframework.security.access.expression.SecurityExpressionRoot;
|
||||||
import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations;
|
import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations;
|
||||||
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.Authentication;
|
||||||
@ -62,8 +61,8 @@ public class CustomMethodSecurityExpressionRoot
|
|||||||
public boolean canInteractWithVoiceChannel(String guildId) {
|
public boolean canInteractWithVoiceChannel(String guildId) {
|
||||||
JwtPrincipal jwtPrincipal = (JwtPrincipal) authentication.getPrincipal();
|
JwtPrincipal jwtPrincipal = (JwtPrincipal) authentication.getPrincipal();
|
||||||
Guild guild = MainBot.jda.getGuildById(guildId);
|
Guild guild = MainBot.jda.getGuildById(guildId);
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
GuildAudioWrapper guildAudioWrapper = GuildAudioWrapper.getInstance(guild);
|
||||||
VoiceChannel channel = audioM.getPlayedChanel();
|
VoiceChannel channel = guild.getAudioManager().getConnectedChannel();
|
||||||
|
|
||||||
if (channel == null) {
|
if (channel == null) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -6,8 +6,8 @@ import net.Broken.Api.Data.Music.PlayBackInfo;
|
|||||||
import net.Broken.Api.Data.Music.Status;
|
import net.Broken.Api.Data.Music.Status;
|
||||||
import net.Broken.Api.Data.Music.TrackInfo;
|
import net.Broken.Api.Data.Music.TrackInfo;
|
||||||
import net.Broken.MainBot;
|
import net.Broken.MainBot;
|
||||||
import net.Broken.audio.AudioM;
|
import net.Broken.Audio.GuildAudioWrapper;
|
||||||
import net.Broken.audio.UserAudioTrack;
|
import net.Broken.Audio.UserAudioTrack;
|
||||||
import net.dv8tion.jda.api.Permission;
|
import net.dv8tion.jda.api.Permission;
|
||||||
import net.dv8tion.jda.api.audio.hooks.ConnectionStatus;
|
import net.dv8tion.jda.api.audio.hooks.ConnectionStatus;
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
@ -38,7 +38,7 @@ public class AudioService {
|
|||||||
boolean canView = member.hasPermission(channel, Permission.VIEW_CHANNEL)
|
boolean canView = member.hasPermission(channel, Permission.VIEW_CHANNEL)
|
||||||
|| (member.getVoiceState() != null
|
|| (member.getVoiceState() != null
|
||||||
&& member.getVoiceState().getChannel() == channel);
|
&& member.getVoiceState().getChannel() == channel);
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
GuildAudioWrapper guildAudioWrapper = GuildAudioWrapper.getInstance(guild);
|
||||||
|
|
||||||
if (canView) {
|
if (canView) {
|
||||||
// The user can interact with the audio if:
|
// The user can interact with the audio if:
|
||||||
@ -51,12 +51,12 @@ public class AudioService {
|
|||||||
&& member.hasPermission(channel, Permission.VOICE_SPEAK);
|
&& member.hasPermission(channel, Permission.VOICE_SPEAK);
|
||||||
|
|
||||||
|
|
||||||
boolean stopped = audioM.getGuildAudioPlayer().player.getPlayingTrack() == null;
|
boolean stopped = guildAudioWrapper.getGuidAudioManager().player.getPlayingTrack() == null;
|
||||||
PlayBackInfo playBackInfo;
|
PlayBackInfo playBackInfo;
|
||||||
if (!stopped) {
|
if (!stopped) {
|
||||||
boolean paused = audioM.getGuildAudioPlayer().player.isPaused();
|
boolean paused = guildAudioWrapper.getGuidAudioManager().player.isPaused();
|
||||||
long position = audioM.getGuildAudioPlayer().player.getPlayingTrack().getPosition();
|
long position = guildAudioWrapper.getGuidAudioManager().player.getPlayingTrack().getPosition();
|
||||||
UserAudioTrack userAudioTrack = audioM.getGuildAudioPlayer().scheduler.getCurrentPlayingTrack();
|
UserAudioTrack userAudioTrack = guildAudioWrapper.getGuidAudioManager().scheduler.getCurrentPlayingTrack();
|
||||||
|
|
||||||
playBackInfo = new PlayBackInfo(paused, false, position, new TrackInfo(userAudioTrack));
|
playBackInfo = new PlayBackInfo(paused, false, position, new TrackInfo(userAudioTrack));
|
||||||
|
|
||||||
@ -75,20 +75,18 @@ public class AudioService {
|
|||||||
|
|
||||||
public ResponseEntity<Status> connect(String guildId, Connect body, String userId) {
|
public ResponseEntity<Status> connect(String guildId, Connect body, String userId) {
|
||||||
Guild guild = MainBot.jda.getGuildById(guildId);
|
Guild guild = MainBot.jda.getGuildById(guildId);
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
GuildAudioWrapper guildAudioWrapper = GuildAudioWrapper.getInstance(guild);
|
||||||
VoiceChannel voiceChannel = guild.getVoiceChannelById(body.channelId());
|
VoiceChannel voiceChannel = guild.getVoiceChannelById(body.channelId());
|
||||||
audioM.getGuildAudioPlayer();
|
guildAudioWrapper.getGuidAudioManager();
|
||||||
guild.getAudioManager().openAudioConnection(voiceChannel);
|
guild.getAudioManager().openAudioConnection(voiceChannel);
|
||||||
audioM.setPlayedChanel(voiceChannel);
|
|
||||||
|
|
||||||
Status status = getGuildAudioStatus(guildId, userId);
|
Status status = getGuildAudioStatus(guildId, userId);
|
||||||
return new ResponseEntity<>(status, HttpStatus.OK);
|
return new ResponseEntity<>(status, HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResponseEntity<Status> disconnect(String guildId, String userId) {
|
public ResponseEntity<Status> disconnect(String guildId, String userId) {
|
||||||
Guild guild = MainBot.jda.getGuildById(guildId);
|
Guild guild = MainBot.jda.getGuildById(guildId);
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
GuildAudioWrapper guildAudioWrapper = GuildAudioWrapper.getInstance(guild);
|
||||||
audioM.disconnect();
|
guildAudioWrapper.disconnect();
|
||||||
Status status = getGuildAudioStatus(guildId, userId);
|
Status status = getGuildAudioStatus(guildId, userId);
|
||||||
return new ResponseEntity<>(status, HttpStatus.OK);
|
return new ResponseEntity<>(status, HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio;
|
package net.Broken.Audio;
|
||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||||
import com.sedmelluq.discord.lavaplayer.track.playback.MutableAudioFrame;
|
import com.sedmelluq.discord.lavaplayer.track.playback.MutableAudioFrame;
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio;
|
package net.Broken.Audio;
|
||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||||
@ -7,7 +7,7 @@ import net.dv8tion.jda.api.entities.Guild;
|
|||||||
/**
|
/**
|
||||||
* Holder for both the player and a track scheduler for one guild.
|
* Holder for both the player and a track scheduler for one guild.
|
||||||
*/
|
*/
|
||||||
public class GuildMusicManager {
|
public class GuildAudioManager {
|
||||||
/**
|
/**
|
||||||
* Audio player for the guild.
|
* Audio player for the guild.
|
||||||
*/
|
*/
|
||||||
@ -24,7 +24,7 @@ public class GuildMusicManager {
|
|||||||
*
|
*
|
||||||
* @param manager Audio player manager to use for creating the player.
|
* @param manager Audio player manager to use for creating the player.
|
||||||
*/
|
*/
|
||||||
public GuildMusicManager(AudioPlayerManager manager, Guild guild) {
|
public GuildAudioManager(AudioPlayerManager manager, Guild guild) {
|
||||||
player = manager.createPlayer();
|
player = manager.createPlayer();
|
||||||
scheduler = new TrackScheduler(player, guild);
|
scheduler = new TrackScheduler(player, guild);
|
||||||
player.addListener(scheduler);
|
player.addListener(scheduler);
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio;
|
package net.Broken.Audio;
|
||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||||
@ -27,49 +27,37 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class AudioM {
|
public class GuildAudioWrapper {
|
||||||
|
|
||||||
|
private static final HashMap<Guild, GuildAudioWrapper> INSTANCES = new HashMap<>();
|
||||||
|
|
||||||
|
private final GuildAudioManager guildAudioManager;
|
||||||
|
|
||||||
|
private final AudioPlayerManager audioPlayerManager;
|
||||||
|
|
||||||
private static HashMap<Guild, AudioM> INSTANCES = new HashMap<>();
|
|
||||||
/**
|
|
||||||
* Music manager for this guild
|
|
||||||
*/
|
|
||||||
private GuildMusicManager musicManager;
|
|
||||||
/**
|
|
||||||
* Audio player manager for this guild
|
|
||||||
*/
|
|
||||||
private AudioPlayerManager playerManager;
|
|
||||||
/**
|
|
||||||
* Current voice chanel (null if not connected)
|
|
||||||
*/
|
|
||||||
private VoiceChannel playedChanel;
|
|
||||||
/**
|
|
||||||
* Time out for list message
|
|
||||||
*/
|
|
||||||
private int listTimeOut = 30;
|
|
||||||
/**
|
/**
|
||||||
* Extrem limit for playlist
|
* Extrem limit for playlist
|
||||||
*/
|
*/
|
||||||
private int listExtremLimit = 300;
|
private final int listExtremLimit = 300;
|
||||||
/**
|
|
||||||
* Current guild
|
private final Guild guild;
|
||||||
*/
|
private final Logger logger = LogManager.getLogger();
|
||||||
private Guild guild;
|
|
||||||
private Logger logger = LogManager.getLogger();
|
|
||||||
|
|
||||||
private Message lastMessageWithButton;
|
private Message lastMessageWithButton;
|
||||||
|
|
||||||
private AudioM(Guild guild) {
|
private GuildAudioWrapper(Guild guild) {
|
||||||
this.playerManager = new DefaultAudioPlayerManager();
|
this.audioPlayerManager = new DefaultAudioPlayerManager();
|
||||||
AudioSourceManagers.registerRemoteSources(playerManager);
|
AudioSourceManagers.registerRemoteSources(audioPlayerManager);
|
||||||
AudioSourceManagers.registerLocalSource(playerManager);
|
AudioSourceManagers.registerLocalSource(audioPlayerManager);
|
||||||
|
this.guildAudioManager = new GuildAudioManager(audioPlayerManager, guild);
|
||||||
|
guild.getAudioManager().setSendingHandler(guildAudioManager.getSendHandler());
|
||||||
this.guild = guild;
|
this.guild = guild;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AudioM getInstance(Guild guild) {
|
public static GuildAudioWrapper getInstance(Guild guild) {
|
||||||
if (!INSTANCES.containsKey(guild)) {
|
if (!INSTANCES.containsKey(guild)) {
|
||||||
INSTANCES.put(guild, new AudioM(guild));
|
INSTANCES.put(guild, new GuildAudioWrapper(guild));
|
||||||
}
|
}
|
||||||
|
|
||||||
return INSTANCES.get(guild);
|
return INSTANCES.get(guild);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,10 +71,9 @@ public class AudioM {
|
|||||||
* @param onHead True for adding audio track on top of playlist
|
* @param onHead True for adding audio track on top of playlist
|
||||||
*/
|
*/
|
||||||
public void loadAndPlay(SlashCommandEvent event, VoiceChannel voiceChannel, final String trackUrl, int playlistLimit, boolean onHead) {
|
public void loadAndPlay(SlashCommandEvent event, VoiceChannel voiceChannel, final String trackUrl, int playlistLimit, boolean onHead) {
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
GuildAudioManager guidAudioManager = getGuidAudioManager();
|
||||||
playedChanel = voiceChannel;
|
|
||||||
|
|
||||||
playerManager.loadItemOrdered(musicManager, trackUrl, new AudioLoadResultHandler() {
|
audioPlayerManager.loadItemOrdered(guidAudioManager, trackUrl, new AudioLoadResultHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void trackLoaded(AudioTrack track) {
|
public void trackLoaded(AudioTrack track) {
|
||||||
logger.info("[" + guild + "] Single Track detected!");
|
logger.info("[" + guild + "] Single Track detected!");
|
||||||
@ -96,7 +83,7 @@ public class AudioM {
|
|||||||
.build();
|
.build();
|
||||||
clearLastButton();
|
clearLastButton();
|
||||||
lastMessageWithButton = event.getHook().sendMessage(message).addActionRow(getActionButton()).complete();
|
lastMessageWithButton = event.getHook().sendMessage(message).addActionRow(getActionButton()).complete();
|
||||||
play(guild, voiceChannel, musicManager, uat, onHead);
|
play(guild, voiceChannel, guidAudioManager, uat, onHead);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -130,12 +117,13 @@ public class AudioM {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void loadAndPlayAuto(String trackUrl) {
|
public void loadAndPlayAuto(String trackUrl) {
|
||||||
playerManager.loadItemOrdered(musicManager, trackUrl, new AudioLoadResultHandler() {
|
VoiceChannel playedChanel = guild.getAudioManager().getConnectedChannel();
|
||||||
|
audioPlayerManager.loadItemOrdered(guildAudioManager, trackUrl, new AudioLoadResultHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void trackLoaded(AudioTrack track) {
|
public void trackLoaded(AudioTrack track) {
|
||||||
logger.info("[" + guild + "] Auto add " + track.getInfo().title + " to playlist.");
|
logger.info("[" + guild + "] Auto add " + track.getInfo().title + " to playlist.");
|
||||||
UserAudioTrack userAudioTrack = new UserAudioTrack(MainBot.jda.getSelfUser(), track);
|
UserAudioTrack userAudioTrack = new UserAudioTrack(MainBot.jda.getSelfUser(), track);
|
||||||
play(guild, playedChanel, musicManager, userAudioTrack, true);
|
play(guild, playedChanel, guildAudioManager, userAudioTrack, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -143,7 +131,7 @@ public class AudioM {
|
|||||||
AudioTrack track = playlist.getTracks().get(0);
|
AudioTrack track = playlist.getTracks().get(0);
|
||||||
logger.info("[" + guild + "] Auto add " + track.getInfo().title + " to playlist.");
|
logger.info("[" + guild + "] Auto add " + track.getInfo().title + " to playlist.");
|
||||||
UserAudioTrack userAudioTrack = new UserAudioTrack(MainBot.jda.getSelfUser(), track);
|
UserAudioTrack userAudioTrack = new UserAudioTrack(MainBot.jda.getSelfUser(), track);
|
||||||
play(guild, playedChanel, musicManager, userAudioTrack, true);
|
play(guild, playedChanel, guildAudioManager, userAudioTrack, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -169,30 +157,24 @@ public class AudioM {
|
|||||||
* @param onHead True for adding audio track on top of playlist
|
* @param onHead True for adding audio track on top of playlist
|
||||||
*/
|
*/
|
||||||
public void playListLoader(AudioPlaylist playlist, int playlistLimit, User user, boolean onHead) {
|
public void playListLoader(AudioPlaylist playlist, int playlistLimit, User user, boolean onHead) {
|
||||||
int i = 0;
|
|
||||||
|
VoiceChannel playedChanel = guild.getAudioManager().getConnectedChannel();
|
||||||
List<AudioTrack> tracks = playlist.getTracks();
|
List<AudioTrack> tracks = playlist.getTracks();
|
||||||
if (onHead)
|
if (onHead)
|
||||||
Collections.reverse(tracks);
|
Collections.reverse(tracks);
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
for (AudioTrack track : playlist.getTracks()) {
|
for (AudioTrack track : playlist.getTracks()) {
|
||||||
UserAudioTrack uat = new UserAudioTrack(user, track);
|
UserAudioTrack uat = new UserAudioTrack(user, track);
|
||||||
play(guild, playedChanel, musicManager, uat, onHead);
|
play(guild, playedChanel, guildAudioManager, uat, onHead);
|
||||||
i++;
|
if ((playlistLimit != -1 && i >= playlistLimit) || i > listExtremLimit)
|
||||||
if ((i >= playlistLimit && i != -1) || i > listExtremLimit)
|
|
||||||
break;
|
break;
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public GuildMusicManager getGuildAudioPlayer() {
|
|
||||||
if (musicManager == null) {
|
|
||||||
musicManager = new GuildMusicManager(playerManager, guild);
|
|
||||||
}
|
|
||||||
|
|
||||||
guild.getAudioManager().setSendingHandler(musicManager.getSendHandler());
|
|
||||||
|
|
||||||
return musicManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add single track to playlist, auto-connect if not connected to vocal chanel
|
* Add single track to playlist, auto-connect if not connected to vocal chanel
|
||||||
@ -203,7 +185,7 @@ public class AudioM {
|
|||||||
* @param track Track to add to playlist
|
* @param track Track to add to playlist
|
||||||
* @param onHead True for adding audio track on top of playlist
|
* @param onHead True for adding audio track on top of playlist
|
||||||
*/
|
*/
|
||||||
public void play(Guild guild, VoiceChannel channel, GuildMusicManager musicManager, UserAudioTrack track, boolean onHead) {
|
public void play(Guild guild, VoiceChannel channel, GuildAudioManager musicManager, UserAudioTrack track, boolean onHead) {
|
||||||
if (!guild.getAudioManager().isConnected())
|
if (!guild.getAudioManager().isConnected())
|
||||||
guild.getAudioManager().openAudioConnection(channel);
|
guild.getAudioManager().openAudioConnection(channel);
|
||||||
if (!onHead)
|
if (!onHead)
|
||||||
@ -218,7 +200,7 @@ public class AudioM {
|
|||||||
* @param event
|
* @param event
|
||||||
*/
|
*/
|
||||||
public void skipTrack(GenericInteractionCreateEvent event) {
|
public void skipTrack(GenericInteractionCreateEvent event) {
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
GuildAudioManager musicManager = getGuidAudioManager();
|
||||||
musicManager.scheduler.nextTrack();
|
musicManager.scheduler.nextTrack();
|
||||||
Message message = new MessageBuilder().setEmbeds(
|
Message message = new MessageBuilder().setEmbeds(
|
||||||
EmbedMessageUtils.buildStandar(
|
EmbedMessageUtils.buildStandar(
|
||||||
@ -236,7 +218,7 @@ public class AudioM {
|
|||||||
* @param event
|
* @param event
|
||||||
*/
|
*/
|
||||||
public void pause(GenericInteractionCreateEvent event) {
|
public void pause(GenericInteractionCreateEvent event) {
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
GuildAudioManager musicManager = getGuidAudioManager();
|
||||||
musicManager.scheduler.pause();
|
musicManager.scheduler.pause();
|
||||||
Message message = new MessageBuilder().setEmbeds(
|
Message message = new MessageBuilder().setEmbeds(
|
||||||
EmbedMessageUtils.buildStandar(
|
EmbedMessageUtils.buildStandar(
|
||||||
@ -256,16 +238,16 @@ public class AudioM {
|
|||||||
* @param event
|
* @param event
|
||||||
*/
|
*/
|
||||||
public void resume(GenericInteractionCreateEvent event) {
|
public void resume(GenericInteractionCreateEvent event) {
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
GuildAudioManager musicManager = getGuidAudioManager();
|
||||||
Message message;
|
Message message;
|
||||||
if(musicManager.player.getPlayingTrack() == null){
|
if (musicManager.player.getPlayingTrack() == null) {
|
||||||
message = new MessageBuilder().setEmbeds(
|
message = new MessageBuilder().setEmbeds(
|
||||||
EmbedMessageUtils.buildStandar(
|
EmbedMessageUtils.buildStandar(
|
||||||
new EmbedBuilder()
|
new EmbedBuilder()
|
||||||
.setTitle(":warning: Nothing to play, playlist is empty !")
|
.setTitle(":warning: Nothing to play, playlist is empty !")
|
||||||
.setColor(Color.green)
|
.setColor(Color.green)
|
||||||
)).build();
|
)).build();
|
||||||
}else{
|
} else {
|
||||||
musicManager.scheduler.resume();
|
musicManager.scheduler.resume();
|
||||||
message = new MessageBuilder().setEmbeds(
|
message = new MessageBuilder().setEmbeds(
|
||||||
EmbedMessageUtils.buildStandar(
|
EmbedMessageUtils.buildStandar(
|
||||||
@ -284,7 +266,7 @@ public class AudioM {
|
|||||||
* @param event
|
* @param event
|
||||||
*/
|
*/
|
||||||
public void info(GenericInteractionCreateEvent event) {
|
public void info(GenericInteractionCreateEvent event) {
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
GuildAudioManager musicManager = getGuidAudioManager();
|
||||||
AudioTrackInfo info = musicManager.scheduler.getInfo();
|
AudioTrackInfo info = musicManager.scheduler.getInfo();
|
||||||
UserAudioTrack userAudioTrack = musicManager.scheduler.getCurrentPlayingTrack();
|
UserAudioTrack userAudioTrack = musicManager.scheduler.getCurrentPlayingTrack();
|
||||||
Message message = new MessageBuilder().setEmbeds(EmbedMessageUtils.getMusicInfo(info, userAudioTrack)).build();
|
Message message = new MessageBuilder().setEmbeds(EmbedMessageUtils.getMusicInfo(info, userAudioTrack)).build();
|
||||||
@ -293,7 +275,7 @@ public class AudioM {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void flush(GenericInteractionCreateEvent event) {
|
public void flush(GenericInteractionCreateEvent event) {
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
GuildAudioManager musicManager = getGuidAudioManager();
|
||||||
musicManager.scheduler.flush();
|
musicManager.scheduler.flush();
|
||||||
Message message = new MessageBuilder().setEmbeds(
|
Message message = new MessageBuilder().setEmbeds(
|
||||||
EmbedMessageUtils.buildStandar(
|
EmbedMessageUtils.buildStandar(
|
||||||
@ -311,7 +293,7 @@ public class AudioM {
|
|||||||
* @param event
|
* @param event
|
||||||
*/
|
*/
|
||||||
public void list(GenericInteractionCreateEvent event) {
|
public void list(GenericInteractionCreateEvent event) {
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
GuildAudioManager musicManager = getGuidAudioManager();
|
||||||
List<UserAudioTrackData> list = musicManager.scheduler.getList();
|
List<UserAudioTrackData> list = musicManager.scheduler.getList();
|
||||||
|
|
||||||
if (list.size() == 0) {
|
if (list.size() == 0) {
|
||||||
@ -361,8 +343,8 @@ public class AudioM {
|
|||||||
* @param onHead True for adding audio track on top of playlist
|
* @param onHead True for adding audio track on top of playlist
|
||||||
*/
|
*/
|
||||||
public void add(SlashCommandEvent event, String url, int playListLimit, boolean onHead) {
|
public void add(SlashCommandEvent event, String url, int playListLimit, boolean onHead) {
|
||||||
if (playedChanel != null) {
|
if (guild.getAudioManager().isConnected()) {
|
||||||
loadAndPlay(event, playedChanel, url, playListLimit, onHead);
|
loadAndPlay(event, guild.getAudioManager().getConnectedChannel(), url, playListLimit, onHead);
|
||||||
} else {
|
} else {
|
||||||
Message message = new MessageBuilder().setEmbeds(EmbedMessageUtils.getMusicError("Not connected to vocal chanel !")).build();
|
Message message = new MessageBuilder().setEmbeds(EmbedMessageUtils.getMusicError("Not connected to vocal chanel !")).build();
|
||||||
event.getHook().setEphemeral(true).sendMessage(message).queue();
|
event.getHook().setEphemeral(true).sendMessage(message).queue();
|
||||||
@ -375,8 +357,8 @@ public class AudioM {
|
|||||||
* @param event
|
* @param event
|
||||||
*/
|
*/
|
||||||
public void stop(GenericInteractionCreateEvent event) {
|
public void stop(GenericInteractionCreateEvent event) {
|
||||||
musicManager.scheduler.stop();
|
guildAudioManager.scheduler.stop();
|
||||||
musicManager.scheduler.flush();
|
guildAudioManager.scheduler.flush();
|
||||||
|
|
||||||
if (event != null) {
|
if (event != null) {
|
||||||
Message message = new MessageBuilder().setEmbeds(
|
Message message = new MessageBuilder().setEmbeds(
|
||||||
@ -390,7 +372,15 @@ public class AudioM {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disconnect(GenericInteractionCreateEvent event){
|
public void stop() {
|
||||||
|
|
||||||
|
GuildAudioManager musicManager = getGuidAudioManager();
|
||||||
|
musicManager.scheduler.stop();
|
||||||
|
musicManager.scheduler.flush();
|
||||||
|
clearLastButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnect(GenericInteractionCreateEvent event) {
|
||||||
disconnect();
|
disconnect();
|
||||||
Message message = new MessageBuilder().setEmbeds(
|
Message message = new MessageBuilder().setEmbeds(
|
||||||
EmbedMessageUtils.buildStandar(
|
EmbedMessageUtils.buildStandar(
|
||||||
@ -402,75 +392,53 @@ public class AudioM {
|
|||||||
event.getHook().sendMessage(message).queue();
|
event.getHook().sendMessage(message).queue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disconnect(){
|
public void disconnect() {
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
GuildAudioManager musicManager = getGuidAudioManager();
|
||||||
musicManager.scheduler.stop();
|
musicManager.scheduler.stop();
|
||||||
musicManager.scheduler.flush();
|
musicManager.scheduler.flush();
|
||||||
playedChanel = null;
|
|
||||||
guild.getAudioManager().closeAudioConnection();
|
guild.getAudioManager().closeAudioConnection();
|
||||||
clearLastButton();
|
clearLastButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Stop current playing track and flush playlist (no confirmation message)
|
|
||||||
*/
|
|
||||||
public void stop() {
|
|
||||||
|
|
||||||
GuildMusicManager musicManager = getGuildAudioPlayer();
|
|
||||||
musicManager.scheduler.stop();
|
|
||||||
musicManager.scheduler.flush();
|
|
||||||
clearLastButton();
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuildMusicManager getGuildMusicManager() {
|
|
||||||
if (musicManager == null)
|
|
||||||
musicManager = getGuildAudioPlayer();
|
|
||||||
return musicManager;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public Guild getGuild() {
|
public Guild getGuild() {
|
||||||
return guild;
|
return guild;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AudioPlayerManager getPlayerManager() {
|
public AudioPlayerManager getAudioPlayerManager() {
|
||||||
return playerManager;
|
return audioPlayerManager;
|
||||||
|
}
|
||||||
|
public GuildAudioManager getGuidAudioManager() {
|
||||||
|
return guildAudioManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VoiceChannel getPlayedChanel() {
|
|
||||||
return playedChanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPlayedChanel(VoiceChannel playedChanel) {
|
|
||||||
this.playedChanel = playedChanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clearLastButton() {
|
public void clearLastButton() {
|
||||||
if (lastMessageWithButton != null){
|
if (lastMessageWithButton != null) {
|
||||||
this.lastMessageWithButton.editMessageComponents(new ArrayList<>()).queue();
|
this.lastMessageWithButton.editMessageComponents(new ArrayList<>()).queue();
|
||||||
this.lastMessageWithButton = null;
|
this.lastMessageWithButton = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public void updateLastButton(){
|
|
||||||
|
public void updateLastButton() {
|
||||||
if (lastMessageWithButton != null)
|
if (lastMessageWithButton != null)
|
||||||
lastMessageWithButton = lastMessageWithButton.editMessageComponents(ActionRow.of(getActionButton())).complete();
|
lastMessageWithButton = lastMessageWithButton.editMessageComponents(ActionRow.of(getActionButton())).complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<Button> getActionButton(){
|
private List<Button> getActionButton() {
|
||||||
ArrayList<Button> buttonArrayList = new ArrayList<>();
|
ArrayList<Button> buttonArrayList = new ArrayList<>();
|
||||||
if(musicManager.player.getPlayingTrack() == null){
|
if (guildAudioManager.player.getPlayingTrack() == null) {
|
||||||
buttonArrayList.add(Button.success("play", Emoji.fromUnicode("▶️")).withDisabled(true));
|
buttonArrayList.add(Button.success("play", Emoji.fromUnicode("▶️")).withDisabled(true));
|
||||||
buttonArrayList.add(Button.primary("next", Emoji.fromUnicode("⏭️")).withDisabled(true));
|
buttonArrayList.add(Button.primary("next", Emoji.fromUnicode("⏭️")).withDisabled(true));
|
||||||
buttonArrayList.add(Button.primary("stop", Emoji.fromUnicode("⏹️")).withDisabled(true));
|
buttonArrayList.add(Button.primary("stop", Emoji.fromUnicode("⏹️")).withDisabled(true));
|
||||||
buttonArrayList.add(Button.danger("disconnect", Emoji.fromUnicode("⏏️")));
|
buttonArrayList.add(Button.danger("disconnect", Emoji.fromUnicode("⏏️")));
|
||||||
return buttonArrayList;
|
return buttonArrayList;
|
||||||
}
|
}
|
||||||
if(musicManager.player.isPaused()){
|
if (guildAudioManager.player.isPaused()) {
|
||||||
buttonArrayList.add(Button.success("play", Emoji.fromUnicode("▶️")));
|
buttonArrayList.add(Button.success("play", Emoji.fromUnicode("▶️")));
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
buttonArrayList.add(Button.success("pause", Emoji.fromUnicode("⏸️")));
|
buttonArrayList.add(Button.success("pause", Emoji.fromUnicode("⏸️")));
|
||||||
}
|
}
|
||||||
buttonArrayList.add(Button.primary("next", Emoji.fromUnicode("⏭️")));
|
buttonArrayList.add(Button.primary("next", Emoji.fromUnicode("⏭️")));
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio;
|
package net.Broken.Audio;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio;
|
package net.Broken.Audio;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Null music manager
|
* Null music manager
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio;
|
package net.Broken.Audio;
|
||||||
|
|
||||||
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
|
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||||
@ -9,9 +9,9 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
|
|||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
||||||
import net.Broken.MainBot;
|
import net.Broken.MainBot;
|
||||||
import net.Broken.RestApi.Data.UserAudioTrackData;
|
import net.Broken.RestApi.Data.UserAudioTrackData;
|
||||||
import net.Broken.audio.Youtube.RelatedIdNotFound;
|
import net.Broken.Audio.Youtube.RelatedIdNotFound;
|
||||||
import net.Broken.audio.Youtube.YoutubeSearchRework;
|
import net.Broken.Audio.Youtube.YoutubeSearchRework;
|
||||||
import net.Broken.audio.Youtube.YoutubeTools;
|
import net.Broken.Audio.Youtube.YoutubeTools;
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
@ -178,7 +178,7 @@ public class TrackScheduler extends AudioEventAdapter {
|
|||||||
if (endReason.mayStartNext) {
|
if (endReason.mayStartNext) {
|
||||||
if(queue.isEmpty()){
|
if(queue.isEmpty()){
|
||||||
logger.debug("[" + guild.getName() + "] End of track, Playlist empty.");
|
logger.debug("[" + guild.getName() + "] End of track, Playlist empty.");
|
||||||
AudioM.getInstance(guild).updateLastButton();
|
GuildAudioWrapper.getInstance(guild).updateLastButton();
|
||||||
}else{
|
}else{
|
||||||
logger.debug("[" + guild.getName() + "] End of track, start next.");
|
logger.debug("[" + guild.getName() + "] End of track, start next.");
|
||||||
nextTrack();
|
nextTrack();
|
||||||
@ -191,49 +191,49 @@ public class TrackScheduler extends AudioEventAdapter {
|
|||||||
@Override
|
@Override
|
||||||
public void onTrackStart(AudioPlayer player, AudioTrack track) {
|
public void onTrackStart(AudioPlayer player, AudioTrack track) {
|
||||||
super.onTrackStart(player, track);
|
super.onTrackStart(player, track);
|
||||||
AudioM.getInstance(guild).updateLastButton();
|
GuildAudioWrapper.getInstance(guild).updateLastButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerPause(AudioPlayer player) {
|
public void onPlayerPause(AudioPlayer player) {
|
||||||
super.onPlayerPause(player);
|
super.onPlayerPause(player);
|
||||||
AudioM.getInstance(guild).updateLastButton();
|
GuildAudioWrapper.getInstance(guild).updateLastButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerResume(AudioPlayer player) {
|
public void onPlayerResume(AudioPlayer player) {
|
||||||
super.onPlayerResume(player);
|
super.onPlayerResume(player);
|
||||||
AudioM.getInstance(guild).updateLastButton();
|
GuildAudioWrapper.getInstance(guild).updateLastButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception) {
|
public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception) {
|
||||||
super.onTrackException(player, track, exception);
|
super.onTrackException(player, track, exception);
|
||||||
AudioM.getInstance(guild).updateLastButton();
|
GuildAudioWrapper.getInstance(guild).updateLastButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTrackStuck(AudioPlayer player, AudioTrack track, long thresholdMs) {
|
public void onTrackStuck(AudioPlayer player, AudioTrack track, long thresholdMs) {
|
||||||
super.onTrackStuck(player, track, thresholdMs);
|
super.onTrackStuck(player, track, thresholdMs);
|
||||||
AudioM.getInstance(guild).updateLastButton();
|
GuildAudioWrapper.getInstance(guild).updateLastButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void needAutoPlay() {
|
private void needAutoPlay() {
|
||||||
if ((queue.size() < 1) && autoFlow && currentPlayingTrack != null) {
|
if ((queue.size() < 1) && autoFlow && currentPlayingTrack != null) {
|
||||||
logger.debug("[" + guild.getName() + "] Auto add needed!");
|
logger.debug("[" + guild.getName() + "] Auto add needed!");
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
GuildAudioWrapper guildAudioWrapper = GuildAudioWrapper.getInstance(guild);
|
||||||
YoutubeSearchRework youtubeSearchRework = YoutubeSearchRework.getInstance();
|
YoutubeSearchRework youtubeSearchRework = YoutubeSearchRework.getInstance();
|
||||||
try {
|
try {
|
||||||
String id = youtubeSearchRework.getRelatedVideo(currentPlayingTrack.getAudioTrack().getInfo().identifier);
|
String id = youtubeSearchRework.getRelatedVideo(currentPlayingTrack.getAudioTrack().getInfo().identifier);
|
||||||
logger.debug("[" + guild.getName() + "] Related id: " + id);
|
logger.debug("[" + guild.getName() + "] Related id: " + id);
|
||||||
audioM.loadAndPlayAuto(id);
|
guildAudioWrapper.loadAndPlayAuto(id);
|
||||||
} catch (IOException | RelatedIdNotFound ex) {
|
} catch (IOException | RelatedIdNotFound ex) {
|
||||||
logger.debug("[" + guild.getName() + "] Can't find related id, try API...");
|
logger.debug("[" + guild.getName() + "] Can't find related id, try API...");
|
||||||
YoutubeTools youtubeTools = YoutubeTools.getInstance();
|
YoutubeTools youtubeTools = YoutubeTools.getInstance();
|
||||||
try {
|
try {
|
||||||
String id = youtubeTools.getRelatedVideo(currentPlayingTrack.getAudioTrack().getInfo().identifier, history);
|
String id = youtubeTools.getRelatedVideo(currentPlayingTrack.getAudioTrack().getInfo().identifier, history);
|
||||||
logger.debug("[" + guild.getName() + "] Related id: " + id);
|
logger.debug("[" + guild.getName() + "] Related id: " + id);
|
||||||
audioM.loadAndPlayAuto(id);
|
guildAudioWrapper.loadAndPlayAuto(id);
|
||||||
|
|
||||||
} catch (GoogleJsonResponseException e) {
|
} catch (GoogleJsonResponseException e) {
|
||||||
logger.error("[" + guild.getName() + "] There was a service error: " + e.getDetails().getCode() + " : " + e.getDetails().getMessage());
|
logger.error("[" + guild.getName() + "] There was a service error: " + e.getDetails().getCode() + " : " + e.getDetails().getMessage());
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio;
|
package net.Broken.Audio;
|
||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||||
import net.dv8tion.jda.api.entities.User;
|
import net.dv8tion.jda.api.entities.User;
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio.Youtube;
|
package net.Broken.Audio.Youtube;
|
||||||
|
|
||||||
public class RelatedIdNotFound extends Exception {
|
public class RelatedIdNotFound extends Exception {
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio.Youtube;
|
package net.Broken.Audio.Youtube;
|
||||||
|
|
||||||
public class SearchResult {
|
public class SearchResult {
|
||||||
public String id;
|
public String id;
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio.Youtube;
|
package net.Broken.Audio.Youtube;
|
||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioTrack;
|
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioTrack;
|
||||||
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeSearchProvider;
|
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeSearchProvider;
|
@ -1,4 +1,4 @@
|
|||||||
package net.Broken.audio.Youtube;
|
package net.Broken.Audio.Youtube;
|
||||||
|
|
||||||
import com.google.api.client.http.javanet.NetHttpTransport;
|
import com.google.api.client.http.javanet.NetHttpTransport;
|
||||||
import com.google.api.client.json.gson.GsonFactory;
|
import com.google.api.client.json.gson.GsonFactory;
|
||||||
@ -68,7 +68,7 @@ public class YoutubeTools {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public ArrayList<net.Broken.audio.Youtube.SearchResult> search(String query, long max, boolean playlist) throws IOException {
|
public ArrayList<net.Broken.Audio.Youtube.SearchResult> search(String query, long max, boolean playlist) throws IOException {
|
||||||
YouTube youTube = getYoutubeService();
|
YouTube youTube = getYoutubeService();
|
||||||
YouTube.Search.List searchList = youTube.search().list(Collections.singletonList("snippet"));
|
YouTube.Search.List searchList = youTube.search().list(Collections.singletonList("snippet"));
|
||||||
if (playlist)
|
if (playlist)
|
||||||
@ -98,10 +98,10 @@ public class YoutubeTools {
|
|||||||
for (Playlist item : playlistResponse.getItems()) {
|
for (Playlist item : playlistResponse.getItems()) {
|
||||||
playlistHashMap.put(item.getId(), item);
|
playlistHashMap.put(item.getId(), item);
|
||||||
}
|
}
|
||||||
ArrayList<net.Broken.audio.Youtube.SearchResult> finalResult = new ArrayList<>();
|
ArrayList<net.Broken.Audio.Youtube.SearchResult> finalResult = new ArrayList<>();
|
||||||
for (SearchResult item : response.getItems()) {
|
for (SearchResult item : response.getItems()) {
|
||||||
logger.trace(item.getSnippet().getTitle());
|
logger.trace(item.getSnippet().getTitle());
|
||||||
finalResult.add(new net.Broken.audio.Youtube.SearchResult(item, playlistHashMap.get(item.getId().getPlaylistId()).getContentDetails().getItemCount().toString() + " Video(s)"));
|
finalResult.add(new net.Broken.Audio.Youtube.SearchResult(item, playlistHashMap.get(item.getId().getPlaylistId()).getContentDetails().getItemCount().toString() + " Video(s)"));
|
||||||
|
|
||||||
}
|
}
|
||||||
return finalResult;
|
return finalResult;
|
||||||
@ -117,10 +117,10 @@ public class YoutubeTools {
|
|||||||
for (Video item : videoResponse.getItems()) {
|
for (Video item : videoResponse.getItems()) {
|
||||||
videoHashMap.put(item.getId(), item);
|
videoHashMap.put(item.getId(), item);
|
||||||
}
|
}
|
||||||
ArrayList<net.Broken.audio.Youtube.SearchResult> finalResult = new ArrayList<>();
|
ArrayList<net.Broken.Audio.Youtube.SearchResult> finalResult = new ArrayList<>();
|
||||||
for (SearchResult item : response.getItems()) {
|
for (SearchResult item : response.getItems()) {
|
||||||
logger.trace(item.getSnippet().getTitle());
|
logger.trace(item.getSnippet().getTitle());
|
||||||
finalResult.add(new net.Broken.audio.Youtube.SearchResult(item, videoHashMap.get(item.getId().getVideoId()).getContentDetails().getDuration()));
|
finalResult.add(new net.Broken.Audio.Youtube.SearchResult(item, videoHashMap.get(item.getId().getVideoId()).getContentDetails().getDuration()));
|
||||||
}
|
}
|
||||||
return finalResult;
|
return finalResult;
|
||||||
}
|
}
|
@ -5,7 +5,7 @@ import net.Broken.DB.Repository.GuildPreferenceRepository;
|
|||||||
import net.Broken.Tools.AutoVoiceChannel;
|
import net.Broken.Tools.AutoVoiceChannel;
|
||||||
import net.Broken.Tools.EmbedMessageUtils;
|
import net.Broken.Tools.EmbedMessageUtils;
|
||||||
import net.Broken.Tools.UserManager.Stats.UserStatsUtils;
|
import net.Broken.Tools.UserManager.Stats.UserStatsUtils;
|
||||||
import net.Broken.audio.AudioM;
|
import net.Broken.Audio.GuildAudioWrapper;
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
import net.dv8tion.jda.api.entities.*;
|
import net.dv8tion.jda.api.entities.*;
|
||||||
@ -119,10 +119,10 @@ public class BotListener extends ListenerAdapter {
|
|||||||
|
|
||||||
if (event.getGuild().getAudioManager().getConnectedChannel().getMembers().size() == 1) {
|
if (event.getGuild().getAudioManager().getConnectedChannel().getMembers().size() == 1) {
|
||||||
logger.debug("I'm alone, close audio connection.");
|
logger.debug("I'm alone, close audio connection.");
|
||||||
AudioM.getInstance(event.getGuild()).stop();
|
GuildAudioWrapper.getInstance(event.getGuild()).stop();
|
||||||
}
|
}
|
||||||
} else if (event.getMember().getUser() == MainBot.jda.getSelfUser()) {
|
} else if (event.getMember().getUser() == MainBot.jda.getSelfUser()) {
|
||||||
AudioM.getInstance(event.getGuild()).clearLastButton();
|
GuildAudioWrapper.getInstance(event.getGuild()).clearLastButton();
|
||||||
}
|
}
|
||||||
AutoVoiceChannel autoVoiceChannel = AutoVoiceChannel.getInstance(event.getGuild());
|
AutoVoiceChannel autoVoiceChannel = AutoVoiceChannel.getInstance(event.getGuild());
|
||||||
autoVoiceChannel.leave(event.getChannelLeft());
|
autoVoiceChannel.leave(event.getChannelLeft());
|
||||||
@ -147,13 +147,13 @@ public class BotListener extends ListenerAdapter {
|
|||||||
public void onButtonClick(@NotNull ButtonClickEvent event) {
|
public void onButtonClick(@NotNull ButtonClickEvent event) {
|
||||||
super.onButtonClick(event);
|
super.onButtonClick(event);
|
||||||
event.deferReply().queue();
|
event.deferReply().queue();
|
||||||
AudioM audioM = AudioM.getInstance(event.getGuild());
|
GuildAudioWrapper guildAudioWrapper = GuildAudioWrapper.getInstance(event.getGuild());
|
||||||
switch (event.getComponentId()) {
|
switch (event.getComponentId()) {
|
||||||
case "pause" -> audioM.pause(event);
|
case "pause" -> guildAudioWrapper.pause(event);
|
||||||
case "play" -> audioM.resume(event);
|
case "play" -> guildAudioWrapper.resume(event);
|
||||||
case "next" -> audioM.skipTrack(event);
|
case "next" -> guildAudioWrapper.skipTrack(event);
|
||||||
case "stop" -> audioM.stop(event);
|
case "stop" -> guildAudioWrapper.stop(event);
|
||||||
case "disconnect" -> audioM.disconnect(event);
|
case "disconnect" -> guildAudioWrapper.disconnect(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.WebLoadUtils;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add track RestApi
|
|
||||||
*/
|
|
||||||
public class Add implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
return new WebLoadUtils(data, user, guild, true).getResponse();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.Broken.audio.TrackScheduler;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
public class AutoFlowOff implements CommandInterface {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
|
||||||
TrackScheduler scheduler = audioM.getGuildMusicManager().scheduler;
|
|
||||||
scheduler.setAutoFlow(false);
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "ok"), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.Broken.audio.TrackScheduler;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
public class AutoFlowOn implements CommandInterface {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
|
||||||
TrackScheduler scheduler = audioM.getGuildMusicManager().scheduler;
|
|
||||||
scheduler.setAutoFlow(true);
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "ok"), HttpStatus.OK);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import net.dv8tion.jda.api.entities.VoiceChannel;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connect to vocal channel RestApi command
|
|
||||||
*/
|
|
||||||
public class Connect implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
|
||||||
if (data.chanelId == null)
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Missing chanelId"), HttpStatus.BAD_REQUEST);
|
|
||||||
VoiceChannel voiceChannel = null;
|
|
||||||
try {
|
|
||||||
voiceChannel = guild.getVoiceChannelById(data.chanelId);
|
|
||||||
} catch (NumberFormatException ignored) {
|
|
||||||
}
|
|
||||||
|
|
||||||
if (voiceChannel == null) {
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Channel Not found"), HttpStatus.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
audioM.getGuildAudioPlayer();
|
|
||||||
guild.getAudioManager().openAudioConnection(guild.getVoiceChannelById(data.chanelId));
|
|
||||||
audioM.setPlayedChanel(voiceChannel);
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Accepted"), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete track RestApi command
|
|
||||||
*/
|
|
||||||
public class Dell implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
if (data.url != null) {
|
|
||||||
if (AudioM.getInstance(guild).getGuildMusicManager().scheduler.remove(data.url)) {
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Accepted"), HttpStatus.OK);
|
|
||||||
} else
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "URL not found"), HttpStatus.NOT_FOUND);
|
|
||||||
}
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Missing URL"), HttpStatus.NOT_ACCEPTABLE);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disconnect from vocal chanel RestApi Command
|
|
||||||
*/
|
|
||||||
public class Disconnect implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM.getInstance(guild).stop();
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Ok"), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flush playlist RestApi Command
|
|
||||||
*/
|
|
||||||
public class Flush implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM.getInstance(guild).getGuildMusicManager().scheduler.flush();
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Accepted"), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Next Track RestApi command
|
|
||||||
*/
|
|
||||||
public class Next implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM.getInstance(guild).getGuildMusicManager().scheduler.nextTrack();
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Accepted"), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pause track RestApi command
|
|
||||||
*/
|
|
||||||
public class Pause implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM.getInstance(guild).getGuildMusicManager().scheduler.pause();
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Accepted"), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resume (play button) RestApi command
|
|
||||||
*/
|
|
||||||
public class Play implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM.getInstance(guild).getGuildMusicManager().scheduler.resume();
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Accepted"), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package net.Broken.RestApi.Commands;
|
|
||||||
|
|
||||||
import net.Broken.RestApi.CommandInterface;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stop RestApi Command
|
|
||||||
*/
|
|
||||||
public class Stop implements CommandInterface {
|
|
||||||
@Override
|
|
||||||
public ResponseEntity<CommandResponseData> action(CommandPostData data, User user, Guild guild) {
|
|
||||||
AudioM.getInstance(guild).stop(null);
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Accepted"), HttpStatus.OK);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +1,7 @@
|
|||||||
package net.Broken.RestApi.Data;
|
package net.Broken.RestApi.Data;
|
||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
||||||
import net.Broken.audio.UserAudioTrack;
|
import net.Broken.Audio.UserAudioTrack;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Data for JSON Parsing
|
* Data for JSON Parsing
|
||||||
|
@ -1,239 +0,0 @@
|
|||||||
package net.Broken.RestApi;
|
|
||||||
|
|
||||||
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
|
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
|
||||||
import net.Broken.DB.Entity.UserEntity;
|
|
||||||
import net.Broken.DB.Repository.UserRepository;
|
|
||||||
import net.Broken.MainBot;
|
|
||||||
import net.Broken.RestApi.Data.*;
|
|
||||||
import net.Broken.Tools.CacheTools;
|
|
||||||
import net.Broken.Tools.UserManager.Exceptions.UnknownTokenException;
|
|
||||||
import net.Broken.Tools.UserManager.Stats.UserStatsUtils;
|
|
||||||
import net.Broken.Tools.UserManager.UserUtils;
|
|
||||||
import net.Broken.audio.AudioM;
|
|
||||||
import net.Broken.audio.GetVoiceChanels;
|
|
||||||
import net.Broken.audio.Youtube.SearchResult;
|
|
||||||
import net.Broken.audio.Youtube.YoutubeSearchRework;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
import net.dv8tion.jda.api.entities.VoiceChannel;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rest Api Controller for /api/music
|
|
||||||
*/
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/api/music/")
|
|
||||||
public class MusicWebAPIController {
|
|
||||||
private final
|
|
||||||
UserRepository userRepository;
|
|
||||||
Logger logger = LogManager.getLogger();
|
|
||||||
UserUtils userUtils = UserUtils.getInstance();
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public MusicWebAPIController(UserRepository userRepository) {
|
|
||||||
this.userRepository = userRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@RequestMapping("/currentMusicInfo")
|
|
||||||
public ResponseEntity<CurrentMusicData> getCurrentM(@RequestParam(value = "guild") String guildId) { //TODO security issue ???!!!
|
|
||||||
Guild guild = MainBot.jda.getGuildById(guildId);
|
|
||||||
if (guild == null) {
|
|
||||||
logger.warn("Request whit no guild!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
|
||||||
} else {
|
|
||||||
logger.trace("currentMusicInfo for " + guild.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (guild.getAudioManager().isConnected()) {
|
|
||||||
AudioPlayer player = AudioM.getInstance(guild).getGuildMusicManager().player;
|
|
||||||
AudioTrack currentTrack = player.getPlayingTrack();
|
|
||||||
if (currentTrack == null) {
|
|
||||||
return new ResponseEntity<>(new CurrentMusicData(null, 0, "STOP", false, AudioM.getInstance(guild).getGuildMusicManager().scheduler.isAutoFlow()), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
UserAudioTrackData uat = new UserAudioTrackData(AudioM.getInstance(guild).getGuildMusicManager().scheduler.getCurrentPlayingTrack());
|
|
||||||
return new ResponseEntity<>(new CurrentMusicData(uat, currentTrack.getPosition(), currentTrack.getState().toString(), player.isPaused(), AudioM.getInstance(guild).getGuildMusicManager().scheduler.isAutoFlow()), HttpStatus.OK);
|
|
||||||
} else {
|
|
||||||
return new ResponseEntity<>(new CurrentMusicData(null, 0, "DISCONNECTED", false, false), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/getPlaylist")
|
|
||||||
public ResponseEntity<PlaylistData> getPlaylist(@RequestParam(value = "guild") String guildId) { //TODO security issue ???!!!
|
|
||||||
Guild guild = MainBot.jda.getGuildById(guildId);
|
|
||||||
if (guild == null) {
|
|
||||||
logger.warn("Request whit no guild!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
|
||||||
} else {
|
|
||||||
logger.trace("getPlaylist for " + guild.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
List<UserAudioTrackData> list = null;
|
|
||||||
list = AudioM.getInstance(guild).getGuildMusicManager().scheduler.getList();
|
|
||||||
return new ResponseEntity<>(new PlaylistData(list), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@RequestMapping("/getAllInfo")
|
|
||||||
public ResponseEntity<AllMusicInfoData> getAllInfo(@RequestParam(value = "guild") String guildId, @CookieValue("token") String token) {
|
|
||||||
if (token != null) {
|
|
||||||
Guild guild = MainBot.jda.getGuildById(guildId);
|
|
||||||
if (guild == null) {
|
|
||||||
|
|
||||||
logger.warn("All info without guild!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
UserEntity user = userUtils.getUserWithApiToken(userRepository, token);
|
|
||||||
logger.trace("All info from USER: " + user.getUsername() + " GUILD: " + guild.getName());
|
|
||||||
|
|
||||||
PlaylistData list = new PlaylistData(AudioM.getInstance(guild).getGuildMusicManager().scheduler.getList());
|
|
||||||
CurrentMusicData musicData;
|
|
||||||
if (guild.getAudioManager().isConnected()) {
|
|
||||||
AudioPlayer player = AudioM.getInstance(guild).getGuildMusicManager().player;
|
|
||||||
AudioTrack currentTrack = player.getPlayingTrack();
|
|
||||||
if (currentTrack == null) {
|
|
||||||
musicData = new CurrentMusicData(null, 0, "STOP", false, AudioM.getInstance(guild).getGuildMusicManager().scheduler.isAutoFlow());
|
|
||||||
} else {
|
|
||||||
UserAudioTrackData uat = new UserAudioTrackData(AudioM.getInstance(guild).getGuildMusicManager().scheduler.getCurrentPlayingTrack());
|
|
||||||
musicData = new CurrentMusicData(uat, currentTrack.getPosition(), currentTrack.getState().toString(), player.isPaused(), AudioM.getInstance(guild).getGuildMusicManager().scheduler.isAutoFlow());
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
musicData = new CurrentMusicData(null, 0, "DISCONNECTED", false, false);
|
|
||||||
}
|
|
||||||
return new ResponseEntity<>(new AllMusicInfoData(musicData, list), HttpStatus.OK);
|
|
||||||
|
|
||||||
|
|
||||||
} catch (UnknownTokenException e) {
|
|
||||||
logger.warn("All info with unknown token");
|
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
logger.warn("All Info without token!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping(value = "/command", method = RequestMethod.POST)
|
|
||||||
public ResponseEntity<CommandResponseData> command(@RequestBody CommandPostData data, HttpServletRequest request, @RequestParam(value = "guild") String guildId, @CookieValue("token") String token) {
|
|
||||||
|
|
||||||
if (data.command != null) {
|
|
||||||
if (token != null) {
|
|
||||||
Guild guild = MainBot.jda.getGuildById(guildId);
|
|
||||||
if (guild == null) {
|
|
||||||
logger.warn("Request whit no guild!");
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Missing Guild!\nPlease Re-connect.", "token"), HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
UserEntity user = userUtils.getUserWithApiToken(userRepository, token);
|
|
||||||
logger.info("[" + guild.getName() + "] Receive command" + data.command + " from" + request.getRemoteAddr() + " USER:" + user.getUsername() + " GUILD:" + guild.getName());
|
|
||||||
|
|
||||||
if (ApiCommandLoader.apiCommands.containsKey(data.command)) {
|
|
||||||
|
|
||||||
UserStatsUtils.getINSTANCE().addApiCount(user, guildId);
|
|
||||||
|
|
||||||
return ApiCommandLoader.apiCommands.get(data.command).action(data, MainBot.jda.getUserById(user.getDiscordId()), guild);
|
|
||||||
} else
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Unknown Command", "command"), HttpStatus.BAD_REQUEST);
|
|
||||||
|
|
||||||
} catch (UnknownTokenException e) {
|
|
||||||
logger.warn("Command with unknown token from: " + request.getRemoteAddr());
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Unknown Token!\nPlease Re-connect.", "token"), HttpStatus.UNAUTHORIZED);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
logger.warn("Command without token! ip: " + request.getRemoteAddr());
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(data.command, "Missing token!\nPlease Re-connect.", "token"), HttpStatus.UNAUTHORIZED);
|
|
||||||
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
logger.info("Null");
|
|
||||||
return new ResponseEntity<>(new CommandResponseData(null, null), HttpStatus.NO_CONTENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping(value = "/getChanel", method = RequestMethod.GET)
|
|
||||||
public ResponseEntity<List<ChanelData>> getChanel(@CookieValue(name = "token", defaultValue = "") String token, @RequestParam(value = "guild") String guildId) {
|
|
||||||
if (token != null && !token.isEmpty()) {
|
|
||||||
try {
|
|
||||||
UserEntity user = userUtils.getUserWithApiToken(userRepository, token);
|
|
||||||
Guild guild = MainBot.jda.getGuildById(guildId);
|
|
||||||
if (guild == null) {
|
|
||||||
logger.warn("Request whit no guild!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
|
||||||
}
|
|
||||||
Member member = guild.getMember(CacheTools.getJdaUser(user));
|
|
||||||
if (member == null) {
|
|
||||||
member = guild.retrieveMember(CacheTools.getJdaUser(user)).complete();
|
|
||||||
if (member == null) {
|
|
||||||
logger.warn("Can't find member " + user.getUsername() + " for guild " + guild.getName() + ", User not in guild ?");
|
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logger.trace("getPlaylist for " + guild.getName());
|
|
||||||
List<ChanelData> temp = new ArrayList<>();
|
|
||||||
for (VoiceChannel aChanel : GetVoiceChanels.find(guild, member)) {
|
|
||||||
temp.add(new ChanelData(aChanel.getName(), aChanel.getId(), aChanel.getPosition()));
|
|
||||||
}
|
|
||||||
return new ResponseEntity<>(temp, HttpStatus.OK);
|
|
||||||
} catch (UnknownTokenException e) {
|
|
||||||
logger.warn("Get Chanel without token!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
logger.warn("Get Chanel without token!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping(value = "/search", method = RequestMethod.GET)
|
|
||||||
public ResponseEntity<List<SearchResult>> search(@CookieValue(name = "token", defaultValue = "") String token, @RequestParam(value = "query") String query) {
|
|
||||||
if (token != null && !token.isEmpty()) {
|
|
||||||
try {
|
|
||||||
UserEntity user = userUtils.getUserWithApiToken(userRepository, token);
|
|
||||||
YoutubeSearchRework youtubeSearch = YoutubeSearchRework.getInstance();
|
|
||||||
List<SearchResult> result = youtubeSearch.searchVideo(query, 25, false);
|
|
||||||
return new ResponseEntity<>(result, HttpStatus.OK);
|
|
||||||
|
|
||||||
} catch (UnknownTokenException e) {
|
|
||||||
logger.warn("Search without token!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
} catch (GoogleJsonResponseException e) {
|
|
||||||
logger.error("There was a service error: " + e.getDetails().getCode() + " : " + e.getDetails().getMessage());
|
|
||||||
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
|
|
||||||
} catch (IOException e) {
|
|
||||||
logger.catching(e);
|
|
||||||
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
|
|
||||||
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.warn("Search without token!");
|
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
|||||||
package net.Broken.RestApi;
|
|
||||||
|
|
||||||
|
|
||||||
import net.Broken.DB.Entity.PlaylistEntity;
|
|
||||||
import net.Broken.DB.Entity.UserEntity;
|
|
||||||
import net.Broken.DB.Repository.PlaylistRepository;
|
|
||||||
import net.Broken.DB.Repository.TrackRepository;
|
|
||||||
import net.Broken.DB.Repository.UserRepository;
|
|
||||||
import net.Broken.RestApi.Data.Playlist.*;
|
|
||||||
import net.Broken.audio.Playlist.PlaylistManager;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.CookieValue;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/api/playlist/")
|
|
||||||
public class PlaylistAPIController {
|
|
||||||
|
|
||||||
private final
|
|
||||||
UserRepository userRepository;
|
|
||||||
|
|
||||||
private final
|
|
||||||
PlaylistRepository playlistRepository;
|
|
||||||
|
|
||||||
private final
|
|
||||||
TrackRepository trackRepository;
|
|
||||||
|
|
||||||
private Logger logger = LogManager.getLogger();
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public PlaylistAPIController(UserRepository userRepository, PlaylistRepository playlistRepository, TrackRepository trackRepository) {
|
|
||||||
this.userRepository = userRepository;
|
|
||||||
this.playlistRepository = playlistRepository;
|
|
||||||
this.trackRepository = trackRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// @RequestMapping("/myPlaylist")
|
|
||||||
// public List<PlaylistEntity> myPlaylist(@CookieValue(value = "token", defaultValue = "") String token) {
|
|
||||||
// if (token.isEmpty())
|
|
||||||
// return null;
|
|
||||||
// else {
|
|
||||||
// UserEntity user = userRepository.findByApiToken(token).get(0);
|
|
||||||
// return user.getPlaylists();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
// @RequestMapping("/createPlaylist")
|
|
||||||
// public ResponseEntity<PlaylistResponseData> createPlaylist(@CookieValue(value = "token", defaultValue = "") String token, @RequestBody CreatePlaylistData data) {
|
|
||||||
//
|
|
||||||
// if (token.isEmpty())
|
|
||||||
// return new ResponseEntity<>(new PlaylistResponseData("Unknown Token!\nPlease Re-connect.", "token"), HttpStatus.UNAUTHORIZED);
|
|
||||||
// else {
|
|
||||||
// UserEntity user = userRepository.findByApiToken(token).get(0);
|
|
||||||
// PlaylistEntity playlistEntity = new PlaylistEntity(data.name, user);
|
|
||||||
// playlistEntity = playlistRepository.save(playlistEntity);
|
|
||||||
// user.addPlaylist(playlistEntity);
|
|
||||||
// userRepository.save(user);
|
|
||||||
// return new ResponseEntity<>(new PlaylistResponseData("Ok", playlistEntity), HttpStatus.OK);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
@RequestMapping("/addToPlaylist")
|
|
||||||
public ResponseEntity<PlaylistResponseData> addToPlaylist(@CookieValue(value = "token", defaultValue = "") String token, @RequestBody AddToPlaylistData data) {
|
|
||||||
PlaylistManager playlistManager = PlaylistManager.getINSTANCE();
|
|
||||||
|
|
||||||
return playlistManager.addToPlaylist(token, data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/dellTrack")
|
|
||||||
public ResponseEntity<PlaylistResponseData> dellTrack(@CookieValue(value = "token", defaultValue = "") String token, @RequestBody DeleteTrackData data) {
|
|
||||||
PlaylistManager playlistManager = PlaylistManager.getINSTANCE();
|
|
||||||
|
|
||||||
return playlistManager.removeTrack(token, data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/moveTrack")
|
|
||||||
public ResponseEntity<PlaylistResponseData> moveTrack(@CookieValue(value = "token", defaultValue = "") String token, @RequestBody MoveTrackData data) {
|
|
||||||
PlaylistManager playlistManager = PlaylistManager.getINSTANCE();
|
|
||||||
|
|
||||||
return playlistManager.moveTrack(token, data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -3,7 +3,7 @@ package net.Broken.SlashCommands;
|
|||||||
|
|
||||||
import net.Broken.SlashCommand;
|
import net.Broken.SlashCommand;
|
||||||
import net.Broken.Tools.EmbedMessageUtils;
|
import net.Broken.Tools.EmbedMessageUtils;
|
||||||
import net.Broken.audio.AudioM;
|
import net.Broken.Audio.GuildAudioWrapper;
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
import net.dv8tion.jda.api.entities.Message;
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
import net.dv8tion.jda.api.entities.VoiceChannel;
|
import net.dv8tion.jda.api.entities.VoiceChannel;
|
||||||
@ -27,7 +27,7 @@ public class Music implements SlashCommand {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void action(SlashCommandEvent event) {
|
public void action(SlashCommandEvent event) {
|
||||||
AudioM audio = AudioM.getInstance(event.getGuild());
|
GuildAudioWrapper audio = GuildAudioWrapper.getInstance(event.getGuild());
|
||||||
String action = event.getSubcommandName();
|
String action = event.getSubcommandName();
|
||||||
event.deferReply().queue();
|
event.deferReply().queue();
|
||||||
switch (action) {
|
switch (action) {
|
||||||
|
@ -4,16 +4,12 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
|||||||
import net.Broken.BotConfigLoader;
|
import net.Broken.BotConfigLoader;
|
||||||
import net.Broken.MainBot;
|
import net.Broken.MainBot;
|
||||||
import net.Broken.SpringContext;
|
import net.Broken.SpringContext;
|
||||||
import net.Broken.audio.UserAudioTrack;
|
import net.Broken.Audio.UserAudioTrack;
|
||||||
import net.Broken.audio.Youtube.SearchResult;
|
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
import net.dv8tion.jda.api.entities.MessageEmbed;
|
import net.dv8tion.jda.api.entities.MessageEmbed;
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.springframework.context.ApplicationContext;
|
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -1,47 +0,0 @@
|
|||||||
package net.Broken.audio;
|
|
||||||
|
|
||||||
import net.Broken.DB.Entity.GuildPreferenceEntity;
|
|
||||||
import net.Broken.Tools.SettingsUtils;
|
|
||||||
import net.dv8tion.jda.api.Permission;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.GuildChannel;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
|
||||||
import net.dv8tion.jda.api.entities.VoiceChannel;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to find general voice channels
|
|
||||||
*/
|
|
||||||
public class GetVoiceChanels {
|
|
||||||
private static final Logger logger = LogManager.getLogger();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for all voice channel where the user can connect
|
|
||||||
*
|
|
||||||
* @param guild Current guild
|
|
||||||
* @return General Category
|
|
||||||
*/
|
|
||||||
public static List<VoiceChannel> find(Guild guild, Member member) {
|
|
||||||
|
|
||||||
ArrayList<VoiceChannel> list = new ArrayList<>();
|
|
||||||
VoiceChannel afk = guild.getAfkChannel();
|
|
||||||
GuildPreferenceEntity pref = SettingsUtils.getInstance().getPreference(guild);
|
|
||||||
String autoVoice = pref.getAutoVoiceChannelID();
|
|
||||||
for (VoiceChannel channel : guild.getVoiceChannels()) {
|
|
||||||
if (channel != afk && !channel.getId().equals(autoVoice) && member.getPermissions(channel).contains(Permission.VOICE_CONNECT)) {
|
|
||||||
list.add(channel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list.sort(Comparator.comparingInt(GuildChannel::getPositionRaw));
|
|
||||||
|
|
||||||
return list;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
package net.Broken.audio.Playlist.Exception;
|
|
||||||
|
|
||||||
public class PlaylistNotFoundException extends Exception {
|
|
||||||
}
|
|
@ -1,218 +0,0 @@
|
|||||||
package net.Broken.audio.Playlist;
|
|
||||||
|
|
||||||
import net.Broken.DB.Entity.PlaylistEntity;
|
|
||||||
import net.Broken.DB.Entity.TrackEntity;
|
|
||||||
import net.Broken.DB.Entity.UserEntity;
|
|
||||||
import net.Broken.DB.Repository.PlaylistRepository;
|
|
||||||
import net.Broken.DB.Repository.TrackRepository;
|
|
||||||
import net.Broken.DB.Repository.UserRepository;
|
|
||||||
import net.Broken.MainBot;
|
|
||||||
import net.Broken.RestApi.Data.Playlist.AddToPlaylistData;
|
|
||||||
import net.Broken.RestApi.Data.Playlist.DeleteTrackData;
|
|
||||||
import net.Broken.RestApi.Data.Playlist.MoveTrackData;
|
|
||||||
import net.Broken.RestApi.Data.Playlist.PlaylistResponseData;
|
|
||||||
import net.Broken.SpringContext;
|
|
||||||
import net.Broken.Tools.UserManager.Exceptions.UnknownTokenException;
|
|
||||||
import net.Broken.Tools.UserManager.UserUtils;
|
|
||||||
import net.Broken.audio.Playlist.Exception.PlaylistNotFoundException;
|
|
||||||
import net.Broken.audio.WebLoadUtils;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.springframework.context.ApplicationContext;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class PlaylistManager {
|
|
||||||
|
|
||||||
private static PlaylistManager INSTANCE = new PlaylistManager();
|
|
||||||
private final ResponseEntity<PlaylistResponseData> TOKEN_ERROR = new ResponseEntity<>(new PlaylistResponseData("Unknown Token!\nPlease Re-connect.", "token"), HttpStatus.UNAUTHORIZED);
|
|
||||||
private final ResponseEntity<PlaylistResponseData> PLAYLIST_NOT_FOUND = new ResponseEntity<>(new PlaylistResponseData("Playlist not found", "playlist"), HttpStatus.NOT_FOUND);
|
|
||||||
private final ResponseEntity<PlaylistResponseData> TRACK_NOT_FOUND = new ResponseEntity<>(new PlaylistResponseData("Can't find media!", "track"), HttpStatus.NOT_FOUND);
|
|
||||||
Logger logger = LogManager.getLogger();
|
|
||||||
private PlaylistRepository playlistRepository;
|
|
||||||
private TrackRepository trackRepository;
|
|
||||||
private UserRepository userRepository;
|
|
||||||
|
|
||||||
private PlaylistManager() {
|
|
||||||
ApplicationContext context = SpringContext.getAppContext();
|
|
||||||
|
|
||||||
playlistRepository = (PlaylistRepository) context.getBean("playlistRepository");
|
|
||||||
trackRepository = (TrackRepository) context.getBean("trackRepository");
|
|
||||||
userRepository = (UserRepository) context.getBean("userRepository");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PlaylistManager getINSTANCE() {
|
|
||||||
return INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResponseEntity<PlaylistResponseData> addToPlaylist(String token, AddToPlaylistData data) {
|
|
||||||
UserUtils userUtils = UserUtils.getInstance();
|
|
||||||
|
|
||||||
try {
|
|
||||||
UserEntity user = userUtils.getUserWithApiToken(userRepository, token);
|
|
||||||
PlaylistEntity playlist = getPlaylist(data.playlistId);
|
|
||||||
|
|
||||||
User jdaUser = MainBot.jda.getUserById(user.getDiscordId());
|
|
||||||
|
|
||||||
WebLoadUtils webLoadUtils = new WebLoadUtils(data, jdaUser, MainBot.jda.getGuilds().get(0), false);
|
|
||||||
webLoadUtils.getResponse();
|
|
||||||
|
|
||||||
if (webLoadUtils.userAudioTrack == null) {
|
|
||||||
return TRACK_NOT_FOUND;
|
|
||||||
} else {
|
|
||||||
TrackEntity trackEntity = new TrackEntity(webLoadUtils.userAudioTrack.getAudioTrack().getInfo(), data.pos, playlist);
|
|
||||||
|
|
||||||
playlist = insert(playlist, trackEntity);
|
|
||||||
return new ResponseEntity<>(new PlaylistResponseData("Ok", playlist), HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} catch (UnknownTokenException e) {
|
|
||||||
logger.warn("Unknown token: " + token);
|
|
||||||
return TOKEN_ERROR;
|
|
||||||
} catch (PlaylistNotFoundException e) {
|
|
||||||
logger.debug("Playlist not found: " + data.playlistId);
|
|
||||||
return PLAYLIST_NOT_FOUND;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ResponseEntity<PlaylistResponseData> removeTrack(String token, DeleteTrackData data) {
|
|
||||||
UserUtils userUtils = UserUtils.getInstance();
|
|
||||||
try {
|
|
||||||
UserEntity user = userUtils.getUserWithApiToken(userRepository, token);
|
|
||||||
PlaylistEntity playlist = getPlaylist(data.playlistId);
|
|
||||||
|
|
||||||
|
|
||||||
TrackEntity toDelete = trackRepository.findById(data.id);
|
|
||||||
|
|
||||||
playlist = remove(playlist, toDelete);
|
|
||||||
|
|
||||||
if (playlist == null) {
|
|
||||||
logger.warn("Playlist: " + data.playlistId + " Track: " + data.id);
|
|
||||||
return TRACK_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ResponseEntity<>(new PlaylistResponseData("Ok", playlist), HttpStatus.OK);
|
|
||||||
|
|
||||||
} catch (UnknownTokenException e) {
|
|
||||||
logger.warn("Unknown token: " + token);
|
|
||||||
return TOKEN_ERROR;
|
|
||||||
} catch (PlaylistNotFoundException e) {
|
|
||||||
logger.debug("Playlist not found: " + data.playlistId);
|
|
||||||
return PLAYLIST_NOT_FOUND;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResponseEntity<PlaylistResponseData> moveTrack(String token, MoveTrackData data) {
|
|
||||||
UserUtils userUtils = UserUtils.getInstance();
|
|
||||||
try {
|
|
||||||
UserEntity user = userUtils.getUserWithApiToken(userRepository, token);
|
|
||||||
PlaylistEntity playlist = getPlaylist(data.playlistId);
|
|
||||||
|
|
||||||
|
|
||||||
TrackEntity toMove = trackRepository.findById(data.id);
|
|
||||||
|
|
||||||
TrackEntity save = new TrackEntity(toMove);
|
|
||||||
|
|
||||||
playlist = remove(playlist, toMove);
|
|
||||||
|
|
||||||
if (playlist == null) {
|
|
||||||
logger.warn("Playlist: " + data.playlistId + " Track: " + data.id);
|
|
||||||
return TRACK_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
save.setPos(data.newPos);
|
|
||||||
|
|
||||||
playlist = insert(playlist, save);
|
|
||||||
|
|
||||||
|
|
||||||
return new ResponseEntity<>(new PlaylistResponseData("Ok", playlist), HttpStatus.OK);
|
|
||||||
|
|
||||||
} catch (UnknownTokenException e) {
|
|
||||||
logger.warn("Unknown token: " + token);
|
|
||||||
return TOKEN_ERROR;
|
|
||||||
} catch (PlaylistNotFoundException e) {
|
|
||||||
logger.debug("Playlist not found: " + data.playlistId);
|
|
||||||
return PLAYLIST_NOT_FOUND;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private PlaylistEntity getPlaylist(int id) throws PlaylistNotFoundException {
|
|
||||||
PlaylistEntity playlist = playlistRepository.findById(id);
|
|
||||||
if (playlist == null)
|
|
||||||
throw new PlaylistNotFoundException();
|
|
||||||
else
|
|
||||||
return playlist;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private PlaylistEntity insert(PlaylistEntity playlistEntity, TrackEntity trackEntity) {
|
|
||||||
List<TrackEntity> tracks = trackRepository.findDistinctByPlaylistOrderByPos(playlistEntity);
|
|
||||||
|
|
||||||
|
|
||||||
boolean increase = false;
|
|
||||||
for (TrackEntity track : tracks) {
|
|
||||||
if (track.getPos().equals(trackEntity.getPos())) {
|
|
||||||
logger.debug("Need re-organisation");
|
|
||||||
increase = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (increase) {
|
|
||||||
track.setPos(track.getPos() + 1);
|
|
||||||
trackRepository.save(track);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!increase) {
|
|
||||||
trackEntity.setPos(tracks.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
trackRepository.save(trackEntity);
|
|
||||||
|
|
||||||
playlistEntity.addTracks(trackEntity);
|
|
||||||
|
|
||||||
|
|
||||||
return playlistRepository.save(playlistEntity);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private PlaylistEntity remove(PlaylistEntity playlistEntity, TrackEntity trackEntity) {
|
|
||||||
|
|
||||||
if (trackEntity == null) {
|
|
||||||
logger.warn("Track not found in DB!");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<TrackEntity> tracks = trackRepository.findDistinctByPlaylistOrderByPos(playlistEntity);
|
|
||||||
|
|
||||||
int toDeleteIndex = tracks.indexOf(trackEntity);
|
|
||||||
logger.debug("To delete index: " + toDeleteIndex);
|
|
||||||
if (toDeleteIndex == -1) {
|
|
||||||
logger.warn("Track not found in playlist");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (int i = toDeleteIndex + 1; i < tracks.size(); i++) {
|
|
||||||
tracks.get(i).setPos(tracks.get(i).getPos() - 1);
|
|
||||||
trackRepository.save(tracks.get(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
tracks.remove(trackEntity);
|
|
||||||
trackRepository.delete(trackEntity);
|
|
||||||
|
|
||||||
playlistEntity.setTracks(tracks);
|
|
||||||
playlistEntity = playlistRepository.save(playlistEntity);
|
|
||||||
|
|
||||||
return playlistEntity;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,101 +0,0 @@
|
|||||||
package net.Broken.audio;
|
|
||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
|
||||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
|
||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
|
||||||
import net.Broken.RestApi.Data.CommandPostData;
|
|
||||||
import net.Broken.RestApi.Data.CommandResponseData;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.User;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface between WebApi and Music bot for submitting track
|
|
||||||
*/
|
|
||||||
public class WebLoadUtils {
|
|
||||||
public UserAudioTrack userAudioTrack;
|
|
||||||
private ResponseEntity<CommandResponseData> response;
|
|
||||||
private Logger logger = LogManager.getLogger();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Submit a track or playlist to Music bot
|
|
||||||
*
|
|
||||||
* @param data Received data from API
|
|
||||||
* @param user User who submit the track
|
|
||||||
* @param guild
|
|
||||||
*/
|
|
||||||
public WebLoadUtils(CommandPostData data, User user, Guild guild, boolean submit) {
|
|
||||||
AudioPlayerManager playerM = AudioM.getInstance(guild).getPlayerManager();
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
AudioM audioM = AudioM.getInstance(guild);
|
|
||||||
playerM.loadItemOrdered(audioM.getGuildMusicManager(), data.url, new AudioLoadResultHandler() {
|
|
||||||
@Override
|
|
||||||
public void trackLoaded(AudioTrack track) {
|
|
||||||
logger.info("Single Track detected from web!");
|
|
||||||
|
|
||||||
userAudioTrack = new UserAudioTrack(user, track);
|
|
||||||
if (submit)
|
|
||||||
audioM.play(audioM.getGuild(), audioM.getPlayedChanel(), audioM.getGuildMusicManager(), userAudioTrack, data.onHead);
|
|
||||||
response = new ResponseEntity<>(new CommandResponseData("ADD", "Loaded"), HttpStatus.OK);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void playlistLoaded(AudioPlaylist playlist) {
|
|
||||||
|
|
||||||
if (submit) {
|
|
||||||
logger.info("Playlist detected from web! Limit: " + data.playlistLimit);
|
|
||||||
audioM.playListLoader(playlist, data.playlistLimit, user, data.onHead);
|
|
||||||
response = new ResponseEntity<>(new CommandResponseData("ADD", "Loaded"), HttpStatus.OK);
|
|
||||||
} else {
|
|
||||||
response = new ResponseEntity<>(new CommandResponseData("ADD", "Adding a list on saved playlist is currently not supported"), HttpStatus.NOT_ACCEPTABLE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void noMatches() {
|
|
||||||
logger.warn("Cant find media ! (web) url: " + data.url);
|
|
||||||
response = new ResponseEntity<>(new CommandResponseData("ADD", "Can't find media!"), HttpStatus.NOT_FOUND);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadFailed(FriendlyException exception) {
|
|
||||||
logger.error("Cant load media ! (web)");
|
|
||||||
response = new ResponseEntity<>(new CommandResponseData("ADD", "Cant load media !"), HttpStatus.INTERNAL_SERVER_ERROR);
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
while (response == null)
|
|
||||||
Thread.sleep(10);
|
|
||||||
|
|
||||||
} catch (InterruptedException nullMusicManager) {
|
|
||||||
nullMusicManager.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wait for the end of submit process and return ResponseEntity
|
|
||||||
*
|
|
||||||
* @return HTTP Response
|
|
||||||
*/
|
|
||||||
public ResponseEntity<CommandResponseData> getResponse() {
|
|
||||||
while (response == null) {
|
|
||||||
try {
|
|
||||||
Thread.sleep(10);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user