feat: show current queue

When given a `/queue show` command, Sergei will print out a list of
songs in the current queue.  As this only outputs the URLs, we rely on
Discord to add the embeds and therefore title of the tracks.
This commit is contained in:
Roman Godmaire 2024-01-29 20:59:11 -05:00
parent 79cd041435
commit 684292eb3b
2 changed files with 38 additions and 1 deletions

View file

@ -11,7 +11,8 @@ defmodule Sergei.Commands.Queue do
@queue_commands [ @queue_commands [
opt.(1, "add", "Add a song to the queue", options: @queue_add_opts), 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 def subcommands() do
@ -43,4 +44,22 @@ defmodule Sergei.Commands.Queue do
{:ok, "I'm not playing anything right now."} {:ok, "I'm not playing anything right now."}
end end
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 end

View file

@ -34,6 +34,11 @@ defmodule Sergei.Player do
GenServer.call(__MODULE__, {:queue_clear, guild_id}) GenServer.call(__MODULE__, {:queue_clear, guild_id})
end 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()} @spec pause(integer()) :: :ok | :not_playing | {:error, String.t()}
def pause(guild_id) do def pause(guild_id) do
GenServer.call(__MODULE__, {:pause, guild_id}) GenServer.call(__MODULE__, {:pause, guild_id})
@ -173,6 +178,19 @@ defmodule Sergei.Player do
} }
end 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 # Pause
@impl true @impl true
def handle_call({:pause, guild_id}, _from, state) do def handle_call({:pause, guild_id}, _from, state) do