-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( <<<>/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( <<<>/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( <<<<<>/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).