Packages

A Gleam library for interacting with the Discord API

Current section

Files

Jump to
shimmer src shimmer.erl
Raw

src/shimmer.erl

-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.