-module(discord_webhook).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/discord_webhook.gleam").
-export([embed/0, embed_title/2, embed_description/2, embed_color/2, embed_field/4, message/1, empty/0, add_message/2, add_embed/2, new/1, send/2]).
-export_type([webhook/0, embed/0, message/0]).
-opaque webhook() :: {webhook, binary()}.
-opaque embed() :: {embed,
gleam@option:option(binary()),
gleam@option:option(binary()),
gleam@option:option(integer()),
list({binary(), binary(), boolean()})}.
-opaque message() :: {message, list(binary()), list(embed())}.
-file("src/discord_webhook.gleam", 31).
-spec embed() -> embed().
embed() ->
{embed, none, none, none, []}.
-file("src/discord_webhook.gleam", 36).
-spec embed_title(embed(), binary()) -> embed().
embed_title(Embed, Title) ->
{embed,
{some, Title},
erlang:element(3, Embed),
erlang:element(4, Embed),
erlang:element(5, Embed)}.
-file("src/discord_webhook.gleam", 41).
-spec embed_description(embed(), binary()) -> embed().
embed_description(Embed, Description) ->
{embed,
erlang:element(2, Embed),
{some, Description},
erlang:element(4, Embed),
erlang:element(5, Embed)}.
-file("src/discord_webhook.gleam", 46).
-spec embed_color(embed(), integer()) -> embed().
embed_color(Embed, Color) ->
{embed,
erlang:element(2, Embed),
erlang:element(3, Embed),
{some, Color},
erlang:element(5, Embed)}.
-file("src/discord_webhook.gleam", 51).
-spec embed_field(embed(), binary(), binary(), boolean()) -> embed().
embed_field(Embed, Name, Value, Inline) ->
New_field = {Name, Value, Inline},
{embed,
erlang:element(2, Embed),
erlang:element(3, Embed),
erlang:element(4, Embed),
lists:append(erlang:element(5, Embed), [New_field])}.
-file("src/discord_webhook.gleam", 62).
-spec message(binary()) -> message().
message(Content) ->
{message, [Content], []}.
-file("src/discord_webhook.gleam", 67).
-spec empty() -> message().
empty() ->
{message, [], []}.
-file("src/discord_webhook.gleam", 72).
-spec add_message(message(), binary()) -> message().
add_message(Msg, Content) ->
{message,
lists:append(erlang:element(2, Msg), [Content]),
erlang:element(3, Msg)}.
-file("src/discord_webhook.gleam", 77).
-spec add_embed(message(), embed()) -> message().
add_embed(Msg, Embed) ->
{message,
erlang:element(2, Msg),
lists:append(erlang:element(3, Msg), [Embed])}.
-file("src/discord_webhook.gleam", 82).
-spec new(binary()) -> webhook().
new(Url) ->
{webhook, Url}.
-file("src/discord_webhook.gleam", 87).
-spec embed_to_json(embed()) -> gleam@json:json().
embed_to_json(Embed) ->
Title_field = case erlang:element(2, Embed) of
{some, T} ->
[{<<"title"/utf8>>, gleam@json:string(T)}];
none ->
[]
end,
Description_field = case erlang:element(3, Embed) of
{some, D} ->
[{<<"description"/utf8>>, gleam@json:string(D)}];
none ->
[]
end,
Color_field = case erlang:element(4, Embed) of
{some, C} ->
[{<<"color"/utf8>>, gleam@json:int(C)}];
none ->
[]
end,
Fields_json = case erlang:element(5, Embed) of
[] ->
[];
Fields ->
[{<<"fields"/utf8>>,
gleam@json:array(
Fields,
fun(Field) ->
gleam@json:object(
[{<<"name"/utf8>>,
gleam@json:string(
erlang:element(1, Field)
)},
{<<"value"/utf8>>,
gleam@json:string(
erlang:element(2, Field)
)},
{<<"inline"/utf8>>,
gleam@json:bool(
erlang:element(3, Field)
)}]
)
end
)}]
end,
All_fields = lists:append(
[Title_field, Description_field, Color_field, Fields_json]
),
gleam@json:object(All_fields).
-file("src/discord_webhook.gleam", 130).
-spec convert_json(message()) -> binary().
convert_json(Message) ->
Content_field = case erlang:element(2, Message) of
[] ->
[];
[Single] ->
[{<<"content"/utf8>>, gleam@json:string(Single)}];
Multiple ->
[{<<"content"/utf8>>,
gleam@json:string(
gleam@string:join(Multiple, <<"\n"/utf8>>)
)}]
end,
Embeds_field = case erlang:element(3, Message) of
[] ->
[];
Embeds ->
[{<<"embeds"/utf8>>, gleam@json:array(Embeds, fun embed_to_json/1)}]
end,
_pipe = gleam@json:object(lists:append([Content_field, Embeds_field])),
gleam@json:to_string(_pipe).
-file("src/discord_webhook.gleam", 147).
-spec send(webhook(), message()) -> {ok, nil} | {error, binary()}.
send(Webhook, Msg) ->
Json_payload = convert_json(Msg),
case gleam@http@request:to(erlang:element(2, Webhook)) of
{error, _} ->
{error,
<<"Failed to parse webhook URL.\nHint: Check the webhook url."/utf8>>};
{ok, Base_req} ->
Req = begin
_pipe = Base_req,
_pipe@1 = gleam@http@request:set_method(_pipe, post),
_pipe@2 = gleam@http@request:set_header(
_pipe@1,
<<"content-type"/utf8>>,
<<"application/json"/utf8>>
),
gleam@http@request:set_body(_pipe@2, Json_payload)
end,
case gleam@httpc:send(Req) of
{ok, Response} ->
case erlang:element(2, Response) of
204 ->
{ok, nil};
_ ->
{error,
<<"Expected status 204, got "/utf8,
(erlang:integer_to_binary(
erlang:element(2, Response)
))/binary>>}
end;
{error, _} ->
{error, <<"Failed to fire HTTP request entirely."/utf8>>}
end
end.