Packages
ex_gram
0.27.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 childrens
``` elixir
children = [
# ...
ExGram,
{MyBot, [method: :polling, token: "bot_token]}
]
```
"""
defmacro __using__(ops) do
name =
case Keyword.fetch(ops, :name) do
{:ok, n} -> n
_ -> raise "name parameter is mandatory"
end
username = Keyword.fetch(ops, :username)
setup_commands = Keyword.get(ops, :setup_commands, false)
quote location: :keep do
# quote do
use ExGram.Middleware.Builder
import ExGram.Dsl
@behaviour ExGram.Handler
def name(), do: unquote(name)
def child_spec(opts) do
opts =
Keyword.merge(opts, setup_commands: unquote(setup_commands), username: unquote(username))
ExGram.Bot.Supervisor.child_spec(opts, __MODULE__)
end
@dialyzer {:nowarn_function, start_link: 1}
def start_link(opts) when is_list(opts) do
message = """
Outdate child specification, change your bot's children config to the following:
{#{__MODULE__}, #{inspect(opts)}}
"""
raise message
end
def start_link(m, token \\ nil) do
message = """
Outdate child specification, change your bot's children config to the following:
{#{__MODULE__}, [method: #{m}, token: #{token}]}
"""
raise message
end
def message(from, message) do
GenServer.call(name(), {:message, from, message})
end
# Default implementations
def handle(msg, _cnt) do
error = %ExGram.Error{code: :not_handled, message: "Message not handled: #{inspect(msg)}"}
handle_error(error)
end
def handle_error(error) do
error
# IO.inspect("Error received: #{inspect(error)}")
end
defoverridable ExGram.Handler
end
end
end