Current section

Files

Jump to
telega src telega.erl
Raw

src/telega.erl

-module(telega).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-define(FILEPATH, "src/telega.gleam").
-export([is_webhook_path/2, is_secret_token_valid/2, get_api_config/1, new/4, handle_all/2, wait_any/4, handle_command/3, wait_command/5, handle_commands/3, wait_commands/5, handle_text/2, wait_text/4, handle_hears/3, wait_hears/5, handle_message/2, wait_message/4, handle_callback_query/3, wait_callback_query/5, handle_voice/2, wait_voice/4, handle_audio/2, wait_audio/4, handle_video/2, wait_video/4, handle_photos/2, wait_photos/4, handle_web_app_data/2, wait_web_app_data/4, with_catch_handler/2, handle_chat_member/2, log_context/3, with_session_settings/4, set_drop_pending_updates/2, set_max_connections/2, set_ip_address/2, set_allowed_updates/2, set_certificate/2, set_api_client/2, init/1, init_nil_session/1, handle_update/2]).
-export_type([telega/2, telega_builder/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-opaque telega(ALWV, ALWW) :: {telega,
telega@internal@config:config(),
telega@model:user(),
gleam@erlang@process:subject(telega@bot:bot_message())} |
{gleam_phantom, ALWV, ALWW}.
-opaque telega_builder(ALWX, ALWY) :: {telega_builder,
telega@internal@config:config(),
list(telega@bot:handler(ALWX, ALWY)),
gleam@option:option(telega@bot:session_settings(ALWX, ALWY)),
gleam@option:option(gleam@erlang@process:subject(telega@bot:bot_message())),
gleam@option:option(fun((telega@bot:context(ALWX, ALWY), ALWY) -> {ok,
nil} |
{error, ALWY})),
gleam@option:option(boolean()),
gleam@option:option(integer()),
gleam@option:option(binary()),
gleam@option:option(list(binary())),
gleam@option:option(telega@model:file())}.
-file("src/telega.gleam", 50).
?DOC(
" Check if a path is the webhook path for the bot.\n"
"\n"
" Useful if you plan to implement own adapter.\n"
).
-spec is_webhook_path(telega(any(), any()), binary()) -> boolean().
is_webhook_path(Telega, Path) ->
erlang:element(3, erlang:element(2, Telega)) =:= Path.
-file("src/telega.gleam", 57).
?DOC(
" Check if a secret token is valid.\n"
"\n"
" Useful if you plan to implement own adapter.\n"
).
-spec is_secret_token_valid(telega(any(), any()), binary()) -> boolean().
is_secret_token_valid(Telega, Token) ->
erlang:element(4, erlang:element(2, Telega)) =:= Token.
-file("src/telega.gleam", 62).
?DOC(" Helper to get the config for API requests.\n").
-spec get_api_config(telega(any(), any())) -> telega@client:telegram_client().
get_api_config(Telega) ->
erlang:element(5, erlang:element(2, Telega)).
-file("src/telega.gleam", 67).
?DOC(" Create a new Telega instance.\n").
-spec new(binary(), binary(), binary(), gleam@option:option(binary())) -> telega_builder(any(), any()).
new(Token, Server_url, Webhook_path, Secret_token) ->
Url = telega@internal@utils:normalize_url(Server_url),
Webhook_path@1 = telega@internal@utils:normalize_webhook_path(Webhook_path),
{telega_builder,
telega@internal@config:new(Token, Url, Webhook_path@1, Secret_token),
[],
none,
none,
none,
none,
none,
none,
none,
none}.
-file("src/telega.gleam", 91).
?DOC(" Handles all messages.\n").
-spec handle_all(
telega_builder(ALXQ, ALXR),
fun((telega@bot:context(ALXQ, ALXR), telega@update:update()) -> {ok,
telega@bot:context(ALXQ, ALXR)} |
{error, ALXR})
) -> telega_builder(ALXQ, ALXR).
handle_all(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_all, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 102).
?DOC(
" Stops bot message handling from current chat and waits for any message.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_any(
telega@bot:context(ALYC, ALYD),
gleam@option:option(telega@bot:handler(ALYC, ALYD)),
gleam@option:option(integer()),
fun((telega@bot:context(ALYC, ALYD), telega@update:update()) -> {ok,
telega@bot:context(ALYC, ALYD)} |
{error, ALYD})
) -> {ok, telega@bot:context(ALYC, ALYD)} | {error, ALYD}.
wait_any(Ctx, Handle_else, Timeout, Handler) ->
telega@bot:wait_handler(Ctx, {handle_all, Handler}, Handle_else, Timeout).
-file("src/telega.gleam", 113).
?DOC(" Handles a specific command.\n").
-spec handle_command(
telega_builder(ALYU, ALYV),
binary(),
fun((telega@bot:context(ALYU, ALYV), telega@update:command()) -> {ok,
telega@bot:context(ALYU, ALYV)} |
{error, ALYV})
) -> telega_builder(ALYU, ALYV).
handle_command(Builder, Command, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_command, Command, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 128).
?DOC(
" Stops bot message handling from current chat and waits for a specific command.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_command(
telega@bot:context(ALZF, ALZG),
binary(),
gleam@option:option(telega@bot:handler(ALZF, ALZG)),
gleam@option:option(integer()),
fun((telega@bot:context(ALZF, ALZG), telega@update:command()) -> {ok,
telega@bot:context(ALZF, ALZG)} |
{error, ALZG})
) -> {ok, telega@bot:context(ALZF, ALZG)} | {error, ALZG}.
wait_command(Ctx, Command, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_command, Command, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 145).
?DOC(" Handles multiple commands.\n").
-spec handle_commands(
telega_builder(ALZX, ALZY),
list(binary()),
fun((telega@bot:context(ALZX, ALZY), telega@update:command()) -> {ok,
telega@bot:context(ALZX, ALZY)} |
{error, ALZY})
) -> telega_builder(ALZX, ALZY).
handle_commands(Builder, Commands, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_commands, Commands, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 160).
?DOC(
" Stops bot message handling from current chat and waits for a specific command.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_commands(
telega@bot:context(AMAJ, AMAK),
list(binary()),
gleam@option:option(telega@bot:handler(AMAJ, AMAK)),
gleam@option:option(integer()),
fun((telega@bot:context(AMAJ, AMAK), telega@update:command()) -> {ok,
telega@bot:context(AMAJ, AMAK)} |
{error, AMAK})
) -> {ok, telega@bot:context(AMAJ, AMAK)} | {error, AMAK}.
wait_commands(Ctx, Commands, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_commands, Commands, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 177).
?DOC(" Handles text messages.\n").
-spec handle_text(
telega_builder(AMBC, AMBD),
fun((telega@bot:context(AMBC, AMBD), binary()) -> {ok,
telega@bot:context(AMBC, AMBD)} |
{error, AMBD})
) -> telega_builder(AMBC, AMBD).
handle_text(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_text, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 188).
?DOC(
" Stops bot message handling from current chat and waits for a text message.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_text(
telega@bot:context(AMBN, AMBO),
gleam@option:option(telega@bot:handler(AMBN, AMBO)),
gleam@option:option(integer()),
fun((telega@bot:context(AMBN, AMBO), binary()) -> {ok,
telega@bot:context(AMBN, AMBO)} |
{error, AMBO})
) -> {ok, telega@bot:context(AMBN, AMBO)} | {error, AMBO}.
wait_text(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(Ctx, {handle_text, Continue}, Handle_else, Timeout).
-file("src/telega.gleam", 199).
?DOC(" Handles messages that match the given `Hears`.\n").
-spec handle_hears(
telega_builder(AMCF, AMCG),
telega@bot:hears(),
fun((telega@bot:context(AMCF, AMCG), binary()) -> {ok,
telega@bot:context(AMCF, AMCG)} |
{error, AMCG})
) -> telega_builder(AMCF, AMCG).
handle_hears(Builder, Hears, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_hears, Hears, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 214).
?DOC(
" Stops bot message handling from current chat and waits for a message that matches the given `Hears`.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_hears(
telega@bot:context(AMCQ, AMCR),
telega@bot:hears(),
gleam@option:option(telega@bot:handler(AMCQ, AMCR)),
gleam@option:option(integer()),
fun((telega@bot:context(AMCQ, AMCR), binary()) -> {ok,
telega@bot:context(AMCQ, AMCR)} |
{error, AMCR})
) -> {ok, telega@bot:context(AMCQ, AMCR)} | {error, AMCR}.
wait_hears(Ctx, Hears, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_hears, Hears, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 231).
?DOC(" Handles any message.\n").
-spec handle_message(
telega_builder(AMDI, AMDJ),
fun((telega@bot:context(AMDI, AMDJ), telega@model:message()) -> {ok,
telega@bot:context(AMDI, AMDJ)} |
{error, AMDJ})
) -> telega_builder(AMDI, AMDJ).
handle_message(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_message, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 245).
?DOC(
" Stops bot message handling from current chat and waits for any message.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_message(
telega@bot:context(AMDU, AMDV),
gleam@option:option(telega@bot:handler(AMDU, AMDV)),
gleam@option:option(integer()),
fun((telega@bot:context(AMDU, AMDV), telega@model:message()) -> {ok,
telega@bot:context(AMDU, AMDV)} |
{error, AMDV})
) -> {ok, telega@bot:context(AMDU, AMDV)} | {error, AMDV}.
wait_message(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_message, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 263).
?DOC(
" Handles messages from inline keyboard callback.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec handle_callback_query(
telega_builder(AMEM, AMEN),
telega@bot:callback_query_filter(),
fun((telega@bot:context(AMEM, AMEN), binary(), binary()) -> {ok,
telega@bot:context(AMEM, AMEN)} |
{error, AMEN})
) -> telega_builder(AMEM, AMEN).
handle_callback_query(Builder, Filter, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_callback_query, Filter, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 278).
?DOC(
" Wait for a callback query and continue with the given function.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_callback_query(
telega@bot:context(AMEY, AMEZ),
telega@bot:callback_query_filter(),
gleam@option:option(telega@bot:handler(AMEY, AMEZ)),
gleam@option:option(integer()),
fun((telega@bot:context(AMEY, AMEZ), binary(), binary()) -> {ok,
telega@bot:context(AMEY, AMEZ)} |
{error, AMEZ})
) -> {ok, telega@bot:context(AMEY, AMEZ)} | {error, AMEZ}.
wait_callback_query(Ctx, Filter, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_callback_query, Filter, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 295).
?DOC(" Handles voice messages.\n").
-spec handle_voice(
telega_builder(AMFQ, AMFR),
fun((telega@bot:context(AMFQ, AMFR), telega@model:voice()) -> {ok,
telega@bot:context(AMFQ, AMFR)} |
{error, AMFR})
) -> telega_builder(AMFQ, AMFR).
handle_voice(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_voice, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 306).
?DOC(
" Stops bot message handling from current chat and waits for a voice message.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_voice(
telega@bot:context(AMGC, AMGD),
gleam@option:option(telega@bot:handler(AMGC, AMGD)),
gleam@option:option(integer()),
fun((telega@bot:context(AMGC, AMGD), telega@model:voice()) -> {ok,
telega@bot:context(AMGC, AMGD)} |
{error, AMGD})
) -> {ok, telega@bot:context(AMGC, AMGD)} | {error, AMGD}.
wait_voice(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(Ctx, {handle_voice, Continue}, Handle_else, Timeout).
-file("src/telega.gleam", 317).
?DOC(" Handles audio messages.\n").
-spec handle_audio(
telega_builder(AMGU, AMGV),
fun((telega@bot:context(AMGU, AMGV), telega@model:audio()) -> {ok,
telega@bot:context(AMGU, AMGV)} |
{error, AMGV})
) -> telega_builder(AMGU, AMGV).
handle_audio(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_audio, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 328).
?DOC(
" Stops bot message handling from current chat and waits for an audio message.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_audio(
telega@bot:context(AMHF, AMHG),
gleam@option:option(telega@bot:handler(AMHF, AMHG)),
gleam@option:option(integer()),
fun((telega@bot:context(AMHF, AMHG), telega@model:audio()) -> {ok,
telega@bot:context(AMHF, AMHG)} |
{error, AMHG})
) -> {ok, telega@bot:context(AMHF, AMHG)} | {error, AMHG}.
wait_audio(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(Ctx, {handle_audio, Continue}, Handle_else, Timeout).
-file("src/telega.gleam", 339).
?DOC(" Handles video messages.\n").
-spec handle_video(
telega_builder(AMHX, AMHY),
fun((telega@bot:context(AMHX, AMHY), telega@model:video()) -> {ok,
telega@bot:context(AMHX, AMHY)} |
{error, AMHY})
) -> telega_builder(AMHX, AMHY).
handle_video(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_video, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 350).
?DOC(
" Stops bot message handling from current chat and waits for a video message.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_video(
telega@bot:context(AMII, AMIJ),
gleam@option:option(telega@bot:handler(AMII, AMIJ)),
gleam@option:option(integer()),
fun((telega@bot:context(AMII, AMIJ), telega@model:video()) -> {ok,
telega@bot:context(AMII, AMIJ)} |
{error, AMIJ})
) -> {ok, telega@bot:context(AMII, AMIJ)} | {error, AMIJ}.
wait_video(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(Ctx, {handle_video, Continue}, Handle_else, Timeout).
-file("src/telega.gleam", 361).
?DOC(" Handles photo messages.\n").
-spec handle_photos(
telega_builder(AMJA, AMJB),
fun((telega@bot:context(AMJA, AMJB), list(telega@model:photo_size())) -> {ok,
telega@bot:context(AMJA, AMJB)} |
{error, AMJB})
) -> telega_builder(AMJA, AMJB).
handle_photos(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_photos, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 372).
?DOC(
" Stops bot message handling from current chat and waits for a photo message.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_photos(
telega@bot:context(AMJM, AMJN),
gleam@option:option(telega@bot:handler(AMJM, AMJN)),
gleam@option:option(integer()),
fun((telega@bot:context(AMJM, AMJN), list(telega@model:photo_size())) -> {ok,
telega@bot:context(AMJM, AMJN)} |
{error, AMJN})
) -> {ok, telega@bot:context(AMJM, AMJN)} | {error, AMJN}.
wait_photos(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_photos, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 388).
?DOC(" Handles web app data messages.\n").
-spec handle_web_app_data(
telega_builder(AMKF, AMKG),
fun((telega@bot:context(AMKF, AMKG), telega@model:web_app_data()) -> {ok,
telega@bot:context(AMKF, AMKG)} |
{error, AMKG})
) -> telega_builder(AMKF, AMKG).
handle_web_app_data(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_web_app_data, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 402).
?DOC(
" Stops bot message handling from current chat and waits for a web app data message.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec wait_web_app_data(
telega@bot:context(AMKQ, AMKR),
gleam@option:option(telega@bot:handler(AMKQ, AMKR)),
gleam@option:option(integer()),
fun((telega@bot:context(AMKQ, AMKR), telega@model:web_app_data()) -> {ok,
telega@bot:context(AMKQ, AMKR)} |
{error, AMKR})
) -> {ok, telega@bot:context(AMKQ, AMKR)} | {error, AMKR}.
wait_web_app_data(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_web_app_data, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 421).
?DOC(
" Set a catch handler for all handlers.\n"
"\n"
" If handler returns `Error`, the chat instance will be stopped and the error will be logged\n"
" The default handler is `fn(_) -> Ok(Nil)`, which will do nothing if handler returns an error\n"
).
-spec with_catch_handler(
telega_builder(AMLI, AMLJ),
fun((telega@bot:context(AMLI, AMLJ), AMLJ) -> {ok, nil} | {error, AMLJ})
) -> telega_builder(AMLI, AMLJ).
with_catch_handler(Builder, Catch_handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
{some, Catch_handler},
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 429).
?DOC(" Handles chat member update (when user joins/leaves a group). The bot must be an administrator in the chat and must explicitly specify \"chat_member\" in the list of `allowed_updates` to receive these updates.\n").
-spec handle_chat_member(
telega_builder(AMLQ, AMLR),
fun((telega@bot:context(AMLQ, AMLR), telega@model:chat_member_updated()) -> {ok,
telega@bot:context(AMLQ, AMLR)} |
{error, AMLR})
) -> telega_builder(AMLQ, AMLR).
handle_chat_member(Builder, Handler) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
[{handle_chat_member, Handler} | erlang:element(3, Builder)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 441).
?DOC(" Log the message and error message if the handler fails.\n").
-spec log_context(
telega@bot:context(AMMC, AMMD),
binary(),
fun(() -> {ok, telega@bot:context(AMMC, AMMD)} | {error, AMMD})
) -> {ok, telega@bot:context(AMMC, AMMD)} | {error, AMMD}.
log_context(Ctx, Prefix, Handler) ->
Id = telega@internal@utils:random_string(5),
Prefix@1 = <<<<<<<<"["/utf8, Prefix/binary>>/binary, ":"/utf8>>/binary,
Id/binary>>/binary,
"] "/utf8>>,
telega@internal@log:info(
<<<<Prefix@1/binary, "received update: "/utf8>>/binary,
(telega@update:to_string(erlang:element(3, Ctx)))/binary>>
),
Start_time = gleam@time@timestamp:system_time(),
Result = begin
_pipe = Handler(),
gleam@result:map_error(
_pipe,
fun(E) ->
telega@internal@log:error(
<<<<Prefix@1/binary, "handler failed: "/utf8>>/binary,
(gleam@string:inspect(E))/binary>>
),
E
end
)
end,
End_time = gleam@time@timestamp:system_time(),
Time = begin
_pipe@1 = Start_time,
_pipe@2 = gleam@time@timestamp:difference(_pipe@1, End_time),
_pipe@3 = gleam@time@duration:to_seconds(_pipe@2),
gleam_stdlib:float_to_string(_pipe@3)
end,
telega@internal@log:info(
<<<<<<Prefix@1/binary, "handler completed in "/utf8>>/binary,
Time/binary>>/binary,
" seconds"/utf8>>
),
Result.
-file("src/telega.gleam", 471).
?DOC(" Construct a session settings.\n").
-spec with_session_settings(
telega_builder(AMMO, AMMP),
fun((binary(), AMMO) -> {ok, AMMO} | {error, AMMP}),
fun((binary()) -> {ok, gleam@option:option(AMMO)} | {error, AMMP}),
fun(() -> AMMO)
) -> telega_builder(AMMO, AMMP).
with_session_settings(Builder, Persist_session, Get_session, Default_session) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
erlang:element(3, _record),
{some,
{session_settings, Persist_session, Get_session, Default_session}},
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 508).
?DOC(" Set the drop pending updates flag as set webhook parameter.\n").
-spec set_drop_pending_updates(telega_builder(AMNG, AMNH), boolean()) -> telega_builder(AMNG, AMNH).
set_drop_pending_updates(Builder, Drop_pending_updates) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
{some, Drop_pending_updates},
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 516).
?DOC(" Set the max connections as set webhook parameter.\n").
-spec set_max_connections(telega_builder(AMNM, AMNN), integer()) -> telega_builder(AMNM, AMNN).
set_max_connections(Builder, Max_connections) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
{some, Max_connections},
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 524).
?DOC(" Set the ip address as set webhook parameter.\n").
-spec set_ip_address(telega_builder(AMNS, AMNT), binary()) -> telega_builder(AMNS, AMNT).
set_ip_address(Builder, Ip_address) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
{some, Ip_address},
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 532).
?DOC(" Set the allowed updates as set webhook parameter.\n").
-spec set_allowed_updates(telega_builder(AMNY, AMNZ), list(binary())) -> telega_builder(AMNY, AMNZ).
set_allowed_updates(Builder, Allowed_updates) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
{some, Allowed_updates},
erlang:element(11, _record)}.
-file("src/telega.gleam", 540).
?DOC(" Set the certificate as set webhook parameter.\n").
-spec set_certificate(telega_builder(AMOF, AMOG), telega@model:file()) -> telega_builder(AMOF, AMOG).
set_certificate(Builder, Certificate) ->
_record = Builder,
{telega_builder,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
{some, Certificate}}.
-file("src/telega.gleam", 550).
?DOC(
" Pass custom api client to the builder.\n"
"\n"
" Useful if you want set custom fetch function or pass your api client options\n"
).
-spec set_api_client(
telega_builder(AMOL, AMOM),
telega@client:telegram_client()
) -> telega_builder(AMOL, AMOM).
set_api_client(Builder, Api_client) ->
_record = Builder,
{telega_builder,
begin
_record@1 = erlang:element(2, Builder),
{config,
erlang:element(2, _record@1),
erlang:element(3, _record@1),
erlang:element(4, _record@1),
Api_client}
end,
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}.
-file("src/telega.gleam", 600).
-spec nil_catch_handler(any(), any()) -> {ok, nil} | {error, any()}.
nil_catch_handler(_, _) ->
{ok, nil}.
-file("src/telega.gleam", 560).
?DOC(
" Initialize a Telega instance.\n"
" This function should be called **only** after all handlers are added to the builder.\n"
" It will set the webhook and start handling messages.\n"
).
-spec init(telega_builder(AMOR, AMOS)) -> {ok, telega(AMOR, AMOS)} |
{error, telega@error:telega_error()}.
init(Builder) ->
gleam@result:'try'(
telega@api:set_webhook(
erlang:element(5, erlang:element(2, Builder)),
{set_webhook_parameters,
<<<<(erlang:element(2, erlang:element(2, Builder)))/binary,
"/"/utf8>>/binary,
(erlang:element(3, erlang:element(2, Builder)))/binary>>,
erlang:element(11, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(7, Builder),
{some, erlang:element(4, erlang:element(2, Builder))}}
),
fun(Is_ok) ->
gleam@bool:guard(
not Is_ok,
{error, set_webhook_error},
fun() ->
gleam@result:'try'(
telega@api:get_me(
erlang:element(5, erlang:element(2, Builder))
),
fun(Bot_info) ->
Session_settings = gleam@option:to_result(
erlang:element(4, Builder),
no_session_settings_error
),
gleam@result:'try'(
Session_settings,
fun(Session_settings@1) ->
gleam@result:'try'(
telega@internal@registry:start(),
fun(Registry_subject) ->
Catch_handler = gleam@option:lazy_unwrap(
erlang:element(6, Builder),
fun() ->
fun nil_catch_handler/2
end
),
gleam@result:'try'(
telega@bot:start(
Registry_subject,
erlang:element(2, Builder),
Bot_info,
erlang:element(3, Builder),
Session_settings@1,
Catch_handler
),
fun(Bot_subject) ->
{ok,
{telega,
erlang:element(
2,
Builder
),
Bot_info,
Bot_subject}}
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/telega.gleam", 489).
?DOC(
" Initialize a Telega instance with a `Nil` session.\n"
" Useful when you don't need to persist the session.\n"
).
-spec init_nil_session(telega_builder(nil, AMMZ)) -> {ok, telega(nil, AMMZ)} |
{error, telega@error:telega_error()}.
init_nil_session(Builder) ->
Persist_session = fun(_, _) -> {ok, nil} end,
Get_session = fun(_) -> {ok, {some, nil}} end,
Default_session = fun() -> nil end,
_pipe = begin
_record = Builder,
{telega_builder,
erlang:element(2, _record),
erlang:element(3, _record),
{some,
{session_settings,
Persist_session,
Get_session,
Default_session}},
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record),
erlang:element(8, _record),
erlang:element(9, _record),
erlang:element(10, _record),
erlang:element(11, _record)}
end,
init(_pipe).
-file("src/telega.gleam", 605).
?DOC(" Handle an update from the Telegram API.\n").
-spec handle_update(telega(any(), any()), telega@model:update()) -> {ok,
boolean()} |
{error, telega@error:telega_error()}.
handle_update(Telega, Raw_update) ->
_pipe = telega@update:raw_to_update(Raw_update),
telega@bot:handle_update(erlang:element(4, Telega), _pipe).