# Installation This guide covers installing ExGram and configuring its dependencies. ## Basic Installation Add `ex_gram` and `jason` to your `mix.exs` dependencies: ```elixir def deps do [ {:ex_gram, "~> 0.64"}, {:jason, ">= 1.0.0"}, # HTTP Adapter (see below) ] end ``` After adding dependencies, run: ```bash mix deps.get ``` ## HTTP Adapter ExGram requires an HTTP adapter to communicate with the Telegram Bot API. Choose one of the following options. ### Req Adapter (Recommended) The [Req](https://hexdocs.pm/req) adapter is the simplest to set up and is recommended for most use cases. **Add to deps:** ```elixir {:req, "~> 0.5"} ``` **Add to config:** ```elixir config :ex_gram, adapter: ExGram.Adapter.Req ``` ### Tesla Adapter [Tesla](https://hexdocs.pm/tesla) provides more flexibility and supports multiple underlying HTTP clients. **Add to deps:** ```elixir {:tesla, "~> 1.16"}, {:hackney, "~> 3.2"} # Default client ``` **Add to config:** ```elixir config :ex_gram, adapter: ExGram.Adapter.Tesla ``` #### Tesla Underlying Adapters Tesla supports several HTTP clients. The default is Hackney, but you can use: - **Finch** - Modern, efficient HTTP client - **Gun** - HTTP/1.1 and HTTP/2 client - **Mint** - Low-level HTTP client - **Httpc** - Built into Erlang - **Ibrowse** - Another Erlang HTTP client **Example using Gun:** ```elixir # In deps {:tesla, "~> 1.16"}, {:gun, "~> 2.0"} # In config config :tesla, adapter: Tesla.Adapter.Gun ``` #### Tesla Logger Configuration By default, ExGram adds `Tesla.Middleware.Logger` with log level `:info`. You can configure the log level and other options ([Tesla Logger docs](https://hexdocs.pm/tesla/Tesla.Middleware.Logger.html#module-options)): ```elixir config :ex_gram, Tesla.Middleware.Logger, level: :debug ``` #### Tesla Middlewares You can add custom [Tesla middlewares](https://github.com/teamon/tesla#middleware) to ExGram: ```elixir config :ex_gram, ExGram.Adapter.Tesla, middlewares: [ {Tesla.Middleware.BaseUrl, "https://example.com/foo"} ] ``` For middlewares that require functions or complex configuration, define a function that returns the Tesla configuration: ```elixir # lib/tesla_middlewares.ex defmodule TeslaMiddlewares do def retry() do {Tesla.Middleware.Retry, delay: 500, max_retries: 10, max_delay: 4_000, should_retry: fn {:ok, %{status: status}} when status in [400, 500] -> true {:ok, _} -> false {:error, _} -> true end} end end # config/config.exs config :ex_gram, ExGram.Adapter.Tesla, middlewares: [ {TeslaMiddlewares, :retry, []} ] ``` The function must return a two-tuple as Tesla requires. ### Custom Adapter You can implement your own HTTP adapter by implementing the `ExGram.Adapter` behaviour: ```elixir config :ex_gram, adapter: YourCustomAdapter ``` ## JSON Engine By default, ExGram uses [Jason](https://hexdocs.pm/jason) for JSON encoding/decoding. You can change it to any engine that exposes `encode/2`, `encode!/2`, `decode/2`, and `decode!/2`: ```elixir config :ex_gram, json_engine: Poison ``` ## Next Steps - [Getting Started](getting-started.md) - Create your first bot - [Handling Updates](handling-updates.md) - Learn about different update types - [Sending Messages](sending-messages.md) - Explore the DSL for building responses - [Polling and Webhooks](polling-and-webhooks.md) - Configure how your bot receives updates