Encore une nouvelle api. Et aussi la séparation du travail dans des fichiers distincts.

This commit is contained in:
Mysaa
2021-05-27 22:51:42 +02:00
parent f16ca7efb0
commit 6a3a454492
5 changed files with 538 additions and 430 deletions
@@ -0,0 +1,249 @@
package com.bernard.julsoundbox;
import java.util.LinkedList;
import java.util.Queue;
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
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.player.event.AudioEvent;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventListener;
import com.sedmelluq.discord.lavaplayer.player.event.TrackEndEvent;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
import net.dv8tion.jda.core.EmbedBuilder;
import net.dv8tion.jda.core.audio.AudioSendHandler;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.MessageEmbed;
import net.dv8tion.jda.core.entities.VoiceChannel;
import net.dv8tion.jda.core.managers.AudioManager;
public class GuildSoundManager {
AudioPlayerManager playerManager;
AudioManager manager;
VoiceChannel currentChannel = null;
BernardSoundHandler soundHandler;
Queue<AudioTrack> playlist;
boolean play;
public GuildSoundManager(Guild guild) {
playerManager = new DefaultAudioPlayerManager();
soundHandler = new BernardSoundHandler();
manager = guild.getAudioManager();
AudioSourceManagers.registerLocalSource(playerManager);
manager.setSendingHandler(soundHandler);
currentChannel = null;
playlist = new LinkedList<>();
play = false;
}
public MessageEmbed playing() {
if(soundHandler.currentTrack == null && playlist.isEmpty()) {
EmbedBuilder mb = new EmbedBuilder();
mb.setTitle("Ben je suis en fait en train de jouer .... rien du tout");
return mb.build();
}
EmbedBuilder builder = new EmbedBuilder();
String playing = "";
if(soundHandler.currentTrack == null)
playing = "Rien du tout !";
else
playing = soundHandler.currentTrack.getIdentifier();
builder.addField("Je joue ", playing, false);
String queued = "";
if(playlist.isEmpty())
queued = "Rien du tout !";
else {
for (AudioTrack audioTrack : playlist)
queued += audioTrack.getUserData() + "\n";
queued = queued.substring(0, queued.length()-1);
}
builder.addField("J'ai prévu ", queued, false);
return builder.build();
}
public void go(VoiceChannel chan) {
if(chan == null) {
System.out.println("Je quite les salons vocaux");
manager.closeAudioConnection();
}else {
System.out.println("Coming into channel "+chan==null?"néant":chan.getName());
manager.openAudioConnection(chan);
currentChannel = chan;
}
}
public void play(String path,String song) {
System.out.println("Trying to play : "+path);
playerManager.loadItem(path, new AudioLoadResultHandler() {
@Override
public void trackLoaded(AudioTrack track) {
track.setUserData(song);
playlist = appendFirst(track, playlist);
soundHandler.update();
}
@Override
public void playlistLoaded(AudioPlaylist playlist) {
System.err.println("Quoikesquevousavezfaitlà ?! Vous avez juste essayé de lancer "+path);
}
@Override
public void noMatches() {
System.err.println("A moins de transformer le texte en données sonores brutes, je sais pas quoi prononcer "+path);
}
@Override
public void loadFailed(FriendlyException exception) {
System.err.println("Je n'ai pas réussi à charger le son ... désolé (en meme temps, vu comme mes devs codent !) "+exception.getMessage());
}
});
}
public void queue(String path,String song) {
playerManager.loadItem(path, new AudioLoadResultHandler() {
@Override
public void trackLoaded(AudioTrack track) {
track.setUserData(song);
playlist.add(track);
soundHandler.update();
}
@Override
public void playlistLoaded(AudioPlaylist playlist) {
System.err.println("Quoikesquevousavezfaitlà ?! Vous avez juste essayé de lancer "+path);
}
@Override
public void noMatches() {
System.err.println("A moins de transformer le texte en données sonores brutes, je sais pas quoi prononcer "+path);
}
@Override
public void loadFailed(FriendlyException exception) {
System.err.println("Je n'ai pas réussi à charger le son ... désolé (en meme temps, vu comme mes devs codent !) "+exception.getMessage());
}
});
}
public void unqueue(int pos) {
Queue<AudioTrack> out = new LinkedList<>();
for (int i = 0; i < playlist.size(); i++)
if(i!=pos)out.add(playlist.poll());
else playlist.poll();
playlist = out;
soundHandler.update();
}
public void unqueue(String song) {
Queue<AudioTrack> out = new LinkedList<>();
for (int i = 0; i < playlist.size(); i++)
if(playlist.peek().getUserData().equals(song))out.add(playlist.poll());
else playlist.poll();
playlist = out;
soundHandler.update();
}
public void setPlay(boolean play) {
soundHandler.update(play);
}
public void update() {
soundHandler.update();
}
public void next() {
soundHandler.next();
}
public boolean isQueueEmpty() {
return playlist.isEmpty();
}
public class BernardSoundHandler implements AudioSendHandler,AudioEventListener {
public AudioTrack currentTrack;
private final AudioPlayer audioPlayer;
public BernardSoundHandler() {
audioPlayer = playerManager.createPlayer();
audioPlayer.addListener(this);
}
public void next() {
currentTrack = playlist.poll();
audioPlayer.startTrack(currentTrack, false);
update();
}
public void update() {
checkNext();
audioPlayer.setPaused(!play);
}
public void update(boolean play) {
GuildSoundManager.this.play = play;
update();
}
@Override
public void onEvent(AudioEvent event) {
if(event instanceof TrackEndEvent) {
currentTrack = null;
checkNext();
}
}
public void checkNext() {
if(playlist.size() > 0 && currentTrack == null) {
currentTrack = playlist.poll();
audioPlayer.startTrack(currentTrack, false);
update();
} else {
play = false;
}
}
private AudioFrame lastFrame;
/////////// Methods for sound playing ///////////
@Override
public boolean canProvide() {
lastFrame = audioPlayer.provide();
return lastFrame != null;
}
@Override
public byte[] provide20MsAudio() {
return lastFrame.getData();
}
@Override
public boolean isOpus() {
return true;
}
}
public static final <T> Queue<T> appendFirst(T element,Queue<T> queue){
Queue<T> out = new LinkedList<T>();
out.add(element);
for (T t : queue)
out.add(t);
return out;
}
}
@@ -0,0 +1,225 @@
package com.bernard.julsoundbox;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Random;
import com.bernard.juldata.JuLData;
import com.bernard.juliabot.api.Command;
import com.bernard.juliabot.api.DiscordCCommande;
import com.bernard.juliabot.api.JuLIAddon;
import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.MessageBuilder;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.GuildVoiceState;
import net.dv8tion.jda.core.entities.MessageChannel;
import net.dv8tion.jda.core.entities.MessageEmbed;
import net.dv8tion.jda.core.entities.User;
import net.dv8tion.jda.core.entities.VoiceChannel;
@JuLIAddon(name="julsoundbox", devs = "Bernard", version="beta", important=true)
public class JulSoundBox {
Map<Long,GuildSoundManager> managers;
Random randomizator;
public JulSoundBox(JDA jda) {
managers = new HashMap<Long, GuildSoundManager>();
randomizator = new Random();
}
public GuildSoundManager getOrInitGS(DiscordCCommande ccommande) {
Guild g = ccommande.getMessage().getGuild();
if(g==null) {
notifyUser("Veuilez envoyer ce message dans un serveur pour que je puisse vois dire ce que je joues dans cette liste en question", ccommande);
return null;
}
if(!managers.containsKey(g.getIdLong()))
managers.put(g.getIdLong(), new GuildSoundManager(g));
return managers.get(g.getIdLong());
}
@Command(name = "playing",aliases = "kestujoues", admin = false, description = "Demande à JuL'IA quel son elle est en train de jouer")
public void playing(DiscordCCommande ccommande) {
GuildSoundManager gs = getOrInitGS(ccommande);
if(gs == null)return;
MessageEmbed toSend = gs.playing();
System.out.println(toSend.toString());
ccommande.getChannel().sendMessage(toSend).queue();
}
@Command(name = "come", admin = true, description = "Ammène julia dans le salon vocal auquel l'utilisateur est connecté")
public void come(DiscordCCommande ccommande) {
GuildSoundManager gs = getOrInitGS(ccommande);
if(gs == null)return;
final GuildVoiceState memberVoiceState = ccommande.getMessage().getGuild().getMember(ccommande.getUser()).getVoiceState();
if(!memberVoiceState.inVoiceChannel())
gs.go(null);
else
gs.go(memberVoiceState.getChannel());
}
@Command(name = "go", admin = true, description = "Ammène julia dans le salon spécifié")
public void go(DiscordCCommande ccommande) {
GuildSoundManager gs = getOrInitGS(ccommande);
if(gs == null)return;
switch(ccommande.getArguments().getNomme(1)) {
case "néant":
case "rien":
case "away":
case "null":
case "nichts":
gs.go(null);
return;
}
String channelName = ccommande.getStringCommand().substring(ccommande.getArguments().getNomme(0).length());
List<VoiceChannel> chans = ccommande.getMessage().getGuild().getVoiceChannelsByName(channelName,true);
if(chans.size() <= 0) {
ccommande.getChannel().sendMessage("Je ne connais pas le channel '"+channelName+"'");
return;
}
gs.go(chans.get(0));
}
@Command(name = "play", admin = true, description = "Reprends ou lance la lecture d'un son")
public void play(DiscordCCommande ccommande) {
GuildSoundManager gs = getOrInitGS(ccommande);
if(gs == null)return;
JuLData jd = JuLData.get("julsoundbox", ccommande.getUser());
if(ccommande.getArguments().getNommeCount() > 0) {
List<String> toPlay = ccommande.getArguments().getNommes();
toPlay.remove(0);
for (int i = 1; i < ccommande.getArguments().getNommes().size(); i++) {
String song = ccommande.getArguments().getNomme(i);
if(jd.find(song))
try {
gs.play(jd.filename(song), ccommande.getUser().getId()+":"+song);
} catch (FileNotFoundException e) {
System.err.println("Mais ... je viens juste de check ?!");
e.printStackTrace();
}
else
ccommande.getChannel().sendMessage("Je ne connais pas ce truc là ... "+song+" ... vous m'apprenderez ?");
}
}else if(gs.isQueueEmpty()){
//Random mode
System.out.println("Random mode !!!");
List<String> songs = jd.listPublic("/");
String toPlay = songs.get(randomizator.nextInt(songs.size()));
try {
gs.play(jd.filenamePublic(toPlay), ccommande.getUser().getId()+":"+toPlay);
} catch (FileNotFoundException e) {
System.err.println("Kestufout Tu bouges les fichiers maintenant ?!");
e.printStackTrace();
}
}
gs.setPlay(true);
}
@Command(name = "queue",admin = true, description = "Ajoute un son à la liste de lecture")
public void queue(DiscordCCommande ccommande) {
GuildSoundManager gs = getOrInitGS(ccommande);
if(gs == null)return;
JuLData jd = JuLData.get("julsoundbox", ccommande.getUser());
if(ccommande.getArguments().getNommeCount() > 0) {
List<String> toPlay = ccommande.getArguments().getNommes();
toPlay.remove(0);
for (int i = 1; i < ccommande.getArguments().getNommes().size(); i++) {
String song = ccommande.getArguments().getNomme(i);
if(jd.find(song))
try {
gs.queue(jd.filename(song), ccommande.getUser().getId()+":"+song);
} catch (FileNotFoundException e) {
System.err.println("Mais ... je viens juste de check ?!");
e.printStackTrace();
}
else
ccommande.getChannel().sendMessage("Je ne connais pas ce truc là ... "+song+" ... vous m'apprenderez ?");
}
}else if(gs.isQueueEmpty()){
//Random mode
System.out.println("Random mode !!!");
List<String> songs = jd.listPublic("/");
String toPlay = songs.get(randomizator.nextInt(songs.size()));
try {
gs.queue(jd.filenamePublic(toPlay), ccommande.getUser().getId()+":"+toPlay);
} catch (FileNotFoundException e) {
System.err.println("Kestufout Tu bouges les fichiers maintenant ?!");
e.printStackTrace();
}
}
}
@Command(name = "unqueue", admin = true, description = "Enlève un son de la liste de lecture")//TODO test
public void unqueue(DiscordCCommande ccommande) {
GuildSoundManager gs = getOrInitGS(ccommande);
if(gs == null)return;
if(ccommande.getArguments().getNommeCount() == 1) {
notifyUser("Il me faut un parametre en plus ...", ccommande);
return;
}
String soundId = ccommande.getArguments().getNomme(1);
if(soundId.matches("^[0-9]+$")) {
int n = Integer.parseInt(soundId, 10) - 1;//Mathe way
gs.unqueue(n);
}else {
gs.unqueue(soundId);
}
gs.update();
}
@Command(name = "pause", admin = true, description = "Met le son joué en pause (wow)")
public void pause(DiscordCCommande ccommande) {
GuildSoundManager gs = getOrInitGS(ccommande);
if(gs == null)return;
gs.setPlay(false);
}
@Command(name = "chut", admin = true, description = "Arette le son que JuL'IA joue (un !!play reprendra le morceau suivant ")
public void chut(DiscordCCommande ccommande) {
GuildSoundManager gs = getOrInitGS(ccommande);
if(gs == null)return;
gs.next();
gs.setPlay(false);
}
//////////// Useful static functions ///////////////
public static final void notifyUser(String problem, DiscordCCommande ccommande) {
notifyUser(problem, ccommande.getUser(), ccommande.getChannel());
}
public static final void notifyUser(String problem, User user, MessageChannel channel) {
MessageBuilder builder = new MessageBuilder();
builder.append(user);
builder.append(" : ");
builder.append(problem);
user.openPrivateChannel().queue((chan) -> {
chan.sendMessage(builder.build()).queue();
});
}
public static final <T> Queue<T> appendFirst(T element,Queue<T> queue){
Queue<T> out = new LinkedList<T>();
out.add(element);
for (T t : queue) {
out.add(t);
}
return out;
}
}