Packages
ex_gram
0.6.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/updates/polling.ex
defmodule ExGram.Updates.Polling do
use GenServer
# require Logger
def start_link({:bot, pid, :token, token}) do
# Logger.debug "START WORKER"
# TODO: Use name
GenServer.start_link(__MODULE__, {:ok, pid, token})
end
def init({:ok, pid, token}) do
# Clean webhook
ExGram.delete_webhook(token: token)
Process.send_after(self(), {:fetch, :update_id, -1}, 1000)
{:ok, {pid, token}}
end
def handle_cast({:fetch, :update_id, _} = m, state), do: handle_info(m, state)
def handle_info({:fetch, :update_id, uid}, {pid, token} = state) do
# Logger.debug "GetUpdates!"
# TODO: If timeout, keep going!
try do
updates = ExGram.get_updates!(limit: 100, offset: uid, timeout: 30000, token: token)
Enum.map(updates, &GenServer.call(pid, {:update, &1}))
nid = extract_last_pid(uid, updates)
send(self(), {:fetch, :update_id, nid + 1})
# GenServer.cast(self(), )
rescue
# If timeout don't wait?
ExGram.Error ->
Process.send_after(self(), {:fetch, :update_id, uid}, 1)
end
{:noreply, state}
end
defp extract_last_pid(actual, []), do: actual
defp extract_last_pid(actual, [u | us]) do
au = u.update_id
extract_last_pid(max(au, actual), us)
end
end