Packages
ex_gram
0.33.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/supervisor.ex
defmodule ExGram.Bot.Supervisor do
@moduledoc """
Bot supervisor that starts the dispatcher and updates processes and tie them together
"""
def child_spec(opts, module) do
%{
id: opts[:id] || module,
start: {ExGram.Bot.Supervisor, :start_link, [opts, module]},
type: :supervisor,
restart: :permanent,
shutdown: 500
}
end
def start_link(opts, module) do
name = opts[:name] || module.name()
supervisor_name = String.to_atom(Atom.to_string(name) <> "_supervisor")
params = Keyword.merge(opts, name: name, module: module)
Supervisor.start_link(ExGram.Bot.Supervisor, params, name: supervisor_name)
end
def init(opts) do
updates_method = Keyword.fetch!(opts, :method)
token = Keyword.fetch!(opts, :token)
name = Keyword.fetch!(opts, :name)
module = opts[:module]
commands = module.commands()
{:ok, _} = Registry.register(Registry.ExGram, name, token)
updates_worker =
case updates_method do
:webhook ->
raise "Not implemented yet"
:noup ->
ExGram.Updates.Noup
:polling ->
ExGram.Updates.Polling
:test ->
ExGram.Updates.Test
nil ->
raise "No updates method received, try with :polling or your custom module"
other ->
other
end
maybe_setup_commands(opts[:setup_commands], commands, token)
bot_info = maybe_fetch_bot(opts[:username], token)
dispatcher_opts = %ExGram.Dispatcher{
name: name,
bot_info: bot_info,
dispatcher_name: name,
commands: commands,
regex: module.regexes(),
middlewares: module.middlewares(),
handler: {module, :handle},
error_handler: {module, :handle_error}
}
children = [
{ExGram.Dispatcher, dispatcher_opts},
{updates_worker, {:bot, name, :token, token}}
]
Supervisor.init(children, strategy: :one_for_one)
end
defp maybe_fetch_bot(username, _token) when is_binary(username),
do: %ExGram.Model.User{username: username, is_bot: true}
defp maybe_fetch_bot(_username, token) do
case ExGram.get_me(token: token) do
{:ok, bot} -> bot
_ -> nil
end
end
defp maybe_setup_commands(true, commands, token) do
send_commands =
commands
|> Stream.filter(fn command ->
not is_nil(command[:description])
end)
|> Enum.map(fn command ->
%ExGram.Model.BotCommand{
command: command[:command],
description: command[:description]
}
end)
ExGram.set_my_commands(send_commands, token: token)
end
defp maybe_setup_commands(_, _commands, _token), do: :nop
end