Skip to main content

src/discord_webhook.erl

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