cronokirby / alchemy

A discord library for Elixir
MIT License
152 stars 34 forks source link

[bug] When Client.edit_member succeeds, a parsing error occurs #74

Closed curz46 closed 5 years ago

curz46 commented 5 years ago

Description When Client.edit_member succeeds, the API returns an empty body. This is passed to the decoder in Alchemy.Discord.Api.handle_response/2 as an empty string, and this throws an error as it is parsed as JSON.

Test

defmodule AlchemyTest do
  use Application
  use Alchemy.Cogs

  alias Alchemy.Client
  alias Alchemy.Events

  defmodule Commands do
    use Alchemy.Cogs

    Cogs.def nick(name) do
      %{channel_id: channel_id, author: %{id: user_id}} = message
      {:ok, guild_id} = Alchemy.Cache.guild_id(channel_id)
      {:ok, _} = Client.edit_member(guild_id, user_id, nick: name)
      Cogs.say "Done"
    end
  end

  @spec start(any, any) :: {:ok, pid}
  def start(_type, _args) do
    run = Client.start(System.get_env("TOKEN"))
    use Commands
    run
  end
end

Expected Behaviour Sending !nick david changes your nickname to "david" and then prints "Done".

Observed Behaviour Nickname is successfully changed to "david", but then the process crashes with the following error:

21:02:17.077 [error] Task #PID<0.307.0> started from #PID<0.299.0> terminating
** (Poison.ParseError) Unexpected end of input at position 0
    lib/poison/parser.ex:357: Poison.Parser.value/3
    lib/poison/parser.ex:64: Poison.Parser.parse!/2
    (alchemy) lib/Discord/api.ex:97: anonymous fn/2 in Alchemy.Discord.Api.handle/2
    (alchemy) lib/Discord/api.ex:126: Alchemy.Discord.Api.handle_response/2
    (alchemy) lib/Discord/rate_manager.ex:37: Alchemy.Discord.RateManager.process_req/3
    (alchemy_test) lib/alchemy_test.ex:14: AlchemyTest.Commands.nick/2
    (elixir) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Function: &AlchemyTest.Commands.nick/2
...