From 97abc9a1848852c7cad8c6d3253f3dcbbb4030a8 Mon Sep 17 00:00:00 2001 From: Skydust Date: Tue, 5 Oct 2021 02:31:31 +0200 Subject: [PATCH] =?UTF-8?q?(En=20cours)=20Refonte=20compl=C3=A8te=20du=20s?= =?UTF-8?q?yst=C3=A8me=20de=20jukebox=20et=20de=20menu.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/fr/Skydust/JdrBot/JdrBot.java | 2 +- .../fr/Skydust/JdrBot/JdrBotListener.java | 5 +- .../JdrBot/cmds/playmusic/PlayMusic.java | 17 +- .../JdrBot/cmds/playmusic/StopMusic.java | 2 - .../JdrBot/cmds/record/CancelRecord.java | 1 - .../JdrBot/cmds/record/StopRecord.java | 1 - .../fr/Skydust/JdrBot/jukebox/JukeboxGUI.java | 14 -- .../JdrBot/jukebox/JukeboxGUISystem.java | 175 ------------------ .../Skydust/JdrBot/jukebox/JukeboxSystem.java | 149 +++++++++++++++ .../java/fr/Skydust/JdrBot/menu/Menu.java | 53 ++++++ .../fr/Skydust/JdrBot/menu/MenuSystem.java | 79 ++++++++ .../fr/Skydust/JdrBot/stock/RecordState.java | 4 - .../java/fr/Skydust/JdrBot/utils/Utils.java | 12 +- 13 files changed, 297 insertions(+), 217 deletions(-) delete mode 100755 src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxGUI.java delete mode 100755 src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxGUISystem.java create mode 100644 src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxSystem.java create mode 100644 src/main/java/fr/Skydust/JdrBot/menu/Menu.java create mode 100644 src/main/java/fr/Skydust/JdrBot/menu/MenuSystem.java diff --git a/src/main/java/fr/Skydust/JdrBot/JdrBot.java b/src/main/java/fr/Skydust/JdrBot/JdrBot.java index bf407ee..4bc9827 100755 --- a/src/main/java/fr/Skydust/JdrBot/JdrBot.java +++ b/src/main/java/fr/Skydust/JdrBot/JdrBot.java @@ -17,7 +17,7 @@ import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.utils.cache.CacheFlag; public class JdrBot { - public static String Version = "2.62"; + public static String Version = "3.0"; public static JDA jda; public static LocalDateTime basedate; diff --git a/src/main/java/fr/Skydust/JdrBot/JdrBotListener.java b/src/main/java/fr/Skydust/JdrBot/JdrBotListener.java index 759df22..820c666 100755 --- a/src/main/java/fr/Skydust/JdrBot/JdrBotListener.java +++ b/src/main/java/fr/Skydust/JdrBot/JdrBotListener.java @@ -3,9 +3,8 @@ package fr.Skydust.JdrBot; import java.util.Random; import fr.Skydust.JdrBot.cmds.LastTimeOnline; -import fr.Skydust.JdrBot.cmds.playmusic.PlayMusic; 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 net.dv8tion.jda.api.events.guild.voice.GuildVoiceLeaveEvent; import net.dv8tion.jda.api.events.guild.voice.GuildVoiceMoveEvent; @@ -50,7 +49,7 @@ public class JdrBotListener extends ListenerAdapter { StopMusic.onGuildVoiceLeave(e); } @Override - public void onMessageReactionAdd(MessageReactionAddEvent e) { JukeboxGUISystem.onMessageReactionAdd(e); } + public void onMessageReactionAdd(MessageReactionAddEvent e) { MenuSystem.onMessageReactionAdd(e); } public boolean isACommand(String message, String cmd) { return message.matches("^("+ JdrBot.startcmdchar +")("+ cmd +")( .*|)$"); diff --git a/src/main/java/fr/Skydust/JdrBot/cmds/playmusic/PlayMusic.java b/src/main/java/fr/Skydust/JdrBot/cmds/playmusic/PlayMusic.java index a2fec55..0933311 100755 --- a/src/main/java/fr/Skydust/JdrBot/cmds/playmusic/PlayMusic.java +++ b/src/main/java/fr/Skydust/JdrBot/cmds/playmusic/PlayMusic.java @@ -3,14 +3,11 @@ package fr.Skydust.JdrBot.cmds.playmusic; import java.util.HashMap; import java.util.Map; -import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem; -import fr.Skydust.JdrBot.cmds.record.Record; +import fr.Skydust.JdrBot.jukebox.JukeboxSystem; import fr.Skydust.JdrBot.stock.Command; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Guild; 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 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 fr.Skydust.JdrBot.audio.GuildMusicManager; -import fr.Skydust.JdrBot.jukebox.JukeboxGUI; public class PlayMusic extends Command { private static final AudioPlayerManager playerManager = new DefaultAudioPlayerManager(); @@ -42,19 +38,14 @@ public class PlayMusic extends Command { if(!e.getMember().hasPermission(Permission.ADMINISTRATOR)) { return; } - + + //TODO: MAKE SURE ONLY ONE JUKEBOX PER GUILD if(JukeboxGUISystem.getGuildsJukebox(e.getGuild()) != null) { e.getChannel().sendMessage("/!\\ Le lecteur audio est deja present ici ! Pour l'arreter, tapez \"!stopmusic\" !").queue(); return; } - String[] args = e.getMessage().getContentRaw().split(" "); - if (args.length != 1) - { - JukeboxGUISystem.createJukebox(e.getChannel(), args[1]); - } else { - JukeboxGUISystem.createJukebox(e.getChannel()); - } + e.getChannel().sendMessage("Loading...").queue(JukeboxSystem::new); } public static void loadAndPlay(final TextChannel channel, final String trackUrl, boolean loop, boolean nomsg) { diff --git a/src/main/java/fr/Skydust/JdrBot/cmds/playmusic/StopMusic.java b/src/main/java/fr/Skydust/JdrBot/cmds/playmusic/StopMusic.java index c59b6ff..1531674 100755 --- a/src/main/java/fr/Skydust/JdrBot/cmds/playmusic/StopMusic.java +++ b/src/main/java/fr/Skydust/JdrBot/cmds/playmusic/StopMusic.java @@ -1,8 +1,6 @@ package fr.Skydust.JdrBot.cmds.playmusic; 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 net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Guild; diff --git a/src/main/java/fr/Skydust/JdrBot/cmds/record/CancelRecord.java b/src/main/java/fr/Skydust/JdrBot/cmds/record/CancelRecord.java index 92e3cd9..475a888 100755 --- a/src/main/java/fr/Skydust/JdrBot/cmds/record/CancelRecord.java +++ b/src/main/java/fr/Skydust/JdrBot/cmds/record/CancelRecord.java @@ -1,6 +1,5 @@ package fr.Skydust.JdrBot.cmds.record; -import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem; import fr.Skydust.JdrBot.stock.Command; import fr.Skydust.JdrBot.stock.RecordState; import fr.Skydust.JdrBot.utils.MessageType; diff --git a/src/main/java/fr/Skydust/JdrBot/cmds/record/StopRecord.java b/src/main/java/fr/Skydust/JdrBot/cmds/record/StopRecord.java index 75b8cc2..beedb7c 100755 --- a/src/main/java/fr/Skydust/JdrBot/cmds/record/StopRecord.java +++ b/src/main/java/fr/Skydust/JdrBot/cmds/record/StopRecord.java @@ -1,6 +1,5 @@ package fr.Skydust.JdrBot.cmds.record; -import fr.Skydust.JdrBot.jukebox.JukeboxGUISystem; import fr.Skydust.JdrBot.stock.Command; import fr.Skydust.JdrBot.stock.RecordState; import fr.Skydust.JdrBot.utils.MessageType; diff --git a/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxGUI.java b/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxGUI.java deleted file mode 100755 index 1e66ed8..0000000 --- a/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxGUI.java +++ /dev/null @@ -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; - } -} diff --git a/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxGUISystem.java b/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxGUISystem.java deleted file mode 100755 index 1dd0a47..0000000 --- a/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxGUISystem.java +++ /dev/null @@ -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 JukeboxGUIs = new HashMap(); - - 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 { - 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); - } -} diff --git a/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxSystem.java b/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxSystem.java new file mode 100644 index 0000000..f5ed909 --- /dev/null +++ b/src/main/java/fr/Skydust/JdrBot/jukebox/JukeboxSystem.java @@ -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 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 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); + } + }; +} diff --git a/src/main/java/fr/Skydust/JdrBot/menu/Menu.java b/src/main/java/fr/Skydust/JdrBot/menu/Menu.java new file mode 100644 index 0000000..161b412 --- /dev/null +++ b/src/main/java/fr/Skydust/JdrBot/menu/Menu.java @@ -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(); + } + + +} diff --git a/src/main/java/fr/Skydust/JdrBot/menu/MenuSystem.java b/src/main/java/fr/Skydust/JdrBot/menu/MenuSystem.java new file mode 100644 index 0000000..cc07b6f --- /dev/null +++ b/src/main/java/fr/Skydust/JdrBot/menu/MenuSystem.java @@ -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 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); + } +} diff --git a/src/main/java/fr/Skydust/JdrBot/stock/RecordState.java b/src/main/java/fr/Skydust/JdrBot/stock/RecordState.java index 8bb1bc1..ce265d4 100755 --- a/src/main/java/fr/Skydust/JdrBot/stock/RecordState.java +++ b/src/main/java/fr/Skydust/JdrBot/stock/RecordState.java @@ -1,14 +1,10 @@ package fr.Skydust.JdrBot.stock; import java.io.*; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Date; 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.Utils; import net.dv8tion.jda.api.entities.Guild; diff --git a/src/main/java/fr/Skydust/JdrBot/utils/Utils.java b/src/main/java/fr/Skydust/JdrBot/utils/Utils.java index 3584249..220310e 100755 --- a/src/main/java/fr/Skydust/JdrBot/utils/Utils.java +++ b/src/main/java/fr/Skydust/JdrBot/utils/Utils.java @@ -1,17 +1,23 @@ package fr.Skydust.JdrBot.utils; 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.MessageBuilder; -import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.TextChannel; import java.awt.*; import java.time.Duration; 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) { try { Integer.parseInt(info);