Packages

Elixir library for building Telegram bots with macro-based API

Current section

Files

Jump to
telegram_ex lib builders poll.ex
Raw

lib/builders/poll.ex

defmodule TelegramEx.Builder.Poll do
@moduledoc """
Builder for poll and quiz payloads.
Builds `sendPoll` payloads for regular polls and quizzes. See
[Messages and Media](messages-and-media.md).
"""
alias TelegramEx.API
alias TelegramEx.Builder
alias TelegramEx.Effect
@type input :: map() | Effect.t()
@spec poll(input(), String.t(), list(String.t())) :: Effect.t()
def poll(input, question, options) do
input
|> Builder.put_payload(:question, question)
|> Builder.put_payload(:options, options)
|> Builder.put_payload(:type, "regular")
end
@spec quiz(input(), String.t(), list(String.t()), integer()) :: Effect.t()
def quiz(input, question, options, correct_option_id) do
input
|> Builder.put_payload(:question, question)
|> Builder.put_payload(:options, options)
|> Builder.put_payload(:type, "quiz")
|> Builder.put_payload(:correct_option_id, correct_option_id)
end
@spec anonymous(input(), boolean()) :: Effect.t()
def anonymous(input, boolean) do
Builder.put_payload(input, :is_anonymous, boolean)
end
@spec multiple_answers(input(), boolean()) :: Effect.t()
def multiple_answers(input, boolean) do
Builder.put_payload(input, :allows_multiple_answers, boolean)
end
@spec explanation(input(), String.t()) :: Effect.t()
def explanation(input, text) do
Builder.put_payload(input, :explanation, text)
end
@spec explanation(input(), String.t(), String.t()) :: Effect.t()
def explanation(input, text, parse_mode) do
input
|> Builder.put_payload(:explanation, text)
|> Builder.put_payload(:explanation_parse_mode, parse_mode)
end
@spec open_period(input(), integer()) :: Effect.t()
def open_period(input, seconds) do
Builder.put_payload(input, :open_period, seconds)
end
@spec close_date(input(), integer()) :: Effect.t()
def close_date(input, timestamp) do
Builder.put_payload(input, :close_date, timestamp)
end
@spec silent(input()) :: Effect.t()
def silent(input) do
Builder.put_payload(input, :disable_notification, true)
end
@spec send(input(), integer()) :: Effect.t()
def send(input, id) do
input
|> Effect.wrap()
|> Effect.then(fn ctx ->
new_ctx =
ctx
|> Map.put(:chat_id, id)
|> Map.put(:method, "sendPoll")
|> Map.put(:format, :json)
case API.request(new_ctx) do
:ok -> {:ok, new_ctx}
{:error, reason} -> {:error, reason}
end
end)
end
end