-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@models@message:message()}. -spec is_command_message(binary(), telega@models@message: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@models@message: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) -> gleam@result:'try'( telega@models@update:decode(Json), fun(Update) -> {ok, raw_message_to_message(erlang:element(2, Update))} end ).