diff --git a/lib/sergei/consumer.ex b/lib/sergei/consumer.ex index b8e6495..0be3ec4 100644 --- a/lib/sergei/consumer.ex +++ b/lib/sergei/consumer.ex @@ -1,6 +1,7 @@ defmodule Sergei.Consumer do use Nostrum.Consumer + require Logger alias Nostrum.Api # Translate params to list of maps @@ -15,6 +16,8 @@ defmodule Sergei.Consumer do @slash_commands [ {"ping", "Pong", []}, + {"pause", "Pause media playback", []}, + {"resume", "Resume media playback", []}, {"play", "Play some tunes", @play_opts} ] @@ -99,4 +102,28 @@ defmodule Sergei.Consumer do {:error, "You are not in a voice channel."} end end + + # /pause + def do_command(%{guild_id: guild_id, data: %{name: "pause"}}) do + case Sergei.Player.pause(guild_id) do + :ok -> + {:ok, "Pausing..."} + + {:error, err} -> + Logger.error("Failed to pause media: #{err}") + {:error, "This is embarrasing..."} + end + end + + # /resume + def do_command(%{guild_id: guild_id, data: %{name: "resume"}}) do + case Sergei.Player.resume(guild_id) do + :ok -> + {:ok, "Resuming..."} + + {:error, err} -> + Logger.error("Failed to resume media: #{err}") + {:error, "This is embarrasing..."} + end + end end diff --git a/lib/sergei/player.ex b/lib/sergei/player.ex index 0cba70c..e7cd2a1 100644 --- a/lib/sergei/player.ex +++ b/lib/sergei/player.ex @@ -20,6 +20,14 @@ defmodule Sergei.Player do GenServer.call(__MODULE__, {:play, guild_id, channel_id, url}) end + def pause(guild_id) do + GenServer.call(__MODULE__, {:pause, guild_id}) + end + + def resume(guild_id) do + GenServer.call(__MODULE__, {:resume, guild_id}) + end + # Server @impl true def handle_info(:tick, state) do @@ -47,6 +55,39 @@ defmodule Sergei.Player do {:reply, res, state} end + @impl true + def handle_call({_, guild_id}, _from, state) when not is_map_key(state, guild_id) do + {:reply, {:error, "I'm not playing anything right now"}, state} + end + + @impl true + def handle_call({:pause, guild_id}, _from, state) do + %{url: url} = Map.fetch!(state, guild_id) + Voice.pause(guild_id) + + state = + Map.put(state, guild_id, %{ + url: url, + paused: true + }) + + {:reply, :ok, state} + end + + @impl true + def handle_call({:resume, guild_id}, _from, state) do + %{url: url} = Map.fetch!(state, guild_id) + Voice.resume(guild_id) + + state = + Map.put(state, guild_id, %{ + url: url, + paused: false + }) + + {:reply, :ok, state} + end + def play_music(guild_id, channel_id, url) do cond do Voice.get_channel_id(guild_id) != channel_id ->