Current section
Files
Jump to
Current section
Files
lib/bot/bot.ex
defmodule Agala.Bot do
use HTTPoison.Base
require Logger
@default_router Agala.Router.Direct
@moduledoc """
Main worker module
"""
def process_url(url) do
"https://api.telegram.org/bot" <> Agala.get_token <> "/" <> url
end
def getUpdates(%{timeout: timeout, offset: offset}) do
"getUpdates"
|> exec_cmd(%{timeout: timeout, offset: offset})
|> resolve_updates
end
def resolve_updates({
offset,
{
:ok,
%HTTPoison.Response{
status_code: 200,
body: %{"ok" => true, "result" => []}
}
}
}) do
offset
end
def resolve_updates({
_offset,
{
:ok,
%HTTPoison.Response{
status_code: 200,
body: %{"ok" => true, "result" => result}
}
}
}) do
Logger.debug "Response body is:\n #{inspect(result)}"
result
|> process_messages
end
def resolve_updates({offset, {:ok, %HTTPoison.Response{status_code: status_code}}}) do
Logger.warn("HTTP response ended with status code #{status_code}")
offset
end
def resolve_updates({offset, {:error, %HTTPoison.Error{id: nil, reason: :timeout}}}) do
# This is just failed long polling, simply restart
Logger.info("Long polling request failed, resend")
offset
end
def resolve_updates({offset, {:error, err}}) do
Logger.warn("#{inspect err}")
offset
end
def exec_cmd(cmd, params = %{offset: offset}) do
{offset, get(cmd, [], params: params)}
end
def exec_cmd(cmd, params) do
get(cmd, [], params: params)
end
def process_response_body(body) do
body
|> Poison.decode!
end
def process_messages([message] = [%{"update_id"=>offset}]) do
process_message(message)
#last message, so the offset is moving to +1
offset + 1
end
def process_messages([h|t]) do
process_message(h)
process_messages(t)
end
def process_message(message) do
Task.Supervisor.start_child(Agala.Bot.TasksSupervisor, fn ->
Agala.get_router().route(message)
end)
end
end