(En cours)
Refonte complète du système de jukebox et de menu.
This commit is contained in:
@@ -17,7 +17,7 @@ import net.dv8tion.jda.api.entities.Activity;
|
|||||||
import net.dv8tion.jda.api.utils.cache.CacheFlag;
|
import net.dv8tion.jda.api.utils.cache.CacheFlag;
|
||||||
|
|
||||||
public class JdrBot {
|
public class JdrBot {
|
||||||
public static String Version = "2.62";
|
public static String Version = "3.0";
|
||||||
|
|
||||||
public static JDA jda;
|
public static JDA jda;
|
||||||
public static LocalDateTime basedate;
|
public static LocalDateTime basedate;
|
||||||
|
|||||||
@@ -3,9 +3,8 @@ package fr.Skydust.JdrBot;
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.cmds.LastTimeOnline;
|
import fr.Skydust.JdrBot.cmds.LastTimeOnline;
|
||||||
import fr.Skydust.JdrBot.cmds.playmusic.PlayMusic;
|
|
||||||
import fr.Skydust.JdrBot.cmds.playmusic.StopMusic;
|
import fr.Skydust.JdrBot.cmds.playmusic.StopMusic;
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem;
|
import fr.Skydust.JdrBot.menu.MenuSystem;
|
||||||
import fr.Skydust.JdrBot.stock.Command;
|
import fr.Skydust.JdrBot.stock.Command;
|
||||||
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceLeaveEvent;
|
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceLeaveEvent;
|
||||||
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceMoveEvent;
|
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceMoveEvent;
|
||||||
@@ -50,7 +49,7 @@ public class JdrBotListener extends ListenerAdapter {
|
|||||||
StopMusic.onGuildVoiceLeave(e);
|
StopMusic.onGuildVoiceLeave(e);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void onMessageReactionAdd(MessageReactionAddEvent e) { JukeboxGUISystem.onMessageReactionAdd(e); }
|
public void onMessageReactionAdd(MessageReactionAddEvent e) { MenuSystem.onMessageReactionAdd(e); }
|
||||||
|
|
||||||
public boolean isACommand(String message, String cmd) {
|
public boolean isACommand(String message, String cmd) {
|
||||||
return message.matches("^("+ JdrBot.startcmdchar +")("+ cmd +")( .*|)$");
|
return message.matches("^("+ JdrBot.startcmdchar +")("+ cmd +")( .*|)$");
|
||||||
|
|||||||
@@ -3,14 +3,11 @@ package fr.Skydust.JdrBot.cmds.playmusic;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem;
|
import fr.Skydust.JdrBot.jukebox.JukeboxSystem;
|
||||||
import fr.Skydust.JdrBot.cmds.record.Record;
|
|
||||||
import fr.Skydust.JdrBot.stock.Command;
|
import fr.Skydust.JdrBot.stock.Command;
|
||||||
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.TextChannel;
|
import net.dv8tion.jda.api.entities.TextChannel;
|
||||||
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceLeaveEvent;
|
|
||||||
import net.dv8tion.jda.api.events.guild.voice.GuildVoiceMoveEvent;
|
|
||||||
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
||||||
|
|
||||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||||
@@ -22,7 +19,6 @@ import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
|||||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.audio.GuildMusicManager;
|
import fr.Skydust.JdrBot.audio.GuildMusicManager;
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUI;
|
|
||||||
|
|
||||||
public class PlayMusic extends Command {
|
public class PlayMusic extends Command {
|
||||||
private static final AudioPlayerManager playerManager = new DefaultAudioPlayerManager();
|
private static final AudioPlayerManager playerManager = new DefaultAudioPlayerManager();
|
||||||
@@ -42,19 +38,14 @@ public class PlayMusic extends Command {
|
|||||||
if(!e.getMember().hasPermission(Permission.ADMINISTRATOR)) {
|
if(!e.getMember().hasPermission(Permission.ADMINISTRATOR)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: MAKE SURE ONLY ONE JUKEBOX PER GUILD
|
||||||
if(JukeboxGUISystem.getGuildsJukebox(e.getGuild()) != null) {
|
if(JukeboxGUISystem.getGuildsJukebox(e.getGuild()) != null) {
|
||||||
e.getChannel().sendMessage("/!\\ Le lecteur audio est deja present ici ! Pour l'arreter, tapez \"!stopmusic\" !").queue();
|
e.getChannel().sendMessage("/!\\ Le lecteur audio est deja present ici ! Pour l'arreter, tapez \"!stopmusic\" !").queue();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] args = e.getMessage().getContentRaw().split(" ");
|
e.getChannel().sendMessage("Loading...").queue(JukeboxSystem::new);
|
||||||
if (args.length != 1)
|
|
||||||
{
|
|
||||||
JukeboxGUISystem.createJukebox(e.getChannel(), args[1]);
|
|
||||||
} else {
|
|
||||||
JukeboxGUISystem.createJukebox(e.getChannel());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void loadAndPlay(final TextChannel channel, final String trackUrl, boolean loop, boolean nomsg) {
|
public static void loadAndPlay(final TextChannel channel, final String trackUrl, boolean loop, boolean nomsg) {
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package fr.Skydust.JdrBot.cmds.playmusic;
|
package fr.Skydust.JdrBot.cmds.playmusic;
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.cmds.record.Record;
|
import fr.Skydust.JdrBot.cmds.record.Record;
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUI;
|
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem;
|
|
||||||
import fr.Skydust.JdrBot.stock.Command;
|
import fr.Skydust.JdrBot.stock.Command;
|
||||||
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;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package fr.Skydust.JdrBot.cmds.record;
|
package fr.Skydust.JdrBot.cmds.record;
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem;
|
|
||||||
import fr.Skydust.JdrBot.stock.Command;
|
import fr.Skydust.JdrBot.stock.Command;
|
||||||
import fr.Skydust.JdrBot.stock.RecordState;
|
import fr.Skydust.JdrBot.stock.RecordState;
|
||||||
import fr.Skydust.JdrBot.utils.MessageType;
|
import fr.Skydust.JdrBot.utils.MessageType;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package fr.Skydust.JdrBot.cmds.record;
|
package fr.Skydust.JdrBot.cmds.record;
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem;
|
|
||||||
import fr.Skydust.JdrBot.stock.Command;
|
import fr.Skydust.JdrBot.stock.Command;
|
||||||
import fr.Skydust.JdrBot.stock.RecordState;
|
import fr.Skydust.JdrBot.stock.RecordState;
|
||||||
import fr.Skydust.JdrBot.utils.MessageType;
|
import fr.Skydust.JdrBot.utils.MessageType;
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
package fr.Skydust.JdrBot.jukebox;
|
|
||||||
|
|
||||||
public class JukeboxGUI {
|
|
||||||
public String MessageID = "";
|
|
||||||
public int prevSong = -1;
|
|
||||||
public String TextChannelID = "";
|
|
||||||
public String Menu = "mainMenu";
|
|
||||||
|
|
||||||
public JukeboxGUI(String textChannelID, String MessageID, String Menu) {
|
|
||||||
this.MessageID = MessageID;
|
|
||||||
this.TextChannelID = textChannelID;
|
|
||||||
this.Menu = Menu;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
package fr.Skydust.JdrBot.jukebox;
|
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.cmds.playmusic.PlayMusic;
|
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.TextChannel;
|
|
||||||
import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
public class JukeboxGUISystem {
|
|
||||||
/*0to10*/
|
|
||||||
public static final String[] AllChars = {"\u0030\u20E3","\u0031\u20E3","\u0032\u20E3","\u0033\u20E3","\u0034\u20E3","\u0035\u20E3","\u0036\u20E3","\u0037\u20E3","\u0038\u20E3","\u0039\u20E3","\uD83D\uDD1F",
|
|
||||||
/*Alphabet*/ "\uD83C\uDDE6","\uD83C\uDDE7","\uD83C\uDDE8","\uD83C\uDDE9","\uD83C\uDDEA","\uD83C\uDDEB","\uD83C\uDDEC","\uD83C\uDDED","\uD83C\uDDEE","\uD83C\uDDEF","\uD83C\uDDF0","\uD83C\uDDF1","\uD83C\uDDF2","\uD83C\uDDF3","\uD83C\uDDF4","\uD83C\uDDF5","\uD83C\uDDF6","\uD83C\uDDF7","\uD83C\uDDF8","\uD83C\uDDF9","\uD83C\uDDFA","\uD83C\uDDFB","\uD83C\uDDFC","\uD83C\uDDFD","\uD83C\uDDFE","\uD83C\uDDFF"};
|
|
||||||
|
|
||||||
public static final String UP = "\uD83D\uDD3C";
|
|
||||||
public static final String DOWN = "\uD83D\uDD3D";
|
|
||||||
public static final String SELECT = "\u2705";
|
|
||||||
public static final String CANCEL = "\u274E";
|
|
||||||
|
|
||||||
private static String songsLocation = "Songs";
|
|
||||||
|
|
||||||
public static HashMap<String, JukeboxGUI> JukeboxGUIs = new HashMap<String, JukeboxGUI>();
|
|
||||||
|
|
||||||
public static void createJukebox(TextChannel tc) {
|
|
||||||
createJukebox(tc, "mainMenu");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void createJukebox(TextChannel tc, String menu) {
|
|
||||||
File path = new File(songsLocation + ((menu.equals("mainMenu") ? "" : "/"+menu)));
|
|
||||||
|
|
||||||
if(!path.exists())
|
|
||||||
return;
|
|
||||||
|
|
||||||
String[] filePaths = path.list();
|
|
||||||
|
|
||||||
StringBuilder str = new StringBuilder();
|
|
||||||
int i = 0;
|
|
||||||
for (String s : filePaths) {
|
|
||||||
str.append(AllChars[i]+":"+s+"\n");
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
tc.sendMessage(new MessageBuilder().append("Music Player 3000").setEmbed(new EmbedBuilder().setThumbnail("https://cdn4.iconfinder.com/data/icons/miu/24/device-volume-loudspeaker-speaker-up-glyph-128.png").setTitle("Choisi un jdr:",null).setColor(Color.green).setDescription("\n"+str.toString()).build()).build()).queue(msg -> {
|
|
||||||
for(int i2=0;i2<filePaths.length;i2++) {
|
|
||||||
msg.addReaction(AllChars[i2]).queue();
|
|
||||||
}
|
|
||||||
|
|
||||||
JukeboxGUIs.put(msg.getGuild().getId(), new JukeboxGUI(msg.getTextChannel().getId(),msg.getId(), menu));
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void onMessageReactionAdd(MessageReactionAddEvent e) {
|
|
||||||
if(e.getChannel() instanceof TextChannel) {
|
|
||||||
TextChannel tc = (TextChannel) e.getChannel();
|
|
||||||
JukeboxGUI cm = JukeboxGUIs.get(tc.getGuild().getId());
|
|
||||||
|
|
||||||
if(cm != null && cm.MessageID.equals(e.getMessageId()) && !e.getUser().isBot()) {
|
|
||||||
e.getReaction().removeReaction(e.getUser()).queue();
|
|
||||||
if(tc.getGuild().getMember(e.getUser()).getVoiceState().getChannel() == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int i=0;
|
|
||||||
for(String s : AllChars){
|
|
||||||
if(s.equals(e.getReaction().getReactionEmote().getEmoji().replace("(null)","").replace("RE:",""))) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
//Autre Emote TG
|
|
||||||
if(i == 37){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int i2 = i;
|
|
||||||
|
|
||||||
e.getChannel().retrieveMessageById(e.getMessageId()).queue(msg -> {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (String s : msg.getEmbeds().get(0).getDescription().split("\n")) {
|
|
||||||
if (s.contains(AllChars[i2])) {
|
|
||||||
sb.append(s.replaceAll(AllChars[i2] + ":", ""));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (cm.Menu.equals("mainMenu")) {
|
|
||||||
String[] filePaths = new File("Songs/" + sb.toString()).list();
|
|
||||||
|
|
||||||
// Si "i2", qui est le nombre du choix que tu viens de cliquer, est au dessus du nombre d'options du menu >> Annuler
|
|
||||||
// OU
|
|
||||||
// Si il essaye de mettre un menu avec + de 20 reactions >> Annuler
|
|
||||||
|
|
||||||
if (i2 > new File("Songs/").list().length || filePaths.length > 20) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder str = new StringBuilder();
|
|
||||||
int i3 = 0;
|
|
||||||
for (String s : filePaths) {
|
|
||||||
str.append(AllChars[i3] + ":" + s.replace(".mp3", "") + "\n");
|
|
||||||
i3++;
|
|
||||||
}
|
|
||||||
|
|
||||||
str.append(AllChars[i3] + ":Retour");
|
|
||||||
|
|
||||||
msg.editMessage(new MessageBuilder().append("Music Player 3000").setEmbed(new EmbedBuilder().setThumbnail("https://cdn4.iconfinder.com/data/icons/miu/24/device-volume-loudspeaker-speaker-up-glyph-128.png").setTitle("Choisi une musique:", null).setColor(Color.green).setDescription("\n" + str.toString()).build()).build()).queue(msg2 -> {
|
|
||||||
//msg2.clearReactions().queue(msg3 -> {
|
|
||||||
try {
|
|
||||||
for (int i4 = 0; i4 < filePaths.length + 1; i4++) {
|
|
||||||
msg2.addReaction(AllChars[i4]).queue();
|
|
||||||
}
|
|
||||||
|
|
||||||
cm.Menu = sb.toString();
|
|
||||||
} catch (Exception e5) {
|
|
||||||
e5.printStackTrace();
|
|
||||||
}
|
|
||||||
//});
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (sb.toString().equals("Retour") || sb.toString().equals("")) {
|
|
||||||
String[] filePaths = new File("Songs").list();
|
|
||||||
|
|
||||||
if (i2 > new File("Songs/" + cm.Menu + "/").list().length || filePaths.length > 20) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder str = new StringBuilder();
|
|
||||||
int i9 = 0;
|
|
||||||
for (String s : filePaths) {
|
|
||||||
str.append(AllChars[i9] + ":" + s + "\n");
|
|
||||||
i9++;
|
|
||||||
}
|
|
||||||
msg.editMessage(new MessageBuilder().append("Music Player 3000").setEmbed(new EmbedBuilder().setThumbnail("https://cdn4.iconfinder.com/data/icons/miu/24/device-volume-loudspeaker-speaker-up-glyph-128.png").setTitle("Choisi un jdr:", null).setColor(Color.green).setDescription("\n" + str.toString()).build()).build()).queue(msg1 -> {
|
|
||||||
for (int y = filePaths.length; y < msg1.getReactions().size(); y++) {
|
|
||||||
msg1.getReactions().get(y).removeReaction().queue();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
for (int i8 = 0; i8 < filePaths.length; i8++) {
|
|
||||||
msg1.addReaction(AllChars[i8]).queue();
|
|
||||||
}
|
|
||||||
JukeboxGUIs.get(e.getGuild().getId()).Menu = "mainMenu";
|
|
||||||
|
|
||||||
} catch (Exception e5) {
|
|
||||||
e5.printStackTrace();
|
|
||||||
}
|
|
||||||
//});
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
tc.getGuild().getAudioManager().openAudioConnection(tc.getGuild().getMember(e.getUser()).getVoiceState().getChannel());
|
|
||||||
if (cm.prevSong == -1) {
|
|
||||||
msg.editMessage(new MessageBuilder().append("Music Player 3000").setEmbed(new EmbedBuilder().setThumbnail("https://cdn4.iconfinder.com/data/icons/miu/24/device-volume-loudspeaker-speaker-up-glyph-128.png").setTitle("Choisi une musique:", null).setColor(Color.green).setDescription(msg.getEmbeds().get(0).getDescription().replace(AllChars[i2], "\u25B6" + AllChars[i2])).build()).build()).queue();
|
|
||||||
} else {
|
|
||||||
msg.editMessage(new MessageBuilder().append("Music Player 3000").setEmbed(new EmbedBuilder().setThumbnail("https://cdn4.iconfinder.com/data/icons/miu/24/device-volume-loudspeaker-speaker-up-glyph-128.png").setTitle("Choisi une musique:", null).setColor(Color.green).setDescription(msg.getEmbeds().get(0).getDescription().replace("\u25B6", "").replace(AllChars[i2], "\u25B6" + AllChars[i2])).build()).build()).queue();
|
|
||||||
}
|
|
||||||
cm.prevSong = i2;
|
|
||||||
PlayMusic.loadAndPlay(tc, "Songs/" + cm.Menu + "/" + sb.toString() + ".mp3", true, true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static synchronized JukeboxGUI getGuildsJukebox(Guild guild) {
|
|
||||||
return JukeboxGUIs.get(guild.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setGuildsJukebox(Guild guild, JukeboxGUI gui) {
|
|
||||||
JukeboxGUIs.put(guild.getId(), gui);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
149
src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxSystem.java
Normal file
149
src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxSystem.java
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
package fr.Skydust.JdrBot.jukebox;
|
||||||
|
|
||||||
|
import fr.Skydust.JdrBot.cmds.playmusic.PlayMusic;
|
||||||
|
import fr.Skydust.JdrBot.cmds.playmusic.StopMusic;
|
||||||
|
import fr.Skydust.JdrBot.menu.Menu;
|
||||||
|
import fr.Skydust.JdrBot.menu.MenuSystem;
|
||||||
|
import fr.Skydust.JdrBot.utils.Utils;
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import net.dv8tion.jda.api.entities.TextChannel;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class JukeboxSystem {
|
||||||
|
// Const
|
||||||
|
public static final String initialFolder = "Songs";
|
||||||
|
public static final String musicPlayerThumbnail = "https://cdn4.iconfinder.com/data/icons/miu/24/device-volume-loudspeaker-speaker-up-glyph-128.png";
|
||||||
|
|
||||||
|
// Dyn
|
||||||
|
// Keeping track of the song currently played to update menus accordingly
|
||||||
|
// Example : "Songs/Spell Temps/Temps ville 2"
|
||||||
|
public String songPlayedPath = "";
|
||||||
|
|
||||||
|
private final HashMap<String, Menu> linkedPath = new HashMap<>();
|
||||||
|
private final Message jukeboxMessage;
|
||||||
|
|
||||||
|
private String currentFolder = "";
|
||||||
|
|
||||||
|
public JukeboxSystem(Message msg) {
|
||||||
|
jukeboxMessage = msg;
|
||||||
|
openFolder(initialFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void openFolder(String newPath) {
|
||||||
|
currentFolder = newPath;
|
||||||
|
|
||||||
|
// If the menu to this path is not created, make and register it.
|
||||||
|
Menu menu = linkedPath.get(currentFolder);
|
||||||
|
|
||||||
|
if(menu == null) {
|
||||||
|
List<String> items = new ArrayList<>();
|
||||||
|
File[] files = new File(currentFolder).listFiles();
|
||||||
|
|
||||||
|
if(files.length != 0) {
|
||||||
|
// Sort files by alphabetical order with directories first
|
||||||
|
Arrays.sort(files, sortItemsComp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Makes this style
|
||||||
|
* 0️⃣ 📁 Directory
|
||||||
|
* 1️⃣ 🎵 Song
|
||||||
|
* 2️⃣ 🔉 Played Song
|
||||||
|
*/
|
||||||
|
for (File file : files) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
|
sb.append(Utils.CharsUnicodeArray[items.size()]).append(" ");
|
||||||
|
|
||||||
|
if(file.isDirectory())
|
||||||
|
sb.append(Utils.FolderUnicode);
|
||||||
|
else
|
||||||
|
sb.append(Utils.SongUnicode);
|
||||||
|
|
||||||
|
sb.append(" ");
|
||||||
|
sb.append(file.getName().replaceAll(".mp3", ""));
|
||||||
|
|
||||||
|
items.add(sb.toString());
|
||||||
|
}
|
||||||
|
// If it isn't the root folder, place the return button
|
||||||
|
if(!currentFolder.equals(initialFolder)) {
|
||||||
|
items.add(Utils.ReturnUnicode + Utils.CharsUnicodeArray[items.size()] + " Retour");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
menu = linkedPath.put(currentFolder,
|
||||||
|
new Menu("Music Player 4000", "Choisis la musique :", musicPlayerThumbnail, (String[]) items.toArray()) {
|
||||||
|
@Override
|
||||||
|
public void onButtonClicked(Message msg, int itemId) {
|
||||||
|
String str = items[itemId];
|
||||||
|
|
||||||
|
// Loop back to open a subfolder
|
||||||
|
if (str.contains(Utils.FolderUnicode)) {
|
||||||
|
openFolder(currentFolder + "/" + getFileNameFromItem(str));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return button
|
||||||
|
if (itemId == items.length - 1) {
|
||||||
|
// Back one menu
|
||||||
|
String subFolder = currentFolder.substring(0, currentFolder.lastIndexOf("/"));
|
||||||
|
MenuSystem.changeMenu(msg, linkedPath.get(subFolder));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not already playing
|
||||||
|
if (str.contains(Utils.SongUnicode)) {
|
||||||
|
if(!songPlayedPath.equals("")) {
|
||||||
|
String folder = songPlayedPath.substring(0, songPlayedPath.lastIndexOf("/"));
|
||||||
|
int previousSongItemID = Integer.parseInt(songPlayedPath.substring(songPlayedPath.lastIndexOf("/")));
|
||||||
|
|
||||||
|
Menu previousMenu = linkedPath.get(folder);
|
||||||
|
previousMenu.items[previousSongItemID] = previousMenu.items[previousSongItemID].replace(Utils.PlayUnicode, Utils.SongUnicode);
|
||||||
|
}
|
||||||
|
items[itemId] = items[itemId].replace(Utils.SongUnicode, Utils.PlayUnicode);
|
||||||
|
|
||||||
|
String songPath = currentFolder + getFileNameFromItem(str) + ".mp3";
|
||||||
|
PlayMusic.loadAndPlay(jukeboxMessage.getTextChannel(), songPath, true, true);
|
||||||
|
|
||||||
|
// Format: Songs/Folder/Folder/2
|
||||||
|
songPlayedPath = currentFolder + "/" + itemId;
|
||||||
|
|
||||||
|
// Reload the current menu
|
||||||
|
MenuSystem.changeMenu(msg, this);
|
||||||
|
} else {
|
||||||
|
//If already playing, stop the song
|
||||||
|
items[itemId] = items[itemId].replace(Utils.PlayUnicode, Utils.SongUnicode);
|
||||||
|
StopMusic.stopMusic(jukeboxMessage.getGuild());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
MenuSystem.changeMenu(jukeboxMessage, menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getFileNameFromItem(String item) {
|
||||||
|
return item.split(" ", 3)[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Comparator sortItemsComp = (o1, o2) -> {
|
||||||
|
File f1 = (File) o1;
|
||||||
|
File f2 = (File) o2;
|
||||||
|
if (f1.isDirectory() && !f2.isDirectory())
|
||||||
|
{
|
||||||
|
// Directory before non-directory
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else if (!f1.isDirectory() && f2.isDirectory())
|
||||||
|
{
|
||||||
|
// Non-directory after directory
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Alphabetic order otherwise
|
||||||
|
//return o1.compareTo(o2);
|
||||||
|
return f1.compareTo(f2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
53
src/main/java/fr/Skydust/JdrBot/menu/Menu.java
Normal file
53
src/main/java/fr/Skydust/JdrBot/menu/Menu.java
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
package fr.Skydust.JdrBot.menu;
|
||||||
|
|
||||||
|
import fr.Skydust.JdrBot.utils.Utils;
|
||||||
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import net.dv8tion.jda.api.entities.TextChannel;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
|
||||||
|
public class Menu {
|
||||||
|
public String thumbnail;
|
||||||
|
public String name;
|
||||||
|
public String title;
|
||||||
|
|
||||||
|
public String[] items;
|
||||||
|
|
||||||
|
public Menu(String name, String title, String thumbnail, String[] items) {
|
||||||
|
this.name = name;
|
||||||
|
this.title = title;
|
||||||
|
this.thumbnail = thumbnail;
|
||||||
|
this.items = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onButtonClicked(Message msg, int itemId) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Builds the menu message */
|
||||||
|
public Message makeMessage() {
|
||||||
|
StringBuilder str = new StringBuilder();
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (String s : items) {
|
||||||
|
str.append(Utils.CharsUnicodeArray[i] +":"+ s +"\n");
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new MessageBuilder()
|
||||||
|
.append(name)
|
||||||
|
.setEmbed(
|
||||||
|
new EmbedBuilder()
|
||||||
|
.setThumbnail(thumbnail)
|
||||||
|
.setTitle(title,null)
|
||||||
|
.setColor(Color.green)
|
||||||
|
.setDescription("\n"+ str)
|
||||||
|
.build())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
79
src/main/java/fr/Skydust/JdrBot/menu/MenuSystem.java
Normal file
79
src/main/java/fr/Skydust/JdrBot/menu/MenuSystem.java
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
package fr.Skydust.JdrBot.menu;
|
||||||
|
|
||||||
|
import fr.Skydust.JdrBot.utils.Utils;
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import net.dv8tion.jda.api.entities.TextChannel;
|
||||||
|
import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class MenuSystem {
|
||||||
|
private static HashMap<Message, Menu> menuHash = new HashMap<>();
|
||||||
|
|
||||||
|
/** Action Listening */
|
||||||
|
public static void onMessageReactionAdd(MessageReactionAddEvent e) {
|
||||||
|
if (e.getChannel() instanceof TextChannel) {
|
||||||
|
if(e.getUser().isBot())
|
||||||
|
return;
|
||||||
|
|
||||||
|
e.getChannel().retrieveMessageById(e.getMessageId()).queue(msg -> {
|
||||||
|
|
||||||
|
// Check if the message has a menu associated
|
||||||
|
Menu menu = menuHash.get(msg);
|
||||||
|
if (menu != null) {
|
||||||
|
|
||||||
|
e.getReaction().removeReaction(e.getUser()).queue();
|
||||||
|
|
||||||
|
// Check if the emote is valid and get id
|
||||||
|
int emoteId = 0;
|
||||||
|
for(String s : Utils.CharsUnicodeArray){
|
||||||
|
if(s.equals(e.getReaction().getReactionEmote().getEmoji().replace("(null)","").replace("RE:",""))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
emoteId++;
|
||||||
|
}
|
||||||
|
// Do not proceed if not valid
|
||||||
|
if(emoteId > Utils.CharsUnicodeArray.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.onButtonClicked(msg, emoteId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Create a new menu message and add it the the specified channel */
|
||||||
|
public static void setupMenuWithMessage(TextChannel channel, Menu menu) {
|
||||||
|
channel.sendMessage(menu.makeMessage()).queue(msg ->
|
||||||
|
{
|
||||||
|
addReactions(msg, menu);
|
||||||
|
menuHash.put(msg, menu);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Adds missing reactions */
|
||||||
|
public static void addReactions(Message msg, Menu menu) {
|
||||||
|
for (int i = msg.getReactions().size(); i < menu.items.length; i++) {
|
||||||
|
msg.addReaction(Utils.CharsUnicodeArray[i]).queue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Edit the message to be the new menu */
|
||||||
|
public static void changeMenu(Message currentMessage, Menu newMenu) {
|
||||||
|
// If null, unbind menu
|
||||||
|
if(newMenu == null) {
|
||||||
|
menuHash.put(currentMessage, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentMessage.editMessage(newMenu.makeMessage()).queue();
|
||||||
|
|
||||||
|
// Remove excess reactions
|
||||||
|
for (int y = newMenu.items.length; y < currentMessage.getReactions().size(); y++) {
|
||||||
|
currentMessage.getReactions().get(y).removeReaction().queue();
|
||||||
|
}
|
||||||
|
addReactions(currentMessage, newMenu);
|
||||||
|
menuHash.put(currentMessage, newMenu);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +1,10 @@
|
|||||||
package fr.Skydust.JdrBot.stock;
|
package fr.Skydust.JdrBot.stock;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.nio.ByteOrder;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.zip.ZipException;
|
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem;
|
|
||||||
import fr.Skydust.JdrBot.utils.MessageType;
|
import fr.Skydust.JdrBot.utils.MessageType;
|
||||||
import fr.Skydust.JdrBot.utils.Utils;
|
import fr.Skydust.JdrBot.utils.Utils;
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
|
|||||||
@@ -1,17 +1,23 @@
|
|||||||
package fr.Skydust.JdrBot.utils;
|
package fr.Skydust.JdrBot.utils;
|
||||||
|
|
||||||
import fr.Skydust.JdrBot.JdrBot;
|
import fr.Skydust.JdrBot.JdrBot;
|
||||||
import fr.Skydust.JdrBot.cmds.record.Record;
|
|
||||||
import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem;
|
|
||||||
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.Guild;
|
|
||||||
import net.dv8tion.jda.api.entities.TextChannel;
|
import net.dv8tion.jda.api.entities.TextChannel;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
|
||||||
public class Utils {
|
public class Utils {
|
||||||
|
/*0to10*/
|
||||||
|
public static final String[] CharsUnicodeArray = {"\u0030\u20E3","\u0031\u20E3","\u0032\u20E3","\u0033\u20E3","\u0034\u20E3","\u0035\u20E3","\u0036\u20E3","\u0037\u20E3","\u0038\u20E3","\u0039\u20E3","\uD83D\uDD1F",
|
||||||
|
/*Alphabet*/ "\uD83C\uDDE6","\uD83C\uDDE7","\uD83C\uDDE8","\uD83C\uDDE9","\uD83C\uDDEA","\uD83C\uDDEB","\uD83C\uDDEC","\uD83C\uDDED","\uD83C\uDDEE","\uD83C\uDDEF","\uD83C\uDDF0","\uD83C\uDDF1","\uD83C\uDDF2","\uD83C\uDDF3","\uD83C\uDDF4","\uD83C\uDDF5","\uD83C\uDDF6","\uD83C\uDDF7","\uD83C\uDDF8","\uD83C\uDDF9","\uD83C\uDDFA","\uD83C\uDDFB","\uD83C\uDDFC","\uD83C\uDDFD","\uD83C\uDDFE","\uD83C\uDDFF"};
|
||||||
|
|
||||||
|
public static final String PlayUnicode = "\uD83D\uDD09";
|
||||||
|
public static final String SongUnicode = "\uD83C\uDFB5";
|
||||||
|
public static final String FolderUnicode = "\uD83D\uDCC1";
|
||||||
|
public static final String ReturnUnicode = "\u21A9";
|
||||||
|
|
||||||
public static boolean IsInt(String info) {
|
public static boolean IsInt(String info) {
|
||||||
try {
|
try {
|
||||||
Integer.parseInt(info);
|
Integer.parseInt(info);
|
||||||
|
|||||||
Reference in New Issue
Block a user