Current section
Files
Jump to
Current section
Files
src/telega.erl
-module(telega).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-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(AMMK, AMML) :: {telega,
telega@internal@config:config(),
telega@model@types:user(),
gleam@erlang@process:subject(telega@bot:bot_message())} |
{gleam_phantom, AMMK, AMML}.
-opaque telega_builder(AMMM, AMMN) :: {telega_builder,
telega@internal@config:config(),
list(telega@bot:handler(AMMM, AMMN)),
gleam@option:option(telega@bot:session_settings(AMMM, AMMN)),
gleam@option:option(gleam@erlang@process:subject(telega@bot:bot_message())),
gleam@option:option(fun((telega@bot:context(AMMM, AMMN), AMMN) -> {ok,
nil} |
{error, AMMN})),
gleam@option:option(boolean()),
gleam@option:option(integer()),
gleam@option:option(binary()),
gleam@option:option(list(binary())),
gleam@option:option(telega@model@types:file())}.
-file("src/telega.gleam", 52).
?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", 59).
?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", 64).
?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", 69).
?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", 93).
?DOC(" Handles all messages.\n").
-spec handle_all(
telega_builder(AMNF, AMNG),
fun((telega@bot:context(AMNF, AMNG), telega@update:update()) -> {ok,
telega@bot:context(AMNF, AMNG)} |
{error, AMNG})
) -> telega_builder(AMNF, AMNG).
handle_all(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_all, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 104).
?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(AMNR, AMNS),
gleam@option:option(telega@bot:handler(AMNR, AMNS)),
gleam@option:option(integer()),
fun((telega@bot:context(AMNR, AMNS), telega@update:update()) -> {ok,
telega@bot:context(AMNR, AMNS)} |
{error, AMNS})
) -> {ok, telega@bot:context(AMNR, AMNS)} | {error, AMNS}.
wait_any(Ctx, Handle_else, Timeout, Handler) ->
telega@bot:wait_handler(Ctx, {handle_all, Handler}, Handle_else, Timeout).
-file("src/telega.gleam", 115).
?DOC(" Handles a specific command.\n").
-spec handle_command(
telega_builder(AMOJ, AMOK),
binary(),
fun((telega@bot:context(AMOJ, AMOK), telega@update:command()) -> {ok,
telega@bot:context(AMOJ, AMOK)} |
{error, AMOK})
) -> telega_builder(AMOJ, AMOK).
handle_command(Builder, Command, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_command, Command, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 130).
?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(AMOU, AMOV),
binary(),
gleam@option:option(telega@bot:handler(AMOU, AMOV)),
gleam@option:option(integer()),
fun((telega@bot:context(AMOU, AMOV), telega@update:command()) -> {ok,
telega@bot:context(AMOU, AMOV)} |
{error, AMOV})
) -> {ok, telega@bot:context(AMOU, AMOV)} | {error, AMOV}.
wait_command(Ctx, Command, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_command, Command, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 147).
?DOC(" Handles multiple commands.\n").
-spec handle_commands(
telega_builder(AMPM, AMPN),
list(binary()),
fun((telega@bot:context(AMPM, AMPN), telega@update:command()) -> {ok,
telega@bot:context(AMPM, AMPN)} |
{error, AMPN})
) -> telega_builder(AMPM, AMPN).
handle_commands(Builder, Commands, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_commands, Commands, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 162).
?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(AMPY, AMPZ),
list(binary()),
gleam@option:option(telega@bot:handler(AMPY, AMPZ)),
gleam@option:option(integer()),
fun((telega@bot:context(AMPY, AMPZ), telega@update:command()) -> {ok,
telega@bot:context(AMPY, AMPZ)} |
{error, AMPZ})
) -> {ok, telega@bot:context(AMPY, AMPZ)} | {error, AMPZ}.
wait_commands(Ctx, Commands, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_commands, Commands, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 179).
?DOC(" Handles text messages.\n").
-spec handle_text(
telega_builder(AMQR, AMQS),
fun((telega@bot:context(AMQR, AMQS), binary()) -> {ok,
telega@bot:context(AMQR, AMQS)} |
{error, AMQS})
) -> telega_builder(AMQR, AMQS).
handle_text(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_text, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 190).
?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(AMRC, AMRD),
gleam@option:option(telega@bot:handler(AMRC, AMRD)),
gleam@option:option(integer()),
fun((telega@bot:context(AMRC, AMRD), binary()) -> {ok,
telega@bot:context(AMRC, AMRD)} |
{error, AMRD})
) -> {ok, telega@bot:context(AMRC, AMRD)} | {error, AMRD}.
wait_text(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(Ctx, {handle_text, Continue}, Handle_else, Timeout).
-file("src/telega.gleam", 201).
?DOC(" Handles messages that match the given `Hears`.\n").
-spec handle_hears(
telega_builder(AMRU, AMRV),
telega@bot:hears(),
fun((telega@bot:context(AMRU, AMRV), binary()) -> {ok,
telega@bot:context(AMRU, AMRV)} |
{error, AMRV})
) -> telega_builder(AMRU, AMRV).
handle_hears(Builder, Hears, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_hears, Hears, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 216).
?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(AMSF, AMSG),
telega@bot:hears(),
gleam@option:option(telega@bot:handler(AMSF, AMSG)),
gleam@option:option(integer()),
fun((telega@bot:context(AMSF, AMSG), binary()) -> {ok,
telega@bot:context(AMSF, AMSG)} |
{error, AMSG})
) -> {ok, telega@bot:context(AMSF, AMSG)} | {error, AMSG}.
wait_hears(Ctx, Hears, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_hears, Hears, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 233).
?DOC(" Handles any message.\n").
-spec handle_message(
telega_builder(AMSX, AMSY),
fun((telega@bot:context(AMSX, AMSY), telega@model@types:message()) -> {ok,
telega@bot:context(AMSX, AMSY)} |
{error, AMSY})
) -> telega_builder(AMSX, AMSY).
handle_message(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_message, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 247).
?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(AMTJ, AMTK),
gleam@option:option(telega@bot:handler(AMTJ, AMTK)),
gleam@option:option(integer()),
fun((telega@bot:context(AMTJ, AMTK), telega@model@types:message()) -> {ok,
telega@bot:context(AMTJ, AMTK)} |
{error, AMTK})
) -> {ok, telega@bot:context(AMTJ, AMTK)} | {error, AMTK}.
wait_message(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_message, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 265).
?DOC(
" Handles messages from inline keyboard callback.\n"
"\n"
" See [conversation](/docs/conversation)\n"
).
-spec handle_callback_query(
telega_builder(AMUB, AMUC),
telega@bot:callback_query_filter(),
fun((telega@bot:context(AMUB, AMUC), binary(), binary()) -> {ok,
telega@bot:context(AMUB, AMUC)} |
{error, AMUC})
) -> telega_builder(AMUB, AMUC).
handle_callback_query(Builder, Filter, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_callback_query, Filter, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 280).
?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(AMUN, AMUO),
telega@bot:callback_query_filter(),
gleam@option:option(telega@bot:handler(AMUN, AMUO)),
gleam@option:option(integer()),
fun((telega@bot:context(AMUN, AMUO), binary(), binary()) -> {ok,
telega@bot:context(AMUN, AMUO)} |
{error, AMUO})
) -> {ok, telega@bot:context(AMUN, AMUO)} | {error, AMUO}.
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", 297).
?DOC(" Handles voice messages.\n").
-spec handle_voice(
telega_builder(AMVF, AMVG),
fun((telega@bot:context(AMVF, AMVG), telega@model@types:voice()) -> {ok,
telega@bot:context(AMVF, AMVG)} |
{error, AMVG})
) -> telega_builder(AMVF, AMVG).
handle_voice(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_voice, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 308).
?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(AMVR, AMVS),
gleam@option:option(telega@bot:handler(AMVR, AMVS)),
gleam@option:option(integer()),
fun((telega@bot:context(AMVR, AMVS), telega@model@types:voice()) -> {ok,
telega@bot:context(AMVR, AMVS)} |
{error, AMVS})
) -> {ok, telega@bot:context(AMVR, AMVS)} | {error, AMVS}.
wait_voice(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(Ctx, {handle_voice, Continue}, Handle_else, Timeout).
-file("src/telega.gleam", 319).
?DOC(" Handles audio messages.\n").
-spec handle_audio(
telega_builder(AMWJ, AMWK),
fun((telega@bot:context(AMWJ, AMWK), telega@model@types:audio()) -> {ok,
telega@bot:context(AMWJ, AMWK)} |
{error, AMWK})
) -> telega_builder(AMWJ, AMWK).
handle_audio(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_audio, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 330).
?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(AMWU, AMWV),
gleam@option:option(telega@bot:handler(AMWU, AMWV)),
gleam@option:option(integer()),
fun((telega@bot:context(AMWU, AMWV), telega@model@types:audio()) -> {ok,
telega@bot:context(AMWU, AMWV)} |
{error, AMWV})
) -> {ok, telega@bot:context(AMWU, AMWV)} | {error, AMWV}.
wait_audio(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(Ctx, {handle_audio, Continue}, Handle_else, Timeout).
-file("src/telega.gleam", 341).
?DOC(" Handles video messages.\n").
-spec handle_video(
telega_builder(AMXM, AMXN),
fun((telega@bot:context(AMXM, AMXN), telega@model@types:video()) -> {ok,
telega@bot:context(AMXM, AMXN)} |
{error, AMXN})
) -> telega_builder(AMXM, AMXN).
handle_video(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_video, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 352).
?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(AMXX, AMXY),
gleam@option:option(telega@bot:handler(AMXX, AMXY)),
gleam@option:option(integer()),
fun((telega@bot:context(AMXX, AMXY), telega@model@types:video()) -> {ok,
telega@bot:context(AMXX, AMXY)} |
{error, AMXY})
) -> {ok, telega@bot:context(AMXX, AMXY)} | {error, AMXY}.
wait_video(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(Ctx, {handle_video, Continue}, Handle_else, Timeout).
-file("src/telega.gleam", 363).
?DOC(" Handles photo messages.\n").
-spec handle_photos(
telega_builder(AMYP, AMYQ),
fun((telega@bot:context(AMYP, AMYQ), list(telega@model@types:photo_size())) -> {ok,
telega@bot:context(AMYP, AMYQ)} |
{error, AMYQ})
) -> telega_builder(AMYP, AMYQ).
handle_photos(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_photos, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 374).
?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(AMZB, AMZC),
gleam@option:option(telega@bot:handler(AMZB, AMZC)),
gleam@option:option(integer()),
fun((telega@bot:context(AMZB, AMZC), list(telega@model@types:photo_size())) -> {ok,
telega@bot:context(AMZB, AMZC)} |
{error, AMZC})
) -> {ok, telega@bot:context(AMZB, AMZC)} | {error, AMZC}.
wait_photos(Ctx, Handle_else, Timeout, Continue) ->
telega@bot:wait_handler(
Ctx,
{handle_photos, Continue},
Handle_else,
Timeout
).
-file("src/telega.gleam", 390).
?DOC(" Handles web app data messages.\n").
-spec handle_web_app_data(
telega_builder(AMZU, AMZV),
fun((telega@bot:context(AMZU, AMZV), telega@model@types:web_app_data()) -> {ok,
telega@bot:context(AMZU, AMZV)} |
{error, AMZV})
) -> telega_builder(AMZU, AMZV).
handle_web_app_data(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_web_app_data, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 404).
?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(ANAF, ANAG),
gleam@option:option(telega@bot:handler(ANAF, ANAG)),
gleam@option:option(integer()),
fun((telega@bot:context(ANAF, ANAG), telega@model@types:web_app_data()) -> {ok,
telega@bot:context(ANAF, ANAG)} |
{error, ANAG})
) -> {ok, telega@bot:context(ANAF, ANAG)} | {error, ANAG}.
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", 423).
?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(ANAX, ANAY),
fun((telega@bot:context(ANAX, ANAY), ANAY) -> {ok, nil} | {error, ANAY})
) -> telega_builder(ANAX, ANAY).
with_catch_handler(Builder, Catch_handler) ->
{telega_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
{some, Catch_handler},
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 431).
?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(ANBF, ANBG),
fun((telega@bot:context(ANBF, ANBG), telega@model@types:chat_member_updated()) -> {ok,
telega@bot:context(ANBF, ANBG)} |
{error, ANBG})
) -> telega_builder(ANBF, ANBG).
handle_chat_member(Builder, Handler) ->
{telega_builder,
erlang:element(2, Builder),
[{handle_chat_member, Handler} | erlang:element(3, Builder)],
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 444).
?DOC(" Log the message and error message if the handler fails.\n").
-spec log_context(
telega@bot:context(ANBR, ANBS),
binary(),
fun((telega@bot:context(ANBR, ANBS)) -> {ok, telega@bot:context(ANBR, ANBS)} |
{error, ANBS})
) -> {ok, telega@bot:context(ANBR, ANBS)} | {error, ANBS}.
log_context(Ctx, Prefix, Handler) ->
Start_time = gleam@option:unwrap(
erlang:element(7, Ctx),
gleam@time@timestamp:system_time()
),
Log_prefix = gleam@option:lazy_unwrap(
erlang:element(8, Ctx),
fun() ->
Id = telega@internal@utils:random_string(5),
<<<<<<<<"["/utf8, Prefix/binary>>/binary, ": "/utf8>>/binary,
Id/binary>>/binary,
"] "/utf8>>
end
),
Ctx@1 = {context,
erlang:element(2, Ctx),
erlang:element(3, Ctx),
erlang:element(4, Ctx),
erlang:element(5, Ctx),
erlang:element(6, Ctx),
{some, Start_time},
erlang:element(8, Ctx)},
telega@internal@log:info(
<<<<Log_prefix/binary, "received update: "/utf8>>/binary,
(telega@update:to_string(erlang:element(3, Ctx@1)))/binary>>
),
Result = begin
_pipe = Handler(Ctx@1),
gleam@result:map_error(
_pipe,
fun(E) ->
telega@internal@log:error(
<<<<Log_prefix/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),
_pipe@4 = telega@internal@utils:seconds_to_milliseconds(_pipe@3),
_pipe@5 = erlang:trunc(_pipe@4),
erlang:integer_to_binary(_pipe@5)
end,
telega@internal@log:info(
<<<<<<Log_prefix/binary, "handler completed in "/utf8>>/binary,
Time/binary>>/binary,
"ms"/utf8>>
),
Result.
-file("src/telega.gleam", 484).
?DOC(
" Construct a session settings.\n"
"\n"
" `get_session` should return `Ok(None)` if there is no session for the given key `default_session` will be used in this case. `Error` will crash chat actor.\n"
).
-spec with_session_settings(
telega_builder(ANCF, ANCG),
fun((binary(), ANCF) -> {ok, ANCF} | {error, ANCG}),
fun((binary()) -> {ok, gleam@option:option(ANCF)} | {error, ANCG}),
fun(() -> ANCF)
) -> telega_builder(ANCF, ANCG).
with_session_settings(Builder, Persist_session, Get_session, Default_session) ->
{telega_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
{some,
{session_settings, Persist_session, Get_session, Default_session}},
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 521).
?DOC(" Set the drop pending updates flag as set webhook parameter.\n").
-spec set_drop_pending_updates(telega_builder(ANCX, ANCY), boolean()) -> telega_builder(ANCX, ANCY).
set_drop_pending_updates(Builder, Drop_pending_updates) ->
{telega_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
{some, Drop_pending_updates},
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 529).
?DOC(" Set the max connections as set webhook parameter.\n").
-spec set_max_connections(telega_builder(ANDD, ANDE), integer()) -> telega_builder(ANDD, ANDE).
set_max_connections(Builder, Max_connections) ->
{telega_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
{some, Max_connections},
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 537).
?DOC(" Set the ip address as set webhook parameter.\n").
-spec set_ip_address(telega_builder(ANDJ, ANDK), binary()) -> telega_builder(ANDJ, ANDK).
set_ip_address(Builder, Ip_address) ->
{telega_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
{some, Ip_address},
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 545).
?DOC(" Set the allowed updates as set webhook parameter.\n").
-spec set_allowed_updates(telega_builder(ANDP, ANDQ), list(binary())) -> telega_builder(ANDP, ANDQ).
set_allowed_updates(Builder, Allowed_updates) ->
{telega_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
{some, Allowed_updates},
erlang:element(11, Builder)}.
-file("src/telega.gleam", 553).
?DOC(" Set the certificate as set webhook parameter.\n").
-spec set_certificate(telega_builder(ANDW, ANDX), telega@model@types:file()) -> telega_builder(ANDW, ANDX).
set_certificate(Builder, Certificate) ->
{telega_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
{some, Certificate}}.
-file("src/telega.gleam", 563).
?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(ANEC, ANED),
telega@client:telegram_client()
) -> telega_builder(ANEC, ANED).
set_api_client(Builder, Api_client) ->
{telega_builder,
begin
_record = erlang:element(2, Builder),
{config,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
Api_client}
end,
erlang:element(3, Builder),
erlang:element(4, Builder),
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)}.
-file("src/telega.gleam", 613).
-spec nil_catch_handler(any(), any()) -> {ok, nil} | {error, any()}.
nil_catch_handler(_, _) ->
{ok, nil}.
-file("src/telega.gleam", 573).
?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(ANEI, ANEJ)) -> {ok, telega(ANEI, ANEJ)} |
{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) ->
Catch_handler = gleam@option:lazy_unwrap(
erlang:element(6, Builder),
fun() ->
fun nil_catch_handler/2
end
),
gleam@result:'try'(
telega@bot:start(
Registry,
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", 502).
?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, ANCQ)) -> {ok, telega(nil, ANCQ)} |
{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 = {telega_builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
{some,
{session_settings, Persist_session, Get_session, Default_session}},
erlang:element(5, Builder),
erlang:element(6, Builder),
erlang:element(7, Builder),
erlang:element(8, Builder),
erlang:element(9, Builder),
erlang:element(10, Builder),
erlang:element(11, Builder)},
init(_pipe).
-file("src/telega.gleam", 618).
?DOC(" Handle an update from the Telegram API.\n").
-spec handle_update(telega(any(), any()), telega@model@types:update()) -> boolean().
handle_update(Telega, Raw_update) ->
_pipe = telega@update:raw_to_update(Raw_update),
telega@bot:handle_update(erlang:element(4, Telega), _pipe).