9. defmodule Telegram.MessageQueue do
def start_link do
Agent.start_link(fn -> [] end, name: __MODULE__)
end
# @doc Flushes all existing records
def flush! do
Agent.cast(__MODULE__, fn(_) -> [] end)
end
# @doc Pushes message for given receiver to queue
def push_message(tlg_id, message, opts) do
item = {tlg_id, message, opts}
# Agent.get(GosuObs.Telegram.MessageQueue, fn set -> set end)
Agent.update(__MODULE__, &( [item | &1 ]))
end
# @doc Gets a top message, grouped if possible
def pull_top_message do
Agent.get_and_update(__MODULE__, fn queue ->
case List.last(queue) do
nil ->
{nil, []}
msg ->
end
end
end
end
10. def handle_info(:timer_event, state) do
case Telegram.MessageQueue.pull_top_message do
{tlg_id, message, opts} ->
case send_message(tlg_id, message, opts) do
:ok ->
Process.send_after(self, :timer_event, @wait_ms_before_next_message_send)
nil
:error ->
Process.send_after(self, :timer_event, @wait_ms_before_next_message_send)
nil
:wait ->
Process.send_after(self, :timer_event, @wait_ms_before_next_message_send_limit)
nil
:retry ->
Process.send_after(self, :timer_event, @wait_ms_before_next_message)
GosuObs.Telegram.MessageQueue.push_message(tlg_id, message, opts)
end
{:noreply, state}
nil ->
Process.send_after(self, :timer_event, @wait_ms_before_next_message_pull)
{:noreply, state}
end
end
11. defp send_message(t, message, opts) do
case Nadia.send_message(t, message, opts) do
{:ok, _result} ->
:ok
{:error, %Nadia.Model.Error{reason: "Please wait»}} ->
:wait
result ->
Rollbax.report()
:retry
end
end