diff --git a/src/main/java/moe/nekojimi/chords/Main.java b/src/main/java/moe/nekojimi/chords/Main.java index a47d741..13f93fc 100644 --- a/src/main/java/moe/nekojimi/chords/Main.java +++ b/src/main/java/moe/nekojimi/chords/Main.java @@ -37,6 +37,7 @@ public class Main extends ListenerAdapter private MusicHandler musicHandler; private final Downloader downloader; private final Searcher searcher; + private final QueueManager queueManager; private JDA jda; private final Map commands = new HashMap<>(); @@ -81,6 +82,8 @@ public class Main extends ListenerAdapter public Main() { log("INFO", "Starting up..."); + + // init downloader downloader = new Downloader(); downloader.setMessageHandler((Song song, Exception ex) -> { @@ -110,8 +113,14 @@ public class Main extends ListenerAdapter } }); + + // init searcher searcher = MetaSearcher.loadYAML(new File("searchproviders.yml")); + // init queue manager + queueManager = new QueueManager(); + + // init commands addCommand(new JoinCommand(this)); addCommand(new LeaveCommand(this)); addCommand(new PlayCommand(this)); @@ -200,7 +209,7 @@ public class Main extends ListenerAdapter song.setRequestedIn(event.getChannel().getId()); song.setNumber(trackNumber); trackNumber++; - downloader.accept(new Downloader.DownloadTask(song, musicHandler)); + downloader.accept(new Downloader.DownloadTask(song, queueManager)); return song; } @@ -281,6 +290,10 @@ public class Main extends ListenerAdapter return currentVoiceChannel; } + public QueueManager getQueueManager() + { + return queueManager; + } public int getTrackNumber() { diff --git a/src/main/java/moe/nekojimi/chords/MusicHandler.java b/src/main/java/moe/nekojimi/chords/MusicHandler.java index 6f84a50..a754b26 100644 --- a/src/main/java/moe/nekojimi/chords/MusicHandler.java +++ b/src/main/java/moe/nekojimi/chords/MusicHandler.java @@ -6,11 +6,7 @@ package moe.nekojimi.chords; import java.io.*; -import moe.nekojimi.chords.Util; import java.nio.ByteBuffer; -import java.util.LinkedList; -import java.util.Queue; -import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; import javax.sound.sampled.*; @@ -21,10 +17,11 @@ import org.apache.commons.io.input.buffer.CircularByteBuffer; * * @author jimj316 */ -public class MusicHandler implements AudioSendHandler, Closeable, Consumer +public class MusicHandler implements AudioSendHandler, Closeable { - private final LinkedList songQueue = new LinkedList<>(); + private QueueManager queueManager; +// private final LinkedList songQueue = new LinkedList<>(); // private final Queue queue = new ConcurrentLinkedQueue<>(); private final CircularByteBuffer audioBuffer = new CircularByteBuffer(3840 * 1024); private boolean playing = true; @@ -53,37 +50,22 @@ public class MusicHandler implements AudioSendHandler, Closeable, Consumer } } - public void addSong(Song song) + void setQueueManager(QueueManager manager) { - System.out.println("Song added to queue: " + song.getLocation().getAbsolutePath()); - songQueue.add(song); - if (!canProvide() && playing) - nextSong(); - } - - public boolean removeSong(int i) - { - try - { - songQueue.remove(i); - return true; - } catch (ArrayIndexOutOfBoundsException ex) - { - return false; - } + queueManager = manager; } - public boolean removeSong(Song song) + public void playNext() { - return songQueue.remove(song); + nextSong(true); } - public boolean restartSong() - { - songQueue.addFirst(currentSong); - currentSong = null; - return nextSong(true); - } +// public boolean restartSong() +// { +//// songQueue.addFirst(currentSong); +// currentSong = null; +// return nextSong(true); +// } private boolean nextSong() { @@ -106,7 +88,7 @@ public class MusicHandler implements AudioSendHandler, Closeable, Consumer currentSong.delete(); currentSong = null; } - currentSong = songQueue.poll(); + currentSong = queueManager.nextSongNeeded(); if (currentSong == null) { System.out.println("End of queue."); @@ -232,12 +214,6 @@ public class MusicHandler implements AudioSendHandler, Closeable, Consumer // } // return true; // } - - public Queue getSongQueue() - { - return songQueue; - } - public Song getCurrentSong() { return currentSong; @@ -254,9 +230,4 @@ public class MusicHandler implements AudioSendHandler, Closeable, Consumer { } - @Override - public void accept(Song t) - { - addSong(t); - } } diff --git a/src/main/java/moe/nekojimi/chords/Playlist.java b/src/main/java/moe/nekojimi/chords/Playlist.java index 0e1f335..2ba65d0 100644 --- a/src/main/java/moe/nekojimi/chords/Playlist.java +++ b/src/main/java/moe/nekojimi/chords/Playlist.java @@ -61,4 +61,9 @@ public class Playlist return songs; } + Song getNextSong() + { + throw new UnsupportedOperationException("Not supported yet."); + } + } diff --git a/src/main/java/moe/nekojimi/chords/QueueManager.java b/src/main/java/moe/nekojimi/chords/QueueManager.java new file mode 100644 index 0000000..2382ca1 --- /dev/null +++ b/src/main/java/moe/nekojimi/chords/QueueManager.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2022 jimj316 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package moe.nekojimi.chords; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.function.Consumer; + +/** + * + * @author jimj316 + */ +public class QueueManager implements Consumer +{ + + private Mode mode; + private final Queue jukeboxQueue; + private Playlist playlist; + private MusicHandler handler; + + public QueueManager() + { + jukeboxQueue = new LinkedList<>(); + } + + @Override + public void accept(Song t) + { + jukeboxQueue.add(t); + + handler.playNext(); + } + + /** + * Called by the music handler when the current song has ended, or if + * playNext is called with nothing playing. + * + * @return the next track to play, or null to stop playing. + */ + public Song nextSongNeeded() + { + // if there's anything in the queue, play that first + if (!jukeboxQueue.isEmpty()) + { + return jukeboxQueue.poll(); + } + // otherwise if there's a playlist, shuffle from that + else if (playlist != null) + { + return playlist.getNextSong(); + } + // otherwise stop playing + else + return null; + } + + public MusicHandler getHandler() + { + return handler; + } + + public void addSong(Song song) + { + System.out.println("Song added to queue: " + song.getLocation().getAbsolutePath()); + jukeboxQueue.add(song); + + } + + public boolean removeSong(int i) + { + try + { + return jukeboxQueue.remove((Song) jukeboxQueue.toArray()[i]); + } catch (ArrayIndexOutOfBoundsException ex) + { + return false; + } + } + + public boolean removeSong(Song song) + { + return jukeboxQueue.remove(song); + } + + public void setHandler(MusicHandler handler) + { + this.handler = handler; + handler.setQueueManager(this); + } + + public Queue getJukeboxQueue() + { + return jukeboxQueue; + } + + public Playlist getPlaylist() + { + return playlist; + } + + public void setPlaylist(Playlist playlist) + { + this.playlist = playlist; + } + + public Mode getMode() + { + return mode; + } + + public void setMode(Mode mode) + { + this.mode = mode; + } + + public boolean restartSong() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + public enum Mode + { + JUKEBOX, + PLAYLIST; + } +} diff --git a/src/main/java/moe/nekojimi/chords/TrackPlayer.java b/src/main/java/moe/nekojimi/chords/TrackPlayer.java index a1aa680..4826ea6 100644 --- a/src/main/java/moe/nekojimi/chords/TrackPlayer.java +++ b/src/main/java/moe/nekojimi/chords/TrackPlayer.java @@ -8,8 +8,6 @@ package moe.nekojimi.chords; import java.io.Closeable; import java.io.IOException; import java.nio.ByteBuffer; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; @@ -47,7 +45,7 @@ public class TrackPlayer implements Closeable fillBuffer(false); } - boolean has(int byteCount) + public boolean has(int byteCount) { // return true; return audioBuffer.getCurrentNumberOfBytes() >= byteCount; @@ -132,7 +130,6 @@ public class TrackPlayer implements Closeable return true; } - @Override public void close() throws IOException { input.close(); diff --git a/src/main/java/moe/nekojimi/chords/commands/QueueCommand.java b/src/main/java/moe/nekojimi/chords/commands/QueueCommand.java index e01587d..e20f8f8 100644 --- a/src/main/java/moe/nekojimi/chords/commands/QueueCommand.java +++ b/src/main/java/moe/nekojimi/chords/commands/QueueCommand.java @@ -43,7 +43,7 @@ public class QueueCommand extends Command else message += ":mute: **Not playing anything right now.**\n"; - final Queue songQueue = bot.getMusicHandler().getSongQueue(); + final Queue songQueue = bot.getQueueManager().getJukeboxQueue(); if (!songQueue.isEmpty()) { message += "__Ready to play:__\n"; diff --git a/src/main/java/moe/nekojimi/chords/commands/RemoveCommand.java b/src/main/java/moe/nekojimi/chords/commands/RemoveCommand.java index 40679a0..b68b682 100644 --- a/src/main/java/moe/nekojimi/chords/commands/RemoveCommand.java +++ b/src/main/java/moe/nekojimi/chords/commands/RemoveCommand.java @@ -34,8 +34,8 @@ public class RemoveCommand extends Command try { int i = Integer.parseInt(arg.get(0)); - boolean removed = bot.getMusicHandler().removeSong(i - 1); - final int size = bot.getMusicHandler().getSongQueue().size(); + boolean removed = bot.getQueueManager().removeSong(i - 1); + final int size = bot.getQueueManager().getJukeboxQueue().size(); if (removed) event.getChannel().sendMessage("Song removed.").queue(); else if (size > 1) diff --git a/src/main/java/moe/nekojimi/chords/commands/RestartCommand.java b/src/main/java/moe/nekojimi/chords/commands/RestartCommand.java index 5cdac33..ee17125 100644 --- a/src/main/java/moe/nekojimi/chords/commands/RestartCommand.java +++ b/src/main/java/moe/nekojimi/chords/commands/RestartCommand.java @@ -32,7 +32,7 @@ public class RestartCommand extends Command public void call(GuildMessageReceivedEvent event, List arg) { // TODO: this needs to clear the current data queue - boolean ok = bot.getMusicHandler().restartSong(); + boolean ok = bot.getQueueManager().restartSong(); if (ok) event.getChannel().sendMessage("Restarted current song!").queue(); else