Current section
Files
Jump to
Current section
Files
lib/api.ex
defmodule TelegramEx.API do
@moduledoc """
HTTP wrapper around the Telegram Bot API.
API.send_message(token, %{chat_id: 123, text: "Hi"})
API.send_photo(token, %{chat_id: 123, photo: "https://..."})
"""
require Logger
alias TelegramEx.Types
@type updates :: Types.updates()
@spec get_updates(String.t(), integer()) :: {:ok, updates()} | {:error, any()}
def get_updates(token, offset) do
case Req.get("https://api.telegram.org/bot#{token}/getUpdates?offset=#{offset}") do
{:ok, %{status: 200, body: %{"ok" => true, "result" => updates}}} ->
{:ok, updates}
{:ok, %{body: %{"description" => reason}}} ->
Logger.error(reason)
{:error, :bad_request}
{:error, reason} ->
{:error, reason}
end
end
@spec send_message(String.t(), map()) :: :ok | {:error, any()}
def send_message(token, message) do
Req.post("https://api.telegram.org/bot#{token}/sendMessage", json: message)
|> handle_response()
end
@spec send_photo(String.t(), map()) :: :ok | {:error, any()}
def send_photo(token, photo) do
Req.post("https://api.telegram.org/bot#{token}/sendPhoto", form_multipart: photo)
|> handle_response()
end
@spec answer_callback_query(String.t(), String.t()) :: :ok | {:error, any()}
def answer_callback_query(token, callback) do
Req.post("https://api.telegram.org/bot#{token}/answerCallbackQuery",
json: %{callback_query_id: callback}
)
|> handle_response()
end
@spec send_document(String.t(), map()) :: :ok | {:error, any()}
def send_document(token, document) do
Req.post("https://api.telegram.org/bot#{token}/sendDocument",
form_multipart: document
)
|> handle_response()
end
defp handle_response({:ok, %{status: 200}}) do
:ok
end
defp handle_response({:ok, %{body: %{"description" => reason}}}) do
Logger.error(reason)
{:error, :bad_request}
end
defp handle_response({:ok, response}) do
Logger.error("Unknown error: #{inspect(response)}")
{:error, :unknown_error}
end
defp handle_response({:error, reason}) do
{:error, reason}
end
end