From 13614e0b7bc7e9dcc303db79825014a4e698f5cc Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 6 Jun 2023 17:01:17 -0400 Subject: [PATCH] Use bare /play to resume playback This replaces the /resume command since most people don't think "pause and resume" as much as "play and pause". --- lib/sergei/consumer.ex | 41 ++++++++++++++++++----------------------- lib/sergei/player.ex | 26 +++++++++++++------------- 2 files changed, 31 insertions(+), 36 deletions(-) diff --git a/lib/sergei/consumer.ex b/lib/sergei/consumer.ex index 3d911ca..68bf975 100644 --- a/lib/sergei/consumer.ex +++ b/lib/sergei/consumer.ex @@ -11,15 +11,14 @@ defmodule Sergei.Consumer do end @play_opts [ - opt.(3, "url", "URL of the audio to play", required: true) + opt.(3, "url", "URL of the audio to play", []) ] @slash_commands [ {"ping", "Pong", []}, - {"play", "Play some tunes", @play_opts}, - {"stop", "Stop media playback and leave the voice channel", []}, + {"play", "Play a song or resume playback", @play_opts}, {"pause", "Pause media playback", []}, - {"resume", "Resume media playback", []} + {"stop", "Stop media playback and leave the voice channel", []} ] def start_link do @@ -89,15 +88,11 @@ defmodule Sergei.Consumer do end # /play - def do_command( - %{ - guild_id: guild_id, - member: %{user: %{id: invoker_id}}, - data: %{name: "play", options: opts} - } = _interaction - ) do - [%{name: "url", value: url}] = opts - + def do_command(%{ + guild_id: guild_id, + member: %{user: %{id: invoker_id}}, + data: %{name: "play", options: [%{name: "url", value: url}]} + }) do case Sergei.VoiceStateCache.get_state(invoker_id) do %{guild_id: id} = _res when guild_id != id -> {:error, "You're not connected to a voice channel in this server."} @@ -110,17 +105,17 @@ defmodule Sergei.Consumer do end end - # /stop - def do_command(%{guild_id: guild_id, data: %{name: "stop"}}) do - case Sergei.Player.stop(guild_id) do + # /play + def do_command(%{guild_id: guild_id, data: %{name: "play"}}) do + case Sergei.Player.resume(guild_id) do :ok -> - {:ok, "Bye!"} + {:ok, "Resuming playback..."} :not_playing -> {:ok, "I'm not playing anything right now."} {:error, err} -> - Logger.error("Failed to stop media: #{err}") + Logger.error("Failed to resume media: #{err}") {:error, "This is embarrasing..."} end end @@ -140,17 +135,17 @@ defmodule Sergei.Consumer do end end - # /resume - def do_command(%{guild_id: guild_id, data: %{name: "resume"}}) do - case Sergei.Player.resume(guild_id) do + # /stop + def do_command(%{guild_id: guild_id, data: %{name: "stop"}}) do + case Sergei.Player.stop(guild_id) do :ok -> - {:ok, "Resuming..."} + {:ok, "Bye!"} :not_playing -> {:ok, "I'm not playing anything right now."} {:error, err} -> - Logger.error("Failed to resume media: #{err}") + Logger.error("Failed to stop media: #{err}") {:error, "This is embarrasing..."} end end diff --git a/lib/sergei/player.ex b/lib/sergei/player.ex index 0a40fc0..1cb20e0 100644 --- a/lib/sergei/player.ex +++ b/lib/sergei/player.ex @@ -20,11 +20,6 @@ defmodule Sergei.Player do GenServer.call(__MODULE__, {:play, guild_id, channel_id, url}) end - @spec stop(integer()) :: :ok | :not_playing | {:error, String.t()} - def stop(guild_id) do - GenServer.call(__MODULE__, {:stop, guild_id}) - end - @spec pause(integer()) :: :ok | :not_playing | {:error, String.t()} def pause(guild_id) do GenServer.call(__MODULE__, {:pause, guild_id}) @@ -35,6 +30,11 @@ defmodule Sergei.Player do GenServer.call(__MODULE__, {:resume, guild_id}) end + @spec stop(integer()) :: :ok | :not_playing | {:error, String.t()} + def stop(guild_id) do + GenServer.call(__MODULE__, {:stop, guild_id}) + end + # Server @impl true def handle_info(:tick, state) do @@ -67,14 +67,6 @@ defmodule Sergei.Player do {:reply, :not_playing, state} end - @impl true - def handle_call({:stop, guild_id}, _from, state) do - Voice.stop(guild_id) - Voice.leave_channel(guild_id) - - {:reply, :ok, Map.delete(state, guild_id)} - end - @impl true def handle_call({:pause, guild_id}, _from, state) do %{url: url} = Map.fetch!(state, guild_id) @@ -103,6 +95,14 @@ defmodule Sergei.Player do {:reply, :ok, state} end + @impl true + def handle_call({:stop, guild_id}, _from, state) do + Voice.stop(guild_id) + Voice.leave_channel(guild_id) + + {:reply, :ok, Map.delete(state, guild_id)} + end + def play_music(guild_id, channel_id, url) do cond do Voice.get_channel_id(guild_id) != channel_id ->