Current section
Files
Jump to
Current section
Files
src/telega@message.erl
-module(telega@message).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([decode/1]).
-export_type([message_kind/0, message/0]).
-type message_kind() :: common_message | command_message | text_message.
-type message() :: {message, message_kind(), telega@model:message()}.
-spec is_command_message(binary(), telega@model:message()) -> boolean().
is_command_message(Text, Raw_message) ->
gleam@bool:guard(
not gleam@string:starts_with(Text, <<"/"/utf8>>),
false,
fun() -> case erlang:element(18, Raw_message) of
none ->
false;
{some, Entities} ->
Is_command_entity = fun(Entity) ->
((erlang:element(2, Entity) =:= <<"bot_command"/utf8>>)
andalso (erlang:element(3, Entity) =:= 0))
andalso (erlang:element(4, Entity) =:= gleam@string:length(
Text
))
end,
gleam@list:any(Entities, Is_command_entity)
end end
).
-spec raw_message_to_message(telega@model:message()) -> message().
raw_message_to_message(Raw_message) ->
case erlang:element(17, Raw_message) of
none ->
{message, common_message, Raw_message};
{some, Text} ->
case is_command_message(Text, Raw_message) of
true ->
{message, command_message, Raw_message};
false ->
{message, text_message, Raw_message}
end
end.
-spec decode(gleam@dynamic:dynamic_()) -> {ok, message()} |
{error, list(gleam@dynamic:decode_error())}.
decode(Json) ->
_pipe = telega@model:decode_update(Json),
gleam@result:map(
_pipe,
fun(Update) -> raw_message_to_message(erlang:element(2, Update)) end
).