Packages
ex_gram
0.66.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.1
0.55.0
0.54.0
0.53.0
0.52.2
0.52.1
0.52.0
0.51.1
0.51.0
0.50.2
0.50.1
0.50.0
0.41.0
0.40.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.1
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.5.0-rc6
0.5.0-rc5
0.5.0-rc4
0.5.0-rc3
0.5.0-rc2
Telegram Bot API low level and framework
Current section
Files
Jump to
Current section
Files
lib/ex_gram/bot.ex
defmodule ExGram.Bot do
@moduledoc """
Bot creation helper.
Usage:
- Create one or more bots
``` elixir
defmodule MyBot do
use ExGram.Bot, name: :my_bot, setup_commands: true
command("echo", description: "Echo the message back to the user")
middleware(ExGram.Middleware.IgnoreUsername)
# Command received as `:echo` instead of `"echo"` because it was configured as a command before
def handle({:command, :echo, %{text: t}}, cnt) do
cnt |> answer(t)
end
def handle(msg, _cnt) do
IO.puts("Unknown message " <> inspect(msg))
end
end
```
- Add `ExGram` and your bots to your application children
``` elixir
children = [
# ...
ExGram,
{MyBot, [method: :polling, token: "bot_token"]}
]
```
"""
alias ExGram.Cnt
@type middleware_fn() :: (Cnt.t(), opts :: any() -> Cnt.t())
@type middleware() :: {module() | middleware_fn(), opts :: any()}
defmacro __using__(opts) do
name = Keyword.get(opts, :name) || raise ArgumentError, "name parameter is mandatory"
module_opts = Keyword.take(opts, [:username, :setup_commands, :get_me])
quote location: :keep do
@behaviour ExGram.Handler
use ExGram.Middleware.Builder
import ExGram.Dsl
def name, do: unquote(name)
def child_spec(opts) do
opts = Keyword.merge(unquote(module_opts), opts)
ExGram.Bot.Supervisor.child_spec(opts, __MODULE__)
end
def start_link(opts) do
opts = Keyword.merge(unquote(module_opts), opts)
ExGram.Bot.Supervisor.start_link(opts, __MODULE__)
end
@impl ExGram.Handler
def init(_opts) do
:ok
end
def message(from, message) do
GenServer.call(name(), {:message, from, message})
end
# Default implementations
@impl ExGram.Handler
def handle(msg, _cnt) do
handle_error(%ExGram.Error{
code: :not_handled,
message: "Message not handled: #{inspect(msg)}"
})
end
@impl ExGram.Handler
def handle_error(error) do
error
end
defoverridable ExGram.Handler
end
end
end