-module(shimmer). -compile(no_auto_import). -export([new/1, new_with_opts/2, new_sharded/1, new_sharded_with_opts/2, connect/2, connect_sharded/2, update_client_presence/2, update_client_presence_from_builder/2, update_all_shards_presence/2, update_all_shards_presence_from_builder/2]). -export_type([client_options/0]). -type client_options() :: {client_options, list(shimmer@intents:intent())}. -spec new(binary()) -> shimmer@client:client(shimmer@ws@event_loop:message()). new(Token) -> Subject = gleam@erlang@process:new_subject(), {client, Token, shimmer@intents:default(), Subject, {shard, 0, 1, Subject}}. -spec new_with_opts(binary(), client_options()) -> shimmer@client:client(shimmer@ws@event_loop:message()). new_with_opts(Token, Opts) -> Default = new(Token), erlang:setelement(3, Default, erlang:element(2, Opts)). -spec new_sharded(binary()) -> shimmer@shards:shards_manager(shimmer@ws@event_loop:message()). new_sharded(Token) -> {shards_manager, Token, shimmer@intents:default(), gleam@erlang@process:new_subject(), []}. -spec new_sharded_with_opts(binary(), client_options()) -> shimmer@shards:shards_manager(shimmer@ws@event_loop:message()). new_sharded_with_opts(Token, Opts) -> Default = new_sharded(Token), erlang:setelement(3, Default, erlang:element(2, Opts)). -spec connect( shimmer@client:client(shimmer@ws@event_loop:message()), shimmer@handlers:handlers_builder(shimmer@ws@event_loop:message()) ) -> {ok, shimmer@client:client(shimmer@ws@event_loop:message())} | {error, shimmer@internal@error:shimmer_error()}. connect(Client, Handlers_builder) -> case shimmer@http@endpoints:bot_gateway(erlang:element(2, Client)) of {error, _try} -> {error, _try}; {ok, Gateway_settings} -> Actor_spec = {spec, shimmer@ws@event_loop:actor_setup( Client, erlang:element(2, Gateway_settings), shimmer@handlers:handlers_from_builder(Handlers_builder) ), 30 * 1000, fun shimmer@ws@event_loop:actor_loop/2}, case begin _pipe = gleam@otp@actor:start_spec(Actor_spec), gleam@result:map_error( _pipe, fun(Field@0) -> {actor_error, Field@0} end ) end of {error, _try@1} -> {error, _try@1}; {ok, _@1} -> {ok, Client} end end. -spec add_child( shimmer@shards:shards_manager(shimmer@ws@event_loop:message()), shimmer@internal@types@responses@bot_gateway:bot_gateway_response(), shimmer@handlers:handlers(shimmer@ws@event_loop:message()), gleam@otp@supervisor:children(IMS), integer(), integer() ) -> gleam@otp@supervisor:children(IMS). add_child(Shards, Gateway_settings, Client_handlers, Children, Current_n, Max_n) -> Children@1 = begin _pipe = Children, gleam@otp@supervisor:add( _pipe, gleam@otp@supervisor:worker( fun(_) -> Actor_spec = {spec, shimmer@ws@event_loop:actor_setup( {client, erlang:element(2, Shards), erlang:element(3, Shards), gleam@erlang@process:new_subject(), {shard, Current_n, Max_n, erlang:element(4, Shards)}}, erlang:element(2, Gateway_settings), Client_handlers ), 30 * 1000, fun shimmer@ws@event_loop:actor_loop/2}, gleam@otp@actor:start_spec(Actor_spec) end ) ) end, Add_more = (Current_n + 1) > Max_n, case Add_more of true -> add_child( Shards, Gateway_settings, Client_handlers, Children@1, Current_n + 1, Max_n ); false -> Children@1 end. -spec connect_sharded( shimmer@shards:shards_manager(shimmer@ws@event_loop:message()), shimmer@handlers:handlers_builder(shimmer@ws@event_loop:message()) ) -> {ok, shimmer@shards:shards_manager(shimmer@ws@event_loop:message())} | {error, shimmer@internal@error:shimmer_error()}. connect_sharded(Shards, Handlers_builder) -> Client_handlers = shimmer@handlers:handlers_from_builder(Handlers_builder), case shimmer@http@endpoints:bot_gateway(erlang:element(2, Shards)) of {error, _try} -> {error, _try}; {ok, Gateway_settings} -> Supervisor_spec = {spec, 1, 5, 1, fun(Children) -> add_child( Shards, Gateway_settings, Client_handlers, Children, 0, erlang:element(3, Gateway_settings) ) end}, case begin _pipe = gleam@otp@supervisor:start_spec(Supervisor_spec), gleam@result:map_error( _pipe, fun(Field@0) -> {actor_error, Field@0} end ) end of {error, _try@1} -> {error, _try@1}; {ok, _@1} -> {ok, Shards} end end. -spec update_client_presence( shimmer@client:client(shimmer@ws@event_loop:message()), shimmer@types@presence:presence() ) -> shimmer@client:client(shimmer@ws@event_loop:message()). update_client_presence(Client, Presence) -> _pipe = erlang:element(4, Client), gleam@erlang@process:send(_pipe, {update_presence, Presence}), Client. -spec update_client_presence_from_builder( shimmer@client:client(shimmer@ws@event_loop:message()), shimmer@builders@presence_builder:presence_builder() ) -> {ok, shimmer@client:client(shimmer@ws@event_loop:message())} | {error, shimmer@internal@error:shimmer_error()}. update_client_presence_from_builder(Client, Builder) -> case shimmer@builders@presence_builder:build(Builder) of {error, _try} -> {error, _try}; {ok, Built_presence} -> {ok, update_client_presence(Client, Built_presence)} end. -spec update_all_shards_presence( shimmer@shards:shards_manager(shimmer@ws@event_loop:message()), shimmer@types@presence:presence() ) -> shimmer@shards:shards_manager(shimmer@ws@event_loop:message()). update_all_shards_presence(Shards, Presence) -> _pipe = erlang:element(4, Shards), gleam@erlang@process:send(_pipe, {update_presence, Presence}), Shards. -spec update_all_shards_presence_from_builder( shimmer@shards:shards_manager(shimmer@ws@event_loop:message()), shimmer@builders@presence_builder:presence_builder() ) -> {ok, shimmer@shards:shards_manager(shimmer@ws@event_loop:message())} | {error, shimmer@internal@error:shimmer_error()}. update_all_shards_presence_from_builder(Shards, Builder) -> case shimmer@builders@presence_builder:build(Builder) of {error, _try} -> {error, _try}; {ok, Built_presence} -> {ok, update_all_shards_presence(Shards, Built_presence)} end.