From 6a5498410c29fa57554f4ab5d7d6e987e23d1abf Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 6 Jun 2023 17:01:17 -0400 Subject: [PATCH] Create stop (disconnenct) command --- lib/sergei/consumer.ex | 20 ++++++++++++++++++-- lib/sergei/player.ex | 13 +++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/sergei/consumer.ex b/lib/sergei/consumer.ex index 5439a30..3d911ca 100644 --- a/lib/sergei/consumer.ex +++ b/lib/sergei/consumer.ex @@ -16,9 +16,10 @@ defmodule Sergei.Consumer do @slash_commands [ {"ping", "Pong", []}, + {"play", "Play some tunes", @play_opts}, + {"stop", "Stop media playback and leave the voice channel", []}, {"pause", "Pause media playback", []}, - {"resume", "Resume media playback", []}, - {"play", "Play some tunes", @play_opts} + {"resume", "Resume media playback", []} ] def start_link do @@ -109,6 +110,21 @@ 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 + :ok -> + {:ok, "Bye!"} + + :not_playing -> + {:ok, "I'm not playing anything right now."} + + {:error, err} -> + Logger.error("Failed to stop media: #{err}") + {:error, "This is embarrasing..."} + end + end + # /pause def do_command(%{guild_id: guild_id, data: %{name: "pause"}}) do case Sergei.Player.pause(guild_id) do diff --git a/lib/sergei/player.ex b/lib/sergei/player.ex index c2ce051..0a40fc0 100644 --- a/lib/sergei/player.ex +++ b/lib/sergei/player.ex @@ -20,6 +20,11 @@ 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}) @@ -62,6 +67,14 @@ 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)