diff --git a/lib/sergei/commands/queue.ex b/lib/sergei/commands/queue.ex index 7cef12d..86e98ad 100644 --- a/lib/sergei/commands/queue.ex +++ b/lib/sergei/commands/queue.ex @@ -11,7 +11,8 @@ defmodule Sergei.Commands.Queue do @queue_commands [ opt.(1, "add", "Add a song to the queue", options: @queue_add_opts), - opt.(1, "clear", "Clear the queue", []) + opt.(1, "clear", "Clear the queue", []), + opt.(1, "show", "Show the queue", []) ] def subcommands() do @@ -43,4 +44,22 @@ defmodule Sergei.Commands.Queue do {:ok, "I'm not playing anything right now."} end end + + def handle(guild_id, "show", _opts) do + case Sergei.Player.queue_list(guild_id) do + :not_playing -> + {:ok, "I'm not playing anything right now."} + + [] -> + {:ok, "The queue is empty."} + + songs_in_queue -> + song_list = + songs_in_queue + |> Enum.with_index(1) + |> Enum.reduce("", fn {song, idx}, acc -> acc <> "\n#{idx}. #{song}" end) + + {:ok, song_list} + end + end end diff --git a/lib/sergei/player.ex b/lib/sergei/player.ex index 85cbab2..1df8960 100644 --- a/lib/sergei/player.ex +++ b/lib/sergei/player.ex @@ -34,6 +34,11 @@ defmodule Sergei.Player do GenServer.call(__MODULE__, {:queue_clear, guild_id}) end + @spec queue_list(integer()) :: [String.t()] | :not_playing + def queue_list(guild_id) do + GenServer.call(__MODULE__, {:queue_list, guild_id}) + end + @spec pause(integer()) :: :ok | :not_playing | {:error, String.t()} def pause(guild_id) do GenServer.call(__MODULE__, {:pause, guild_id}) @@ -173,6 +178,19 @@ defmodule Sergei.Player do } end + # Queue List + @impl true + def handle_call({:queue_list, guild_id}, _from, state) do + { + :reply, + state + |> Map.get(guild_id) + |> Map.get(:queue) + |> :queue.to_list(), + state + } + end + # Pause @impl true def handle_call({:pause, guild_id}, _from, state) do