Packages
ex_gram
0.52.1
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
"""
alias ExGram.Dispatcher
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
supervisor_name = opts[:name] || Module.concat(module, Supervisor)
params = Keyword.put(opts, :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)
module = Keyword.fetch!(opts, :module)
name = Keyword.get(opts, :bot_name, module.name())
{:ok, _} = Registry.register(Registry.ExGram, name, token)
{updates_worker, updates_worker_opts} = updates_worker(updates_method)
updates_worker_opts = Map.merge(updates_worker_opts, %{bot: name, token: token})
module.init(bot: name, token: token)
if opts[:setup_commands], do: setup_commands(module.commands(), token)
bot_info = get_bot_info(opts[:username], token)
extra_info = Keyword.get(opts, :extra_info, %{})
dispatcher_opts = Dispatcher.init_state(name, bot_info, module, extra_info)
children =
[
{Dispatcher, dispatcher_opts},
{updates_worker, updates_worker_opts}
]
Supervisor.init(children, strategy: :one_for_one)
end
defp updates_worker(nil), do: raise("No updates method received, try with :polling or your custom module")
defp updates_worker(name) when is_atom(name) do
{updates_worker_module(name), %{}}
end
defp updates_worker({name, options}) when is_atom(name) do
{updates_worker_module(name), Map.new(options)}
end
defp updates_worker_module(:webhook), do: ExGram.Updates.Webhook
defp updates_worker_module(:noup), do: ExGram.Updates.Noup
defp updates_worker_module(:polling), do: ExGram.Updates.Polling
defp updates_worker_module(:test), do: ExGram.Updates.Test
defp updates_worker_module(module) when is_atom(module), do: module
defp get_bot_info(username, _token) when is_binary(username), do: %ExGram.Model.User{username: username, is_bot: true}
defp get_bot_info(_username, token) do
case ExGram.get_me(token: token) do
{:ok, bot} -> bot
_ -> nil
end
end
defp setup_commands(commands, token) do
send_commands =
for command <- commands, command[:description] != nil do
%ExGram.Model.BotCommand{
command: command[:command],
description: command[:description]
}
end
ExGram.set_my_commands(send_commands, token: token)
end
end